UNPKG

@navinc/base-react-components

Version:
68 lines 3.06 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import { jsx as _jsx } from "react/jsx-runtime"; import { useMemo, useEffect } from 'react'; import { Input } from '../input.js'; import { useField } from 'formik'; import { phoneNumberToFormattedString, phoneNumberToE164 } from '@navinc/utils'; export const createPhoneNumberValidator = ({ isRequired = false, requiredErrorMessage = 'Required', lengthErrorMessage = 'We need your full 10-digit phone number', } = {}) => (phoneNumber) => { if (isRequired && !phoneNumber) { return [requiredErrorMessage]; } if (phoneNumber && phoneNumberToFormattedString(phoneNumber).length < 12) { return [lengthErrorMessage]; } }; /** This input must be nested within Formik. It then ties it's validation and formatting through the `useField` hook * * @example * ```tsx * <Formik * initialValues={{ * phone: '' * }} * > * <PhoneNumberInput * label="Phone number" * name="phone" * isRequired * /> * </Formik> * ``` * * @deprecated This component is deprecated and will be removed in a future release. Avoid using it in new code. */ export const PhoneNumberInput = (_a) => { var { name, isRequired, onBlur, onChange, requiredErrorMessage, lengthErrorMessage } = _a, props = __rest(_a, ["name", "isRequired", "onBlur", "onChange", "requiredErrorMessage", "lengthErrorMessage"]); const memoizedValidatePhoneNumber = useMemo(() => createPhoneNumberValidator({ isRequired, requiredErrorMessage, lengthErrorMessage }), [isRequired, requiredErrorMessage, lengthErrorMessage]); const [field, meta, { setValue }] = useField({ name, validate: memoizedValidatePhoneNumber }); useEffect(() => { // Ensure initial value stored in parent form is E164 formatted setValue(phoneNumberToE164(field.value)); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return (_jsx(Input, Object.assign({ type: "text", inputMode: "tel", name: name, value: phoneNumberToFormattedString(field.value), onChange: (e) => { const { target } = e; const { value } = target; target.value = phoneNumberToFormattedString(value); setValue(phoneNumberToE164(value)); if (onChange) { onChange(e); } }, onBlur: (e) => { field.onBlur(e); if (onBlur) { onBlur(e); } }, errors: meta.touched ? meta.error : undefined, isInvalid: meta.touched && !!meta.error, hasSpaceForErrors: true }, props))); }; //# sourceMappingURL=phone-number-input.js.map