diff --git a/src/pages/admin/AdminMembers.tsx b/src/pages/admin/AdminMembers.tsx index 126de0d..d9254d0 100644 --- a/src/pages/admin/AdminMembers.tsx +++ b/src/pages/admin/AdminMembers.tsx @@ -1,17 +1,17 @@ -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'; +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; @@ -39,46 +39,49 @@ export default function AdminMembers() { useEffect(() => { if (!authLoading) { - if (!user) navigate('/auth'); - else if (!isAdmin) navigate('/dashboard'); + 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'), + 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)); + 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) }))); + 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[] || []); + 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(); } + 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(); } + 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(); + } } }; @@ -114,13 +117,13 @@ export default function AdminMembers() { {members.map((member) => ( - {member.email || '-'} - {member.full_name || '-'} + {member.email || "-"} + {member.full_name || "-"} {adminIds.has(member.id) ? ( Admin ) : ( - Member + Member )} {formatDateTime(member.created_at)} @@ -159,9 +162,15 @@ export default function AdminMembers() { {selectedMember && (
-

Email: {selectedMember.email}

-

Nama: {selectedMember.full_name || '-'}

-

ID: {selectedMember.id}

+

+ Email: {selectedMember.email} +

+

+ Nama: {selectedMember.full_name || "-"} +

+

+ ID: {selectedMember.id} +

Akses Produk: