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, CardHeader, CardTitle } 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 { formatIDR, formatDateTime } from '@/lib/format'; import { Eye, CheckCircle, XCircle } from 'lucide-react'; import { toast } from '@/hooks/use-toast'; interface Order { id: string; user_id: string; total_amount: number; status: string; payment_status: string | null; payment_method: string | null; payment_reference: string | null; created_at: string; profile?: { email: string } | null; } interface OrderItem { id: string; product: { title: string }; unit_price: number; quantity: number; } export default function AdminOrders() { const { user, isAdmin, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [selectedOrder, setSelectedOrder] = useState(null); const [orderItems, setOrderItems] = useState([]); const [dialogOpen, setDialogOpen] = useState(false); useEffect(() => { if (!authLoading) { if (!user) navigate('/auth'); else if (!isAdmin) navigate('/dashboard'); else fetchOrders(); } }, [user, isAdmin, authLoading]); const fetchOrders = async () => { const { data, error } = await supabase .from('orders') .select('*, profile:profiles(email)') .order('created_at', { ascending: false }); if (!error && data) setOrders(data as unknown as Order[]); setLoading(false); }; const viewOrderDetails = async (order: Order) => { setSelectedOrder(order); const { data } = await supabase .from('order_items') .select('*, product:products(title)') .eq('order_id', order.id); setOrderItems(data as unknown as OrderItem[] || []); setDialogOpen(true); }; const updateOrderStatus = async (orderId: string, status: 'paid' | 'cancelled') => { const { error } = await supabase.from('orders').update({ payment_status: status }).eq('id', orderId); if (error) { toast({ title: 'Error', description: 'Gagal update status', variant: 'destructive' }); } else { if (status === 'paid') { // Grant access for each order item const { data: items } = await supabase.from('order_items').select('product_id').eq('order_id', orderId); const order = orders.find(o => o.id === orderId); if (items && order) { for (const item of items) { await supabase.from('user_access').upsert({ user_id: order.user_id, product_id: item.product_id, granted_at: new Date().toISOString(), }, { onConflict: 'user_id,product_id' }); } } } toast({ title: 'Berhasil', description: `Status diubah ke ${status}` }); fetchOrders(); setDialogOpen(false); } }; const getStatusBadge = (status: string | null) => { switch (status) { case 'paid': return Lunas; case 'pending': return Pending; case 'cancelled': return Dibatalkan; default: return {status}; } }; if (authLoading || loading) { return (
); } return (

Manajemen Order

Kelola semua pesanan

ID Order Email Total Metode Status Tanggal Aksi {orders.map((order) => ( {order.id.slice(0, 8)} {order.profile?.email || '-'} {formatIDR(order.total_amount)} {order.payment_method || '-'} {getStatusBadge(order.payment_status)} {formatDateTime(order.created_at)} ))} {orders.length === 0 && ( Belum ada order )}
Detail Order {selectedOrder && (
ID: {selectedOrder.id.slice(0, 8)}
Referensi: {selectedOrder.payment_reference || '-'}
Email: {selectedOrder.profile?.email}
Metode: {selectedOrder.payment_method || '-'}

Item:

{orderItems.map((item) => (
{item.product?.title} {formatIDR(item.unit_price)}
))}
Total {formatIDR(selectedOrder.total_amount)}
{selectedOrder.payment_status !== 'paid' && ( )} {selectedOrder.payment_status !== 'cancelled' && ( )}
)}
); }