Fix info on page

This commit is contained in:
NotII
2025-02-21 03:39:20 +00:00
parent ac3e8c078f
commit b316246313
2 changed files with 79 additions and 10 deletions

View File

@@ -46,6 +46,21 @@ interface Order {
trackingNumber?: string; trackingNumber?: string;
} }
const getStatusVariant = (status: string) => {
switch (status) {
case 'paid':
return 'paid';
case 'shipped':
return 'shipped';
case 'completed':
return 'completed';
case 'cancelled':
return 'destructive';
default:
return 'unpaid';
}
};
export default function OrderDetailsPage() { export default function OrderDetailsPage() {
const [order, setOrder] = useState<Order | null>(null); const [order, setOrder] = useState<Order | null>(null);
const [trackingNumber, setTrackingNumber] = useState(""); const [trackingNumber, setTrackingNumber] = useState("");
@@ -54,6 +69,7 @@ export default function OrderDetailsPage() {
const [productNames, setProductNames] = useState<Record<string, string>>({}); const [productNames, setProductNames] = useState<Record<string, string>>({});
const [isPaid, setIsPaid] = useState(false); const [isPaid, setIsPaid] = useState(false);
const [isSending, setIsSending] = useState(false); const [isSending, setIsSending] = useState(false);
const [isMarkingShipped, setIsMarkingShipped] = useState(false);
const router = useRouter(); const router = useRouter();
const params = useParams(); const params = useParams();
@@ -114,6 +130,36 @@ export default function OrderDetailsPage() {
} }
}; };
const handleMarkAsShipped = async () => {
try {
setIsMarkingShipped(true);
const authToken = document.cookie.split("Authorization=")[1];
const response = await fetchData(
`${process.env.NEXT_PUBLIC_API_URL}/orders/${orderId}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${authToken}`,
},
body: JSON.stringify({ status: "shipped" }),
}
);
if (response && response.message === "Order status updated successfully") {
setOrder((prevOrder) => prevOrder ? { ...prevOrder, status: "shipped" } : null);
toast.success("Order marked as shipped successfully!");
} else {
throw new Error(response.error || "Failed to mark order as shipped");
}
} catch (error: any) {
console.error("Failed to mark order as shipped:", error);
toast.error(error.message || "Failed to mark order as shipped");
} finally {
setIsMarkingShipped(false);
}
};
useEffect(() => { useEffect(() => {
const fetchOrderDetails = async () => { const fetchOrderDetails = async () => {
try { try {
@@ -183,7 +229,7 @@ export default function OrderDetailsPage() {
trackingNumber: trackingNumber trackingNumber: trackingNumber
} : null); } : null);
toast.success("Tracking number updated and notification sent to customer!"); toast.success("Tracking number updated successfully!");
setTrackingNumber(""); // Clear the input setTrackingNumber(""); // Clear the input
} catch (err: any) { } catch (err: any) {
console.error("Failed to update tracking:", err); console.error("Failed to update tracking:", err);
@@ -207,10 +253,12 @@ export default function OrderDetailsPage() {
<div className="space-y-6"> <div className="space-y-6">
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<h1 className="text-3xl font-bold">Order Details: {order?.orderId}</h1> <h1 className="text-3xl font-bold">Order Details: {order?.orderId}</h1>
<Badge variant={order?.status === "paid" ? "paid" : "unpaid"}> <div className="flex items-center gap-2">
<Badge variant={getStatusVariant(order?.status || '')}>
{order?.status} {order?.status}
</Badge> </Badge>
</div> </div>
</div>
<div className="grid gap-6 md:grid-cols-2"> <div className="grid gap-6 md:grid-cols-2">
<Card> <Card>
@@ -336,9 +384,28 @@ export default function OrderDetailsPage() {
</div> </div>
<div className="flex justify-end space-x-4"> <div className="flex justify-end space-x-4">
<Button size="lg" onClick={handleMarkAsPaid} disabled={isPaid}> {order?.status === "unpaid" && (
<Button
size="lg"
onClick={handleMarkAsPaid}
disabled={isPaid}
className="bg-emerald-600 hover:bg-emerald-700"
>
{isPaid ? "Order Marked as Paid" : "Mark Order as Paid"} {isPaid ? "Order Marked as Paid" : "Mark Order as Paid"}
</Button> </Button>
)}
{order?.status === "paid" && (
<Button
size="lg"
onClick={handleMarkAsShipped}
disabled={isMarkingShipped}
className="bg-blue-600 hover:bg-blue-700"
>
<Truck className="w-5 h-5 mr-2" />
{isMarkingShipped ? "Updating..." : "Mark as Shipped"}
</Button>
)}
</div> </div>
</div> </div>
</Layout> </Layout>

View File

@@ -12,9 +12,11 @@ const badgeVariants = cva(
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
outline: "text-foreground", outline: "text-foreground",
paid: "border-transparent bg-green-500 text-white hover:bg-green-600", paid: "border-transparent bg-emerald-500 text-emerald-50",
unpaid: "border-transparent bg-red-500 text-white hover:bg-red-600", unpaid: "border-transparent bg-amber-500 text-amber-50",
pending: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600", shipped: "border-transparent bg-blue-500 text-blue-50",
completed: "border-transparent bg-purple-500 text-purple-50",
pending: "border-transparent bg-orange-500 text-orange-50"
}, },
}, },
defaultVariants: { defaultVariants: {