import { useEffect, useState, useEffectEvent } from 'react'; import { useSharedWebSocket } from './context'; /** * Reactive auth state with authenticate/deauthenticate actions. * Syncs across all tabs via BroadcastChannel. No-ops while the socket is null. * * @example * function Header() { * const { isAuthenticated, deauthenticate } = useSocketAuth(); * return isAuthenticated * ? * : Login; * } */ export function useSocketAuth(): { isAuthenticated: boolean; authenticate: (token: string) => void; deauthenticate: () => void; } { const socket = useSharedWebSocket(); const [isAuthenticated, setIsAuthenticated] = useState(() => socket?.isAuthenticated ?? false); const onAuthChange = useEffectEvent((authenticated: boolean) => { setIsAuthenticated(authenticated); }); useEffect(() => { if (!socket) return; setIsAuthenticated(socket.isAuthenticated); // sync current state when the socket attaches return socket.onAuthChange(onAuthChange); }, [socket]); const authenticate = useEffectEvent((token: string) => { socket?.authenticate(token); }); const deauthenticate = useEffectEvent(() => { socket?.deauthenticate(); }); return { isAuthenticated, authenticate, deauthenticate }; }