Files
nofx/web/src/hooks/useSystemConfig.ts
shinchan-zhai fa048b44ac fix: auto re-fetch system config after invalidation
- invalidateSystemConfig() now dispatches a custom event
- useSystemConfig() listens for the event and re-fetches automatically
- Fixes stale initialized=false after register/logout causing
  incorrect redirect to SetupPage
2026-04-04 23:39:05 +08:00

43 lines
1.2 KiB
TypeScript

import { useEffect, useState, useCallback } from 'react'
import { getSystemConfig, invalidateSystemConfig, type SystemConfig } from '../lib/config'
export function useSystemConfig() {
const [config, setConfig] = useState<SystemConfig | null>(null)
const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null)
const [fetchKey, setFetchKey] = useState(0)
useEffect(() => {
let mounted = true
setLoading(true)
getSystemConfig()
.then((data) => {
if (!mounted) return
setConfig(data)
setLoading(false)
})
.catch((err: Error) => {
if (!mounted) return
console.error('Failed to fetch system config:', err)
setError(err.message)
setLoading(false)
})
return () => {
mounted = false
}
}, [fetchKey])
// Listen for invalidation events and re-fetch automatically
useEffect(() => {
const handler = () => setFetchKey((k) => k + 1)
window.addEventListener('system-config-invalidated', handler)
return () => window.removeEventListener('system-config-invalidated', handler)
}, [])
const refresh = useCallback(() => {
invalidateSystemConfig()
}, [])
return { config, loading, error, refresh }
}