import { useEffect, useRef, useState } from 'react';
function toDraftValue(value, fallback = '') {
if (value === undefined || value === null) {
return fallback;
}
return String(value);
}
function useDraftValue(value, fallback, onCommit) {
const [draft, setDraft] = useState(() => toDraftValue(value, fallback));
const isEditingRef = useRef(false);
const externalValue = toDraftValue(value, fallback);
useEffect(() => {
if (!isEditingRef.current && draft !== externalValue) {
setDraft(externalValue);
}
}, [draft, externalValue]);
const change = (nextValue) => {
setDraft(nextValue);
onCommit(nextValue);
};
return {
value: draft,
onFocus: () => {
isEditingRef.current = true;
},
onBlur: () => {
isEditingRef.current = false;
onCommit(draft);
},
onChange: (event) => change(event.target.value),
};
}
export function NodeDraftInput({ value, fallback = '', onCommit, ...props }) {
const draftProps = useDraftValue(value, fallback, onCommit);
return ;
}
export function NodeDraftTextarea({ value, fallback = '', onCommit, ...props }) {
const draftProps = useDraftValue(value, fallback, onCommit);
return ;
}