From 978c6da37a87775010577b0a59db250bd2bc7402 Mon Sep 17 00:00:00 2001 From: ryan Date: Sat, 4 Apr 2026 20:44:27 +0000 Subject: [PATCH] fix: drawer open/close updates UI immediately without refresh - Return null instead of throwing on 404 for drawer current query - Sync drawer session ID to null when drawer closes - Await query invalidation before closing dialog - Fix unused approvedBy lint error Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/admin/src/api/pos.ts | 8 +++++++- packages/admin/src/components/pos/pos-drawer-dialog.tsx | 8 ++++---- packages/admin/src/components/pos/pos-register.tsx | 2 ++ packages/backend/src/services/drawer.service.ts | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/admin/src/api/pos.ts b/packages/admin/src/api/pos.ts index d3f421c..2d32aff 100644 --- a/packages/admin/src/api/pos.ts +++ b/packages/admin/src/api/pos.ts @@ -121,7 +121,13 @@ export function transactionOptions(id: string | null) { export function currentDrawerOptions(locationId: string | null) { return queryOptions({ queryKey: posKeys.drawer(locationId ?? ''), - queryFn: () => api.get('/v1/drawer/current', { locationId }), + queryFn: async (): Promise => { + try { + return await api.get('/v1/drawer/current', { locationId }) + } catch { + return null // 404 = no open drawer + } + }, enabled: !!locationId, retry: false, }) diff --git a/packages/admin/src/components/pos/pos-drawer-dialog.tsx b/packages/admin/src/components/pos/pos-drawer-dialog.tsx index e04f8f7..a3e9f31 100644 --- a/packages/admin/src/components/pos/pos-drawer-dialog.tsx +++ b/packages/admin/src/components/pos/pos-drawer-dialog.tsx @@ -43,9 +43,9 @@ export function POSDrawerDialog({ open, onOpenChange, drawer }: POSDrawerDialogP locationId: locationId ?? undefined, openingBalance: parseFloat(openingBalance) || 0, }), - onSuccess: (session) => { + onSuccess: async (session) => { setDrawerSession(session.id) - queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') }) + await queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') }) toast.success('Drawer opened') onOpenChange(false) }, @@ -58,9 +58,8 @@ export function POSDrawerDialog({ open, onOpenChange, drawer }: POSDrawerDialogP closingBalance: parseFloat(closingBalance) || 0, notes: notes || undefined, }), - onSuccess: (session) => { + onSuccess: async (session) => { setDrawerSession(null) - queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') }) const overShort = parseFloat(session.overShort ?? '0') if (Math.abs(overShort) < 0.01) { toast.success('Drawer closed - balanced') @@ -68,6 +67,7 @@ export function POSDrawerDialog({ open, onOpenChange, drawer }: POSDrawerDialogP toast.warning(`Drawer closed - ${overShort > 0 ? 'over' : 'short'} $${Math.abs(overShort).toFixed(2)}`) } onOpenChange(false) + await queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') }) }, onError: (err) => toast.error(err.message), }) diff --git a/packages/admin/src/components/pos/pos-register.tsx b/packages/admin/src/components/pos/pos-register.tsx index 4bd8645..116e469 100644 --- a/packages/admin/src/components/pos/pos-register.tsx +++ b/packages/admin/src/components/pos/pos-register.tsx @@ -44,6 +44,8 @@ export function POSRegister() { useEffect(() => { if (drawer?.id && drawer.status === 'open') { setDrawerSession(drawer.id) + } else { + setDrawerSession(null) } }, [drawer, setDrawerSession]) diff --git a/packages/backend/src/services/drawer.service.ts b/packages/backend/src/services/drawer.service.ts index dd992de..55fe966 100644 --- a/packages/backend/src/services/drawer.service.ts +++ b/packages/backend/src/services/drawer.service.ts @@ -104,7 +104,7 @@ export const DrawerService = { return session ?? null }, - async addAdjustment(db: PostgresJsDatabase, sessionId: string, input: DrawerAdjustmentInput, createdBy: string, approvedBy?: string) { + async addAdjustment(db: PostgresJsDatabase, sessionId: string, input: DrawerAdjustmentInput, createdBy: string, _approvedBy?: string) { const session = await this.getById(db, sessionId) if (!session) throw new NotFoundError('Drawer session') if (session.status === 'closed') throw new ConflictError('Cannot adjust a closed drawer')