UNPKG

@procraft/widget-order

Version:

Order widget for landing

233 lines 18.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; 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; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.calcPriceWithDiscount = void 0; const react_1 = __importStar(require("react")); const Button_1 = __importDefault(require("../../../components/Button")); const OldPrice_1 = __importDefault(require("../../../components/OldPrice")); const colors_1 = require("../../../constants/colors"); const useOrderLink_1 = require("../../../hooks/useOrderLink"); const utils_1 = require("../../../utils"); const styles_1 = require("./styles"); const PriceFormat_1 = require("../../../PriceFormat"); /** * Считаем стоимость с учетом скидки */ const calcPriceWithDiscount = (price, sale) => { if (!sale || !sale.benefitAmount || !sale.benefitUnit) { return 0; } /** * Конечная сумма с учетом скидки */ let totalPriceWithDiscount = price; if (sale.benefitUnit === 'Percent') { totalPriceWithDiscount = price * ((100 - sale.benefitAmount) / 100); } else { totalPriceWithDiscount = price - sale.benefitAmount; } if (totalPriceWithDiscount < 0) { totalPriceWithDiscount = 0; } return Math.round(totalPriceWithDiscount); }; exports.calcPriceWithDiscount = calcPriceWithDiscount; /** * Скидка */ const Sale = (_a) => { var _b, _c; var { catalogItem, sale, orderLink, fieldsValueSelected, bgColor, buttonColor, buttonTextColor, titleTextColor } = _a, other = __rest(_a, ["catalogItem", "sale", "orderLink", "fieldsValueSelected", "bgColor", "buttonColor", "buttonTextColor", "titleTextColor"]); const currencyPrefix = (0, utils_1.getCurrencyPrefix)(((_b = catalogItem.master) === null || _b === void 0 ? void 0 : _b.currency) || ''); const currencySuffix = (0, utils_1.getCurrencySuffix)(((_c = catalogItem.master) === null || _c === void 0 ? void 0 : _c.currency) || ''); const { canOrder, items, totalPriceOriginal, totalPrice, saleFieldsValueSelected, } = (0, react_1.useMemo)(() => { /** * Конечный набор заказываемых филдов */ const saleFieldsValueSelected = []; /** * Общая сумма */ let totalPrice = 0; let totalPriceOriginal = 0; /** * Можно ли сделать заказ */ let canOrder = true; const items = []; sale.benefitItems.forEach((n, index) => { /** * В каждом элементе есть свой набор fieldValues. * Из этого набора надо выбрать те, что указаны в fieldsValueSelected. * Если таких нет, то берем тогда дефолтные выбранные в самом элементе. */ var _a, _b, _c, _d; let itemFieldValues = ((_a = n.fieldValues) === null || _a === void 0 ? void 0 : _a.filter((i) => fieldsValueSelected.findIndex((f) => f.uid === i.uid) !== -1)) || []; /** * Если не был получен ни один элемент, то берем дефолтные */ if (!itemFieldValues.length) { const itemFieldValueDefault = (_b = n.fieldValues) === null || _b === void 0 ? void 0 : _b.find((f) => f.isSelected === true); if (itemFieldValueDefault) { /** * Если есть дефолтный элемент и в нем нет свободных мест, то пропускаем его */ if (itemFieldValueDefault.availableCount !== 0) { itemFieldValues.push(itemFieldValueDefault); } } else { /** * Если не был найден ни один элемент, то берем дефолтный селектед и находим любой * элемент из той же группы и с доступный для заказа */ if (!itemFieldValues.length) { const defaultSelected = (_c = n.fieldValues) === null || _c === void 0 ? void 0 : _c.find((f) => f.isSelected === true); if (defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.groupName) { const firstAvailable = (_d = n.fieldValues) === null || _d === void 0 ? void 0 : _d.find((f) => f.availableCount === null || (f.availableCount || 0) > 0); if (firstAvailable) { itemFieldValues = [firstAvailable]; } } } } } /** * Если нет ни одного итогового филда, то пропускаем элемент */ if (!itemFieldValues.length) { canOrder = false; return; } /** * Считаем цены по каждому выбранному филду элемента */ let price = 0; let priceOrigin = 0; itemFieldValues.forEach((fieldValue) => { /** * Если нет мест, заказать курс нельзя */ if (typeof fieldValue.availableCount === 'number' && fieldValue.availableCount < 1) { canOrder = false; return; } price += fieldValue.extraPay; priceOrigin += fieldValue.extraPayOriginal || fieldValue.extraPay; /** * Добавляем элемент в ссылку */ saleFieldsValueSelected.push(fieldValue); }); const priceWithDiscount = (0, exports.calcPriceWithDiscount)(price, sale); totalPrice += priceWithDiscount; totalPriceOriginal += priceOrigin; items.push(react_1.default.createElement("span", { key: n.id, className: "item" }, react_1.default.createElement("span", { className: "item--name" }, index > 0 ? '+ ' : '', n.name), ' ', priceWithDiscount && (react_1.default.createElement(PriceFormat_1.PriceFormat, { prefix: currencyPrefix, suffix: currencySuffix, value: price })))); }); return { canOrder, items, totalPriceOriginal, totalPrice, saleFieldsValueSelected, }; }, [fieldsValueSelected, sale, currencyPrefix, currencySuffix]); const uri = (0, useOrderLink_1.useOrderLink)({ catalogItem, orderLink, /** * Сюда передаем именно филды из скидки, а не внешнийй выбранный элемент */ fieldsValueSelected: saleFieldsValueSelected, sale, }); return (0, react_1.useMemo)(() => { var _a; if (!items.length || !canOrder || !((_a = catalogItem.sales) === null || _a === void 0 ? void 0 : _a.length) || !sale || !sale.benefitAmount || !sale.benefitUnit || !sale.benefitItems.length) { return null; } return (react_1.default.createElement(styles_1.SaleStyled, Object.assign({ bgColor: bgColor }, other), react_1.default.createElement("div", null, react_1.default.createElement("svg", { width: "30", height: "30", viewBox: "0 0 30 30", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, react_1.default.createElement("path", { d: "M11.1749 0.152262C11.2886 0.158122 11.3812 0.181559 11.4773 0.20031C11.6694 0.235467 11.8558 0.288201 12.0562 0.35031C12.4558 0.475701 12.8964 0.649137 13.3347 0.81906C13.7729 0.988983 14.2019 1.1589 14.5394 1.28196C14.7116 1.34524 14.8968 1.38509 15.0023 1.40969H15.0046C15.1101 1.38509 15.2905 1.3429 15.4593 1.28196C15.7968 1.15891 16.2292 0.986646 16.6675 0.81672C17.1057 0.645627 17.5534 0.47688 17.953 0.35148C18.1522 0.288198 18.335 0.240153 18.5284 0.204996C18.7206 0.169839 18.8941 0.104214 19.2608 0.212027C19.6265 0.319841 19.7437 0.466325 19.8866 0.599927C20.0296 0.734693 20.155 0.877661 20.2898 1.0382C20.5581 1.35929 20.8441 1.74134 21.1206 2.12219C21.3972 2.50187 21.6655 2.88275 21.8823 3.16985C21.9913 3.31282 22.1214 3.44758 22.1976 3.5261C22.3007 3.56242 22.4788 3.62688 22.6569 3.6679C23.0073 3.74641 23.4632 3.83196 23.9237 3.92571C24.3843 4.01946 24.8483 4.11907 25.2515 4.22922C25.453 4.2843 25.6394 4.34406 25.821 4.41789C26.0026 4.49289 26.1773 4.53742 26.4269 4.82688C26.6776 5.11516 26.6964 5.29329 26.7444 5.4843C26.7913 5.67415 26.8241 5.86749 26.8499 6.07494C26.9026 6.49095 26.9331 6.96321 26.9601 7.43196C26.987 7.90188 27.0093 8.36478 27.0374 8.72337C27.0515 8.90501 27.0913 9.08901 27.1124 9.1968C27.1792 9.28352 27.2917 9.43352 27.4183 9.56124C27.6702 9.81788 28.0089 10.1366 28.3464 10.4648C28.6827 10.7917 29.0202 11.1292 29.3003 11.4398C29.4398 11.5956 29.5628 11.7409 29.6753 11.9015C29.7878 12.062 29.9179 12.2015 29.9718 12.5788C30.0257 12.9573 29.9355 13.1179 29.8734 13.3042C29.8112 13.4894 29.7362 13.6652 29.646 13.8538C29.4655 14.2312 29.2323 14.6495 29.0015 15.0585C28.7706 15.4675 28.5398 15.8718 28.3698 16.1882C28.2843 16.3464 28.2198 16.5222 28.18 16.6241V16.6265C28.1894 16.7366 28.2034 16.9253 28.2409 17.1011C28.3148 17.4526 28.4202 17.9015 28.5269 18.3585C28.6335 18.8167 28.7401 19.2761 28.8069 19.6897C28.8409 19.896 28.8667 20.0893 28.8749 20.285C28.8831 20.4807 28.9183 20.6624 28.7601 21.0104C28.6019 21.3585 28.4366 21.4499 28.2843 21.5729C28.1308 21.6948 27.9714 21.8038 27.7933 21.914C27.437 22.1331 27.0187 22.3558 26.6026 22.5749C26.1866 22.794 25.7706 23.012 25.4566 23.1866C25.296 23.2757 25.146 23.3882 25.0593 23.4503C25.0077 23.5476 24.9198 23.7104 24.8566 23.8769C24.7288 24.2132 24.5777 24.655 24.4195 25.098C24.2613 25.5409 24.0995 25.9827 23.932 26.3671C23.8488 26.5593 23.7656 26.7362 23.6659 26.905C23.5663 27.0738 23.4925 27.2484 23.1714 27.4546C22.8503 27.6609 22.671 27.6503 22.4753 27.6702C22.2808 27.6901 22.0863 27.696 21.8765 27.6925C21.4582 27.6843 20.9824 27.6468 20.5136 27.6069C20.0449 27.5671 19.5831 27.5179 19.2245 27.4956C19.0452 27.4839 18.8589 27.498 18.7499 27.505C18.655 27.5577 18.4898 27.6491 18.3421 27.7581C18.0527 27.9714 17.6859 28.2609 17.3132 28.5468C16.9405 28.8339 16.5655 29.1186 16.2187 29.3507C16.0453 29.4667 15.8777 29.5687 15.7019 29.6565C15.5273 29.7444 15.3773 29.8522 14.9952 29.8522C14.6132 29.8522 14.4632 29.7468 14.2886 29.6577C14.114 29.5698 13.9534 29.4667 13.78 29.3507C13.4319 29.1175 13.0487 28.8315 12.6761 28.5456C12.3034 28.2585 11.9378 27.9714 11.6483 27.7581C11.5042 27.6515 11.3401 27.5601 11.2452 27.505C11.1362 27.5003 10.9487 27.4874 10.7659 27.4991C10.4073 27.5226 9.94908 27.5612 9.48033 27.6023C9.01158 27.6421 8.53698 27.6784 8.1186 27.6866C7.90883 27.6901 7.71783 27.6901 7.52328 27.6702C7.32873 27.6503 7.14009 27.6573 6.8178 27.4511C6.49671 27.2448 6.43224 27.0726 6.33264 26.9038C6.23304 26.7351 6.14866 26.557 6.06545 26.3659C5.89905 25.9827 5.73851 25.5421 5.58029 25.0991C5.42209 24.6561 5.26856 24.2155 5.14085 23.8792C5.07523 23.7081 4.98265 23.5417 4.93226 23.4456C4.8432 23.3812 4.69437 23.2698 4.53617 23.1819C4.22093 23.0026 3.80609 22.7894 3.39008 22.569C2.97524 22.3499 2.56157 22.1261 2.20649 21.9069C2.02837 21.7968 1.86431 21.6901 1.71197 21.5683C1.55845 21.4452 1.3979 21.355 1.23971 21.0069C1.08034 20.6601 1.11549 20.4749 1.12369 20.2792C1.1319 20.0823 1.15768 19.8936 1.19166 19.6874C1.25846 19.2737 1.36393 18.8085 1.4694 18.3503C1.57604 17.8921 1.68033 17.4468 1.75416 17.094C1.79166 16.9136 1.8069 16.7249 1.81744 16.6171C1.7776 16.514 1.70846 16.3405 1.62408 16.1823C1.45416 15.8659 1.22331 15.464 0.992435 15.055C0.761576 14.6448 0.531876 14.2253 0.351427 13.848C0.261192 13.6593 0.181501 13.4847 0.118223 13.2984C0.0561142 13.1132 -0.0259171 12.9503 0.0291615 12.5718C0.0830669 12.1933 0.210802 12.0597 0.323301 11.9003C0.435801 11.7398 0.561192 11.5886 0.70064 11.4327C0.980717 11.1222 1.31354 10.7917 1.65104 10.4648C1.98854 10.1366 2.32721 9.81435 2.57918 9.55773C2.70575 9.43 2.82059 9.27648 2.88737 9.18975C2.90964 9.08311 2.94948 8.9003 2.96354 8.721C2.99284 8.36241 3.01042 7.89951 3.03737 7.42959C3.06432 6.96084 3.09479 6.48273 3.14753 6.06786C3.17331 5.86044 3.20729 5.6706 3.25534 5.47959C3.30339 5.28975 3.31745 5.10927 3.56824 4.821C3.81902 4.53272 4.00066 4.48467 4.18114 4.41084C4.36278 4.33701 4.55146 4.27959 4.753 4.22451C5.15614 4.11319 5.61784 4.01709 6.0784 3.92334C6.53896 3.83077 6.99715 3.74405 7.34755 3.66553C7.52216 3.62569 7.69795 3.56006 7.80223 3.52256H7.8034V3.52139C7.8784 3.44287 8.00731 3.3128 8.1163 3.16982C8.33427 2.88271 8.60965 2.50184 8.88622 2.12216C9.16279 1.74131 9.4417 1.35926 9.71005 1.03817C9.84364 0.877621 9.9749 0.734659 10.1179 0.599899C10.2608 0.466306 10.3757 0.317476 10.7425 0.210829C10.9253 0.156922 11.0612 0.145204 11.1749 0.152236L11.1749 0.152262ZM19.4144 9.00826C17.775 9.00826 16.4261 10.3594 16.4261 11.9989C16.4261 13.6384 17.775 14.9895 19.4144 14.9895C21.0539 14.9895 22.3968 13.6384 22.3968 11.9989C22.3968 10.3594 21.0539 9.00826 19.4144 9.00826ZM12.6116 9.19459V9.19576C12.2753 9.1981 11.9671 9.38092 11.8019 9.6739C11.6378 9.96687 11.6425 10.3266 11.8159 10.6149L16.5361 18.7935C16.6568 19.0162 16.8619 19.1791 17.1045 19.2482C17.347 19.3173 17.6072 19.2845 17.8263 19.1591C18.0454 19.0337 18.2048 18.8251 18.2681 18.5802C18.3302 18.3353 18.2927 18.0763 18.1615 17.8595L13.4353 9.68093C13.2701 9.38093 12.9548 9.1946 12.6115 9.19577L12.6116 9.19459ZM19.4144 10.8833C20.0402 10.8833 20.5218 11.3719 20.5218 11.9989C20.5218 12.6247 20.0402 13.1122 19.4144 13.1122C18.7886 13.1122 18.3011 12.6247 18.3011 11.9989C18.3011 11.3731 18.7886 10.8833 19.4144 10.8833ZM10.5632 14.399C8.92377 14.399 7.57494 15.7501 7.57494 17.3896C7.57494 19.0291 8.92377 20.3802 10.5632 20.3802C12.2027 20.3802 13.5539 19.0291 13.5539 17.3896C13.5539 15.7501 12.2027 14.399 10.5632 14.399ZM10.5632 16.2763C11.189 16.2763 11.6789 16.7638 11.6789 17.3896C11.6789 18.0153 11.1902 18.5052 10.5632 18.5052C9.93744 18.5052 9.44994 18.0165 9.44994 17.3896C9.44994 16.7638 9.93744 16.2763 10.5632 16.2763Z", fill: "#233D78" }))), react_1.default.createElement("div", { className: "content" }, react_1.default.createElement("p", { style: { color: titleTextColor }, className: "title" }, "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0441\u043A\u0438\u0434\u043A\u0430", ' ', sale.benefitUnit === 'Percent' ? (`${Math.round(((totalPriceOriginal - totalPrice) / totalPriceOriginal) * 100)}%`) : (react_1.default.createElement(PriceFormat_1.PriceFormat, { value: totalPriceOriginal - totalPrice, prefix: currencyPrefix, suffix: currencySuffix }))), react_1.default.createElement("div", { className: "items" }, items), react_1.default.createElement("div", { className: "prices" }, react_1.default.createElement("div", null, react_1.default.createElement(OldPrice_1.default, { price: totalPriceOriginal, prefix: currencyPrefix, suffix: currencySuffix })), react_1.default.createElement("a", { href: uri.toString() }, react_1.default.createElement(Button_1.default, { style: { backgroundColor: buttonColor !== null && buttonColor !== void 0 ? buttonColor : colors_1.TITLE_BG_DEFAULT_COLOR, color: buttonTextColor !== null && buttonTextColor !== void 0 ? buttonTextColor : colors_1.TITLE_TEXT_DEFAULT_COLOR, }, className: "buy-link" }, "\u041A\u0443\u043F\u0438\u0442\u044C \u0437\u0430", ' ', react_1.default.createElement(PriceFormat_1.PriceFormat, { prefix: currencyPrefix, suffix: currencySuffix, value: totalPrice }))))))); }, [ sale, catalogItem, items, canOrder, other, totalPriceOriginal, uri, totalPrice, bgColor, buttonColor, buttonTextColor, titleTextColor, currencyPrefix, currencySuffix, ]); }; exports.default = Sale; //# sourceMappingURL=index.js.map