import { width } from "@davidsouther/jiffies/lib/esm/dom/css/sizing.js"; import { useCallback, useState } from "react"; import { useStateInitializer } from "./react.js"; import { Action } from "@nand2tetris/simulator/types.js"; const Mode = { VIEW: 0, EDIT: 1 }; export const InlineEdit = (props: { mode?: keyof typeof Mode; value: string; highlight: boolean; onChange: Action; onFocus?: () => void; }) => { const [mode, setMode] = useState(props.mode ?? Mode.VIEW); const [value, setValue] = useStateInitializer(props.value); const render = () => { switch (mode) { case Mode.EDIT: return edit(); case Mode.VIEW: return view(); default: return ; } }; const view = () => (
{ setMode(Mode.EDIT); }} > {value} 
); const doSelect = useCallback( (ref: HTMLInputElement | null) => ref?.select(), [], ); const doChange = useCallback( (target: HTMLInputElement) => { setMode(Mode.VIEW); setValue(target.value ?? ""); props.onChange(target.value ?? ""); }, [props, setMode, setValue], ); const edit = () => { const edit = ( doChange(target)} onKeyPress={({ key, target }) => { if (key === "Enter") { doChange(target as HTMLInputElement); } }} type="text" defaultValue={value} /> ); return edit; }; return render(); }; export default InlineEdit;