Files
metabuilder/frontends/codegen/src/hooks/use-persistence.ts
T
2026-03-09 22:30:41 +00:00

86 lines
1.9 KiB
TypeScript

import { useEffect, useState } from 'react'
import { useAppSelector } from '@/store'
import {
getSyncMetrics,
resetSyncMetrics,
subscribeSyncMetrics
} from '@/store/middleware/syncMonitorMiddleware'
import {
configureAutoSync,
getAutoSyncStatus,
triggerAutoSync
} from '@/store/middleware/autoSyncMiddleware'
interface PersistenceStatus {
enabled: boolean
lastSyncTime: number | null
syncStatus: 'idle' | 'syncing' | 'success' | 'error'
error: string | null
dbalConnected: boolean
}
interface SyncMetrics {
totalOperations: number
successfulOperations: number
failedOperations: number
lastOperationTime: number
averageOperationTime: number
}
interface AutoSyncStatus {
enabled: boolean
lastSyncTime: number
changeCounter: number
nextSyncIn: number | null
}
export function usePersistence() {
const syncState = useAppSelector((state) => state.dbal)
const [metrics, setMetrics] = useState<SyncMetrics>(getSyncMetrics())
const [autoSyncStatus, setAutoSyncStatus] = useState<AutoSyncStatus>(getAutoSyncStatus())
useEffect(() => {
const unsubscribe = subscribeSyncMetrics((newMetrics) => {
setMetrics(newMetrics)
})
const statusTimer = setInterval(() => {
setAutoSyncStatus(getAutoSyncStatus())
}, 1000)
return () => {
unsubscribe()
clearInterval(statusTimer)
}
}, [])
const status: PersistenceStatus = {
enabled: true,
lastSyncTime: syncState.lastSyncedAt,
syncStatus: syncState.status,
error: syncState.error,
dbalConnected: syncState.dbalConnected,
}
const resetMetrics = () => {
resetSyncMetrics()
}
const configureAutoSyncSettings = (config: any) => {
configureAutoSync(config)
}
const syncNow = async () => {
await triggerAutoSync()
}
return {
status,
metrics,
autoSyncStatus,
resetMetrics,
configureAutoSync: configureAutoSyncSettings,
syncNow,
}
}