UNPKG

@procraft/widget-order

Version:

Order widget for landing

113 lines 5.62 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 __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ReviewsStats = void 0; const react_1 = __importStar(require("react")); const dist_1 = __importDefault(require("react-decliner/dist")); const types_1 = require("../../../../modules/gql/generated/types"); const ProgressBar_1 = require("../ProgressBar"); const styles_1 = require("./styles"); const classnames_1 = __importDefault(require("classnames")); /** * Статистика по отзывам */ const ReviewsStats = ({ reviews, onSelectFilter, }) => { const [filter, setFilter] = (0, react_1.useState)({}); const selectItem = (0, react_1.useCallback)((e) => { const type = e.currentTarget.dataset.type; let n = e.currentTarget.dataset.n || ''; if (!type || !n) { return; } if (type === 'stars') { n = parseInt(n); if (isNaN(n)) { return; } } setFilter((prev) => (Object.assign(Object.assign({}, prev), { [type]: filter[type] !== n ? n : null }))); }, [setFilter, filter]); (0, react_1.useEffect)(() => { onSelectFilter(filter.stars, filter.expect); }, [filter, onSelectFilter]); return (0, react_1.useMemo)(() => { var _a; const reviewNodes = []; (_a = reviews === null || reviews === void 0 ? void 0 : reviews.edges) === null || _a === void 0 ? void 0 : _a.forEach((n) => { if (n === null || n === void 0 ? void 0 : n.node) { reviewNodes.push(n.node); } }); if (!reviewNodes.length) { return null; } const stars = [5, 4, 3, 2, 1].map((n) => { const count = reviewNodes.filter((i) => i.rating === n).length; const percent = Math.round(100 / (reviewNodes.length / count)); return (react_1.default.createElement(react_1.default.Fragment, { key: n }, react_1.default.createElement("div", { className: (0, classnames_1.default)('stat-key', filter.stars === n && 'stat-key--active'), "data-n": n, "data-type": "stars", onClick: selectItem }, react_1.default.createElement("div", { className: "stat-key-wrapper" }, n, ' ', react_1.default.createElement(dist_1.default, { one: "\u0437\u0432\u0435\u0437\u0434\u0430", two: "\u0437\u0432\u0435\u0437\u0434\u044B", many: "\u0437\u0432\u0435\u0437\u0434", num: n }), ' ')), ' ', react_1.default.createElement(ProgressBar_1.ProgressBar, { percent: percent, color: "light" }), " ", react_1.default.createElement("div", null, percent, "%"))); }); const expectations = [ types_1.MeetExpectation.OVEREXPECTATION, types_1.MeetExpectation.ASEXPECTED, types_1.MeetExpectation.BELOWEXPECTATION, ].map((n) => { const count = reviewNodes.filter((i) => i.meetExpectation === n).length; const percent = Math.round(100 / (reviewNodes.length / count)); let meetExpectation = 'Соответствует ожиданиям'; switch (n) { case types_1.MeetExpectation.BELOWEXPECTATION: meetExpectation = 'Меньше ожиданий'; break; case types_1.MeetExpectation.OVEREXPECTATION: meetExpectation = 'Больше ожиданий'; break; } return (react_1.default.createElement(react_1.default.Fragment, { key: n }, react_1.default.createElement("div", { className: (0, classnames_1.default)('stat-key', filter.expect === n && 'stat-key--active'), "data-n": n, "data-type": "expect", onClick: selectItem }, react_1.default.createElement("div", { className: "stat-key-wrapper" }, meetExpectation)), ' ', react_1.default.createElement(ProgressBar_1.ProgressBar, { percent: percent, color: "dark" }), react_1.default.createElement("div", null, percent, "%"))); }); return (react_1.default.createElement(styles_1.ReviewsStatsStyled, null, react_1.default.createElement("div", null, stars), react_1.default.createElement("div", null, expectations))); }, [reviews, filter, selectItem]); }; exports.ReviewsStats = ReviewsStats; //# sourceMappingURL=index.js.map