mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 06:11:45 +00:00
3aa6b0952a
Add navigator.onLine guard to SWR refresh IIFEs so background network calls don't fire in offline mode (prevents fake-IDB leakage in tests via MSW default handlers). Fix IDB isolation in affected test files by flushing pending macro tasks then clearing IDB tables in beforeEach, so stale IDB writes from previous tests' background IIFEs don't bleed into the next test. Restore loadBudgetItems and refreshPlaces to apply background refresh results to store state. Move tags/categories API calls before the main Promise.all in loadTrip so MSW handlers resolve during the await window.
51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import { daysApi } from '../api/client'
|
|
import { offlineDb, upsertDays } from '../db/offlineDb'
|
|
import { mutationQueue, generateUUID } from '../sync/mutationQueue'
|
|
import type { Day } from '../types'
|
|
|
|
export const dayRepo = {
|
|
async list(tripId: number | string): Promise<{ days: Day[]; refresh: Promise<{ days: Day[] } | null> }> {
|
|
const cached = (await offlineDb.days
|
|
.where('trip_id')
|
|
.equals(Number(tripId))
|
|
.sortBy('day_number' as keyof Day)) as Day[]
|
|
|
|
const refresh = (async () => {
|
|
if (!navigator.onLine) return null
|
|
try {
|
|
const result = await daysApi.list(tripId)
|
|
upsertDays(result.days)
|
|
return result
|
|
} catch {
|
|
return null
|
|
}
|
|
})()
|
|
|
|
if (cached.length > 0) return { days: cached, refresh }
|
|
|
|
const fresh = await refresh
|
|
if (!fresh) return { days: [], refresh: Promise.resolve(null) }
|
|
return { days: fresh.days, refresh: Promise.resolve(fresh) }
|
|
},
|
|
|
|
async update(tripId: number | string, dayId: number | string, data: Record<string, unknown>): Promise<{ day: Day }> {
|
|
if (!navigator.onLine) {
|
|
const existing = await offlineDb.days.get(Number(dayId))
|
|
const optimistic: Day = { ...(existing ?? {} as Day), ...(data as Partial<Day>), id: Number(dayId) }
|
|
await offlineDb.days.put(optimistic)
|
|
await mutationQueue.enqueue({
|
|
id: generateUUID(),
|
|
tripId: Number(tripId),
|
|
method: 'PUT',
|
|
url: `/trips/${tripId}/days/${dayId}`,
|
|
body: data,
|
|
resource: 'days',
|
|
})
|
|
return { day: optimistic }
|
|
}
|
|
const result = await daysApi.update(tripId, dayId, data)
|
|
offlineDb.days.put(result.day)
|
|
return result
|
|
},
|
|
}
|