Create centralized status management system
- Add statusHelpers.ts with single source of truth for all status labels/colors - Update AdminOrders to use centralized helpers - Add utility functions: canRefundOrder, canCancelOrder, canMarkAsPaid - Improve consistency across payment status handling Benefits: - Consistent Indonesian labels everywhere - DRY principle - no more duplicate switch statements - Easy to update status styling in one place - Reusable across all components 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,7 @@ import { Textarea } from "@/components/ui/textarea";
|
||||
import { formatIDR, formatDateTime } from "@/lib/format";
|
||||
import { Eye, CheckCircle, XCircle, Video, ExternalLink, Trash2, AlertTriangle, RefreshCw, Link as LinkIcon } from "lucide-react";
|
||||
import { toast } from "@/hooks/use-toast";
|
||||
import { getPaymentStatusLabel, getPaymentStatusColor, canRefundOrder, canCancelOrder, canMarkAsPaid } from "@/lib/statusHelpers";
|
||||
|
||||
interface Order {
|
||||
id: string;
|
||||
@@ -272,20 +273,11 @@ export default function AdminOrders() {
|
||||
};
|
||||
|
||||
const getStatusBadge = (status: string | null) => {
|
||||
switch (status) {
|
||||
case "paid":
|
||||
return <Badge className="bg-brand-accent text-white rounded-full">Lunas</Badge>;
|
||||
case "refunded":
|
||||
return <Badge className="bg-purple-500 text-white rounded-full">Refund</Badge>;
|
||||
case "partially_refunded":
|
||||
return <Badge className="bg-purple-500/80 text-white rounded-full">Refund Sebagian</Badge>;
|
||||
case "pending":
|
||||
return <Badge className="bg-amber-500 text-white rounded-full">Pending</Badge>;
|
||||
case "cancelled":
|
||||
return <Badge className="bg-destructive text-white rounded-full">Dibatalkan</Badge>;
|
||||
default:
|
||||
return <Badge className="bg-muted rounded-full">{status}</Badge>;
|
||||
}
|
||||
return (
|
||||
<Badge className={`${getPaymentStatusColor(status)} rounded-full`}>
|
||||
{getPaymentStatusLabel(status)}
|
||||
</Badge>
|
||||
);
|
||||
};
|
||||
|
||||
if (authLoading || loading) {
|
||||
@@ -499,7 +491,7 @@ export default function AdminOrders() {
|
||||
)}
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-2 pt-4">
|
||||
{selectedOrder.payment_status === "paid" && !selectedOrder.refunded_at && (
|
||||
{canRefundOrder(selectedOrder.payment_status, selectedOrder.refunded_at) && (
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={openRefundDialog}
|
||||
@@ -509,13 +501,13 @@ export default function AdminOrders() {
|
||||
Refund
|
||||
</Button>
|
||||
)}
|
||||
{selectedOrder.payment_status !== "paid" && !selectedOrder.refunded_at && (
|
||||
{canMarkAsPaid(selectedOrder.payment_status, selectedOrder.refunded_at) && (
|
||||
<Button onClick={() => updateOrderStatus(selectedOrder.id, "paid")} className="flex-1">
|
||||
<CheckCircle className="w-4 h-4 mr-2" />
|
||||
Tandai Lunas
|
||||
</Button>
|
||||
)}
|
||||
{selectedOrder.payment_status !== "cancelled" && !selectedOrder.refunded_at && (
|
||||
{canCancelOrder(selectedOrder.payment_status, selectedOrder.refunded_at) && (
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => updateOrderStatus(selectedOrder.id, "cancelled")}
|
||||
|
||||
Reference in New Issue
Block a user