@navikt/ds-react
Version:
React components from the Norwegian Labour and Welfare Administration.
64 lines • 3.17 kB
JavaScript
import React, { useCallback, useMemo, useRef, useState } from "react";
import { createContext } from "../../../util/create-context.js";
import { useClientLayoutEffect } from "../../../util/hooks/index.js";
import { useFormField } from "../../useFormField.js";
const [InputContextProvider, useInputContext] = createContext({
name: "InputContext",
errorMessage: "useInputContext must be used within an InputContextProvider",
});
const InputProvider = ({ children, value: props }) => {
const { defaultValue = "", description, disabled, readOnly, error, errorId, id: externalId, value: externalValue, onChange: externalOnChange, onClear, shouldAutocomplete, size, } = props;
const formFieldProps = useFormField({
description,
disabled,
readOnly,
error,
errorId,
id: externalId,
size,
}, "comboboxfield");
const inputRef = useRef(null);
const toggleOpenButtonRef = useRef(null);
const [internalValue, setInternalValue] = useState(defaultValue);
const [hideCaret, setHideCaret] = useState(false);
const [anchorRef, setAnchorRef] = useState(null);
const value = useMemo(() => String(externalValue !== null && externalValue !== void 0 ? externalValue : internalValue), [externalValue, internalValue]);
const [searchTerm, setSearchTerm] = useState(value);
const onChange = useCallback((newValue) => {
externalValue !== null && externalValue !== void 0 ? externalValue : setInternalValue(newValue);
setSearchTerm(newValue);
externalOnChange === null || externalOnChange === void 0 ? void 0 : externalOnChange(newValue);
}, [externalValue, externalOnChange]);
const clearInput = useCallback((event) => {
onClear === null || onClear === void 0 ? void 0 : onClear(event);
externalOnChange === null || externalOnChange === void 0 ? void 0 : externalOnChange("");
setInternalValue("");
setSearchTerm("");
}, [externalOnChange, onClear]);
const focusInput = useCallback(() => {
var _a, _b;
(_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.call(_a);
}, []);
useClientLayoutEffect(() => {
var _a, _b;
if (shouldAutocomplete && inputRef && value !== searchTerm) {
(_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.setSelectionRange) === null || _b === void 0 ? void 0 : _b.call(_a, searchTerm.length, value.length);
}
}, [value, searchTerm, shouldAutocomplete]);
const contextValue = Object.assign(Object.assign({}, formFieldProps), { clearInput,
error,
focusInput,
inputRef,
value, setValue: setInternalValue, onChange,
searchTerm,
setSearchTerm,
shouldAutocomplete,
toggleOpenButtonRef,
hideCaret,
setHideCaret,
anchorRef,
setAnchorRef });
return (React.createElement(InputContextProvider, Object.assign({}, contextValue), children));
};
export { InputProvider as InputContextProvider, useInputContext };
//# sourceMappingURL=Input.context.js.map