import { useState, useEffect } from 'react'; import { usePreference } from './usePreference'; /** * Get the props for a preference input that changes the value on blur * * Relies on `usePreference`, so it's using the PreferenceKeyContext * * @example * const FontSizePreferenceInput = () => { * const field = usePreferenceInput('ui.font.size', 10); * return ( *
* * *
* ); * } */ export const usePreferenceInput = (key?: string, defaultValue?: any) => { const [valueFromStore, setValueFromStore] = usePreference( key, defaultValue ); const [value, setValue] = useState(valueFromStore); useEffect(() => { setValue(valueFromStore || defaultValue); }, [valueFromStore, defaultValue]); const onChange = event => { setValue(event.target.value === '' ? defaultValue : event.target.value); }; const onBlur = () => { setValueFromStore(value); }; const onKeyDown = event => { if (event.key === 'Enter') { setValueFromStore(value); const form = event.target.form; if (form) { const index = [...form].indexOf(event.target); form.elements[index + 1]?.focus(); } event.preventDefault(); } }; return { value, onChange, onBlur, onKeyDown }; };