diff --git a/src/admin/orders/KanbanBoard.jsx b/src/admin/orders/KanbanBoard.jsx index 6020651..4a8ae1b 100644 --- a/src/admin/orders/KanbanBoard.jsx +++ b/src/admin/orders/KanbanBoard.jsx @@ -18,7 +18,10 @@ const KanbanBoard = () => { const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 5 } })); + const [localOverrides, setLocalOverrides] = useState({}); + const findOrderStatus = (orderId) => { + if (localOverrides[orderId]) return localOverrides[orderId]; for (const status of STATUSES) { if (ordersByStatus[status]?.find((o) => o.id === orderId)) return status; } @@ -27,7 +30,8 @@ const KanbanBoard = () => { const handleDragStart = ({ active }) => { const status = findOrderStatus(active.id); - if (status) setActiveOrder(ordersByStatus[status].find((o) => o.id === active.id)); + if (status) setActiveOrder(ordersByStatus[status].find((o) => o.id === active.id) || + Object.values(ordersByStatus).flat().find((o) => o.id === active.id)); }; const handleDragEnd = async ({ active, over }) => { @@ -38,10 +42,38 @@ const KanbanBoard = () => { const sourceStatus = findOrderStatus(active.id); if (targetStatus && sourceStatus !== targetStatus) { - await updateStatus(active.id, targetStatus, session?.user?.email); + setLocalOverrides((prev) => ({ ...prev, [active.id]: targetStatus })); + const { error } = await updateStatus(active.id, targetStatus, session?.user?.email); + if (error) { + console.error('Status update failed:', error); + setLocalOverrides((prev) => { + const next = { ...prev }; + delete next[active.id]; + return next; + }); + } else { + setLocalOverrides((prev) => { + const next = { ...prev }; + delete next[active.id]; + return next; + }); + } } }; + const effectiveOrdersByStatus = STATUSES.reduce((acc, status) => { + acc[status] = (ordersByStatus[status] || []).filter( + (o) => !localOverrides[o.id] || localOverrides[o.id] === status + ); + // Add orders that were moved here optimistically + const overrideOrders = Object.entries(localOverrides) + .filter(([, s]) => s === status) + .map(([id]) => Object.values(ordersByStatus).flat().find((o) => o.id === id)) + .filter(Boolean); + acc[status] = [...acc[status], ...overrideOrders]; + return acc; + }, {}); + if (loading) { return (