@pinuts/bsr-uikit-relaunch
Version:
BSR UI-KIT Relaunch
180 lines (172 loc) • 7.9 kB
JavaScript
;
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;