import { Box, Text, useInput } from "ink"; import { homedir } from "os"; import { HybridDirectoryBrowser, formatDisplayPath, } from "./onboarding/DirectoriesStep.tsx"; import { useAddDirectoryFlow } from "../hooks/useAddDirectoryFlow.ts"; import type { ExtendedKey } from "../types/ink-keys.ts"; export interface AddDirectoryDialogProps { initialPath?: string; onConfirm: (path: string, maxDepth: number, label: string) => void; onCancel: () => void; } export function AddDirectoryDialog({ initialPath, onConfirm, onCancel, }: AddDirectoryDialogProps) { const flow = useAddDirectoryFlow({ initialPath, onComplete: onConfirm, onCancel, }); const { step, selectedPath, maxDepthInput, labelInput, error, setSelectedPath, setMaxDepthInput, setLabelInput, advance, back, } = flow; useInput((input, key) => { const extKey = key as unknown as ExtendedKey; // Browse mode is handled entirely by HybridDirectoryBrowser if (step === "browse") return; if (key.escape) { back(); return; } if (key.return) { advance(); return; } if (step === "maxDepth") { if (extKey.backspace || extKey.delete) { setMaxDepthInput(maxDepthInput.slice(0, -1)); } else if (/^[0-9]$/.test(input)) { setMaxDepthInput(maxDepthInput + input); } } else if (step === "label") { if (extKey.backspace || extKey.delete) { setLabelInput(labelInput.slice(0, -1)); } else if (input.length === 1) { setLabelInput(labelInput + input); } } }); return ( Add Directory {step === "browse" && ( )} {step === "maxDepth" && ( Max scan depth (0-10, default 2): {"> "} {maxDepthInput} _ Path: {formatDisplayPath(selectedPath || "")} {error && {error}} Enter: continue Esc: back to browser )} {step === "label" && ( Label (optional, press Enter to skip): {"> "} {labelInput} _ Path: {formatDisplayPath(selectedPath || "")} Depth: {maxDepthInput} {error && {error}} Enter: confirm Esc: back to depth )} ); }