import * as editable from "@zag-js/editable"; import { normalizeProps, useMachine } from "@zag-js/react"; import clsx from "clsx"; import * as React from "react"; import { useGetKey } from "../../hooks"; import { useComposedRefs } from "../../utils/mergeRefs"; type EditableProps = Omit< React.HTMLProps, "onSubmit" | "value" | "defaultValue" > & { autoResize?: boolean; value?: string; onSubmit: (value: string) => void; "data-id"?: string; }; const EditableContext = React.createContext(undefined as any); const useEditableContext = () => React.useContext(EditableContext); export const Editable = ({ className, value, children, disabled, onSubmit, autoResize = true, ref, ...props }: EditableProps) => { const key = useGetKey(props); const service = useMachine(editable.machine, { defaultValue: value, id: key, disabled: disabled, selectOnFocus: true, autoResize, onValueCommit: (details) => { onSubmit(details.value); }, }); const api = editable.connect(service, normalizeProps); return (
{children}
); }; Editable.EditablePreview = ({ className, ...props }) => { const api = useEditableContext(); return ( ); }; Editable.EditableInput = ({ className, ref, ...props }) => { const inputRef = React.useRef(null); const api = useEditableContext(); React.useEffect(() => { if (inputRef.current && api.editing) { window.setTimeout(() => { // console.log("api.editing", api.editing, inputRef.current); inputRef.current?.focus(); }, 100); } }, [api.editing]); return ( ); };