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() {