import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { AppLayout } from '@/components/AppLayout'; import { useAuth } from '@/hooks/useAuth'; import { supabase } from '@/integrations/supabase/client'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { formatIDR, formatDate } from '@/lib/format'; import { Video, Calendar, BookOpen, ArrowRight } from 'lucide-react'; interface UserAccess { id: string; granted_at: string; expires_at: string | null; product: { id: string; title: string; slug: string; type: string; meeting_link: string | null; recording_url: string | null; description: string; }; } interface Order { id: string; total_amount: number; status: string; payment_status: string | null; created_at: string; } export default function Dashboard() { const { user, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [access, setAccess] = useState([]); const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!authLoading && !user) navigate('/auth'); else if (user) fetchData(); }, [user, authLoading, navigate]); const fetchData = async () => { const [accessRes, ordersRes] = await Promise.all([ supabase.from('user_access').select(`id, granted_at, expires_at, product:products (id, title, slug, type, meeting_link, recording_url, description)`).eq('user_id', user!.id), supabase.from('orders').select('*').eq('user_id', user!.id).order('created_at', { ascending: false }) ]); if (accessRes.data) setAccess(accessRes.data as unknown as UserAccess[]); if (ordersRes.data) setOrders(ordersRes.data); setLoading(false); }; const getStatusColor = (status: string) => { switch (status) { case 'paid': return 'bg-brand-accent text-white'; case 'pending': return 'bg-secondary'; case 'cancelled': return 'bg-destructive'; default: return 'bg-secondary'; } }; const getPaymentStatusLabel = (status: string | null) => { switch (status) { case 'paid': return 'Lunas'; case 'pending': return 'Pending'; case 'failed': return 'Gagal'; default: return status || 'Pending'; } }; const renderAccessActions = (item: UserAccess) => { switch (item.product.type) { case 'consulting': return ( ); case 'webinar': return (
{item.product.meeting_link && ( )} {item.product.recording_url && ( )}
); case 'bootcamp': return ( ); default: return null; } }; if (authLoading || loading) { return (
{[...Array(3)].map((_, i) => )}
); } return (

Dashboard

Kelola akses dan riwayat pembelian Anda

Akses Saya Riwayat Order {access.length === 0 ? (

Anda belum memiliki akses ke produk apapun

) : (
{access.map((item) => (
{item.product.title} {item.product.type}
Aktif

{item.product.description}

{renderAccessActions(item)}
))}
)}
{orders.length === 0 ? (

Belum ada order

) : (
{orders.map((order) => (

{order.id.slice(0, 8)}

{formatDate(order.created_at)}

{getPaymentStatusLabel(order.payment_status || order.status)} {formatIDR(order.total_amount)}
))}
)}
); }