814eeadd1f
useSyncIndicator gibt die Unsubscribe-Funktion von subscribeToSyncState zurück. conn-status-Klassen berücksichtigen jetzt auch den aktiven Sync-Lauf (syncing) statt nur die Queue-Länge. Co-authored-by: Cursor <cursoragent@cursor.com>
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
import { useLiveQuery } from 'dexie-react-hooks'
|
|
import { db } from '../services/db.js'
|
|
import { subscribeToSyncState } from '../services/sync.js'
|
|
|
|
export type SyncConnStatusVariant = 'offline' | 'syncing' | 'pending' | 'online'
|
|
|
|
/** Maps sync/online state to conn-status CSS modifier classes. */
|
|
export function syncConnStatusClassName(
|
|
online: boolean,
|
|
showSpinner: boolean,
|
|
pendingCount: number
|
|
): string {
|
|
if (!online) return 'conn-status offline'
|
|
if (showSpinner) return 'conn-status syncing'
|
|
if (pendingCount > 0) return 'conn-status warning'
|
|
return 'conn-status online'
|
|
}
|
|
|
|
/** Sync queue depth and whether a sync pass is running (for header indicators). */
|
|
export function useSyncIndicator(logbookId?: string | null) {
|
|
const [isSyncing, setIsSyncing] = useState(false)
|
|
|
|
const pendingCount =
|
|
useLiveQuery(
|
|
() =>
|
|
logbookId
|
|
? db.syncQueue.where({ logbookId }).count()
|
|
: db.syncQueue.count(),
|
|
[logbookId]
|
|
) ?? 0
|
|
|
|
useEffect(() => {
|
|
return subscribeToSyncState(setIsSyncing)
|
|
}, [])
|
|
|
|
const showSpinner = isSyncing
|
|
const showPendingWarning = pendingCount > 0 && !isSyncing
|
|
|
|
return {
|
|
isSyncing,
|
|
pendingCount,
|
|
showSpinner,
|
|
showPendingWarning,
|
|
connStatusClassName: (online: boolean) =>
|
|
syncConnStatusClassName(online, showSpinner, pendingCount)
|
|
}
|
|
}
|