import React, { createContext, useMemo, useSyncExternalStore } from 'react'; import { getTerminalFocused, getTerminalFocusState, subscribeTerminalFocus, type TerminalFocusState, } from '../core/terminal-focus-state.js'; export type { TerminalFocusState }; export type TerminalFocusContextProps = { readonly isTerminalFocused: boolean; readonly terminalFocusState: TerminalFocusState; }; const TerminalFocusContext = createContext({ isTerminalFocused: true, terminalFocusState: 'unknown', }); // eslint-disable-next-line custom-rules/no-top-level-side-effects TerminalFocusContext.displayName = 'TerminalFocusContext'; // Separate component so App.tsx doesn't re-render on focus changes. // Children are a stable prop reference, so they don't re-render either — // only components that consume the context will re-render. export function TerminalFocusProvider({ children }: { children: React.ReactNode }): React.ReactNode { const isTerminalFocused = useSyncExternalStore(subscribeTerminalFocus, getTerminalFocused); const terminalFocusState = useSyncExternalStore(subscribeTerminalFocus, getTerminalFocusState); const value = useMemo(() => ({ isTerminalFocused, terminalFocusState }), [isTerminalFocused, terminalFocusState]); return {children}; } export default TerminalFocusContext;