feat(01-06): add plan types and utilities
- Add Plan and PlanFeatures TypeScript interfaces - Add Profile type with plan relationship - Create plan utility functions with Italian labels - Add formatPrice, formatFeatureValue, getPlanBadgeColor helpers
This commit is contained in:
49
src/lib/plans.ts
Normal file
49
src/lib/plans.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { PlanFeatures } from '@/types/database'
|
||||
|
||||
export const PLAN_DISPLAY_ORDER = ['free', 'creator', 'pro'] as const
|
||||
|
||||
// Feature display names in Italian
|
||||
export const FEATURE_LABELS: Record<keyof PlanFeatures, string> = {
|
||||
posts_per_month: 'Post al mese',
|
||||
ai_models: 'Modelli AI',
|
||||
social_accounts: 'Account social',
|
||||
image_generation: 'Generazione immagini',
|
||||
automation: 'Automazione',
|
||||
}
|
||||
|
||||
export function formatFeatureValue(
|
||||
key: keyof PlanFeatures,
|
||||
value: PlanFeatures[keyof PlanFeatures]
|
||||
): string {
|
||||
if (typeof value === 'boolean') {
|
||||
return value ? 'Incluso' : 'Non incluso'
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
return value.length.toString()
|
||||
}
|
||||
|
||||
if (key === 'automation') {
|
||||
if (value === 'manual') return 'Solo manuale'
|
||||
if (value === 'full') return 'Completa'
|
||||
return 'Non inclusa'
|
||||
}
|
||||
|
||||
return value.toString()
|
||||
}
|
||||
|
||||
export function formatPrice(cents: number): string {
|
||||
if (cents === 0) return 'Gratis'
|
||||
return `${(cents / 100).toFixed(0)}/mese`
|
||||
}
|
||||
|
||||
export function getPlanBadgeColor(planName: string): string {
|
||||
switch (planName) {
|
||||
case 'pro':
|
||||
return 'bg-purple-100 text-purple-800 border-purple-200'
|
||||
case 'creator':
|
||||
return 'bg-blue-100 text-blue-800 border-blue-200'
|
||||
default:
|
||||
return 'bg-gray-100 text-gray-800 border-gray-200'
|
||||
}
|
||||
}
|
||||
29
src/types/database.ts
Normal file
29
src/types/database.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
export interface Plan {
|
||||
id: string
|
||||
name: 'free' | 'creator' | 'pro'
|
||||
display_name: string
|
||||
display_name_it: string
|
||||
price_monthly: number
|
||||
features: PlanFeatures
|
||||
created_at: string
|
||||
}
|
||||
|
||||
export interface PlanFeatures {
|
||||
posts_per_month: number
|
||||
ai_models: string[]
|
||||
social_accounts: number
|
||||
image_generation: boolean
|
||||
automation: boolean | 'manual' | 'full'
|
||||
}
|
||||
|
||||
export interface Profile {
|
||||
id: string
|
||||
tenant_id: string
|
||||
plan_id: string
|
||||
email: string
|
||||
full_name: string | null
|
||||
avatar_url: string | null
|
||||
created_at: string
|
||||
updated_at: string
|
||||
plans?: Plan
|
||||
}
|
||||
Reference in New Issue
Block a user