UNPKG

@navinc/base-react-components

Version:
53 lines 4.52 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, jsxs as _jsxs } from "react/jsx-runtime"; import { global, loadScript, noop } from '@navinc/utils'; import { useEffect, useRef } from 'react'; import styled from 'styled-components'; import { Copy } from './copy.js'; import { Err, Errors, Field, FieldWrapper, Input, Label } from './form-elements/shared.js'; const handlePreventSubmitOnEnter = (keyDownEvent) => { if (keyDownEvent.keyCode === 13) keyDownEvent.preventDefault(); }; export const AddressInput = (_a) => { var { className, label, hasSpaceForErrors, isInvalid, value, required, type, errors = [], lede = '', onAddressSelected = noop, touched, placeholder = 'Enter a location' } = _a, props = __rest(_a, ["className", "label", "hasSpaceForErrors", "isInvalid", "value", "required", "type", "errors", "lede", "onAddressSelected", "touched", "placeholder"]); const inputRef = useRef(); useEffect(() => { var _a, _b, _c, _d; Promise.resolve((_d = (_c = (_b = (_a = global === null || global === void 0 ? void 0 : global.google) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.places) === null || _c === void 0 ? void 0 : _c.Autocomplete) !== null && _d !== void 0 ? _d : loadScript('https://maps.googleapis.com/maps/api/js?key=AIzaSyAvfE0mS4qeMdHm2fsIfE2XowJj6XG2pW8&libraries=places').then(() => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = global === null || global === void 0 ? void 0 : global.google) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.places) === null || _c === void 0 ? void 0 : _c.Autocomplete) !== null && _d !== void 0 ? _d : Promise.reject(new Error('Error loading GoogleMaps script')); })) .then((Autocomplete) => { const autocomplete = new Autocomplete(inputRef.current, { types: ['address'], componentRestrictions: { country: 'us' }, }); autocomplete.addListener('place_changed', () => { const place = autocomplete.getPlace(); // bail if there is a problem getting data from the api if (!place || !Array.isArray(place.address_components)) return; const { locality: city = '', administrative_area_level_1: state = '', postal_code: zip = '', street_number: streetNumber = '', route: street = '', street1 = `${streetNumber} ${street}`.trim(), } = Object.assign({}, ...place.address_components .filter(({ types: [type] }) => ['street_number', 'route', 'locality', 'administrative_area_level_1', 'postal_code'].includes(type)) .map(({ types: [type], long_name: longName, short_name: shortName }) => ({ [type]: ['route', 'locality'].includes(type) ? longName : shortName, }))); onAddressSelected({ city, state, street1, zip }); }); }) .catch((err) => console.error(err)); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return (_jsxs(FieldWrapper, Object.assign({ className: className }, { children: [lede && _jsx(Copy, Object.assign({ bold: true }, { children: lede })), _jsxs(Field, Object.assign({ "data-heap-redact-text": "true", className: "js-private", isVisited: touched || !!value || !!placeholder, onKeyDown: handlePreventSubmitOnEnter }, { children: [_jsx(Input, Object.assign({ ref: inputRef, type: type, required: required, value: value, isInvalid: isInvalid, placeholder: placeholder }, props)), _jsx(Label, Object.assign({ required: required }, { children: label }))] })), _jsx(Errors, Object.assign({ hasSpaceForErrors: hasSpaceForErrors }, { children: !!errors.length && errors.map((err, i) => _jsx(Err, { children: err }, `err-${i}`)) }))] }))); }; const StyledAddressInput = styled(AddressInput).withConfig({ displayName: "brc-sc-StyledAddressInput", componentId: "brc-sc-trxfzq" }) ``; export default StyledAddressInput; //# sourceMappingURL=address-input.js.map