diff --git a/src/pages/admin/AdminOrders.tsx b/src/pages/admin/AdminOrders.tsx index 3718738..8dbef02 100644 --- a/src/pages/admin/AdminOrders.tsx +++ b/src/pages/admin/AdminOrders.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, 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'; +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; @@ -43,51 +43,51 @@ export default function AdminOrders() { useEffect(() => { if (!authLoading) { - if (!user) navigate('/auth'); - else if (!isAdmin) navigate('/dashboard'); + 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 }); + .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[] || []); + 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); + 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' }); + toast({ title: "Error", description: "Gagal update status", variant: "destructive" }); } else { - if (status === 'paid') { + 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); + 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' }); + 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}` }); + toast({ title: "Berhasil", description: `Status diubah ke ${status}` }); fetchOrders(); setDialogOpen(false); } @@ -95,10 +95,14 @@ export default function AdminOrders() { const getStatusBadge = (status: string | null) => { switch (status) { - case 'paid': return Lunas; - case 'pending': return Pending; - case 'cancelled': return Dibatalkan; - default: return {status}; + case "paid": + return Lunas; + case "pending": + return Pending; + case "cancelled": + return Dibatalkan; + default: + return {status}; } }; @@ -137,9 +141,9 @@ export default function AdminOrders() { {orders.map((order) => ( {order.id.slice(0, 8)} - {order.profile?.email || '-'} + {order.profile?.email || "-"} {formatIDR(order.total_amount)} - {order.payment_method || '-'} + {order.payment_method || "-"} {getStatusBadge(order.payment_status)} {formatDateTime(order.created_at)} @@ -169,10 +173,18 @@ export default function AdminOrders() { {selectedOrder && (
-
ID: {selectedOrder.id.slice(0, 8)}
-
Referensi: {selectedOrder.payment_reference || '-'}
-
Email: {selectedOrder.profile?.email}
-
Metode: {selectedOrder.payment_method || '-'}
+
+ ID: {selectedOrder.id.slice(0, 8)} +
+
+ Referensi: {selectedOrder.payment_reference || "-"} +
+
+ Email: {selectedOrder.profile?.email} +
+
+ Metode: {selectedOrder.payment_method || "-"} +

Item:

@@ -188,14 +200,18 @@ export default function AdminOrders() {
- {selectedOrder.payment_status !== 'paid' && ( - )} - {selectedOrder.payment_status !== 'cancelled' && ( -