This commit is contained in:
gpt-engineer-app[bot]
2025-12-19 16:37:01 +00:00
parent 461a14dfdc
commit cc7c330e83
13 changed files with 756 additions and 14 deletions

View File

@@ -9,6 +9,7 @@ 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 { WhatsAppBanner } from "@/components/WhatsAppBanner";
interface UserAccess {
id: string;
@@ -35,6 +36,7 @@ export default function MemberDashboard() {
const [access, setAccess] = useState<UserAccess[]>([]);
const [recentOrders, setRecentOrders] = useState<Order[]>([]);
const [loading, setLoading] = useState(true);
const [hasWhatsApp, setHasWhatsApp] = useState(true);
useEffect(() => {
if (!authLoading && !user) navigate("/auth");
@@ -42,7 +44,7 @@ export default function MemberDashboard() {
}, [user, authLoading]);
const fetchData = async () => {
const [accessRes, ordersRes, paidOrdersRes] = await Promise.all([
const [accessRes, ordersRes, paidOrdersRes, profileRes] = await Promise.all([
supabase
.from("user_access")
.select(`id, product:products (id, title, slug, type, meeting_link, recording_url)`)
@@ -61,6 +63,7 @@ export default function MemberDashboard() {
.eq("user_id", user!.id)
.eq("payment_status", "paid")
.eq("payment_provider", "pakasir"),
supabase.from("profiles").select("whatsapp_number").eq("id", user!.id).single(),
]);
// Combine access from user_access and paid orders
@@ -81,6 +84,7 @@ export default function MemberDashboard() {
setAccess([...directAccess, ...paidProductAccess]);
if (ordersRes.data) setRecentOrders(ordersRes.data);
if (profileRes.data) setHasWhatsApp(!!profileRes.data.whatsapp_number);
setLoading(false);
};
@@ -118,6 +122,8 @@ export default function MemberDashboard() {
<h1 className="text-4xl font-bold mb-2">Dashboard</h1>
<p className="text-muted-foreground mb-8">Selamat datang kembali!</p>
{!hasWhatsApp && <WhatsAppBanner />}
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3 mb-8">
<Card className="border-2 border-border">
<CardContent className="pt-6">