feat(01-06): add plan card component and switch action
- Create switchPlan server action for plan changes - Create getCurrentPlan utility function - Build PlanCard component with feature display - Handle plan switching with loading state - Revalidate dashboard and subscription pages on change
This commit is contained in:
80
src/app/actions/subscription.ts
Normal file
80
src/app/actions/subscription.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
'use server'
|
||||
|
||||
import { createClient } from '@/lib/supabase/server'
|
||||
import { revalidatePath } from 'next/cache'
|
||||
|
||||
export type SubscriptionActionState = {
|
||||
success?: boolean
|
||||
error?: string
|
||||
message?: string
|
||||
}
|
||||
|
||||
export async function switchPlan(planId: string): Promise<SubscriptionActionState> {
|
||||
const supabase = await createClient()
|
||||
|
||||
// Get current user
|
||||
const { data: { user }, error: authError } = await supabase.auth.getUser()
|
||||
|
||||
if (authError || !user) {
|
||||
return { error: 'Devi essere autenticato per cambiare piano' }
|
||||
}
|
||||
|
||||
// Verify plan exists
|
||||
const { data: plan, error: planError } = await supabase
|
||||
.from('plans')
|
||||
.select('id, name, display_name_it')
|
||||
.eq('id', planId)
|
||||
.single()
|
||||
|
||||
if (planError || !plan) {
|
||||
return { error: 'Piano non trovato' }
|
||||
}
|
||||
|
||||
// Update user's plan
|
||||
const { error: updateError } = await supabase
|
||||
.from('profiles')
|
||||
.update({ plan_id: planId })
|
||||
.eq('id', user.id)
|
||||
|
||||
if (updateError) {
|
||||
console.error('Failed to update plan:', updateError)
|
||||
return { error: 'Errore durante il cambio piano. Riprova.' }
|
||||
}
|
||||
|
||||
// Revalidate pages that show plan info
|
||||
revalidatePath('/dashboard')
|
||||
revalidatePath('/subscription')
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Piano cambiato a ${plan.display_name_it}`
|
||||
}
|
||||
}
|
||||
|
||||
export async function getCurrentPlan() {
|
||||
const supabase = await createClient()
|
||||
|
||||
const { data: { user } } = await supabase.auth.getUser()
|
||||
|
||||
if (!user) {
|
||||
return null
|
||||
}
|
||||
|
||||
const { data: profile } = await supabase
|
||||
.from('profiles')
|
||||
.select(`
|
||||
plan_id,
|
||||
plans (
|
||||
id,
|
||||
name,
|
||||
display_name,
|
||||
display_name_it,
|
||||
price_monthly,
|
||||
features
|
||||
)
|
||||
`)
|
||||
.eq('id', user.id)
|
||||
.single()
|
||||
|
||||
return profile?.plans || null
|
||||
}
|
||||
Reference in New Issue
Block a user