UNPKG

@ozen-ui/kit

Version:

React component library

95 lines (94 loc) 3.82 kB
import { __read } from "tslib"; import { useEffect } from 'react'; import { useStoredValue } from '../../../../hooks/useStoredValue'; import { isKeys } from '../../../../utils/isKeys'; import { isSingleInternalValue, isMultipleInternalValue } from '../../utils'; export var useAutocompleteBaseInputEvents = function (_a) { var multiple = _a.multiple, inputControl = _a.inputControl, valueControl = _a.valueControl, dropdownControl = _a.dropdownControl, searchControl = _a.searchControl, allowCustomValue = _a.allowCustomValue; var lastInputValue = useStoredValue(''); var observableValuesAllowCustomValueSync = (function () { if (isMultipleInternalValue(valueControl.value, multiple) || !valueControl.value) { return ''; } var withoutRawValue = {}; Object.entries(valueControl.value).forEach(function (_a) { var _b = __read(_a, 2), _key = _b[0], value = _b[1]; var key = _key; if (key === 'raw') { return; } withoutRawValue[key] = value; }); return JSON.stringify(withoutRawValue); })(); useEffect(function () { var _a; if (allowCustomValue || multiple) { return; } var value = valueControl.value; if (isSingleInternalValue(value, multiple)) { lastInputValue.current = (_a = value === null || value === void 0 ? void 0 : value.label) !== null && _a !== void 0 ? _a : ''; if (lastInputValue.current !== inputControl.value) { inputControl.setValue(null, lastInputValue.current); } } }, [observableValuesAllowCustomValueSync, allowCustomValue]); var onChange = function (event) { var value = event.target.value; // Открываем список при вводе первого символа (при условии, что список еще не открыт) if (value.length && !dropdownControl.isOpen) { dropdownControl.open(); } if (multiple) { inputControl.setValue(event, value); } if (value && !multiple) { inputControl.setValue(event, value); } if (!value && !multiple) { valueControl.setValue(event, null, { source: 'input', }); } searchControl.activate(value); }; /** Актуализация значения текстового поля после его покидания */ var onBlur = function () { if (allowCustomValue) { return; } if (inputControl.value !== lastInputValue.current) { inputControl.setValue(null, lastInputValue.current); } }; /** Открытие списка по клику на текстовом поле */ var onClick = function () { dropdownControl.toggle(); }; /** Управление элементом контроля через клавиатуру */ var onKeyDown = function (event) { var _a; if (isKeys(event, ['ArrowDown', 'ArrowUp']) && !dropdownControl.isOpen) { event.preventDefault(); dropdownControl.open(); } var value = valueControl.value; if (isMultipleInternalValue(value, multiple) && isKeys(event, ['Backspace']) && !inputControl.value) { if (value) { valueControl.setValue(event, ((_a = value[value.length - 1]) === null || _a === void 0 ? void 0 : _a.id) || null, { source: 'input', }); } } }; return { onChange: onChange, onBlur: onBlur, onClick: onClick, onKeyDown: onKeyDown, }; };