From 24826a3ea45ea403beca5cb0b0f27694b30f437e Mon Sep 17 00:00:00 2001
From: dwindown
Date: Thu, 25 Dec 2025 18:08:37 +0700
Subject: [PATCH] Fix badge colors and show paid webinars in access pages
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Change "Lunas" badge to use brand accent color instead of hardcoded green
- Fix "Aktif" badge with white text and border for better contrast
- Update MemberAccess page to fetch from paid orders (webinars now show)
- Remove payment_provider filter completely since only Pakasir is used
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5
---
src/pages/member/MemberAccess.tsx | 49 ++++++++++++++++++++++++----
src/pages/member/MemberDashboard.tsx | 2 +-
2 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/src/pages/member/MemberAccess.tsx b/src/pages/member/MemberAccess.tsx
index b54892e..9c37100 100644
--- a/src/pages/member/MemberAccess.tsx
+++ b/src/pages/member/MemberAccess.tsx
@@ -36,11 +36,48 @@ export default function MemberAccess() {
}, [user, authLoading]);
const fetchAccess = async () => {
- const { data } = await 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);
- if (data) setAccess(data as unknown as UserAccess[]);
+ const [accessRes, paidOrdersRes] = await Promise.all([
+ // Get direct user_access
+ 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),
+ // Get products from paid orders (via order_items)
+ supabase
+ .from("orders")
+ .select(
+ `
+ order_items (
+ product:products (id, title, slug, type, meeting_link, recording_url, description)
+ )
+ `,
+ )
+ .eq("user_id", user!.id)
+ .eq("payment_status", "paid"),
+ ]);
+
+ // Combine access from user_access and paid orders
+ const directAccess = (accessRes.data as unknown as UserAccess[]) || [];
+ const paidProductAccess: UserAccess[] = [];
+
+ if (paidOrdersRes.data) {
+ 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)) {
+ existingIds.add(item.product.id);
+ paidProductAccess.push({
+ id: `paid-${item.product.id}`,
+ granted_at: new Date().toISOString(),
+ expires_at: null,
+ product: item.product
+ });
+ }
+ });
+ });
+ }
+
+ setAccess([...directAccess, ...paidProductAccess]);
setLoading(false);
};
@@ -127,7 +164,7 @@ export default function MemberAccess() {
{item.product.title}
{item.product.type}
- Aktif
+ Aktif
diff --git a/src/pages/member/MemberDashboard.tsx b/src/pages/member/MemberDashboard.tsx
index 963a632..1339a0c 100644
--- a/src/pages/member/MemberDashboard.tsx
+++ b/src/pages/member/MemberDashboard.tsx
@@ -298,7 +298,7 @@ export default function MemberDashboard() {
-
+
{order.payment_status === "paid" ? "Lunas" : "Pending"}
{formatIDR(order.total_amount)}