import { useState } from 'react'; import { useDaemonHealth } from '../../hooks/useDaemonHealth'; import { useDaemonLifecycle } from '../../hooks/useDaemonLifecycle'; import { useT } from '../../lib/i18n/I18nContext'; import { useCoreState } from '../../providers/CoreStateProvider'; import { LATEST_APP_DOWNLOAD_URL } from '../../utils/config'; import { openUrl } from '../../utils/openUrl'; interface ServiceBlockingGateProps { children: React.ReactNode; } const ServiceBlockingGate = ({ children }: ServiceBlockingGateProps) => { const { t } = useT(); const { snapshot } = useCoreState(); const daemonHealth = useDaemonHealth(); const daemonLifecycle = useDaemonLifecycle(); const [isRestarting, setIsRestarting] = useState(false); const [restartError, setRestartError] = useState(null); const hasSession = Boolean(snapshot.sessionToken); const shouldShowRecoveryPrompt = hasSession && daemonLifecycle.maxAttemptsReached && daemonHealth.status !== 'running'; const handleRetry = async () => { setIsRestarting(true); setRestartError(null); try { const restarted = await daemonHealth.restartDaemon(); if (restarted) { daemonLifecycle.resetRetries(); return; } setRestartError(t('daemon.serviceBlockingGate.retryFailed')); } catch { setRestartError(t('daemon.serviceBlockingGate.retryFailed')); } finally { setIsRestarting(false); } }; const handleDownloadLatest = async () => { await openUrl(LATEST_APP_DOWNLOAD_URL); }; if (!shouldShowRecoveryPrompt) { return <>{children}; } return ( <> {children}

{t('daemon.serviceBlockingGate.title')}

{t('daemon.serviceBlockingGate.body')}

{t('daemon.serviceBlockingGate.downloadHint')}

{restartError &&

{restartError}

}
); }; export default ServiceBlockingGate;