| import { useState, useEffect } from 'react'; |
| import { checkConnection } from '~/lib/api/connection'; |
|
|
| const ACKNOWLEDGED_CONNECTION_ISSUE_KEY = 'bolt_acknowledged_connection_issue'; |
|
|
| type ConnectionIssueType = 'disconnected' | 'high-latency' | null; |
|
|
| const getAcknowledgedIssue = (): string | null => { |
| try { |
| return localStorage.getItem(ACKNOWLEDGED_CONNECTION_ISSUE_KEY); |
| } catch { |
| return null; |
| } |
| }; |
|
|
| export const useConnectionStatus = () => { |
| const [hasConnectionIssues, setHasConnectionIssues] = useState(false); |
| const [currentIssue, setCurrentIssue] = useState<ConnectionIssueType>(null); |
| const [acknowledgedIssue, setAcknowledgedIssue] = useState<string | null>(() => getAcknowledgedIssue()); |
|
|
| const checkStatus = async () => { |
| try { |
| const status = await checkConnection(); |
| const issue = !status.connected ? 'disconnected' : status.latency > 1000 ? 'high-latency' : null; |
|
|
| setCurrentIssue(issue); |
|
|
| |
| setHasConnectionIssues(issue !== null && issue !== acknowledgedIssue); |
| } catch (error) { |
| console.error('Failed to check connection:', error); |
|
|
| |
| setCurrentIssue('disconnected'); |
| setHasConnectionIssues(true); |
| } |
| }; |
|
|
| useEffect(() => { |
| |
| checkStatus(); |
|
|
| const interval = setInterval(checkStatus, 10 * 1000); |
|
|
| return () => clearInterval(interval); |
| }, [acknowledgedIssue]); |
|
|
| const acknowledgeIssue = () => { |
| setAcknowledgedIssue(currentIssue); |
| setAcknowledgedIssue(currentIssue); |
| setHasConnectionIssues(false); |
| }; |
|
|
| const resetAcknowledgment = () => { |
| setAcknowledgedIssue(null); |
| setAcknowledgedIssue(null); |
| checkStatus(); |
| }; |
|
|
| return { hasConnectionIssues, currentIssue, acknowledgeIssue, resetAcknowledgment }; |
| }; |
|
|