| 1 | import { useEffect, useRef } from "react"; |
| 2 | import { activeTabMirror } from "./activeTabMirror"; |
| 3 | |
| 4 | export function useRetiredProjectTreeUiMigration() { |
| 5 | useEffect(() => { |
| 6 | try { |
| 7 | localStorage.removeItem("projectTree:timeFilter"); |
| 8 | localStorage.removeItem("projectTree:workbenchOrganize"); |
| 9 | } catch { |
| 10 | /* localStorage unavailable */ |
| 11 | } |
| 12 | }, []); |
| 13 | } |
| 14 | |
| 15 | export function useDecisionSurfaceFocus(input: { |
| 16 | surface: string | null; |
| 17 | activeTabId?: string | null; |
| 18 | closeOverlays: () => void; |
| 19 | }) { |
| 20 | const { surface, activeTabId, closeOverlays } = input; |
| 21 | const previous = useRef<string | null>(null); |
| 22 | const surfaceRef = useRef<string | null>(surface); |
| 23 | surfaceRef.current = surface; |
| 24 | useEffect(() => { |
| 25 | if (surface) { |
| 26 | closeOverlays(); |
| 27 | previous.current = surface; |
| 28 | return; |
| 29 | } |
| 30 | const hadSurface = previous.current !== null; |
| 31 | previous.current = null; |
| 32 | if (!hadSurface) return; |
| 33 | const tabAtRelease = activeTabId; |
| 34 | const frame = requestAnimationFrame(() => { |
| 35 | if (surfaceRef.current !== null || activeTabMirror().current !== tabAtRelease) return; |
| 36 | (document.getElementById("composer-input") as HTMLTextAreaElement | null)?.focus({ preventScroll: true }); |
| 37 | }); |
| 38 | return () => cancelAnimationFrame(frame); |
| 39 | }, [activeTabId, closeOverlays, surface]); |
| 40 | } |
| 41 | |
| 42 | export function useActiveTabUiReset(input: { |
| 43 | activeTabId?: string | null; |
| 44 | setClearPending: (value: boolean) => void; |
| 45 | setInsertTarget: (value: "composer") => void; |
| 46 | }) { |
| 47 | const { activeTabId, setClearPending, setInsertTarget } = input; |
| 48 | useEffect(() => { |
| 49 | setClearPending(false); |
| 50 | setInsertTarget("composer"); |
| 51 | }, [activeTabId, setClearPending, setInsertTarget]); |
| 52 | } |
| 53 | |
| 54 | export function useVerificationRevealReset(input: { |
| 55 | activeTabId?: string | null; |
| 56 | completionSummary: unknown; |
| 57 | sessionPath?: string; |
| 58 | turnStartAt?: number | null; |
| 59 | reset: (value: null) => void; |
| 60 | }) { |
| 61 | const { activeTabId, sessionPath, turnStartAt, reset } = input; |
| 62 | useEffect(() => { reset(null); }, [activeTabId, sessionPath, reset, turnStartAt]); |
| 63 | } |
| 64 |