import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/hooks/useAuth"; import { AppLayout } from "@/components/AppLayout"; import { Card, CardContent } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Skeleton } from "@/components/ui/skeleton"; import { formatDateTime } from "@/lib/format"; import { Eye, Shield, ShieldOff } from "lucide-react"; import { toast } from "@/hooks/use-toast"; interface Member { id: string; email: string | null; name: string | null; created_at: string; isAdmin?: boolean; } interface UserAccess { id: string; granted_at: string; product: { title: string }; } export default function AdminMembers() { const { user, isAdmin, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [members, setMembers] = useState([]); const [adminIds, setAdminIds] = useState>(new Set()); const [loading, setLoading] = useState(true); const [selectedMember, setSelectedMember] = useState(null); const [memberAccess, setMemberAccess] = useState([]); const [dialogOpen, setDialogOpen] = useState(false); useEffect(() => { if (!authLoading) { if (!user) navigate("/auth"); else if (!isAdmin) navigate("/dashboard"); else fetchMembers(); } }, [user, isAdmin, authLoading]); const fetchMembers = async () => { const [profilesRes, rolesRes] = await Promise.all([ supabase.from("profiles").select("*").order("created_at", { ascending: false }), supabase.from("user_roles").select("user_id").eq("role", "admin"), ]); const admins = new Set((rolesRes.data || []).map((r) => r.user_id)); setAdminIds(admins); if (profilesRes.data) { setMembers(profilesRes.data.map((p) => ({ ...p, isAdmin: admins.has(p.id) }))); } setLoading(false); }; const viewMemberDetails = async (member: Member) => { setSelectedMember(member); const { data } = await supabase.from("user_access").select("*, product:products(title)").eq("user_id", member.id); setMemberAccess((data as unknown as UserAccess[]) || []); setDialogOpen(true); }; const toggleAdminRole = async (memberId: string, currentlyAdmin: boolean) => { if (currentlyAdmin) { const { error } = await supabase.from("user_roles").delete().eq("user_id", memberId).eq("role", "admin"); if (error) toast({ title: "Error", description: "Gagal menghapus role admin", variant: "destructive" }); else { toast({ title: "Berhasil", description: "Role admin dihapus" }); fetchMembers(); } } else { const { error } = await supabase.from("user_roles").insert({ user_id: memberId, role: "admin" }); if (error) toast({ title: "Error", description: error.message, variant: "destructive" }); else { toast({ title: "Berhasil", description: "Role admin ditambahkan" }); fetchMembers(); } } }; if (authLoading || loading) { return (
); } return (

Manajemen Member

Kelola semua pengguna

{/* Desktop Table */}
Email Nama Role Bergabung Aksi {members.map((member) => ( {member.email || "-"} {member.name || "-"} {adminIds.has(member.id) ? ( Admin ) : ( Member )} {formatDateTime(member.created_at)} ))} {members.length === 0 && ( Belum ada member )}
{/* Mobile Card Layout */}
{members.map((member) => (

{member.name || "Tanpa Nama"}

{member.email || "-"}

{adminIds.has(member.id) ? ( Admin ) : ( Member )}
Bergabung: {formatDateTime(member.created_at)}
))} {members.length === 0 && (
Belum ada member
)}
Detail Member {selectedMember && (

Email: {selectedMember.email}

Nama: {selectedMember.name || "-"}

ID: {selectedMember.id}

Akses Produk:

{memberAccess.length === 0 ? (

Tidak ada akses

) : (
{memberAccess.map((access) => (
{access.product?.title} {formatDateTime(access.granted_at)}
))}
)}
)}
); }