UNPKG

@pinuts/bsr-uikit-relaunch

Version:

BSR UI-KIT Relaunch

180 lines (172 loc) 7.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.BSRAddressContext = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _formBuilder = require("@pinuts/form-builder"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } const defaultControllerPath = 'de.bsr.adressen.app/'; const { useFormikContext } = _formBuilder.formik; const defaultAdContext = { groupKey: 'addressSelector', restUrl: '', controllerPath: defaultControllerPath, overwriteLabels: {} }; const BSRAddressContext = exports.BSRAddressContext = /*#__PURE__*/(0, _react.createContext)(); const BSRAddressContextProvider = _ref => { let { initAddressContext, children } = _ref; const { setFieldValue, values, submitForm, isSubmitting, submitCount } = useFormikContext(); const [addressContext, setAddressContext] = (0, _react.useState)({ ...defaultAdContext, ...initAddressContext }); const [selectedRadioValue, setSelectedRadioValue] = (0, _react.useState)(null); const getControllerPath = (0, _react.useCallback)(() => { return addressContext.restUrl + addressContext.controllerPath; }, [addressContext]); const setAdContext = (0, _react.useCallback)(newAdContext => { setAddressContext(oldAdContext => { return { ...oldAdContext, ...newAdContext }; }); }, [setAddressContext]); //used in autocomplete const [selectedOptionId, setSelectedOptionId] = (0, _react.useState)(''); const [prevSelection, setPrevSelection] = (0, _react.useState)({}); const [triggerCancelCombox, setTriggerCancelCombox] = (0, _react.useState)(false); // used in plz and street selector const [showNoResultsError, setShowNoResultsError] = (0, _react.useState)(false); const [selectedStreetList, setSelectedStreetList] = (0, _react.useState)(null); // used for autoCommit const [lastCommitValue, setLastCommitValue] = (0, _react.useState)({ submitCount: -1, value: null }); const fieldKeys = (0, _react.useMemo)(() => { const groupKey = addressContext.groupKey; return { groupKey, streetFieldKey: `${groupKey}-streetSelector`, streetFieldKeyLabel: `${groupKey}-streetSelectorLabel`, houseNumberFieldKey: `${groupKey}-houseNumber`, labelKey: `${groupKey}Label`, selectedStreetAndNumberKey: `${groupKey}-streedAndNumber`, selectedStreetStreetPlz: `${groupKey}-streetPlz` }; }, [addressContext.groupKey]); (0, _react.useEffect)(() => { const currentStreetAndNumber = values[fieldKeys.selectedStreetAndNumberKey]; const currentStreet = values[fieldKeys.streetFieldKey]; const currentHouseNumber = values[fieldKeys.houseNumberFieldKey]; if (currentStreetAndNumber && currentStreet && currentHouseNumber) { if (currentStreetAndNumber !== `${currentStreet}:::${currentHouseNumber}`) { setFieldValue(fieldKeys.selectedStreetAndNumberKey, ''); } } else if (currentStreetAndNumber) { setFieldValue(fieldKeys.selectedStreetAndNumberKey, ''); } }, [setFieldValue, values, fieldKeys]); const resetContextValues = (0, _react.useCallback)(() => { Object.keys(fieldKeys).forEach(key => { setFieldValue(fieldKeys[key], undefined); }); // rest autocomplete input setSelectedOptionId(' '); setPrevSelection({}); setTriggerCancelCombox(true); setShowNoResultsError(false); setSelectedStreetList(null); setSelectedRadioValue(null); if (addressContext.doSubmitOnChange) { setLastCommitValue({ submitCount, value: undefined }); submitForm(); } }, [setFieldValue, setTriggerCancelCombox, fieldKeys, setShowNoResultsError, submitForm, addressContext.doSubmitOnChange, setLastCommitValue, submitCount]); // AdressePrüfenBtn anzeigen, wenn Straße und Hausnummer gesetzt sind const selectedStreetName = values[fieldKeys.streetFieldKey] || ''; const houseNumber = values[fieldKeys.houseNumberFieldKey] || ''; const onClickCheckAddressBtn = (0, _react.useCallback)(() => { const streetOrHouseNumber = selectedStreetName && houseNumber ? `${selectedStreetName}:::${houseNumber}` : null; setFieldValue(fieldKeys.selectedStreetAndNumberKey, streetOrHouseNumber); }, [selectedStreetName, houseNumber, setFieldValue, fieldKeys.selectedStreetAndNumberKey]); const showNextBtn = values[fieldKeys.streetFieldKey] && values[fieldKeys.houseNumberFieldKey] && !values[fieldKeys.labelKey] && (!selectedStreetList || selectedStreetList.length === 1); // if everything is filled out, then only display the address as read-only const dontShowSelector = values[fieldKeys.labelKey] && values[fieldKeys.groupKey]; const hasNewValueSinceLastCommit = () => { const curValue = values[fieldKeys.groupKey]; if (!curValue) { return false; } return lastCommitValue.submitCount === -1 || lastCommitValue.submitCount !== submitCount && lastCommitValue.value !== curValue; }; if (dontShowSelector && addressContext.doSubmitOnChange && !isSubmitting && hasNewValueSinceLastCommit()) { setLastCommitValue({ submitCount, value: values[fieldKeys.groupKey] }); window.setTimeout(() => { // need a thread change to wait the form is re-rendered before submitting // ==> react-dom.development.js:86 Warning: Cannot update a component (`Vr`) while rendering a different component submitForm(); }, 1); } const pathThroughValues = (0, _react.useMemo)(() => { return { addressContext, setAdContext, resetContextValues, selectedOptionId, setSelectedOptionId, prevSelection, setPrevSelection, triggerCancelCombox, setTriggerCancelCombox, getControllerPath, showNextBtn, onClickCheckAddressBtn, showNoResultsError, setShowNoResultsError, selectedStreetList, setSelectedStreetList, dontShowSelector, fieldKeys, selectedRadioValue, setSelectedRadioValue }; }, [addressContext, setAdContext, resetContextValues, selectedOptionId, setSelectedOptionId, prevSelection, setPrevSelection, triggerCancelCombox, setTriggerCancelCombox, getControllerPath, showNextBtn, onClickCheckAddressBtn, showNoResultsError, setShowNoResultsError, selectedStreetList, setSelectedStreetList, dontShowSelector, fieldKeys, selectedRadioValue, setSelectedRadioValue]); return /*#__PURE__*/_react.default.createElement(BSRAddressContext.Provider, { value: pathThroughValues }, children); }; BSRAddressContextProvider.propTypes = { initAddressContext: _propTypes.default.shape({ groupKey: _propTypes.default.string, restUrl: _propTypes.default.string, controllerPath: _propTypes.default.string, doSubmitOnChange: _propTypes.default.bool, overwriteLabels: _propTypes.default.object }), children: _propTypes.default.node.isRequired }; var _default = exports.default = BSRAddressContextProvider;