Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useState } from 'react';
import { useState } from "react";
import {
Clock,
ChefHat,
Expand All @@ -8,8 +8,8 @@ import {
Phone,
MoreVertical,
Loader2,
} from 'lucide-react';
import api from "@services/common/api";
X,
} from "lucide-react";

const OrderCard = ({ order, onStatusUpdate }) => {
const [updating, setUpdating] = useState(false);
Expand All @@ -19,32 +19,39 @@ const OrderCard = ({ order, onStatusUpdate }) => {
// ------------------------------------
const statusConfig = {
pending: {
bg: 'bg-yellow-50',
text: 'text-yellow-700',
border: 'border-yellow-200',
bg: "bg-yellow-50",
text: "text-yellow-700",
border: "border-yellow-200",
icon: Clock,
label: 'Pending',
label: "Pending",
},
cooking: {
bg: 'bg-blue-50',
text: 'text-blue-700',
border: 'border-blue-200',
bg: "bg-blue-50",
text: "text-blue-700",
border: "border-blue-200",
icon: ChefHat,
label: 'Cooking',
label: "Cooking",
},
ready: {
bg: 'bg-green-50',
text: 'text-green-700',
border: 'border-green-200',
bg: "bg-green-50",
text: "text-green-700",
border: "border-green-200",
icon: CheckCircle2,
label: 'Ready',
label: "Ready",
},
billed: {
bg: 'bg-purple-50',
text: 'text-purple-700',
border: 'border-purple-200',
bg: "bg-purple-50",
text: "text-purple-700",
border: "border-purple-200",
icon: Receipt,
label: 'Billed',
label: "Billed",
},
cancelled: {
bg: "bg-red-50",
text: "text-red-700",
border: "border-red-200",
icon: X,
label: "Cancelled",
},
};

Expand All @@ -53,40 +60,49 @@ const OrderCard = ({ order, onStatusUpdate }) => {
// ------------------------------------
const actionConfig = {
pending: {
label: 'Start Cooking',
next: 'cooking',
label: "Start Cooking",
next: "cooking",
icon: ChefHat,
bg: 'bg-blue-50',
text: 'text-blue-700',
hoverBg: 'hover:bg-blue-100',
border: 'border border-blue-200',
bg: "bg-blue-50",
text: "text-blue-700",
hoverBg: "hover:bg-blue-100",
border: "border border-blue-200",
},
cooking: {
label: 'Mark Ready',
next: 'ready',
label: "Mark Ready",
next: "ready",
icon: CheckCircle2,
bg: 'bg-green-50',
text: 'text-green-700',
hoverBg: 'hover:bg-green-100',
border: 'border border-green-200',
bg: "bg-green-50",
text: "text-green-700",
hoverBg: "hover:bg-green-100",
border: "border border-green-200",
},
ready: {
label: 'Generate Bill',
next: 'billed',
label: "Generate Bill",
next: "billed",
icon: Receipt,
bg: 'bg-purple-50',
text: 'text-purple-700',
hoverBg: 'hover:bg-purple-100',
border: 'border border-purple-200',
bg: "bg-purple-50",
text: "text-purple-700",
hoverBg: "hover:bg-purple-100",
border: "border border-purple-200",
},
billed: {
label: 'Complete Payment',
next: 'complete',
label: "Complete Payment",
next: "complete",
icon: CreditCard,
bg: 'bg-gray-50',
text: 'text-gray-700',
hoverBg: 'hover:bg-gray-100',
border: 'border border-gray-200',
bg: "bg-gray-50",
text: "text-gray-700",
hoverBg: "hover:bg-gray-100",
border: "border border-gray-200",
},
cancelled: {
label: "Cancelled",
next: null,
icon: X,
bg: "bg-red-50",
text: "text-red-700",
hoverBg: "hover:bg-red-100",
border: "border border-red-200",
},
};

Expand All @@ -110,7 +126,29 @@ const OrderCard = ({ order, onStatusUpdate }) => {
await new Promise((resolve) => setTimeout(resolve, 400));
onStatusUpdate(order.id, action.next);
} catch (err) {
console.error('Failed to update order:', err);
console.error("Failed to update order:", err);
} finally {
setUpdating(false);
}
};

const handleCancel = async () => {
const isConfirmed = window.confirm(
"Are you sure you want to cancel this order?",
);
if (!isConfirmed) return;

try {
setUpdating(true);

// 🔌 UNCOMMENT WHEN API READY
// await api.put(`/api/orders/${order.id}/status`, { status: 'cancelled' });
// toast.success(`Order #${order.id} cancelled`);
Comment on lines +143 to +146

await new Promise((resolve) => setTimeout(resolve, 400));
onStatusUpdate(order.id, "cancelled");
} catch (err) {
Comment on lines +148 to +150
console.error("Failed to cancel order:", err);
} finally {
Comment on lines +135 to +152
setUpdating(false);
}
Expand All @@ -131,7 +169,9 @@ const OrderCard = ({ order, onStatusUpdate }) => {

<div>
<div className="flex items-center gap-2">
<span className="font-semibold text-gray-900">Table {order.table}</span>
<span className="font-semibold text-gray-900">
Table {order.table}
</span>
{/* Status Badge */}
<span
className={`inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium ${status.bg} ${status.text} border ${status.border}`}
Expand Down Expand Up @@ -181,27 +221,41 @@ const OrderCard = ({ order, onStatusUpdate }) => {
{/* Total */}
<div className="flex justify-between pt-2 border-t border-gray-100">
<span className="font-semibold text-gray-900">Total</span>
<span className="font-bold text-lg text-gray-900">₹{order.amount}</span>
<span className="font-bold text-lg text-gray-900">
₹{order.amount}
</span>
</div>
</div>

{/* Action Button - NO WHITE TEXT */}
{action && (
<button
onClick={handleAction}
disabled={updating}
className={`w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl transition-all text-sm font-semibold disabled:opacity-50 ${action.bg} ${action.text} ${action.hoverBg} ${action.border}`}
>
{updating ? (
<Loader2 className="w-4 h-4 animate-spin" />
) : (
<action.icon className="w-4 h-4" />
<div className="flex items-center gap-2">
<button
onClick={handleAction}
disabled={updating}
className={`flex-1 flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl transition-all text-sm font-semibold disabled:opacity-50 ${action.bg} ${action.text} ${action.hoverBg} ${action.border}`}
>
{updating ? (
<Loader2 className="w-4 h-4 animate-spin" />
) : (
<action.icon className="w-4 h-4" />
)}
{action.label}
</button>
{order.status === "pending" && (
<button
onClick={handleCancel}
disabled={updating}
className="flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl transition-all text-sm font-semibold text-red-700 bg-red-50 hover:bg-red-100 border border-red-200 disabled:opacity-50"
>
<X className="w-4 h-4" />
Cancel
</button>
Comment on lines +233 to +253
)}
{action.label}
</button>
</div>
)}
</div>
);
};

export default OrderCard;
export default OrderCard;
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ const OrdersGrid = ({ activeFilter, searchQuery, onOrdersChange }) => {
// HANDLERS
// ------------------------------------
const handleStatusUpdate = (orderId, newStatus) => {
if (newStatus === 'complete') {
if (newStatus === 'complete' || newStatus === 'cancelled') {
syncOrders(orders.filter((o) => o.id !== orderId));
} else {
syncOrders(orders.map((o) => (o.id === orderId ? { ...o, status: newStatus } : o)));
Expand Down