ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
53 lines (46 loc) • 1.49 kB
text/typescript
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 (
* <div>
* <label for="font-size">Font size</label>
* <input id="font-size" {...field} />
* </div>
* );
* }
*/
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 };
};