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) <noreply@anthropic.com>
This commit is contained in:
ryan
2026-04-04 20:44:27 +00:00
parent 12a3e170de
commit 6505b2dcb9
4 changed files with 14 additions and 6 deletions

View File

@@ -121,7 +121,13 @@ export function transactionOptions(id: string | null) {
export function currentDrawerOptions(locationId: string | null) { export function currentDrawerOptions(locationId: string | null) {
return queryOptions({ return queryOptions({
queryKey: posKeys.drawer(locationId ?? ''), queryKey: posKeys.drawer(locationId ?? ''),
queryFn: () => api.get<DrawerSession>('/v1/drawer/current', { locationId }), queryFn: async (): Promise<DrawerSession | null> => {
try {
return await api.get<DrawerSession>('/v1/drawer/current', { locationId })
} catch {
return null // 404 = no open drawer
}
},
enabled: !!locationId, enabled: !!locationId,
retry: false, retry: false,
}) })

View File

@@ -43,9 +43,9 @@ export function POSDrawerDialog({ open, onOpenChange, drawer }: POSDrawerDialogP
locationId: locationId ?? undefined, locationId: locationId ?? undefined,
openingBalance: parseFloat(openingBalance) || 0, openingBalance: parseFloat(openingBalance) || 0,
}), }),
onSuccess: (session) => { onSuccess: async (session) => {
setDrawerSession(session.id) setDrawerSession(session.id)
queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') }) await queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') })
toast.success('Drawer opened') toast.success('Drawer opened')
onOpenChange(false) onOpenChange(false)
}, },
@@ -58,9 +58,8 @@ export function POSDrawerDialog({ open, onOpenChange, drawer }: POSDrawerDialogP
closingBalance: parseFloat(closingBalance) || 0, closingBalance: parseFloat(closingBalance) || 0,
notes: notes || undefined, notes: notes || undefined,
}), }),
onSuccess: (session) => { onSuccess: async (session) => {
setDrawerSession(null) setDrawerSession(null)
queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') })
const overShort = parseFloat(session.overShort ?? '0') const overShort = parseFloat(session.overShort ?? '0')
if (Math.abs(overShort) < 0.01) { if (Math.abs(overShort) < 0.01) {
toast.success('Drawer closed - balanced') 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)}`) toast.warning(`Drawer closed - ${overShort > 0 ? 'over' : 'short'} $${Math.abs(overShort).toFixed(2)}`)
} }
onOpenChange(false) onOpenChange(false)
await queryClient.invalidateQueries({ queryKey: posKeys.drawer(locationId ?? '') })
}, },
onError: (err) => toast.error(err.message), onError: (err) => toast.error(err.message),
}) })

View File

@@ -44,6 +44,8 @@ export function POSRegister() {
useEffect(() => { useEffect(() => {
if (drawer?.id && drawer.status === 'open') { if (drawer?.id && drawer.status === 'open') {
setDrawerSession(drawer.id) setDrawerSession(drawer.id)
} else {
setDrawerSession(null)
} }
}, [drawer, setDrawerSession]) }, [drawer, setDrawerSession])

View File

@@ -104,7 +104,7 @@ export const DrawerService = {
return session ?? null return session ?? null
}, },
async addAdjustment(db: PostgresJsDatabase<any>, sessionId: string, input: DrawerAdjustmentInput, createdBy: string, approvedBy?: string) { async addAdjustment(db: PostgresJsDatabase<any>, sessionId: string, input: DrawerAdjustmentInput, createdBy: string, _approvedBy?: string) {
const session = await this.getById(db, sessionId) const session = await this.getById(db, sessionId)
if (!session) throw new NotFoundError('Drawer session') if (!session) throw new NotFoundError('Drawer session')
if (session.status === 'closed') throw new ConflictError('Cannot adjust a closed drawer') if (session.status === 'closed') throw new ConflictError('Cannot adjust a closed drawer')