import { type RefObject, useEffect, useMemo, useRef, useState } from "react"; import type { DirectorySession } from "../workspace/types"; const focusableSelector = 'button:not(:disabled), input:not(:disabled), [href], [tabindex]:not([tabindex="-1"])'; function sessionTitle(session: DirectorySession) { return session.name ?? session.firstMessage ?? "Untitled session"; } function messageCountLabel(count: number) { return `${count} ${count === 1 ? "message" : "messages"}`; } function matchesQuery(session: DirectorySession, query: string) { return [session.name, session.firstMessage, session.id].some((value) => value?.toLocaleLowerCase().includes(query), ); } function SessionRow({ session, onOpen, }: { session: DirectorySession; onOpen: (session: DirectorySession) => void; }) { const showPreview = Boolean( session.name && session.firstMessage && session.firstMessage !== session.name, ); return (
  • ); } function SessionResults({ sessions, query, onOpen, }: { sessions: DirectorySession[]; query: string; onOpen: (session: DirectorySession) => void; }) { if (sessions.length === 0) return

    No saved sessions match “{query}”.

    ; return ( ); } function useDialogFocus( dialogRef: RefObject, searchRef: RefObject, onClose: () => void, ) { const openerRef = useRef( document.activeElement as HTMLElement | null, ); useEffect(() => { const dialog = dialogRef.current; const controls = () => [ ...(dialog?.querySelectorAll(focusableSelector) ?? []), ]; searchRef.current?.focus(); const keydown = (event: KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); onClose(); return; } if (event.key !== "Tab") return; const focusable = controls(); const first = focusable[0]; const last = focusable[focusable.length - 1]; if (!first || !last) return; if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); } else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); } }; window.addEventListener("keydown", keydown); return () => { window.removeEventListener("keydown", keydown); openerRef.current?.focus(); }; }, [dialogRef, onClose, searchRef]); } export function SessionPicker({ sessions, onOpen, onClose, }: { sessions: DirectorySession[]; onOpen: (session: DirectorySession) => void; onClose: () => void; }) { const [query, setQuery] = useState(""); const dialogRef = useRef(null); const searchRef = useRef(null); const normalizedQuery = query.trim().toLocaleLowerCase(); const filteredSessions = useMemo( () => sessions.filter((session) => matchesQuery(session, normalizedQuery)), [normalizedQuery, sessions], ); useDialogFocus(dialogRef, searchRef, onClose); const resultLabel = `${filteredSessions.length} saved session${filteredSessions.length === 1 ? "" : "s"}`; return (

    Saved sessions

    setQuery(event.target.value)} placeholder="Search by name, message, or ID" aria-controls="session-results" />

    {sessions.length ? resultLabel : "No saved sessions"}

    {sessions.length === 0 ? (

    No saved sessions for this directory.

    ) : ( )}
    ); }