From d860f0296d990741efc78830aeeb64698ac56c5f Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:55:49 +0000 Subject: [PATCH] Code edited in Lovable Code Editor Edited UI in Lovable --- src/pages/member/MemberDashboard.tsx | 97 +++++++++++++++------------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/src/pages/member/MemberDashboard.tsx b/src/pages/member/MemberDashboard.tsx index f46c83e..32db61b 100644 --- a/src/pages/member/MemberDashboard.tsx +++ b/src/pages/member/MemberDashboard.tsx @@ -1,14 +1,14 @@ -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 { formatIDR } from '@/lib/format'; -import { Video, Calendar, BookOpen, ArrowRight, Package, Receipt, ShoppingBag } from 'lucide-react'; +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 { formatIDR } from "@/lib/format"; +import { Video, Calendar, BookOpen, ArrowRight, Package, Receipt, ShoppingBag } from "lucide-react"; interface UserAccess { id: string; @@ -37,32 +37,38 @@ export default function MemberDashboard() { const [loading, setLoading] = useState(true); useEffect(() => { - if (!authLoading && !user) navigate('/auth'); + if (!authLoading && !user) navigate("/auth"); else if (user) fetchData(); }, [user, authLoading]); const fetchData = async () => { const [accessRes, ordersRes, paidOrdersRes] = await Promise.all([ - supabase.from('user_access').select(`id, product:products (id, title, slug, type, meeting_link, recording_url)`).eq('user_id', user!.id), - supabase.from('orders').select('*').eq('user_id', user!.id).order('created_at', { ascending: false }).limit(3), + supabase + .from("user_access") + .select(`id, product:products (id, title, slug, type, meeting_link, recording_url)`) + .eq("user_id", user!.id), + supabase.from("orders").select("*").eq("user_id", user!.id).order("created_at", { ascending: false }).limit(3), // Also get products from paid orders (via order_items) - supabase.from('orders') - .select(` + supabase + .from("orders") + .select( + ` order_items ( product:products (id, title, slug, type, meeting_link, recording_url) ) - `) - .eq('user_id', user!.id) - .eq('payment_status', 'paid') - .eq('payment_provider', 'pakasir') + `, + ) + .eq("user_id", user!.id) + .eq("payment_status", "paid") + .eq("payment_provider", "pakasir"), ]); - + // Combine access from user_access and paid orders - const directAccess = accessRes.data as unknown as UserAccess[] || []; + const directAccess = (accessRes.data as unknown as UserAccess[]) || []; const paidProductAccess: UserAccess[] = []; - + if (paidOrdersRes.data) { - const existingIds = new Set(directAccess.map(a => a.product.id)); + const existingIds = new Set(directAccess.map((a) => a.product.id)); paidOrdersRes.data.forEach((order: any) => { order.order_items?.forEach((item: any) => { if (item.product && !existingIds.has(item.product.id)) { @@ -72,7 +78,7 @@ export default function MemberDashboard() { }); }); } - + setAccess([...directAccess, ...paidProductAccess]); if (ordersRes.data) setRecentOrders(ordersRes.data); setLoading(false); @@ -80,12 +86,12 @@ export default function MemberDashboard() { const getQuickAction = (item: UserAccess) => { switch (item.product.type) { - case 'consulting': - return { label: 'Jadwalkan', icon: Calendar, href: item.product.meeting_link }; - case 'webinar': - return { label: 'Tonton', icon: Video, href: item.product.recording_url || item.product.meeting_link }; - case 'bootcamp': - return { label: 'Lanjutkan', icon: BookOpen, route: `/bootcamp/${item.product.slug}` }; + case "consulting": + return { label: "Jadwalkan", icon: Calendar, href: item.product.meeting_link }; + case "webinar": + return { label: "Tonton", icon: Video, href: item.product.recording_url || item.product.meeting_link }; + case "bootcamp": + return { label: "Lanjutkan", icon: BookOpen, route: `/bootcamp/${item.product.slug}` }; default: return null; } @@ -97,7 +103,9 @@ export default function MemberDashboard() {
{recentOrders.length}
Order Terbaru
@@ -136,13 +144,13 @@ export default function MemberDashboard() {Jelajahi lebih banyak
Lihat semua produk
{order.id.slice(0, 8)}
-{new Date(order.created_at).toLocaleDateString('id-ID')}
++ {new Date(order.created_at).toLocaleDateString("id-ID")} +