import { useEffect, useState } from "preact/hooks" import { validName } from "../../lib/files" import FormInput from "../FormInput" import { Popover, PopoverButtonRow } from "../Popover" type Props = { title: string initial?: string pending: boolean error?: string onSave: (name: string) => Promise onClose: () => void } export function NameDialog({ title, initial = "", pending, error, onSave, onClose }: Props) { const [name, setName] = useState(initial) const save = async () => { if (!pending && validName(name) && (await onSave(name))) onClose() } useEffect(() => { const listener = (event: KeyboardEvent) => { if (event.key === "Escape" && !pending) onClose() } window.addEventListener("keydown", listener) return () => window.removeEventListener("keydown", listener) }, [pending, onClose]) return (

{title}

setName(event.currentTarget.value)} /> {error &&

{error}

}
void save(), pending || !validName(name)], ["Cancel", onClose, pending], ]} />
) }