From 5ff6ac0a9bc5edfec3c325260e7f6e9d417085dc Mon Sep 17 00:00:00 2001 From: Pkpedram Date: Tue, 8 Feb 2022 15:09:46 +0330 Subject: [PATCH] Redux is Set From Danovin --- package-lock.json | 94 +++++- package.json | 4 + src/App.js | 6 + src/components/Cart/index.js | 41 +++ src/components/Product/discount.png | Bin 0 -> 868 bytes src/components/Product/goldon.png | Bin 0 -> 87616 bytes src/components/Product/index.js | 276 +++++++++++++++++ src/components/Product/lightBlueDotIcon.svg | 3 + src/components/Product/purpleDotIcon.svg | 3 + src/components/Product/redDotIcon.svg | 3 + .../Product/vuesax-linear-heart.svg | 8 + src/components/Product/watermelon.png | Bin 0 -> 34684 bytes src/components/Product/yellowDotIcon.svg | 3 + src/components/products/classes/index.js | 42 ++- src/constants/colors.scss | 36 +++ src/constants/defaultValues.js | 9 + src/constants/size.scss | 8 + src/redux/actions/blog.js | 27 ++ src/redux/actions/book.js | 44 +++ src/redux/actions/content.js | 14 + src/redux/actions/faq.js | 20 ++ src/redux/actions/file.js | 22 ++ src/redux/actions/index.js | 18 ++ src/redux/actions/product.js | 30 ++ src/redux/actions/public.js | 56 ++++ src/redux/actions/qr.js | 32 ++ src/redux/actions/scroll.js | 74 +++++ src/redux/actions/user.js | 63 ++++ src/redux/actions/userFactor.js | 55 ++++ src/redux/actions/userProduct.js | 33 ++ src/redux/cart/card.types.js | 8 + src/redux/cart/cart.actions.js | 20 ++ src/redux/cart/cart.reducer.js | 43 +++ src/redux/cart/cart.selectors.js | 34 +++ src/redux/cart/cart.utils.js | 31 ++ src/redux/directory/directory.reducer.jsx | 44 +++ src/redux/directory/directory.selector.jsx | 8 + src/redux/index.js | 7 + src/redux/proxy.js | 120 ++++++++ src/redux/reducers/blog.js | 28 ++ src/redux/reducers/book.js | 168 +++++++++++ src/redux/reducers/faq.js | 57 ++++ src/redux/reducers/file.js | 26 ++ src/redux/reducers/index.js | 12 + src/redux/reducers/product.js | 31 ++ src/redux/reducers/public.js | 184 ++++++++++++ src/redux/reducers/qr.js | 32 ++ src/redux/reducers/scroll.js | 185 ++++++++++++ src/redux/reducers/user.js | 49 +++ src/redux/reducers/userFactor.js | 57 ++++ src/redux/reducers/userProduct.js | 50 ++++ src/redux/root-reducer.js | 24 ++ src/redux/shop/shop.data.js | 254 ++++++++++++++++ src/redux/shop/shop.reducer.js | 14 + src/redux/shop/shop.selectors.js | 8 + src/redux/store.js | 14 + src/redux/user/user.actions.js | 6 + src/redux/user/user.reducer.js | 19 ++ src/redux/user/user.selector.js | 9 + src/redux/user/user.types.js | 3 + src/utils/comments.js | 22 ++ src/utils/location.js | 11 + src/utils/onInput.js | 282 ++++++++++++++++++ src/utils/scroll.js | 213 +++++++++++++ src/view/services/index.js | 85 +++++- yarn.lock | 43 ++- 66 files changed, 3186 insertions(+), 39 deletions(-) create mode 100644 src/components/Cart/index.js create mode 100644 src/components/Product/discount.png create mode 100644 src/components/Product/goldon.png create mode 100644 src/components/Product/index.js create mode 100644 src/components/Product/lightBlueDotIcon.svg create mode 100644 src/components/Product/purpleDotIcon.svg create mode 100644 src/components/Product/redDotIcon.svg create mode 100644 src/components/Product/vuesax-linear-heart.svg create mode 100644 src/components/Product/watermelon.png create mode 100644 src/components/Product/yellowDotIcon.svg create mode 100644 src/constants/colors.scss create mode 100644 src/constants/defaultValues.js create mode 100644 src/constants/size.scss create mode 100644 src/redux/actions/blog.js create mode 100644 src/redux/actions/book.js create mode 100644 src/redux/actions/content.js create mode 100644 src/redux/actions/faq.js create mode 100644 src/redux/actions/file.js create mode 100644 src/redux/actions/index.js create mode 100644 src/redux/actions/product.js create mode 100644 src/redux/actions/public.js create mode 100644 src/redux/actions/qr.js create mode 100644 src/redux/actions/scroll.js create mode 100644 src/redux/actions/user.js create mode 100644 src/redux/actions/userFactor.js create mode 100644 src/redux/actions/userProduct.js create mode 100644 src/redux/cart/card.types.js create mode 100644 src/redux/cart/cart.actions.js create mode 100644 src/redux/cart/cart.reducer.js create mode 100644 src/redux/cart/cart.selectors.js create mode 100644 src/redux/cart/cart.utils.js create mode 100644 src/redux/directory/directory.reducer.jsx create mode 100644 src/redux/directory/directory.selector.jsx create mode 100644 src/redux/index.js create mode 100644 src/redux/proxy.js create mode 100644 src/redux/reducers/blog.js create mode 100644 src/redux/reducers/book.js create mode 100644 src/redux/reducers/faq.js create mode 100644 src/redux/reducers/file.js create mode 100644 src/redux/reducers/index.js create mode 100644 src/redux/reducers/product.js create mode 100644 src/redux/reducers/public.js create mode 100644 src/redux/reducers/qr.js create mode 100644 src/redux/reducers/scroll.js create mode 100644 src/redux/reducers/user.js create mode 100644 src/redux/reducers/userFactor.js create mode 100644 src/redux/reducers/userProduct.js create mode 100644 src/redux/root-reducer.js create mode 100644 src/redux/shop/shop.data.js create mode 100644 src/redux/shop/shop.reducer.js create mode 100644 src/redux/shop/shop.selectors.js create mode 100644 src/redux/store.js create mode 100644 src/redux/user/user.actions.js create mode 100644 src/redux/user/user.reducer.js create mode 100644 src/redux/user/user.selector.js create mode 100644 src/redux/user/user.types.js create mode 100644 src/utils/comments.js create mode 100644 src/utils/location.js create mode 100644 src/utils/onInput.js create mode 100644 src/utils/scroll.js diff --git a/package-lock.json b/package-lock.json index c2c41d3..3bb9685 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", "@testing-library/user-event": "^13.5.0", + "axios": "^0.25.0", "jalali-moment": "^3.3.10", "lord-icon-element": "^3.3.3", "lottie-web": "^5.8.1", @@ -22,7 +23,10 @@ "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", "react-slideshow-image": "^3.7.0", + "react-toastify": "^8.1.1", "redux": "^4.1.2", + "redux-devtools-extension": "^2.13.9", + "redux-thunk": "^2.4.1", "sass": "^1.45.1", "web-vitals": "^2.1.2" }, @@ -4330,6 +4334,14 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5129,6 +5141,14 @@ "node": ">=0.8" } }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7579,9 +7599,9 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "node_modules/follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "funding": [ { "type": "individual", @@ -13951,6 +13971,18 @@ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0" } }, + "node_modules/react-toastify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.1.1.tgz", + "integrity": "sha512-KQa+j+JHjy69xpPYheaWUq3SjVw1sV2D7/QsXW6Tpo2x9HhUCvASezAMYDmLhfAYoSnaXUVnTNFAgZQA75SExQ==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -14006,6 +14038,23 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/redux-devtools-extension": { + "version": "2.13.9", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", + "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", + "deprecated": "Package moved to @redux-devtools/extension.", + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -19863,6 +19912,14 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==" }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "requires": { + "follow-redirects": "^1.14.7" + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -20463,6 +20520,11 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -22269,9 +22331,9 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.0", @@ -26694,6 +26756,14 @@ "resize-observer-polyfill": "^1.5.1" } }, + "react-toastify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.1.1.tgz", + "integrity": "sha512-KQa+j+JHjy69xpPYheaWUq3SjVw1sV2D7/QsXW6Tpo2x9HhUCvASezAMYDmLhfAYoSnaXUVnTNFAgZQA75SExQ==", + "requires": { + "clsx": "^1.1.1" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -26737,6 +26807,18 @@ "@babel/runtime": "^7.9.2" } }, + "redux-devtools-extension": { + "version": "2.13.9", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", + "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", + "requires": {} + }, + "redux-thunk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "requires": {} + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", diff --git a/package.json b/package.json index 3916525..cbd3361 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", "@testing-library/user-event": "^13.5.0", + "axios": "^0.25.0", "jalali-moment": "^3.3.10", "lord-icon-element": "^3.3.3", "lottie-web": "^5.8.1", @@ -17,7 +18,10 @@ "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", "react-slideshow-image": "^3.7.0", + "react-toastify": "^8.1.1", "redux": "^4.1.2", + "redux-devtools-extension": "^2.13.9", + "redux-thunk": "^2.4.1", "sass": "^1.45.1", "web-vitals": "^2.1.2" }, diff --git a/src/App.js b/src/App.js index d55df78..8770ee7 100644 --- a/src/App.js +++ b/src/App.js @@ -22,6 +22,9 @@ import LoginSignUp from './view/LoginSignUp'; import Register from './view/register' import Services from './view/services'; +import {Provider, provider} from 'react-redux'; +import store from './redux/store'; + let data = [ { @@ -641,6 +644,8 @@ function App() { }; return ( + +
{LOGIN &&
} @@ -677,6 +682,7 @@ function App() {
+
); } diff --git a/src/components/Cart/index.js b/src/components/Cart/index.js new file mode 100644 index 0000000..82ea0dd --- /dev/null +++ b/src/components/Cart/index.js @@ -0,0 +1,41 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { createStructuredSelector } from "reselect"; +import { withRouter } from 'react-router-dom'; + + + +import { selectCartItems } from "../../redux/cart/cart.selectors"; +import { toggleCartHidden } from '../../redux/cart/cart.actions'; + + +import './cart-dropdown.styles.scss'; + +const CartDropdown = ({ cartItems, history, dispatch }) => ( +
+
+ { + cartItems.length ? ( + cartItems.map(cartItem => ( + + )) + ):( + سبد خرید شما خالیست. + )} +
+
+
+
+) + +const mapStateToProps = createStructuredSelector({ + cartItems: selectCartItems +}) + +export default withRouter(connect(mapStateToProps)(CartDropdown)); \ No newline at end of file diff --git a/src/components/Product/discount.png b/src/components/Product/discount.png new file mode 100644 index 0000000000000000000000000000000000000000..eff7853521b4104aa53d12c05733a217605d3319 GIT binary patch literal 868 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%0At0PR3hnh6hYM%77zW*$fs7$=CMwLJoyhN;iX%4I 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 literal 0 HcmV?d00001 diff --git a/src/components/Product/index.js b/src/components/Product/index.js new file mode 100644 index 0000000..4993f08 --- /dev/null +++ b/src/components/Product/index.js @@ -0,0 +1,276 @@ +import React, { useState } from "react"; + +// import Tag from "../Tag"; +// import ReactTooltip from "react-tooltip"; + +import book from "./goldon.png"; +import watermelon from "./watermelon.png"; +import heart from "./vuesax-linear-heart.svg"; +import discountImg from "./discount.png"; +import YellowDotIcon from "./yellowDotIcon.svg"; +import RedDotIcon from "./redDotIcon.svg"; +import PurpleDotIcon from "./purpleDotIcon.svg"; +import LightBlueDotIcon from "./lightBlueDotIcon.svg"; + + +const ProductDesign = ({ + colors, + likeBtn, + discount, + discountPricePercent, + discountPrice, + productContent, + star, + productTags, + priceDirection, + productTitleAlignment, + priceHolder, + productHolderBorder, + productHolderBorderColor, + productTitleColor, + productExcerptTextColor, + productCat, + productCatTextColor, + rangeHolder, + verticalImg, + horizontalImg, + rangeWidth, + addToCartHolder, + productName, + productPrice, + productImg, + writeGHEIMAT, + numberOfRegards, + productHolderHoverBorder, + hoverMode, + big, + starRate +}) => { + const [isHovering, setIsHovering] = useState(false); + return ( +

+
+
setIsHovering(true)} + onMouseLeave={() => setIsHovering(false)} + > + {/* product image */} +
+ {/* icons on image */} +
+ {discountPricePercent && ( +
+

+ 23% +

+
+ )} + {likeBtn && ( +
+ +
+ )} + {discount && ( +
+ +
+ )} +
+ {/* img */} +
+ {verticalImg && ( + + )} + {horizontalImg && ( + + )} +
+ {/* select Color */} + {/* {colors && ( +
+ + + + + + + + +
+ )} */} + +
+ {/* product content */} +
+
+

+ {productName} +

+ {productContent && ( +

+ این کتاب شامل گلدان و گیاه و خاک می باشد و همچنین آپشن های خوب + دیگری نیز دارد. +

+ )} + {productCat && ( + + {productCat} + + )} +
+ {/* star */} + {/* price */} + {priceHolder && ( +
+
+
+ {writeGHEIMAT && قیمت} + {/* price with line on it */} + {discountPrice && ( +

+ 145تومان +

+ )} +
+

+ {productPrice} تومان +

+
+ {/* add to cart */} + {addToCartHolder && ( + + + )} + + +
+ + )} + + + + {hoverMode == 'blue' ?
+
+ +
+
: null} + + {/* {productTags && ( +
+ { + productTags.map((item, index) => ) + } +
+ )} */} + {rangeHolder && ( +
+
+
+ )} + +
+
+
+
+ ); +}; + +export default ProductDesign; + +// text colors i used for product title: +// text-darkCrimsonTextColor +// text-productTitle + +// text color i used for product excerpt: +// text-productContent + +// text color i used for product cat: +// text-darkCrimsonTextColor + +ProductDesign.defaultProps = { + // icons on product image + colors: false, + likeBtn: false, + discount: false, + discountPricePercent: false, + // product price + discountPrice: false, + priceHolder: true, + + productContent: false, + star: true, + productTags: [], + productCat: true, + rangeHolder: true, + + // دو مدل عکس طراحی کردم که یکی عرض بیشتری دارد یکی ارتفاع + verticalImg: true, + horizontalImg: false, + + addToCartHolder: false, + + productTitleColor: "text-productTitle", + + productExcerptTextColor: "text-productContent", + + productCatTextColor: "text-darkCrimsonTextColor", + // برای درصد دادن به عرض رنج + rangeWidth: "w-44", + //دی ای وی که محصول داخلش است میتونیم بهش بوردر بدیم + productHolderBorder: "border", + productHolderBorderColor: "border-grayBorderColor", + + productTitleAlignment: "text-justify", + //میتونیم تعیین کنیم که قیمت و دکمه اضاف به سبد خرید کنار یکدیگر باشند یا زیر هم + priceDirection: "flex-row", + productImg: book, + writeGHEIMAT: false +}; diff --git a/src/components/Product/lightBlueDotIcon.svg b/src/components/Product/lightBlueDotIcon.svg new file mode 100644 index 0000000..fc3cc88 --- /dev/null +++ b/src/components/Product/lightBlueDotIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Product/purpleDotIcon.svg b/src/components/Product/purpleDotIcon.svg new file mode 100644 index 0000000..1859629 --- /dev/null +++ b/src/components/Product/purpleDotIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Product/redDotIcon.svg b/src/components/Product/redDotIcon.svg new file mode 100644 index 0000000..1c20427 --- /dev/null +++ b/src/components/Product/redDotIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Product/vuesax-linear-heart.svg b/src/components/Product/vuesax-linear-heart.svg new file mode 100644 index 0000000..306bf40 --- /dev/null +++ b/src/components/Product/vuesax-linear-heart.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/components/Product/watermelon.png b/src/components/Product/watermelon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5efe729cc9460766fe5441d27ad7139705ad4d GIT binary patch literal 34684 zcmeEth1=Y-7-nP&Rj}gIt=p!juf7Nt@FAeiU zrp7pBtjC)ZGNy_(tQQlfnk^F)8XyyqVj)5b{6#4$X-{~_OrQUC{>eSjixY*^|BVVo zr-Ig%fSHo8ckTA~+O71Z>m*xN#~aD-E$@@6Y2vc?D36Qoq1pBE?f%9QW&-oCO>JLS zqH9MZ-?GP3uib}I?}L|tnc3&;mj~zj`kyZ(p)W0(yVUzCy#Pm;*fj*Bz{U4o>ksfo zuP*L;lHaSYrQq8+%b%co$4N|Tt=&;ABTbnUKV{ta=bKN#g%6a8Wg4w~y?}!rs1!f# zv#+EbAI*%}S;7}xnz~-SfZhu_<~sFU(*i%ZuRrg!|1&bF9;!q*FSrc2E!F`Qg-H$5 zxruOuke&aZ_6jX9b+0+`e{J9XzispXnGf>L5vEQa^4|WY$R3@1%Kr;6fsqYhbQ@r5 zhLVDMYoiGkQhGJe$1@lMDF#E|h)XV3`*x?DyUy#JK5)9`Nb0<3|Agd(ttY zn(vppOuO@DN|%58w^_tDIspzMr?j3q-bno0% zGSmkmgW_R{dDrJ%$uM_cJ>b8Y>^=$K&v3I8^`(&9Mvv{X=X%LPD>e3`a}U8DSXkllVtwI#JgTTrG# zMQ-}&h`ow~+m2%SysNkNmb|(Menr*a=94ea;S*9+XtxXaDjQ--lJ6aTaBp7+=5I?I zikX2viA_!&<^Ew4z&9+AygEJuN`v~KExAg`mW$E^l6`^KLnU(PnuoPQu$`bqJ!Uci zjZj6x>Z1U-0e+%enNP{`O5m|o=xq$@<>yZYxDV9AnKd@cNRF9v0M1R$iMK1KOp|%e zEW4Uudg*sMy>V_y?1E)kMYL5s(J*E@?+1bqwW?AZ51Q&P@4(yFwt=>KaEmOPLffll zS4YzMv<74PTi>}B_et`@8KwFF0$racr6+y}T%l-`7Z>#3G2V-B@9l42vP6?~yfQR% zb-xP?*DPc86o+}b&Ik5MwSZIFnZH$Zfg>^IR@u4=NpBmLtufY@Z@OJHS*3WX&h1TE zI#qI(fqm)?(G_`RU0m`XSJ>44GCI6&q|Q08@P!yLdD z+j?URH9Q%aSWt1Y47?b=W1$iJ&Dhor&4~VfZx9=xNxs}t9mAWt4)o4E2RN22_S5a^ zWpffEFSPrmr!wXq;o-F(7P0ek1GIX!txEB*Hg}FfVRcrkV@K!qf!xm^{Bm-=r|%MT zUXR=@_>%y}+=1QrS+qJQ1~tRFqVM(3?iUq{2K(8Ax01-$LeedgR4z>VGU&1TKUu6kQ9YJ*b;9kiEZ)-M;3^ zU2H?Tv_s9JD0M`gRQpc*2on84^^OuxX+vu#9?03>a1fLk1DfSInL2Rn#x)R*)tFts zQa|`Ja1t{1Bd=nYMLxF|AYlq%<~=3N?h0kic-ZcI$u|+cy&wuZSn*&$k^*|g22!br z&6T<1>e!gxk%xL@OU3P_qyF**r_#Z^TGY(ZxeILW3%f};AtJsN{fgN$H0m7+gyMsN zC>A2jn+)e!+w7de++48?ojWF{N2_H8yT&q4JE%BS8(Wy-Hf5A`zr`&^;%5&|(fX^m z*93J7n5 zie~F^l@3otCR-zx=@^+@;GK*^3`12B6+t710Zx3+^TqGSxdqX0F;`Tcdj8HRQ^N1% zb#3ke0raxw^=@Mq3jENu6yzf(*Hi$fmaZ zrP)ps)>|ueWkGy#s!hGXjXd{lD2G75(W5Gi)7haU*5%@AGHAp@T22)}b_ccy@gkcl zLj)S)U97#fwi9QIrla{~1`>!3QJl}8lztPsxqaTIm?f{O?Yu%luk+1cVd^+H{qu}n zwP{`&?(MBYdk}NPwzd`D@^RmcI-OCp<;#(YBTcwWY4~ z1SoQYnn&LLq=Gm-tDT{AS z<8`4qVMtJXp2GmGb!(Hb{zlE`P^>3}j(=ofAWkzUSg&E$0krU541ek|kDCG%A4NH&UEyLhkPF3aV2gkLiJA3NIKmk`=RtCI7l-; zYqpkpuv%?F#G4&`ju(^OtatRX#406FQ6Q9OB0t8clHMxYY2d;IS}8!OeOcBJOAMmnt!%1fe@nO@-1*AOaK~R0tz)0?;G51HynUlR`Hgx z1-LS4Q9oB#c0Md;`8sG(;iyHY|Faj%^Jx{{<-agc+ccQQuUu5|bbWEv(YGoilCH<9 z?T!?#@4q0du8OA920rLm`SU6{*q$85lW+f8TtUr-2e&mfriT83vvDv{*)nCoN(DMp z^eiB`wZ+jXxFR^?1|0qknrCKcOIrjmPdclJv3q?(jWUgEb#n-6VqX;s?*h5_#5h%# zvJ7z9lQsL>{@W&b%C#w5UVdVK?nITY`GZy4(D*}G{XhTh3EDAFKz56NpK2k^M&B~3 z9lvu5MKLjPpmOW%nz8q z#kF&bZDa!*@^<%k0I6b05tz8s>RePmrgbf!k7LwH1INBD!zx19Nc4R5&ZtU+d+|Iz zXe?+pFIM^09J|71>-7*##Q$#TSSXuvbsM3jmQf;1Q)&WA+gtY(-{6e#{qeXU>%DCy zH+djet?E0fO3PRK$n`c*z3J_N?A4Fa+*(F-!VG=&ymfKVNvWLx^3*q&4m~|1%zg~Y zG=FWUjx0$)x&Qpah1TGG43`_ZhK9XcI~+8Ql9-V~RHktZl{=<+u7$s`+Dz4LD3!mz zLR@)v`>JUypA1($bQ$bjTMbVlL0m#u0+L0>Jj<<3m-Hb|DomoRj9X zE+7L@OyT2W<7>uKiv6`Fd#H^h!5`IvjJ{>;0`t0ykj#+ULhV5Lz;t75^|SC0S%bt0 zZGTujavARDKx`KHvv$Rj=I0eihg?)7PD}`2KB!e$es-*=UbSRZynZgSe_ZfEIP4zN z60EFP)2dv@T|^sx&e{c|{uvJXXIT-BKz%la5fuVQI)reb60ECC=|Y7`3u87jLQEc? zGs9|x{4=KLk}}H}8KB`1<#*UMzJySU@x2W9XB@(>XcZJvNo8lI7EgwU>h>lE1cGR> zi^dl2IJ+lz>FBD~1dxP$`B4@MnhCi@O&c}aDB4|YmGR=mK%}D^D1{;^y=NTM;4-+; ze*I^I>F%6IQMnn>t_1-QlrsWhK6x@z7F0GHov6a7M`g*pW*E`Fyy`vV!tpcRL7{L- zZfMOELlWDJnItx6*ZjcL$X11wqnf7U3}PS1B~pnNIe4JiMJYmWqNi;z*B2PVdzw(F zDsx}Oi%l`Y^@~v59c=rnv{)GCydT**$l<1Vk8}?b%L`u1kN23DC(Sr`4RV&QoD=S< zj&w?3Q76w&U^%=5pTFv^_rKV@@mFz}$o#IZa-%#wdT=4Gds;YgOhpuo#a8Kr(dr+A z9XK|q=|xv*BQKBbg@G6xb(Yql_Cf5UR!+# zYbxon%x1vVlC**$UY!QY2h_5ZRbVq zCbN#anA@nsW9dA8-?K|U-g^+>^fV3WVgPTpKl-~j^?Mxa#ewyd!~=-(jhdTBRxm^S zmlO&6arRi@2u&lY0&bV}fwP0%uSKj}y8Y~ zTFrWL3~cgo#v@N9TVlzvsDH);dQG=E&oAqev!+F`Gk=S23yt?|M+WF5-O0^yiN z`km?DA$~7TRAK1PYFzug;6_H^*VMR-ixg!m)3-R4EuKzDK)-6rntb1RW!Ct5^{w2? zVbW`H-!2jMgT>HMp~c~QlF~Z3`S}`6G{If1!S& zH0q~AeTSopu>^f(i1eTO3|he6=3_kd4W6dTBbL^xyK-ajfTc)nC%5W~jC zSCGVZNphE#8YCO9!QBn_Vx#uT`HwVO zdhIs+j+4;KigLf7g2y_e5GI9Fj3J=r0qQ!>P^vj#5p^K@GAhNwVbeEhijm#U5zogx zD=9@iH=H^s?6%pb^de0ad7XG3#$03!&-#{0I6ZuRl;C#>w{1&+FeI##h|MK`eeUb-u@xVa%^czbR`mGpfBI~n`k!|ZM}E|e#M#O)S!H~ zY*>R%Ew)tTv53Oy>}R|t1ss=2gp#)o#iR_WeEXiH#~MPYF)zl9GM$GtRR=osRZvk- z#mCS&1l|Z6=X&~)9d1^=ERqNkk;yZly46&iF&_9@Cp}S4ky^_ahgz@< zUV)D|pNSf_k)YjYIAT4A{_1TI*i+2es@iZY+Cv#8+KqTh7A+m&Mpw*L7A%bfdIys_ z&7=f4D={S|85l}}oZdf0th$_-rh7kq&*ee0h{{K7Muoo56xqK6Vx?CaJLcv?)WghL zN3abZs7GxnVr?5NM^zJ7Z^!GVrP~Jnp`KH^#c4Z4rzcC?lZonE~5_Nv@_I)++F?HhUC%PRN&Nr6Tv5;7Zc7Q zAd843G37dGUx?v7!%vC7E}~{(`G8<|i$OxzOuhHHmLq{z2SP3XwfYGZ;h+Z#aAko>!|$MMuiY?!(V!LGf(tq7E#AAM(-03)=(36iKc-pJ z48oR@@!7-4EeFJy}C8D4u%BF&f5~)iT9f z>8C}yWFzmW38b2^Cfs=9E#6P345=1w2s-mzHJE}ZyUMbTP67kr;@{Ms^|8PJdxK8Y z$ox=;OM4Sc=y`__OkcVWtppI0Dg)Y~m^4G8RpKxr+emnKp;-%SKacHcz{BO>7Sw8dHJvkk z=yrwP(%zS~w>MNH7n-}Ud3=z&XGo}jUaQ>zeZ1;rgI5%MEN zoCCZnoV*W=Fta^2BkXE&BZRR}kQ$@jtuYG$T{N84cVif6fmn>LhYR{lnKbFxBeZ`? zIa0*i&!2HjYj~t!oVy}~SMKyYi;YM@w*r~kX4;p zo(;4)&Pak1-Z5qyldifDvLJ9Bqn1Tb4ro5LLAN%kX5#+k19IMA_D$6{`;KRvea*Sj zaymh}urZ>K{eet?b);%cu2dZu>0QOq59TVe0Y>qT=H!z&uelgr97fRrH^1TGF6kqV zGiA#i;aJjjM^P82H%TTnL&1x!_*9;tJ`Dry=by$1u?fyGH}8muM28M(DJKOzIPb!0 z$!U3JRTAdVNr>p8{f|r#hdK_-Q&Ss~#cm-Mz06@UL(%UWk30r-wd4>dJn9l1LQSyU zNokFmAlY^-{szs(!o$&X&-10<^W(X5Vv6P?Kq)GcDBN+AE~p6M93wdKV)PnuH6v?)6ZFRcFR|gTBe6qFh?NR zIB#w8WcCaA1PC+#XhCUR)|L6MZ=8pbU~?c0()7m zor&Wsqm(mdc-=b?$==CqHwQF^WI4vsb#Xv{FDc47XqXsqPEdCf$&K%LII z%x&>>?7_a&h8&1CG#`S{4D>zM^u2D|<2HXCylRZobT;Vd3)4d~iD5DnLYdNDQ%^4n z$J38CQxDva5;*Htiw3X%_0HgL(J&y?yBA2#RqpOMlVk^y&eLEjAC(TQ4tB0+oAwXj;fO|AkZI{3aTZz0EB48o$Q0#JI{&iN z>qsn3Lp^sYQ&lX8q)}iAvb?dh^1FJgc=Or6jr)s`=aV4_#^Qz6c?kJ_?UNw-#H1$~ zhqs8v)EGe<|G@S;%F>z+x|8gMN7?Esxi3RAB8(a$*o>~zmgKhcd?e$)3&Ub^`@%pt zwb?Hd)&z*O=$bGh{0r6P*Mof*M#CXhl*Q+uusuc{qxs=V;&?8sIbNSDE8cpm zNQ`9pN{&rIy4>d1Fbqxh)qI_g)nHDlzCg};qi;Co3-pG8a0L8*xwSnXu%f|y5%*RR zg5;+>f%fvAf8Qx=*q|W_Y|jzI0G11DViNPLFEN;`y?Vm~C`Otcj8FlS)c!<)<@c5Q z2#8pmXw0~}oQJln2T=#p(CLq%^|dM(Xh_)JSp1NtUPAUAKO;qr#W^IOQqJlHFV+O= zqNvK1>ZN#A#O+HSxsD@Lc$iCmBm(W9ReNOH^iN1Hp_79U@S|#i?Cb3rW-6 z6vltU;3F~|HOSu**Tg04@eoAveZtBLe+*TC5Z74aURyk=X#7W}K|+F)hN~OZb52If zj85Do0oMt(nbVtOR7lV}QlA5Gc{j#k!q`N`CIMg2vc~zFAks*5&9zOGdH>-~O3dMD z7SM92slw}S5jZ*|yQsC;=*ZK5;c_O5qcbF&)f$P6f0EVO;ZzkmR{~k%iY5icdAc5U zeb?8$bA6Ad+ZK*EWbs_sN+KupHnuV_n_2$1763u(r62C5tf>m$l5js*pjC&tdE~y8 zqWTnzJf2Ms4egY&w)!V7KJsHj>U{3XQ&MoCFlV6($;}Dxm63^oKEym&oWW#=MRq!V z=z?(FV<;?;i~YEXR){aV97A&6GtJb)Fjq@2;KH&o)+bpy?ZwI#&RxzR4i2G`t{}$n z{t*IuX#yo;wq!u_u2^1<(qt|s@jFyLID%kpJy8UBVc!w8NbLAzmkhjB}`qnLMX+ZWG>(M$xi0YeHOV?Dk_v4ix}_g#BkMQsWURQk+J1cXpbJJ0582^ie0 zT5^ZNFMx-_0_=8}1o97oU&9^>NXc5o&&pV-(u@I|FYV9X7DDk)c&YPxZb&eV;>(MW zq{?u@w4LF*0#o4$wsP!8Y++2CgA=fs;}7!_8;`93m&>@4f}W`k@F`pin#Dgd;+35$h~VSjU-e{m`l1Q=;_Te=yl}K?{;9hA|FEvmgCf#?;_&L zcB)(d4FNe*tQ4p;_IkemDoceq=BOYwR0}4+Cu_c?gms7Q?6);}!tpU}g022@#-yeN zmEd@A!7e{mpTF(2$c{BZ&UGU%tu8_$;EEi=vEZ>_pp7knD29`ghZ}O+c}r55mf_(h z@H2~7_+)ALBv@qdYVshgkM(H1imR4nZfK6b3>POn2V49S?w`TA?FUKDYmwC15;?tR z^Z^gi+Lq~m=@fe?;7;>_`RVhsC0YLu?ruc!7p%V;5^PEzFjP*HBNnE{w%*vLt%#Fz zg=T@EmIYj3#)Zrk{*fm!#^7uuwlsbu*%Id=`(~v*aBA({8p!bj)k$mygm?iA6$CGD zS_ZX0Kp-+Wa31WqL6&`Hr#qd!uRUh9H@AhKIPYcIuy?F^erH$!9w)}M#eA=}voan> zUUTw`UAe2v6&&V$UZ~6Kj{j`p>hVWQEQfrXNJj3PA?|%4;@QY~MCpCJ0HhKsI@BF0 z2ziITA&7*mTdQ%YVT=oi`oDzgo?XeUES%^7ozQkA7}~D_4WL2=#CMtEnS^4LH!6Oi zlz_tF#DwOWXF$`vZ4KTEv6g$Gk*yJC*wv0Pe8Er}s-h;Sto`eqz13cl)boBaFBsQt zEy&cvd3TUJAX9yQrjUI@OX=5 z9;H>I%~-NZ)blA7FmCws>gNuY88@UjVvNfyX!O1-@AUv1!lP|*SZG@je-;v1$XIi= z%&z9sFLzfQ&|DF}wQjKf`M##^b-=*Rk&k5uLbr2F2%q4YQpVnj0pud1VX94QgmmvC?{*z0%2Yw~~zLgrFQLtXH*IQt9FMQeXJb&8Z| zgB{>Thca&(J-*s*dXjYFkhUJ zNoTIfmYDYXdwbh5YB@X42I?Uut7#X566CJ^EM{`$yr>&aXf@~`c$7aGg;xbH%&zVc zplmvvO>hBjc5oOKcblU|@2poZM00nKik;6?gU(i7 zC1Vf7Np+@7b7*RJ7EBuoOa?`+*a822kh+9iw2yMcA5N`iIFEUskc5+nETfhi7d=8o zSUIP%%hKXuleCKv1qnmttAWI$kiIRQlC=@oTa6PzQIC2-6Z6FbIYZb-ZB^NEuXVGK z_=ol{$R=hS+mKL4NNb6PJ{@?r51)`u|*;aKI$9UduVVhu2RcTx|Fuay?jQ zDJ>8S`if&3)A@KDc)v=0&7>`kSZ=Cx;hYs`b=~-VKGc;_QUA9StqDDWTn(b{-Vn`S z(_zG=y1@{JdcCN+0;LLj0R)mF;wesQNF%S^5AUGj!`k{%IY9L9m*B!kMxwZ@gyW&{ zA8vZOY6i3_QtRU9a&}$l3_kRmL0IdG)Q$h3sU@CFVX^SEGQi}Gt75`zo&hI7Yc-QV zV^=B>p7fqfF@ubv_XV?&e?aej52Tn?XmSKL&mgIam)#HN2cKw&+E6g20O`URTSL1c$Kb+)0(vJ_P}>U7J9Vi*Kqgw02>wSDGMnGS=-=A zN8$Nf1RH#dcKLd=Hda~RX8K@WsXHN|x`Xh)dVLS-P>cCL;7;mFce*^u z8H&vFujoSEgnzCnGE(v-A`w0%v^cIR|AmGbLH263Z9yZNqyz8-CKX((iyNI+q_( z;n-q=Zj02YL1-r-5nCSwqZZSE%gi1;pj+12T1NscQ?T{Pv&srsBA+KNTn|s7_sA46m=THA{@3kBhm9QBh&GU4IA8 zp@9Tyn;t6gs1rDiR`!~(A-l9oI7q&{@oz7?`EJT~Jl~?u5V;JaRCqL9GbV)&c|X^3 z-p;I1u1j~saX(BAb|8SfMm5jCS>%a3vSA9RBn^C(wOCLe==Pb;_vw|a10-7 zDE4KBe?W9wtK8o}!80_}!e}qZ2##dblJxc!Wm~e-h8H!!9UH|BD}*S8LKp{ie@r{q z=pl_&Bo*b@XVJw$6Zvg4<_KZA^%nO>Sr*bcjP1$&kSD zl?bBSkju+CE&l@KS+cmf84e(R`JmrcM;x8Awk~IBJJKUJt41&=(60%-?JB+=c)2YK zK{0$OoR?>HHe*OeBf+;nv2mdyUtfKFUf7qok=%BDfbq{buCF-y1%oxr?z6dlkg(tJ zEIIx?YFJiyDr!2f0rQ^fBYF|*q(~X}K48kjwHn1z3(c2Pczy>k(%UcDZcxunFq_)Z zO#?7foeLPo_Hu1JPu1fx&sh5uYn(>d(nZj70$rxitb~Kg6I!WFWjjI4n`Moc+B*LZ zP!?+5TJsVK9lU#DyF-vkpp8!F??pU)?Q%64w@h5`D2Tq{tw}nO&9*zL(OVA65>ArP z7&a@!2m>*#1x%A-);8}W&bF|xZ0JfYE^8y0rzom+X=h1)5%{`egVA^_t?i~qO(Z1U zAz3m*6e#D^dYx%xiBSysk&fmDj@TGm$Ys%o+^Sm~3X2#Un##CCTc%?FjGK;inuWJ= zCaRkdGbAS!r}xURDcNs!W_Y?0K^p-_V^(r(1Hgj{ za$j$5Jy~|>H+Bv^e(qP2p6J8BkiFcj@m=v(BIoibeKqoHjn?J^8vMfKtqPc{ei7Yo+oh#aIduZoflVt}I z`F3#($dH)VIOMx1+&nh4ML6x_PSz{?ah8rXCu%?EQ~Vp2*SW?(#d!jIafv1>O^6NqM%rjnt2az)M2=) zTBP_0bv3R1g`tN2KjcacE8Z*g%Ya6`Zh_yp`f`7HJNx=~tH>LZ_-{1tO|KJzwiojE zGvLM7NChTwUUDs4in$C>5EHu5K8;lC7G70*DBiRBOGG+WIHl#(1X6++!~!qJ1D6`N z9xQTXmN=Qfi)Eid*31IU^8Vw3!q13$oZ7_f7F9I-4A;b~D{lgKAn`?-Jarl)l&9V%u+O&v2lS ztcYZF9vkz$oYbHfkP+NtK%OjqaH&%q@k}fLFDf^~)7&Qjt{wJ4oFNo;xgwu)+1zf? z)xtfF4f%Q4E?51w^VQ!gZJ&hyrPMGNue?|U66%(-NM`_BLdV`6v7Ia~gH_KL;_G5o z8Xloy{fUx-Q$j`)c#=^H3?M@|lj8??(43R%_rIb2N6`td@t5c*iVx*p1iyCzV88bdES2E=Gm_HvsAEkOJ(&cD^pGc+&hARDdu_vbQABL;9= zweoA3Spc$Rm8tRcx5?{pnQ-;)HWXfzf~W#mO{9q-a)_UmfPXUqW0`=F;EzR+M* zopm&OBYzvHUYY>~rPLLMdTfAwW7sV#676B_e#wN^Zr}Yi=$zW`vXW|9CC+`P4}M@m zcIfEX0r@fcR5Ydf67rrSUw_f)9b~2Q+YFseJn`9~#5`6&)!OgO z`@G+A5BcN51K2o=JnRO8IxFZMXCcr337Yg{VTuWO*?^w(RDv-yK_Nyuo4f3YaBbv| zMMgttYIf*iLOb8%`rfZs^=dn;1@PK;I~d!nMOMia=V7Vh=Rn~{TohO_FEm!aeLt>X&O4zkMSR_fdfp~L*n8%exs^d>q95v&tW*qtZ<6X{=J*`Kv zdUAv|YLc3~Jb+l>KZw`gF)!eVjcA3Up&z8W1;opfZoa5y8Q-csvi{DsiidT+VQnXU z>XhQ_QdpLMuP?>i;se3AG=@76!|KwF(Md>6B4@3XdKQ8?8`9R2@BYCuUK`Y_607mVU6xT%Ovr14vE-h%3nv3I@w4rpx3+Oqm*??W`Ri-hUs%$r$e0dlKJJ&zJInGA|M-KmL zJU$tdsJ|i&ez}JH;}3kdt{(+=xd8;_Fr3HQu#z!QAJ|;=&(?pU*%u9TPOh{@6cMWP z+p{z5cFQrpK0}-rer{q7D%-*lP@V8(;bHVSD^yoo^@3uEoPtRK&R2L0m6!J>f_TyY zB}{BKZ0bP1K4dCg%X=x};x_wlGt=&h^J&xkxI3dm(!^eAx~20?*9M*44SAuQbtnBC z8&v>ykaN0uxJFpyDj%H;uHjIgWtoB`*?zkfr3_4`vgV#SASFcw@9Jc>lkin8v3Is}8;}~}w6i{~{ zz4bw}B9L4{XA%Xd>~8A>2^<1v`_PE?M5=%IF6}MVpmma|d3D zg_AgJkDk_7XLT;qfByK`nd;cE&d%nGR6+LDc+S;Oo!J_gkQ*i}Xde=~Y|(7WK`Tkn zPz_fDGiNliE&~X00^4@rrq2N<_smLY}F$HwmL{(o%wck9dqQuPNHUw@Uxe zZJZ4*7MDh&GYr6?^0^&xWVY#A4#A3~>vmeVuCvTEt1%t9J8kO2taERO{yXirMfc76 zv%wK$`^!$dF`Q#j=QiC3bNUKPpL6w*Fhe?(J2Y!@r08#c07>#TZVrE9SI3>j1qN!StzJ5 zDu`yBK$tL{@mqOX!WmtaEHa=CanP5B;OjfUM@e`6M}xv%AR?O14!A6RK;}suYffG( zZD2!?D&VxRpYebdE`QnQkj(nkjc8fO&$cppue#{UQXdx@g5|TSm(9 z`R{T{ma7{p83fbj<%=gjU`a@8I#3AD_{YmaKCfjB{7);!sD7IfKz$ zWTiVq^Fn)B^O6q7tU^PlLc2|%VZtL%FH5|&H~m%-YP+E1a$m*gmJ#$*lFyMJ+_Ptel`0hVY5evu&AuJw1zBLgPFYkT5Rm9s5-D&^l z`3Tb+>!SDVqbJ%ZV@2Srq-_Cw1($!b3vh?}X6hJxhB3ITk?#~Nl*zlNc(ES!NIcOw z_|5998~FKK?pGF8J?rok19b_613I5aWyWJA>UAZ~w-v0W?mk#pTITLh>tv}PSV$2M zgkA?rG7m4Ivkpk56f56UbNo6fRA1^eh?)qv8vu_b%1?c4#w@ zJg2>aEg1&Y5S2hFn;oHGql)g-8N(il8fG4;{h>^(c!jf_8DhnuAq~rX8w78~O|#&2 zqUGa4AK%#2Wk)CnmkdJwRz$e09bS@orHcT}ejFHUYeFiGdbBH7Rw>lce#)T6v19yw zq}79Ug@ssHUxbEHEDfghOPn&vHBw6|d@5bRkU}wEd{WtuJ>g0tvL}9DkWAw5IiQ58d(-f$QW+MK z{N`T0gy8JK~)FA$pd&;WtgcMt!HgJ%SqMO(&;fw9eja;>@mO3EDDrOMJYu) z#Am#Bq0#uU16bgecrMoFxil5cf>9!X9!9c%Bl-Y$3hZXbo}0Bva;eJk}L)jQ^qKX zhr(e^6%TsfvXc7mbx4tXt5VDnv%eBsc7;ddIXfl+8AS&4`0Sc&E=QXte2SVfq!Lug z)Qdy1;sg;~OvNF5Rk}>@BlWdjug>dKO11%kcg6D|me^iSJkc}it3Y2iA-bW$7FTi= zZZdTahA;<(Xw#xe1P{GQq#V|Ok;asjjM-k9TKqcEdpO2k(mqn+?R~+o*_Uk@Cgop* z&}RQ}eSIdFzKA%st)FF@jKno@UWmSPY+m(r*wJ@b3Xttc^R0nbN<(LwQ-9)juhYjS zj4I@I$$j4>w_ADmEuzlSE9Cl|e26=M=jF1YQ;s|#^aCGqwj3RbAeegGqn0K*AOCwMbrMIkf|UZGj#I zjkP5YCq>3P%>P>pz*M5aDMI1CB~e)!YBX!(p06C_XaR8bH~H-$_d-x%qIWX3Ja`f> zu$oNPtr%8MHx5kGzp}F$;q0{$*Oz_sZgWs#6QQpqADzD1i{*>y0{#0D^IY)<1}96o zHhky@F_x`$%#uXQ)>!Fy;ef2%kLmAbfuulcQkd1hcqc!gbK04>_n~oHXE>hIDklV< zcSGDFi1`-Oww4UAQ#}CRrubdW<3MMrLv;$LabQ3EgILtW@H5B`@Tpp`(~bv9Q+dYNc_!f)mP`{17aM3p)~x0@qktK4 zU}H93K{7)&_N*KiSs4gCuwh#C3CfOSyS9|A`1OU-lh^b2QuO@T6Jd0;TMz_wh4fUF z^!W5V_;`=dEZkR5fZbXkd}}nL$Nhf*SU{)0OVR&Xs-WmuW%FJqLJ|+_cGq-kAxX?& zXqkVOY@+pZ?5oyGjg4}fOMG{d0(vN;EfCWGcst*+|PL_t@1OxvEi z(;`8UPk-erOq!(a5c%8D4(*T-V4LPSwKC>Nd3=F3k8P7cezyu!N~V{T&S+FGs3rL# zE)HST(%EIj6b}N_aQu!{SoAA%LSqZ^#Kg1`)?Z$>v3MPKbwD0I2Gqf>+9qE+;ySy; zz(ZoxL#d*y+j6~2|30idYoRw_dZ>;umVd6% z(Q}7XVMA6M3P396E-tv3LerMRLAT^O`Sc-HH|BHMkRq0qHQ|2OnK@;f;~Xp^hFWP^ zZ58CyNr@*m5u~i5LB*HjkBpzk#L79}nO!^uAY-_@`E=uTGY8U0a;B01SZbZW`@QtW zH>>IF1n}%wal$@1s6W;g+FO$8bGx>c-Z_Vr1pLT{j3c#_4kf<^&F?IEQ8%C5VTmRR zXl4&;!7xA|E3s_1+TPnz3!N+}n6*eZ3EtSC-ZY67 zJHaN?Ek`h7a>S_%>C{(#BW-@~yQzIh86@683{yiRIM6L7cIW_d{)xF(s<@1I1z1-= z%XL$oQEgR`=_Rdk-TRZl7VaVE(1o|*0)is)L;wDoC43Z7509Z8v44e?h z+T3q|6?=*cy2UYVA5_8W?;$HqV&qFG#SM^t$GW;6JFv+dv~HUp6`rkm`>@7LB}I!Q zyN;qLo%-RV3zbw1_;Uh>HRcME%>nI~j&S986)ga|7;X^Mw_;AVEsyL6=jhl2)_UXC z^)z_?EP$~#)mzTDvMHe+lHrX=_YAbXhG%4>!HKCxiZA9DNKb))gYX3i7L->{gCd&P z(R1{Y@7*+d_B3_A{w%${dyx>wz~-1FoBu5U-LV&F@9jnPF#Q=w_uhG28Ulfu)z_j2)bl{surPyvS9~y;Y4t>(xhl+ zyl(!}Dkm#^bc>5_n8b+AV^+8jWOy4K~5zb(y^Bln)0FG_dwl zi7*Js-rc(~r)rapej9}MF+zBjR!D8E;I}|}-+1eD>DEp!UEumRD4*Pil+q_ockGOf z6r@&a(Z?tN8xb@?ksU~|`|t^M=oD&jA1Was2GMpKLHK1HZG(r5>#+N2M>;3S_ZsJR z%#C4%j6HeUK@`9XS%rPJhtN50c8-^2Pp~P7d&RVs;Rp9S(j5WxGPNf?cFfOnT<_do zWP)vimO=E2j%AQs;G+*dBzr-M?VC^2TX#;SX08&F{#y$4X9CP0GvoO$@(1aIt4y;1 zb)A#8Y7)CjZ#;MDYD~C@i5kXf#;x|~a)N^GVR4ZYuC=39ot`15St}P42bq^7-&?Rq z3ZrZ=24@%$)@^RC7aFLL{NdV!-ny%R?8-Si)yN{tttd_+|n|M z6^)4;TO*5xR3aAP6*t;s~cR8jpAitMe9HVwzXwDz)b5JPuxem)^j@XnGN<=`+ zys$B*^Q9bAE^0q_91rOnty>IEmtn=@`4s**s+X$eZhQkU}TQj<%SO612G{<$ctrcq{ zl%weWoK(`3^E#(X0M3y%P7P7uMg48L+ayLF;;D3)@!WTOFbuWa)D+zMspYMB1I z?w6pmvZSuQb_**_p~k{OhCmxj6Z2J>QYUd6| z3!yF;UZULQkh_!_3eNP2O>LFq@H8E_C{PfL(snNDdSlj;d1d(4rbmi?Ss=Xjpf)~5 z7$k(qPwo@jcj%2~n6)c-nWS-yE> zk8d4$k#3})HwgF`yh2u-m1H@un*x+(YC6#S%@Nuz;lMzGi8apDHPhUj-=h#6$!ong zo`QrJ`P$Zg4-w`m?)Ky{S%81NMOZ;48SRDCRVu9L>n#D{n0wtPLZFKhbXY&tVft#i zm!4fS{Xhpzrf6&shn;7_psAo}24srIDkg-r;pA6#UFP3Gh<2ol6C!!1LJi9)2Uwcx zipuE1J)iJxe5{~OWOT8)M{=HZ(-n5})dD=W1afyE*pUb+u%FmKF*M#GbPhj9kYiA+ z%qZSFGR-BRWG7I|E3LVIqX2u32U`&VbQG-< zEhc>4zYiEQBgteah-dp@e%?pun&&B4K*(xX?HA90HlVg|K&SrGf40G=Qi#~k5R$ZhidvYI8N}#xqgS$ zPZ9jC9ZgVpJtkv%-R7B%lkEYvYi~2>I9m&@l5%dB&tuVk$YBP0QFdjK7&3y}>AIN8 zlY4CeNTi?e653d23OpUG4VSy%ZChDpxoGg*1q@v`E66z4SaQ!kT=H+;Pd7ejrY1<24#9sKrgd^tOH@&D$(*w0Siy0Vn@aaQBD%7%_@o{|3}ILJ z<*;Kt1^;BWSs-Cp5T1m>hEj;}vQTWrjAN*s*4$P^)^JmN;u-~BAq&lZ=v+^YSX=C% zDIOq#&wJNt$SB@WV~u+#rJ4e+r|g_OG44&X~8&MlwQKAp4z0}T57vk@*e4oIUte8Zm-6yXjeSrAQlhgj9w#tvlbLx>saP7{|- z=}wa4IpAo70M}3wLzGZdfr-$2Zry2BpB}=3Wft3+(4^0`5BdEn(=npY8V%~B(!ot` zdn3*s;Fh)Ax)zb9bFwDF4>3i6aE_2lvvr`n9Yk!F5XVPogY^zTW?SN5yq&v{8iYdq zCyye#P@}A|O(tTSF+WRyTgJ=wLbGR?GpG{fmo~_s*&M>wLs)F9+G2(ric=zs$JKS# zD(7>WK2D*C&S_x`MlyKsMY{g|X}Y`zaLJ_@02-TJOK2rlv_V=3iH#OW+>$TH^|umCSKiW2TyJ|(3od!? z7RzN$k(%K=1 zlGPzFWTY}0Gk$ky4K?T}okFB*M(!9_R;}K0UNO1e34CwS@yNr0{bXr+tr zs5&%K#?`XAj6Y-MvAwq4nC6iMiTL(P26zU+6=$Psl^qID!5RwM8GKuaQO82sLu^8^ ze?;M)*M4T^bG3}R-h9On9y!=x1`<(Bi&@w(!2-4sxH-suKiVo0N(AJ~2c%V^NSuQu zmwb+A69ehE7TfFEebeHP=mUml(E$vbutqt6mmY@A{mj3cLzjSK^8?prf?zw1#P-Cl zqmw$DR7OQFHd_zta)VZ9^ziQ6S_t6FJo8wkrt59HVTm}hzieIXGY>RdhBoU;o_WNu zxv?dY0EEw8pjb0lU^V)*I~v!in4}szct2e`#XuGbL|Rc*X|~Atq}@a>L`ddNEimyQ%WhShYj9$ zoDWkdmW)p=93iHTcpRaR;tmxA{~ifK*}X%u2QGZySy4`Vq*z4a#c-Pm9JrVR+U}vJtLB6>dT3U2u*LO6>g8?X>i* z+vyD5QyVryOGyi4hPE&KdHebdXlWv>(ndqY85*q*;R7tPZ zDvM+bfDtoKjG2d!X8P&Hw&2}Glo*s-GXpVa8g*lyUm)CT7ZBr~yC{)0n0QOyxs#go zOsi4eYD?t0d<51sibal%!_Bo0e*1Sm0_~51NAZc581=1a-Xi7+%s1k`Lad8M{I^?A z(*3uvinoXZDV;OUYd4p%Ld-R8Y#`Y51cE23pR~4p~2h zn9{V3kp0!To)Ph^IDricY(H$AJj04toWP+AZ3`#y0dN5)d1}$APKmfV+BYG%cIb?J zpU>HUTh|>OJE=;;)jpsH_|r}Mb6;S6Ap8(YIW^S#mKYNhTU!w6S{v6ddX(vTv`|<> z(rxxrYw}#z@s3XK4b$=-N{#1kN>t?>p2{Z$)SvMCBf)x=@%M=k=%18wtDO9b$Y)`( zCly-fw4bF9Zc+z(2?4O$35sZ^xxw6GN-Py=-DObe}&(m4e24j|6n;vUaq+0B&SHWWgE zF>~bzmvgX9w`CTy7>d{cG2mTNZ=M%Hc5c)v6>IxF2GQ}J5#$V~h)jri8*r%QY4_-G zVj57es_ASg`<4sHNp#TzP>_kcGlbXnKsDY|RiIH==Gx6cOZ8M(CC*f+sG8wkJM9Eo@-%E=qT%> zC7$qnW3&zn+UNccVX5_)m{~_5ud`NbumQQ+ba8Vpb#C7y1}|C($AbtE*8G?IM1qQ5 zghF4SckDspDJmCUefMtHg!1j8c?$lqTZ=ZdTb}!I!_e?vjFI|Li zbOB4vykZ2p21uqWUI1(h_E5N$MXJdzqL~1gykp1H@^6vl86a2Crp(vcM8I}B5=^jQ zzGw7=f&)3$5>%q#!_6rV!Y2HM02VoAK`1td8zh=26ky*nR`gJpU*uWEVAp=jJ+;c# z5pnFgZEkhX**rEiaHIN}Vlt)2!3&V&LLS?C>mIM=C;;(?BB!jN7qPbW(+YG2E4d3^ zaPI1rv~&A?y1T%fvpkfN%QpSSdr)4DwN+eGVq)u>dyWP&4mR#RDlidbBQCe;y@eAX z3|L?gYy{ddxiR(z0oIKdC^VO>Wj5}WF{VJz?J(jWjwvsDG7|usKxM@;KWF7?7XaLf z@=aSKJJYKsh1XheU2cV0iY?cx^7Psy+xT;MHYz{<-y@?iu|uoj0|L9k^JzWaOietq zHsMoan_+^?1#g-QM`@X#S70NP;R6e@khy-Xx*M?Yz6zi5)0OCxEzk?{M9?XW7j1Kk zDS1}kP2XC1KfQbtHzzyRlTWdMTL?38a0PUk>Lh8I(fc!+x{H9CBGOvp^4bAK zVu}qnu*kBb3p5j+jJQTfsT$GMQj)Y&lS`~;fO*VF*loVX?=rc`NX&! zt45lr2}N`44CP+;9ir8>n`gMy#K289!URFiU{A$2@!8ad1-3eh_Clnn0G=$p ztn)3?YzT55Gc*DaVB^5b61g7Oei(~uj@nM1&bE@#wH)0tIi><@!HAZ^-qZ`U*7C+E z4hi7RxRYzQ5JSqPDgzVW0GW@e6E^0vh8tn4V}bV%N$*J4G)1Ozu)%-|#*HdCh2Sp3 z+Uj%MWrTN|Hop>1GFWDF_}2Caw*!lOa8pzj*j`oh-Jx)l6k>Dp%eLnAx)(Y2$nuFe zE5u$5YQFD1BX6ExBy>6x7TB^%(_ak~b5x{7V+ivaKJ$ezFTydO zQwaA_cxDWM}!oG9y6OG)C#GukL~EeLzkJ< zupk_|CtDL4Q%@rO73J4|C0ML_i zYfU#9@3Re1^`! zUPf`PJlafMT=SX3{$TF4X{1pQQ!IDYEqCL5x*6>gF3<%kIR(xQzO?{_{;DpmF1Ri% z)W^HE&2)!hcTcW?Y(k|JEHn0M(pyXNNduu4i56A$;fR1s0SQZP%0~(($5wX>#7;$Q zv2+vMSkEgj+sy88mO%wbaYAdO!L$3Ya^Zm4Wz#zKpGR(CNo|P3_kYtFN z8#HGWeb=JOi5IAfI&@KV)q@;<*Fu3^gf&sGz7XsvVGV&ZW-ly!fP{h^QjY}JBn5HJ zG5%Mvcijxl{4B4Dv2^)e%b8`6R%$$}CaKB>!k)=(mx3GkOz4Tf^{*2l&YHeTvBF( zL6K#?$5`wduCM*R?V@5Sr=0O77Ih$~#s+E;-Fi4HcY?RzYTlmHVGJWOM8GYkMd|ALS=nFg+=!vIjxl~yE~z9MfGr3iGy6TcZYoU` z6TAUiBn2lsSYL-UBV_hBC8Kv9QwQE(rOuskwD8Uy4j(`!ibMokfKlOUENG-tEN2mZ zsD}l>76PlzQh6Tj7sXY#!%@fr1588mlEtksvzSv{z&S{ z?2co89^y_1Hd+IILhJFfRK5Esb?pCy%kyADN?%@Ju6&Q*gRTC2z`!!1>~Lqqd;kQEtc_9Y8R!EK*&ZmmTKku}C9Wi3S% zT$9}42p;0-3fA0tQ*F~U#IrUjh_SW`4+6c4VD~mRiIpAOLp4_bKBh+sUUqZ^b*`3W zq6ke7moHp-V}9EhnU9uYD)40kZ#)nM+4ilu|bZkv#5Pxaf{a!=%c0-hFNhgUkafsW^a2g>(ssHcrALio9ZL{azAO| z7p}UVS2WGwTV~K!iu zep}S|>JFNxwP*qwV$@xe3bX5p-0kT>F%+*x+Q_)KV@?=>x4O#$3u9n6SQr`OMn2cG z%Ls0=1J6a=^-_!n6}}ug!r7>rH`?-g;mv~ zaVVbCK%ym5fLksxZ#L&11e8L(8vp7tyHkB%6nR>!41SSQBxCzs-zf;^*016PIYY!r zB*O{*64v<<_2qXT_tVaR5U72g`BrODAkt95h!t1>LP1QR@tmUx8n1gDsW}m9-FnxE z`w4!4XVg+_5hHC?xZzQBv#{17v_2k0Mfv%3Sf9;G7oqBY_S}UVKI`$oHru zLUnjOhC_;?+;bGcI!d+q@LB3Uc%GWzDh-Na?0N3B*;lSew`!$bOGCs$2}Lv?n)OE> z=wiDUub%{_n3lIFcPj+f`z;=Z;EVTPG;((%+9~6ZIZi{;Cn3Nc+*_>1*pv?oAE@d= zKO8_2eYSlkZSK6EZoGb)-eeX6P?p$QO{>kbSYBwOG&Tsz=)$cwrZ#p|sH4;ZOKzvk zXqcd3bW#KlQ(?1V;oNvw>uJhLP3{Aul(mV^(p=WswPd z`89DWh;ghyla*Znak_yryk@Ydq6q@|;WjBRL9LwYhyiaZ8LsDC9n~@t)q!d5t>x2k& ztZ)EOu3yBuYC`_*A;i5k`c%=Y`2gWPWK&Jp%s6||RWleD5rAt^d>{^dC%z3Hue+M~ z71!{uzWw`H%dK?bdMBNy_3Wi{H&{~;aDcNKZnkl>0u~?{ms9k4b|aAkMYxTkwUEZ( zy5!NpGn&}T5i4S~K#3F%Kqd=CjDPI`?h%8S)H192^S&lZ=?<37_g%cZP z0!P_%n7XO*Zz@7lI#rBUohkUneO63G*un8#3%*SOX(8OiT2U>&ZnLhT#F_XGrD;xF z4a9Md&}lchakC^4Jem<{oKOfJNedPVK^{1bx}0rKEpAx zR5nHzb6ti`;lZewCTW%Dz5a|^`1kLp#$&8E?zxjgRN1OPdGW5bopwIK<38RNy0FI) zs>Y^vsP~u&4`W=!9M@3`tV=!M`w;mWA1$0NO(50^aKSu^5`%i3pdU%MisUc1qsbMt~ar?Xm;rA0AK{lv=%bZh_#K}L97cf zMpr!E_)*zn*fqJr3a^tWZSA9*=!VkDYSBY@e6ocL5%HZuBG{z0axHv=h_e=7w|()s zNLvwW&Oo25&^68dnveHd!@?eAQv{ZDrx$=wkR!AbT!`L_f}++GR5J}0-ATd=bW;|@ z6l;;4>7}qL7wz?o=A5so@=E!Hpkk||8Fp2Wg>G2v9G6p9U6kXMM2akt%^Asl!uvrtgX$f7E$$JC00;eL9| zD54MV?WY&JggrBQsV@`OFlnSq3Fp!>ZZ?46GS=DnSN2+6OhG{mbEYe;=Of-IU|Enp zqVOV=jP7`m0yB-M;`14+*c3Rss4AF8_gE+a4^z11M=`X&40l@3Lm=}g)?OHcBNzQh zm?IYVTnhHbgg?&hL{M}19M8-}pz7@J1=15}EFZam*FSbl^0fjKL#|njASlN*61!*o8Zvg_t0ue^C5QlgcMI3_KA*tCxsL%N;6NY~yzo!F`=bVD)s%+Fbck*8J) zBRGMMBc$_%Ydxj^bPdC63bR6B)VVrt z?L})Dl4g$mzN_9W#41%6L1GVgXn1RRr`)npLV?*Ha-N~Q<@T~;VmYi9#?bdbz5+Gz z_yx!r-_`n?%U3e{NHOmBwDI9Tv||aq>`3}0)9raW#p0L>cq9Hxvy|sKUg-WPTH8(` zO(Od%e<6xQo7ScF9$qSDdaAvu&i3WZQZ>#}53iKkm~bTW+ncEq5SztoOD-^4upAL| z`vA<=cF<3QI@wdSzjd!|@~SCMbeGM_&Gwczw8-UOq&@rO;H5_MtIez^zHf% zm{<2r#c#fJH09O*q5w6?57E5da+aZe}VQ$P+&(a z`-k(ekfFQrxTgHF*9LlX6_xCWb?wMx%Kb}ASwpX#PH1WiIOG=gF{TLshEeEWQ*BrV z_hpSOvPD%IHRDbNO%6A}v15!44N5b2I_PK%Hx(~4s+$QK{Mg1iH`+E@JgeCSDW$wp zWTX3Nu%ldXhSfcDgekuSxTT{dM|tI~$XKIPgwe=?q!i3F8a1lRs{9{w6^U%99oFWD z{~G4n)BCvsnpNZhFonyKGH9VRc$7`UK`suNbi1I-<5Cp*_;5CyC>2%{1{ns&<$(UQ|foKtkhEG+`T2e@k*Q(a>xkQ($&E z9Gk{L!=dE*jES@33_%5L*Lmq*<%O=vR7*Owr&Y(y8ymw{UpX4S_Nua(RKzf!QFkp( z4eg}fT43FzDIty~z=Q)y8sGFOE_w|aHhIEgguhrh#ybPZS4=ZWPnCU&*c?AZYe!Ha z3=${{pd$d%;nVB{l1958d1hd|q}FmzXeMIe zVo%ts8n;KPnSTHF?cu$TJ{j)ZKOOEpRJX4uDt_6!IvgmDye|;rxxS*;fxOq)$=vNW z8@AJ(wYo^un24CEH8t*zZ>cuf62M#IlzzC+O{ucn_5Gyl{=I* zW{zR|mIIB)v`5?_zVaQ|evh^_D`1`1_xqkkZR`@z2#{xsLO3_$7bO!1X`j!&3{9^? z`BqNMlW037u{<_84I2Ml`FVEKqwe_vntQN3O!^{@69ye1lV?nh@TqotSP8gi*B8TM z?bUQa4l~=L&<)c7WdgDwtsBq~ELcDW1?)wIs>Z=(04I3@+6ZWqd&}NRY3&o+mBauo zPHWq2NyApDfY%heDyIM~3mze`jU=Z*Am@P*;Dy#_#CQP>`5H?oyh1WcFdH5`eK0Iu zUJT#5csk1^}n`*wWxup&3rQvbZ zLBjzl%^7rq-Z};^JIO3w5C&fa6+(s|vdygdakz28aHf*{h)5Da06*DQN-FW9!^_W} z)B*Gb=Y<9Fg7=WtYC27F2;1vW=BW+q)DYl<+joas@2l?ogHP2aNdj!=Kv`o4!(5#^ z7usTW|N0FTlpGBE+7)C^9_%Y}dZpZf=hMgt&|5f}EVL?&#M*)G5{@z@CB|Nkt)|u! zz?J>s=WZvL6O4*ZySak_$apkuU&p4~!|iYt*G_#~Be! z>X@O;K1*T7-lUS(nkmUQuaWPst)SF|6dVvfKWxc=-dRG~WK_ zr^BsV_f(TijWX?iR3ss=&JOgP``E{a(!>kxx^Y8Z>wPtqAUYr$S?tSclLZpT=n<59 z?NB{s+RS{1!a}uq3JX_?Jjy=4U`&b{w+|JknD-JAvFDP?Ku48oP&y&$uKenn~@U4RIM4@ z$*r)X()iZ;r4WVt!{-BYIQh{VMcjQ=Ux**CQyahjt6tHRxx+FU`WObl(_dN`FSK?x zSgK_1R9g3VUnP1kYD*K{+&Lj8y~qQmB8Tg88fV8Cpz%mU^CG4AFg3E4QoLArr~a7#o$mV7hMtTr`&}rea4sV~gwA@rAZdXaT@O(HKlS!`S1h9YCf%u!G!} z0pJAvcqSS6GaPR`3L2ZnbvV)lLM1aQO;h>Mhuhi^eP=j0+SR|>5dP>;>5E#hl6MXc z={afB>%tI)y=bLF*b70yLOZ7ywt%%sp1C@%C~oB;!d~XM)EC5w6(r;6!Um1Q3%gzR zMFf&IsB`NeYk%xC8!eiAXf;9$ZT&>ReXOwE-Qmt%C4SuJbuxS=D*f;gW{B)^0gx&# zfV`{H&a3LZz0l4j?3Qt;`s>|Y0a^Ajb=@@VqZBlQgjcyUxe~kONn;0dugSsA5)8PV z1=awAVU_2-zvJiO>pY9kpGEInYryLD5)IgX2yVqYUD~u+XOSf~T}$2ojWf*vwPP!B z>;|kmobp*|UnisZG4tLi4C?REF;?eoTbu8DvjLhuu+(Up0UIb`!!xs-;nqRakpaMt+Z*ItTu58VwQD{yB(i6}j2`ZjZK56e`4PH`|{$3rn zfL@p4v6q`lC*E+(+0En2X=Yjk=;L5vK-ZHO7Qp>`^7MjwB5ldkTG824_s8B+pQyzx z6M4YK>Uz#oX>V6&&o!P~x=-~y+gV&5uD-Y@EjAyn>9v1VVBJ&5YkS{7B=ZdKFPj9Q zAptb@_)Hoalf-d#cJEkJT6;sCsOt(F3drO71)(>RWvD%t?aSU)Y!tAoxG~KW4pp7CD@}Yw zdyCDLnYJ(O%#X9X^tw!kQiC81+(i?Re-dISt^lk&O=&kLX&BsbKE-QY5BvSS^l6|4bg~qj&kKt z@dZDydgXbLZKL9e7D!L!fxbA91B*?-U%Ea#zJ5h@##qgAWD)*gHv_h*sjz@8ivqE= za7i~WL4G$l3Os}b8m!n0o<)_r7wCFmd5@5fRU(s9G>yzEgV>(xqTBjAWr@&hghuvp zW&qJ#rt~G<0DGLzB6#>A`^k%`!Vc6BvqK}!3eH28S?*ieXwrgbG(M2m7D^1z z-6@kseEOWvoNg*Xyej9|hFVizX3Nw)Ra-6821mOq?yFSsNV`q!tKN8rVg$w7`I)IX z0W|pOB{_ZAy2kI)vP?`s+LCG{LNhCM!z9(yj6&C6s%y$huLtU)a$g?k2lto5-Mc5! z#A+IFf(cL|G|E0{3#8|9QUpD^sBFR;t%8xOUr{GjY2mqq)k1dib~%%YS@3H2$k+LPV1o$vm?&-=(XZ7M}Ofa@ZOTki ze3Ij{*?Al)91L&`R)aV$ekYfpS^ZhXp8>Mt(R>$MGQhR>mX08R-94-XxN30EnAnkF zuV&~xAU-Rn3D0`Q&KEV&e)jTe0tP^D0^FHPfD0+EN+nBlhlH$Gy^_sP_>B}+9Ca*m z>WJ~`iZ0O?i*0lelpCtDe_=!Ih82_FAm`eQN8ui2Xkm*3@30aeHG?SWqx*H?3V=l5>cOqud~k$(m`AM_{+`;kMP&ot2>oeFr&o4? z&!;4=JBFijjBR8DYpp|P#MSv4oOzbAjiJ7tpit?i_59mj@BZ%e_y%8xt(uDW{k3); zwKwXyA}frcJ>i&;`j;Y=93QsqbDmm5=b>C+;K9bi(gM}wo~el8LZE%TmLX(Cwu1~xkb=s)ybuF3-Ti^|~4}vfp*MV^mV#AlgzbQ~o0teg5;sm{S&l{2m&}?j26wWZx|iKF%!BU@z`6P< zCRNkm&g|-Ei)JJnDhU_dHFIRz$}`oxuTwE&OY#$d=J=^*bhrxEQO6_X*2yI0SaNu8 zeLTq|$@Y0~V~&YI%{a$D0W$_24**M&Dn`%ZqlloruO| za%+G9JI(9dya4S6-6l)O-fiwD*DxIdoO}+w)BQ$6^ZhUdfNZb>865+Cp4Pn1>TVhJ+9h#TAEPYI*-jG2~!j|ZN4wG>D55{J%r9JX;2d)c-)wM3)0M3-l> zd1oryoXZa0Rfy^En%W#IS%kK~bA7%LsBt_|1I|2A5YhHIdUQwNrGNydCR%x0>&77) zJp)N2?!2knL1?n@&9Xdy$<5|@+iqst zuTbU#pW}OQjWx4s2QJ$gQJfOx#dnwk-|q*%`pr{zDOia%ucVF7M5XCgvD5)%Ymw|> zFk&;C`U1)m942uQzRe5qGMuBF`&N+lQ`6n_xQ2x z#EPu%w|!(<0u|;V5jOx5ZH>3bzY8>WmZgr>Lc`9nWRUSUfH$qv-~3M34b#7_1;RcLg3NJ*f{I2fcX5X=^R2WpPr2`3o>%{90dj?nGIdc7;8slQkNf{U?7 zt2^{o0EDt5z*zVkPxvD6^>H{}oC51(L3A~|6Lqp@l*AI~ue9n8sg=-V)e+AW58hMO z)`7Oj*%qzd)!#FjS8Rv}kjH%L@=haE3@$IWBv=4u>}DtOa5s8CU?n3h?2r3%G=h7r zwUvedI5^zxhp&`#E=`)#|m!8_XGHLt!Pq3(r2c6M6Ixylv2sdrO{W)HYRT@SyGI>k;7puU z)<@Q|&IK%ISMD?Rb2-Wih)MTcYjuPL1LM7gv7L!KLv0+sB8ep0yu)M(l|^bJ9XpSi z`ykX{2Z$z~Fai|Wo43^@+pDkRn6#DNr+ES8i3Tp$tO+YaC1d1qtqP}!=HNR#V;ad< zK>*qc&1>O;whMr_1xy+XLZi{dbR*fNxAv}H0``Hnogv|Y6i!+i&170ly}bNx&0;o? zj4k)l@|=Wi0amBCn&p?r9p+ODx=3|4)8ep>VKdjqh4 zpB}%~)RjVO#gbK>wVE=?wNYQfq~pz{Ij1zf&pBlT)BEW4&RXdATLARm(|hK!xo zH2NGtfW}lXdy`!&X;Ukw*i5C8+iW=_3C;#`J8IZJR|gZSjqs48fvGo!!XeBJTxlu( zwWfdu*P?7{>K3>-%?#Xljp=|{UkhzTNR|o2_pw8p;Xn@!X0(ouZ3oe4QeCZ2N_@0dZYoo;-8nl08~WIm^0=GqOk zsbj2d=>}^Hk;YHo@04!$@l$783o(xG>+s(6KC~d-y7c?Mz5Tkh#9LmcrBUtBYBgGb z?g#N|uR-x-njS|RW~JueB>%6y*zFPgUz$1;y`5)iOM}LA7L}!OG$A%Ap1s&(Ol&l@ zX)~0sg+vJkYioPD4TuS+v1LjH7{~5>zj$VrI@_s{Ck! z4PaOQF3b^!2MsdprqD(5j6I%&QlQO_4Oh-G3(KIX&`Sf3cWSM)U~X#N;h`z84A#=B z)9_J%k#*KKjZ}Lq4k-N)Q!e#>@7yP6#=kig&)?EJvZy?I=?%V z-QTle8TWn$G$Ad7f^85_ZZf=bzH-Ewwxd~^Efnyv=M8k|cLW%8yp!#F4A?{28XHGm zPo%X*c7(Jrz}CjjmF=g%Pm&dTdimtDZQ8_zw5gv=aH^t$B!gCtHW93(bDbdIH{x)%+=Cj=#p?r;UQ z%X$W`%Q*n1HMBmD6T_S|9%}vVP)qCs+s}j^;>^%PKw$xLIm_G^x@a>UKQJKqY)e|! zHZFTt=~#vf%}gIKH_p>lp=1WO0TvC+ajn@#Eme!6DQ(Xm+SmQM3LtI!1spyoi{8R8 z8WN!52=sUKm4Mk)FV05&-V4@cj`n6}yzSHTwt6&#%A#+H3D}uKxg}%M9l(SUP$D0000 + + diff --git a/src/components/products/classes/index.js b/src/components/products/classes/index.js index 3e35aa1..4773626 100644 --- a/src/components/products/classes/index.js +++ b/src/components/products/classes/index.js @@ -1,18 +1,28 @@ -import React from "react"; -const Class = ({ - title, - description, - teacher, - group, - price, -}) => { - return( -
-

{title}

-

{description}

- {teacher} {group} {price} +import React from 'react'; +import { connect } from 'react-redux'; + +import { addItem }from '../../../redux/cart/cart.actions.js'; + + + +const Class = ({item, addItem}) => { + const {name, price, imageUrl} = item; + return ( +
+ + +
+ {name} + {price}
- ) -}; -export default Class \ No newline at end of file + +
+ ); +} + +const mapDispatchToProps = dispatch => ({ + addItem: item => dispatch(addItem(item)) +}) + +export default connect(null, mapDispatchToProps) (Class); \ No newline at end of file diff --git a/src/constants/colors.scss b/src/constants/colors.scss new file mode 100644 index 0000000..a1637fd --- /dev/null +++ b/src/constants/colors.scss @@ -0,0 +1,36 @@ +// gray +$gray : #aaa; +$gray1 : #383838; +$gray2 : #6c6c6c; +$gray3 : rgb(143, 142, 142); +$gray4 : #666666; +$gray5 : #555; +$gray6 : #ddd; +$gray7 : #797979; +$gray8 : #272727; +$gray9 : #b3b3b3; +$gray10 : #cccccc; +$gray11 : #969696; +$gray12 : #e9e9e9; +$gray13 : #f6f6f6; +// green +$green : #4dd35b; +$green1 : #81C342; +$green2 : #6cbe44; +$green3 : #00cc69; +$green4 : #84de56; +$green5 : #9cdf52; +$green6 : #08793d; +// blue +$blue : #a2b4cb; +$blue1 : #505a82; +$blue2 : #00FFF8; +// red +$red : red; +$red1 : rgb(255, 115, 115); + +//yellow +$yellow : #FFD70F; + +//orange +$orange : orange; \ No newline at end of file diff --git a/src/constants/defaultValues.js b/src/constants/defaultValues.js new file mode 100644 index 0000000..2591544 --- /dev/null +++ b/src/constants/defaultValues.js @@ -0,0 +1,9 @@ +export const ApiConfig = { + apiKey: 'AIzaSyBBksq-Asxq2M4Ot-75X19IyrEYJqNBPcg', + authDomain: 'dnvn.ir', + baseUrl: 'https://dnvn.ir/api/v1', + //baseUrl: 'http://localhost:3030/api/v1', + loginURL: 'user/login', + otploginURL: 'user/otp/login', + logoutURL: 'user/logout', +}; \ No newline at end of file diff --git a/src/constants/size.scss b/src/constants/size.scss new file mode 100644 index 0000000..2ca18c5 --- /dev/null +++ b/src/constants/size.scss @@ -0,0 +1,8 @@ +$xs : 320px; +$sm : 640px; +$md : 768px; +$lg : 1024px; +$xl : 1280px; +$xxl : 1536px; + +$maxWidth : calc(100% - 120px); \ No newline at end of file diff --git a/src/redux/actions/blog.js b/src/redux/actions/blog.js new file mode 100644 index 0000000..d873065 --- /dev/null +++ b/src/redux/actions/blog.js @@ -0,0 +1,27 @@ +import proxy from "../proxy"; +const blog = { + list: + (data = {}) => + async (dispatch) => + await proxy.get("public/blogList", data, { dispatch }), + // update: + // (data = {}, data2 = {}) => + // async (dispatch : Dispatch) => { + // await proxy.put("blog/update", data); + // await proxy.get("blog/list", data2, { dispatch }); + // }, + // add: + // (data = {}, data2 = {}) => + // async (dispatch : Dispatch) => { + // await proxy.post("blog/add", data); + // await proxy.get("blog/list", data2, { dispatch }); + // }, + // del: + // (data = {}, data2 = {}) => + // async (dispatch : Dispatch) => { + // await proxy.delete("blog/delete", data); + // await proxy.get("blog/list", data2, { dispatch }); + // }, +}; + +export default blog; diff --git a/src/redux/actions/book.js b/src/redux/actions/book.js new file mode 100644 index 0000000..f74ec70 --- /dev/null +++ b/src/redux/actions/book.js @@ -0,0 +1,44 @@ +import proxy from "../proxy"; +const book = { + list: + (data = {}) => + async (dispatch) => + await proxy.get("book/list", data, { dispatch }), + info: + (data = {}) => + async (dispatch) => + await proxy.get("book/info", data, { dispatch }), + setLessonActive: (data) => async (dispatch) => + await dispatch({ type: "book/lesson/active", data: data }), + gradeFilter: (data) => async (dispatch) => + await dispatch({ type: "book/gradeFilter", data: data }), + sortFilter: (data) => async (dispatch) => + await dispatch({ type: "book/sortFilter", data: data }), + + // update: + // (data = {}, data2 = {}) => + // async (dispatch : Dispatch) => { + // await proxy.put("book/update", data); + // await proxy.get("book/list", data2, { dispatch }); + // }, + // add: + // (data = {}, data2 = {}) => + // async (dispatch) => { + // await proxy.post("book/add", data); + // await proxy.get("book/list", data2, { dispatch }); + // }, + // del: + // (data = {}, data2 = {}) => + // async (dispatch) => { + // await proxy.delete("book/delete", data); + // await proxy.get("book/list", data2, { dispatch }); + // }, + // searchBook: (data) => async (dispatch) => { + // dispatch({ type: "book/search", data: data }); + // }, + // filterBook: (data) => async (dispatch) => { + // dispatch({ type: "book/filter", data: data }); + // }, +}; + +export default book; diff --git a/src/redux/actions/content.js b/src/redux/actions/content.js new file mode 100644 index 0000000..e09c8c8 --- /dev/null +++ b/src/redux/actions/content.js @@ -0,0 +1,14 @@ +import proxy from "../proxy"; +import { Dispatch } from "redux"; +const content = { + listVOD: + (data = {}) => + async (dispatch) => + await proxy.get("content/listVOD", data, { dispatch }), + infoVOD: + (data = {}) => + async (dispatch) => + await proxy.get("content/infoVOD", data, { dispatch }), +}; + +export default content; diff --git a/src/redux/actions/faq.js b/src/redux/actions/faq.js new file mode 100644 index 0000000..aaf031b --- /dev/null +++ b/src/redux/actions/faq.js @@ -0,0 +1,20 @@ +import proxy from "../proxy"; +import { Dispatch } from "redux"; +const faq = { + list: + (data = {}) => + async (dispatch) => + await proxy.get("faq/list", data, { dispatch }), + add: + (data = {}) => + async (dispatch) => + await proxy.post("faq/add", data, { dispatch }), + selectFaq: + (data = {}) => + async (dispatch) => + await dispatch({ type: "faq/selectFaq", data: data }), + searchFaq: (data) => async (dispatch) => + await dispatch({ type: "faq/search", data: data }), +}; + +export default faq; diff --git a/src/redux/actions/file.js b/src/redux/actions/file.js new file mode 100644 index 0000000..02090a1 --- /dev/null +++ b/src/redux/actions/file.js @@ -0,0 +1,22 @@ +import proxy from "../proxy"; +const file = { + upload: + (data = {}) => + async (dispatch) => { + var formData = new FormData(); + for (let key in data) formData.append(key, data[key]); + return await proxy.post( + "file/upload", + formData, + { + dispatch, + headers: { + "Content-Type": "multipart/form-data", + }, + }, + data + ); + }, +}; + +export default file; diff --git a/src/redux/actions/index.js b/src/redux/actions/index.js new file mode 100644 index 0000000..cc0da2a --- /dev/null +++ b/src/redux/actions/index.js @@ -0,0 +1,18 @@ +// @create-index +export { default as publicApi } from "./public"; +export { default as user } from "./user"; +export { default as book } from "./book"; +export { default as blog } from "./blog"; +export { default as product } from "./product"; +export { default as userFactor } from "./userFactor"; +export { default as userProduct } from "./userProduct"; +export { default as content } from "./content"; +export { default as faq } from "./faq"; +export { default as file } from "./file"; +export {default as scrollAction} from "./scroll"; +export {default as qr} from "./qr"; + + + + + diff --git a/src/redux/actions/product.js b/src/redux/actions/product.js new file mode 100644 index 0000000..0dabd1e --- /dev/null +++ b/src/redux/actions/product.js @@ -0,0 +1,30 @@ +import proxy from "../proxy"; +const product = { + getSimilar: + (data = {}) => + async (dispatch) => + await proxy.get("product/similar", data, { dispatch }), + listVOD: + (data = {}) => + async (dispatch) => + await proxy.get("product/listVOD", data, { dispatch }), + addVOD: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("product/addVOD", data); + await proxy.get("product/listVOD", data2, { dispatch }); + }, + deleteVOD: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("product/deleteVOD", data); + await proxy.get("product/listVOD", data2, { dispatch }); + }, + selectVOD: + (data = {}) => + async (dispatch) => { + await dispatch({ type: "product/selectVOD", data }); + }, +}; + +export default product; diff --git a/src/redux/actions/public.js b/src/redux/actions/public.js new file mode 100644 index 0000000..3755441 --- /dev/null +++ b/src/redux/actions/public.js @@ -0,0 +1,56 @@ +import proxy from "../proxy"; +const publicApi = { + setDesktopContentTransform: (data) => async (dispatch) => + await dispatch({ type: "public/setDesktopContentTransform", data }), + setHeaderOptions: (data) => async (dispatch) => + await dispatch({ type: "public/setHeaderOptions", data }), + setIsDark: (data) => async (dispatch) => + await dispatch({ type: "public/setIsDark", data }), + getHomeData: (data) => async (dispatch) => + await proxy.get("public/homePage", data, { dispatch }), + + setFaqActive: (data) => async (dispatch) => + await dispatch({ type: "public/faq/activate", data }), + bookInfo: + (data = {}) => + async (dispatch) => + await proxy.get("public/vod/bookCourse", data, { dispatch }), + bookSection: + (data = {}) => + async (dispatch) => + await proxy.get("public/vod/bookSection", data, { dispatch }), + getContactData: + (data = {}) => + async (dispatch) => + await proxy.get("public/contact", data, { dispatch }), + + getBlogList: (data) => async (dispatch) => + await proxy.get("public/blogList", data, { dispatch }), + + getBlogInfo: (data) => async (dispatch) => + await proxy.get("public/blogInfo", data, { dispatch }), + setSubscribe: (data) => async (dispatch) => + await dispatch({ type: "public/setSubscribe", data }), + getProvince: + (data = {}) => + async (dispatch) => + await proxy.get("public/province", data, { dispatch }), + getCity: + (data = {}) => + async (dispatch) => + await proxy.get("public/city", data, { dispatch }), + selectMenu: (data) => async (dispatch) => + await dispatch({ type: "public/selectMenu", data }), + getHeader: + (data = {}) => + async (dispatch) => + await proxy.get("public/VOD/homePage", data, { dispatch }), + activeCategory: (data) => async (dispatch) => + await dispatch({ type: "active/category", data }), + setVideoActive: (data) => async (dispatch) => + await dispatch({ type: "active/video", data }), + getArList: (data, history) => async (dispatch) => + await proxy.get("public/ar", data, { history, dispatch }), +}; + +export default publicApi; diff --git a/src/redux/actions/qr.js b/src/redux/actions/qr.js new file mode 100644 index 0000000..06dabbb --- /dev/null +++ b/src/redux/actions/qr.js @@ -0,0 +1,32 @@ +import proxy from "../proxy"; +const qr = { + list: + (data = {}) => + async (dispatch) => + await proxy.get("qr/list", data, { dispatch }), + info: + (data = {}) => + async (dispatch) => { + await proxy.get("qr/info", data, { dispatch }); + }, + add: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("qr/add", data); + await proxy.get("qr/list", data2, { dispatch }); + }, + del: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("ar/delete", data); + await proxy.get("ar/list", data2, { dispatch }); + }, + update: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.put("ar/update", data); + await proxy.get("ar/list", data2, { dispatch }); + }, +}; + +export default qr; \ No newline at end of file diff --git a/src/redux/actions/scroll.js b/src/redux/actions/scroll.js new file mode 100644 index 0000000..ef8e431 --- /dev/null +++ b/src/redux/actions/scroll.js @@ -0,0 +1,74 @@ +const scrollAction = { + floatMouseToggle: + (data = null) => + async (dispatch) => { + await dispatch({ type: "scroll/page1/floatMouse", data }); + }, + handlePage1TopPosition: + (data = null) => + async (dispatch) => { + await dispatch({ type: "scroll/page1/top", data }); + }, + handlePage2TopPosition: + (data = null) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/top", data }); + }, + handlePage2RotateX: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/rotateX", data }); + }, + handlePage2BoxPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/boxPosition", data }); + }, + handlePage2MobilePosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/mobilePosition", data }); + }, + handlePage2VideoPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/videoPosition", data }); + }, + handlePage2VideoTopPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/videoTopPosition", data }); + }, + handlePage2MobileUnit: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page2/mobileUnit", data }); + }, + handleVideoTubeTopPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/videoTube/top", data }); + }, + handleTestTranslateY: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/test/translateY", data }); + }, + handlePage3TopPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page3/top", data }); + }, + handlePage3TestTranslateY: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page3/testTranslateY", data }); + }, + handlePage4TopPosition: + (data = window.scrollY) => + async (dispatch) => { + await dispatch({ type: "scroll/page4/top", data }); + }, +}; + +export default scrollAction; diff --git a/src/redux/actions/user.js b/src/redux/actions/user.js new file mode 100644 index 0000000..31fe949 --- /dev/null +++ b/src/redux/actions/user.js @@ -0,0 +1,63 @@ +import proxy from "../proxy"; + +const user = { + otp: (data) => async (dispatch) => + await proxy.post("public/sendOTP", data, { dispatch }), + + otp_login: (data) => async (dispatch) => + await proxy.login("user/otp/login", data, { dispatch }), + + login: (data) => async (dispatch) => + await proxy.login("user/login", data, { dispatch }), + + // register: (data : undefined) => async (dispatch : Dispatch) => + // await proxy.login("user/register", data, { dispatch }), + + // switchRole: (data : String) => async (dispatch : Dispatch) => + // await proxy.login("user/switchRole", data, { dispatch }), + + logout: (data) => async (dispatch) => + await proxy.logout("user/logout", data, { dispatch }), + + getUserRole: (data) => async (dispatch) => + await proxy.get("user/getUserRole", data, { dispatch }), + + // list: + // (data = {}) => + // async (dispatch : Dispatch) => + // await proxy.get("user/list", data, { dispatch }), + // domains: + // (data = {}) => + // async (dispatch : Dispatch) => + // await proxy.get("user/domains", data, { dispatch }), + // getmothers: + // (data = {}) => + // async (dispatch : Dispatch) => + // await proxy.get("mothers/list", data, { + // dispatch, + // }), + getProfile: + (data = {}) => + async (dispatch) => + await proxy.get("user/getProfile", data, { dispatch }), + setProfile: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.put("user/setProfile", data, { dispatch }); + await proxy.get("user/getProfile", data2, { dispatch }); + }, + add: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("user/add", data); + await proxy.get("user/list", data2, { dispatch }); + }, + del: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("user/delete", data); + await proxy.get("user/list", data2, { dispatch }); + }, +}; + +export default user; diff --git a/src/redux/actions/userFactor.js b/src/redux/actions/userFactor.js new file mode 100644 index 0000000..a46962c --- /dev/null +++ b/src/redux/actions/userFactor.js @@ -0,0 +1,55 @@ +import proxy from "../proxy"; +const userFactor = { + //dnvn + list: + (data = {}) => + async (dispatch) => + await proxy.get("userFactor/list", data, { dispatch }), + payment: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("userFactor/payment", data, { dispatch }); + }, + add: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("userFactor/add", data, { dispatch }); + await proxy.get("userFactor/list", data2, { dispatch }); + }, + del: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("userFactor/delete", data); + await proxy.get("userFactor/list", data2, { dispatch }); + }, + + //vod + payment: + (data1 = {}, data2 = {}) => + async (dispatch) => { + await proxy.post("userProduct/addVOD", data1, { dispatch }); + await proxy.post("userFactor/paymentVOD", data2, { dispatch }); + }, + verify: + (data = {}) => + async (dispatch) => + await proxy.post("userFactor/verifyVOD", data, { dispatch }), + info: + (data = {}) => + async (dispatch) => + await proxy.get("userFactor/info", data, { dispatch }), + update: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.put("userFactor/update", data, { dispatch }); + await proxy.get("userFactor/info", data2, { dispatch }); + }, + deleteUserOffCode: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("userFactor/deleteUserOffCode", data, { dispatch }); + await proxy.get("userFactor/info", data2, { dispatch }); + }, +}; + +export default userFactor; diff --git a/src/redux/actions/userProduct.js b/src/redux/actions/userProduct.js new file mode 100644 index 0000000..2436d7f --- /dev/null +++ b/src/redux/actions/userProduct.js @@ -0,0 +1,33 @@ +import proxy from "../proxy"; +const userProduct = { + list: + (data = {}) => + async (dispatch) => { + await proxy.get("userProduct/list", data, { dispatch }); + }, + info: + (data = {}) => + async (dispatch) => + await proxy.get("userProduct/info", data, { dispatch }), + update: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.put("userProduct/update", data); + await proxy.get("userProduct/list", data2, { dispatch }); + }, + add: + (data = {}, data2 = {}, data3 = {}) => + async (dispatch) => { + await proxy.post("userProduct/add", data, { dispatch }); + await proxy.get("userProduct/list", data2, { dispatch }); + await proxy.get("userFactor/info", data3, { dispatch }); + }, + del: + (data = {}, data2 = {}) => + async (dispatch) => { + await proxy.delete("userProduct/delete", data); + await proxy.get("userProduct/list", data2, { dispatch }); + }, +}; + +export default userProduct; diff --git a/src/redux/cart/card.types.js b/src/redux/cart/card.types.js new file mode 100644 index 0000000..c52159e --- /dev/null +++ b/src/redux/cart/card.types.js @@ -0,0 +1,8 @@ +const CartActionTypes = { + TOGGLE_CART_HIDDEN: "TOGGLE_CART_HIDDEN", + ADD_ITEM: "ADD_ITEM", + REMOVE_ITEM: "REMOVE_ITEM", + CLEAR_ITEM_FROM_CART: "CLEAR_ITEM_FROM_CART" +}; + +export default CartActionTypes; diff --git a/src/redux/cart/cart.actions.js b/src/redux/cart/cart.actions.js new file mode 100644 index 0000000..688f8ce --- /dev/null +++ b/src/redux/cart/cart.actions.js @@ -0,0 +1,20 @@ +import CartActionTypes from './card.types' + +export const toggleCartHidden = () => ({ + type: CartActionTypes.TOGGLE_CART_HIDDEN +}) + +export const addItem = item =>({ + type: CartActionTypes.ADD_ITEM, + payload: item +}) + +export const removeItem = item =>({ + type: CartActionTypes.REMOVE_ITEM, + payload: item +}) + +export const clearItemFromCart = item => ({ + type: CartActionTypes.CLEAR_ITEM_FROM_CART, + payload: item +}) diff --git a/src/redux/cart/cart.reducer.js b/src/redux/cart/cart.reducer.js new file mode 100644 index 0000000..07dfa86 --- /dev/null +++ b/src/redux/cart/cart.reducer.js @@ -0,0 +1,43 @@ +import CartActionTypes from './card.types.js'; +import {addItemsToCart, removeItemFromCart} from './cart.utils.js'; + +const INITIAL_STATE = { + hidden: true, + cartItems: [] +} + +const cartReducer = (state = INITIAL_STATE, action) => { + switch (action.type){ + + case CartActionTypes.TOGGLE_CART_HIDDEN: + return { + ...state, + hidden: !state.hidden + } + + case CartActionTypes.ADD_ITEM: + return{ + ...state, + cartItems: addItemsToCart(state.cartItems, action.payload ) + } + + case CartActionTypes.REMOVE_ITEM: + return{ + ...state, + cartItems: removeItemFromCart(state.cartItems, action.payload) + } + + case CartActionTypes.CLEAR_ITEM_FROM_CART: + return{ + ...state, + cartItems: state.cartItems.filter( + cartItem => cartItem.id !== action.payload.id + ) + } + + default: + return state; + } +} + +export default cartReducer; \ No newline at end of file diff --git a/src/redux/cart/cart.selectors.js b/src/redux/cart/cart.selectors.js new file mode 100644 index 0000000..cfe4fe9 --- /dev/null +++ b/src/redux/cart/cart.selectors.js @@ -0,0 +1,34 @@ +import { createSelector } from 'reselect'; + +const selectCart = state => state.cart; + +export const selectCartItems = createSelector( + [selectCart], + cart => cart.cartItems +) + +export const selectCartHidden = createSelector( + [selectCart], + cart => cart.hidden +) + +export const selectCartItemsCount = createSelector( + [selectCartItems], + cartItems => + cartItems.reduce( + (accumulatedQuantity, cartItem) => + accumulatedQuantity + cartItem.quantity, + 0 + ) +) + +export const selectCartTotal = createSelector( + [selectCartItems], + cartItems => + cartItems.reduce( + (accumulatedQuantity, cartItem) => + accumulatedQuantity + cartItem.quantity * cartItem.price, + 0 + ) + +) \ No newline at end of file diff --git a/src/redux/cart/cart.utils.js b/src/redux/cart/cart.utils.js new file mode 100644 index 0000000..2eaeff9 --- /dev/null +++ b/src/redux/cart/cart.utils.js @@ -0,0 +1,31 @@ +export const addItemsToCart = (cartItems, cartItemToAdd) => { + const existingCartItem = cartItems.find( + cartItem => cartItem.id === cartItemToAdd.id + ) + + if(existingCartItem){ + return cartItems.map(cartItem => + cartItem.id === cartItemToAdd.id + ? { ...cartItem, quantity: cartItem.quantity + 1 } + : cartItem + ) + } + + return [...cartItems, { ...cartItemToAdd, quantity: 1 }] +} + +export const removeItemFromCart = (cartItems, cartItemToRemove) => { + const existingCartItem = cartItems.find( + cartItem => cartItem.id === cartItemToRemove.id + ) + + if(existingCartItem.quantity === 1){ + return cartItems.filter(cartItem => cartItem.id !== cartItemToRemove.id) + } + + return cartItems.map(cartItem => + cartItem.id === cartItemToRemove.id + ? {...cartItem, quantity: cartItem.quantity -1 } + :cartItem + ) +} \ No newline at end of file diff --git a/src/redux/directory/directory.reducer.jsx b/src/redux/directory/directory.reducer.jsx new file mode 100644 index 0000000..cd38020 --- /dev/null +++ b/src/redux/directory/directory.reducer.jsx @@ -0,0 +1,44 @@ +const INITIAL_STATE = { + sections: [ + { + title: "موس (موشواره)", + imageUrl: "https://www.pngkey.com/png/full/957-9575055_redragon-m908-impact-mmo-gaming-mouse-up-to.png", + id: 1, + linkUrl: "shop/hats" + }, + { + title: "کیبورد", + imageUrl: "https://www.pngplay.com/wp-content/uploads/13/Gaming-Keyboard-Transparent-Free-PNG.png", + id: 2, + linkUrl: "shop/jackets" + }, + { + title: "وبکم", + imageUrl: "https://www.pngkey.com/png/full/246-2465497_webcam-transparent-images-trust-exis-webcam-17003.png", + id: 3, + linkUrl: "shop/sneakers" + }, + { + title: "اسپیکر", + imageUrl: "https://www.pngarts.com/files/12/Portable-Bluetooth-Speaker-Transparent-Images.png", + size: "large", + id: 4, + linkUrl: "shop/womens" + }, + { + title: "مانیتور", + imageUrl: "https://static.acer.com/up/Resource/Acer/Monitors/BE0/Image/20160503/BE240Y_sku_preview.png", + size: "large", + id: 5, + linkUrl: "shop/mens" + } + ] +} +const directoryReducer = (state = INITIAL_STATE, action) => { + switch(action.type){ + default: + return state + } +} + +export default directoryReducer \ No newline at end of file diff --git a/src/redux/directory/directory.selector.jsx b/src/redux/directory/directory.selector.jsx new file mode 100644 index 0000000..7aee6df --- /dev/null +++ b/src/redux/directory/directory.selector.jsx @@ -0,0 +1,8 @@ +import { createSelector } from 'reselect' + +const selectDirectory = state => state.directory + +export const selectDirectorySections = createSelector( + [selectDirectory], + directory => directory.sections +) \ No newline at end of file diff --git a/src/redux/index.js b/src/redux/index.js new file mode 100644 index 0000000..94cfa95 --- /dev/null +++ b/src/redux/index.js @@ -0,0 +1,7 @@ +// @create-index + +export { default as actions } from './actions'; +export { default as proxy } from './proxy.js'; +export { default as reducers } from './reducers'; +export { default as store } from './store.js'; + diff --git a/src/redux/proxy.js b/src/redux/proxy.js new file mode 100644 index 0000000..23bc497 --- /dev/null +++ b/src/redux/proxy.js @@ -0,0 +1,120 @@ +import { ApiConfig } from "../constants/defaultValues"; +import axios from "axios"; + +let { baseUrl } = ApiConfig; +let access = window.localStorage.getItem("access"); +baseUrl = baseUrl + "/"; + +const Axios = axios.create({ + withCredentials: true, + validateStatus: null, + baseURL: baseUrl, + //headers: access ? { Authorization: `Bearer ${access}` } : {}, +}); +class Proxy { + get = async (url, params, opt, data) => + await this.check( + url, + opt, + async () => await Axios.get(url, { params, ...opt }), + data || params + ); + post = async (url, params, opt, data ) => + await this.check( + url, + opt, + async () => await Axios.post(url, params, opt), + data || params + ); + put = async (url , params , opt , data ) => + await this.check( + url, + opt, + async () => await Axios.put(url, params, opt), + data || params + ); + delete = async (url , params , opt , data ) => { + await this.check( + url, + opt, + async () => await Axios.delete(url, { ...opt, data: params }), + data || params + ); + }; + + check = async (url , { dispatch } , fetch , params ) => { + dispatch = dispatch || (() => {}); + dispatch({ type: url.split("/")[0] + "/" + "loading" }); + let response = await fetch(); + switch (response.status) { + case 200: + dispatch({ type: url, data: response.data.data, params }); + return response.data.data; + case 401: + if (await this.refresh()) { + let response = await fetch(); + dispatch({ type: url, data: response.data.data, params }); + return response.data.data; + } + break; + default: + dispatch({ + type: url.split("/")[0] + "/" + "error", + data: response.data, + params, + }); + } + return false; + }; + + refresh = async () => { + let refresh = localStorage.getItem("refresh"); + if (!refresh) window.location.href = "/"; + let login = await this.login( + "user/login", + {}, + { headers: { Authorization: `Bearer ${refresh}` } } + ); + return login ? true : false; + }; + login = async (url , params , { dispatch } ) => + this.post(url, params, { + dispatch: (obj ) => { + let login = obj.data; + if (!login || !login.refreshToken) return false; + localStorage.setItem("refresh", login.refreshToken); + localStorage.setItem("access", login.accessToken); + delete login.refreshToken; + delete login.accessToken; + localStorage.setItem("userData", JSON.stringify(login.profile)); + dispatch(obj); + }, + }); + + logout = async (url , params , { dispatch } ) => { + this.post(url, params, { + dispatch: (obj ) => { + localStorage.removeItem("refresh"); + localStorage.removeItem("access"); + localStorage.removeItem("userData"); + dispatch(obj); + }, + }); + }; + status = () => { + let refresh = localStorage.getItem("refresh"); + let userData = localStorage.getItem("userData"); + if (!refresh) return false; + if (refresh == "undefined") { + localStorage.removeItem("refresh"); + localStorage.removeItem("access"); + localStorage.removeItem("userData"); + return false; + } + + return JSON.parse(userData || ''); + }; +} +const _proxy = new Proxy(); + +export default _proxy; diff --git a/src/redux/reducers/blog.js b/src/redux/reducers/blog.js new file mode 100644 index 0000000..f7fafc3 --- /dev/null +++ b/src/redux/reducers/blog.js @@ -0,0 +1,28 @@ +import { toast } from "react-toastify"; + +const initialState = { + loading: false, + error: null, + list: [], +}; +export default function blog(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "public/blogList": + return { ...state, loading: false, list: data, error: null }; + // case "blog/update": + // return { ...state, loading: false, error: null }; + // case "blog/add": + // return { ...state, loading: false, error: null }; + // case "blog/delete": + // return { ...state, loading: false, error: null }; + ///////////// + case "blog/loading": + return { ...state, loading: true }; + case "blog/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/book.js b/src/redux/reducers/book.js new file mode 100644 index 0000000..a29204a --- /dev/null +++ b/src/redux/reducers/book.js @@ -0,0 +1,168 @@ +import { toast } from "react-toastify"; + +const initialState = { + loading: false, + error: null, + list: [], + info: null, + searchResult: [], + filterResult: [], + subjects: [], + levels: [], + sortFilters: ["مرتب سازی", "محبوب ترین", "جدیدترین"], + selectedVideo: null, + gradeFilterBooks: null, + sortFilterCourse: null, + selectedGrade: null, + selectedSort: "پربازدید ترین ها", +}; + +const grades = [ + "پیش دبستان", + "اول", + "دوم", + "سوم", + "چهارم", + "پنجم", + "ششم", + "هفتم", + "هشتم", + "نهم", + "دهم", + "یازدهم", + "دوازدهم", +]; + +export default function book(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "book/list": + let itemsSubject = (Array.isArray(data) ? data : []).map( + (item, index) => item.name + ); + if (window.innerWidth < 1000) { + itemsSubject.unshift("نام کتاب"); + } + let itemsLevel = (Array.isArray(data) ? data : []) + .map((item) => item.gradeId * 1) + .sort((a, b) => a - b) + .map((e) => grades[e]); + if (window.innerWidth < 1000) { + itemsLevel.unshift("پایه تحصیلی"); + } + return { + ...state, + loading: false, + list: data, + subjects: Array.from(new Set(itemsSubject)), + levels: Array.from(new Set(itemsLevel)), + filterResult: data, + error: null, + }; + case "book/info": + return { ...state, loading: false, info: data, error: null }; + case "book/lesson/active": + return { + ...state, + loading: false, + error: null, + }; + case "book/gradeFilter": + if (data === state.selectedGrade) { + return { ...state, gradeFilterBooks: null, selectedGrade: null }; + } else { + return { + ...state, + gradeFilterBooks: state.list.filter( + (item, i) => grades[item.gradeId] === data + ), + selectedGrade: data, + }; + } + case "book/sortFilter": + const search = state.list.filter( + (item) => item.name.indexOf(data.search) !== -1 + ); + if (data.sort === "تمامی دوره‌ها") { + return { ...state, sortFilterCourse: search, selectedSort: data.sort }; + } else if (data.sort === "جدیدترین‌ها") { + return { + ...state, + sortFilterCourse: search.sort((item1, item2) => { + return item1.publishYear - item2.publishYear; + }), + selectedSort: data.sort, + }; + } + return { ...state, sortFilterCourse: search, selectedSort: data.sort }; + + // case "book/update": + // return { ...state, loading: false, error: null }; + // case "book/add": + // return { ...state, loading: false, error: null }; + // case "book/delete": + // return { ...state, loading: false, error: null }; + // case "book/search": + // return { ...state }; + // case "book/filter": + // const realList = state.list; + // const level = data.level; + // const subject = data.subject; + // const sort = data.sort; + // const search = data.search; + // if (level.length > 0 || subject.length > 0 || sort || search) { + // localStorage.setItem("filter", "ON"); + // } + // let finalSort; + // let byLevelFilter = []; + // if (level.length > 0) { + // level.map((item1) => { + // for (let i = 0; i < realList.length; i++) { + // if (grades[realList[i].gradeId] === item1) { + // byLevelFilter.push(realList[i]); + // } + // } + // }); + // } else { + // byLevelFilter = realList; + // } + + // let bySubjectFilter = []; + // if (subject.length > 0) { + // subject.map((item1) => { + // for (let i = 0; i < byLevelFilter.length; i++) { + // if (byLevelFilter[i].name === item1) { + // bySubjectFilter.push(byLevelFilter[i]); + // } + // } + // }); + // } else { + // bySubjectFilter = byLevelFilter; + // } + + // const bySearchFilter = search + // ? bySubjectFilter.filter((item1) => item1.name.indexOf(search) !== -1) + // : bySubjectFilter; + + // if (sort === "گران ترین") { + // finalSort = bySearchFilter.sort((item1, item2) => { + // return item1.product[0].price - item2.product[0].price; + // }); + // } else { + // finalSort = bySearchFilter; + // } + // return { + // ...state, + // loading: false, + // error: null, + // filterResult: finalSort, + // }; + case "book/loading": + return { ...state, loading: true }; + case "book/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/faq.js b/src/redux/reducers/faq.js new file mode 100644 index 0000000..c89b078 --- /dev/null +++ b/src/redux/reducers/faq.js @@ -0,0 +1,57 @@ +import { toast } from "react-toastify"; + +const initialState = { + loading: false, + error: null, + list: [], + searchResult: [], + search: null, +}; +export default function faq(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "faq/list": + return { ...state, loading: false, list: data, error: null }; + case "faq/add": + return { ...state, loading: false, error: null }; + case "faq/selectFaq": + return { + ...state, + loading: false, + error: null, + list: !state.search + ? state.list.map((item) => + item.id === data + ? { ...item, active: !item.active } + : { ...item, active: false } + ) + : state.list, + searchResult: state.search + ? state.searchResult.map((item) => + item.id === data + ? { ...item, active: !item.active } + : { ...item, active: false } + ) + : state.searchResult, + }; + case "faq/search": + return { + ...state, + loading: false, + error: null, + search: data, + searchResult: state.list.filter( + (item) => + item.title.indexOf(data) !== -1 || + item.description.indexOf(data) !== -1 + ), + }; + case "faq/loading": + return { ...state, loading: true }; + case "faq/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/file.js b/src/redux/reducers/file.js new file mode 100644 index 0000000..164494c --- /dev/null +++ b/src/redux/reducers/file.js @@ -0,0 +1,26 @@ +const initialState = { + loading: false, + error: null, + uploads: {}, + lastUpload: null, +}; + +export default function file(state = initialState, action) { + let { type, data, params } = action; + switch (type) { + case "file/upload": + return { + ...state, + loading: false, + error: null, + uploads: { ...state.uploads, [params?.target || "last"]: data.id }, + lastUpload: data.id, + }; + case "file/loading": + return { ...state, loading: true }; + case "file/error": + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/index.js b/src/redux/reducers/index.js new file mode 100644 index 0000000..584b6eb --- /dev/null +++ b/src/redux/reducers/index.js @@ -0,0 +1,12 @@ +// @create-index +export { default as publicApi } from "./public"; +export { default as user } from "./user"; +export { default as book } from "./book"; +export { default as blog } from "./blog"; +export { default as product } from "./product"; +export { default as faq } from "./faq"; +export { default as file } from "./file"; +export { default as userFactor } from "./userFactor"; +export { default as userProduct } from "./userProduct"; +export {default as scrollAction} from "./scroll"; +export {default as qr} from "./qr"; \ No newline at end of file diff --git a/src/redux/reducers/product.js b/src/redux/reducers/product.js new file mode 100644 index 0000000..4fb4099 --- /dev/null +++ b/src/redux/reducers/product.js @@ -0,0 +1,31 @@ +import { toast } from "react-toastify"; + +const initialState = { + loading: false, + error: null, + listVOD: [], + selectedVOD: null, + similarList : [], +}; +export default function product(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "product/listVOD": + return { ...state, loading: false, listVOD: data, error: null }; + case "product/similar": + return { ...state, loading: false, similarList: data, error: null }; + case "product/addVOD": + return { ...state, loading: false, error: null }; + case "product/deleteVOD": + return { ...state, loading: false, error: null }; + case "product/selectVOD": + return { ...state, selectedVOD: data }; + case "product/loading": + return { ...state, loading: true }; + case "product/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/public.js b/src/redux/reducers/public.js new file mode 100644 index 0000000..7e14a88 --- /dev/null +++ b/src/redux/reducers/public.js @@ -0,0 +1,184 @@ +import location from "../../utils/location"; + +const initialState = { + isDark: false, + isMobile: window.innerWidth < 1024, + homeData: [], + newProducts: [], + levels: [], + loading: false, + error: null, + searchResult: [], + arList: [], + blogList: [], + blog: null, + province: null, + city: null, + departmans: [ + { + id: 0, + name: "محتوا", + }, + { + id: 0, + name: "دیزاین", + }, + { + id: 0, + name: "برنامه نویسی", + }, + ], + header: [], + selectedMenu: null, + contactData: null, + selectedVideo: null, + bookInfo: null, + activeCategory: null, + categories: null, + bookSection: null, + grades: { + 0: "پیش دبستان", + 1: "اول", + 2: "دوم", + 3: "سوم", + 4: "چهارم", + 5: "پنجم", + 6: "ششم", + 7: "هفتم", + 8: "هشتم", + 9: "نهم", + 10: "دهم", + 11: "یازدهم", + 12: "دوازدهم", + }, + headerOptions: { + shown: false, + logo: false, + hamburgerMenu: false, + qr: false, + menu: false, + back: false, + title: false, + }, + desktopContentTransform: false, +}; + +const grades = [ + "پیش دبستان", + "اول", + "دوم", + "سوم", + "چهارم", + "پنجم", + "ششم", + "هفتم", + "هشتم", + "نهم", + "دهم", + "یازدهم", + "دوازدهم", +]; + +export default function publicApi(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "public/setDesktopContentTransform": + return { ...state, desktopContentTransform: data }; + case "public/setHeaderOptions": + return { ...state, headerOptions: data }; + case "public/setIsDark": + localStorage.setItem("isDark", data); + return { ...state, location: false, error: null, isDark: data }; + case "active/video": + return { + ...state, + loading: false, + error: null, + selectedVideo: data, + }; + case "active/category": + return { + ...state, + loading: false, + activeCategory: state.activeCategory === data ? null : data, + error: null, + }; + case "public/vod/bookSection": + const videoId = location.getId(); + return { + ...state, + loading: false, + bookSection: data, + error: null, + selectedVideo: data.vods?.filter((item) => item.id !== videoId)[0], + }; + + case "public/vod/bookCourse": + let allCats; + allCats = Array.from( + new Set(data.vods.map((item) => item.categoryId && item.categoryId)) + ); + + return { + ...state, + loading: false, + bookInfo: { + ...data, + vods: data.vods.map((item) => { + return { ...item, active: false }; + }), + }, + error: null, + categories: allCats.map((item) => + data.vods.filter((item1) => item1.categoryId === item) + ), + selectedVideo: data.vods.filter( + (item) => item.id !== location.getId() + )[0], + }; + case "public/homePage": + let itemsLevel; + if (window.innerWidth > 1000) { + const jadidTarin = data.filter( + (item) => item.title === "جدیدترین کتاب‌های دانوین" + ); + itemsLevel = jadidTarin[0].data + .map((item) => item.book.gradeId * 1) + .sort((a, b) => a - b) + .map((e) => grades[e]); + itemsLevel.unshift("همه"); + } + + return { + ...state, + loading: false, + levels: window.innerWidth > 1000 ? Array.from(new Set(itemsLevel)) : [], + error: null, + homeData: data, + }; + case "public/ar": + return { ...state, loading: false, error: null, arList: data }; + case "public/contact": + return { ...state, loading: false, error: null, contactData: data }; + case "public/blogList": + return { ...state, loading: false, error: null, blogList: data }; + case "public/blogInfo": + return { ...state, loading: false, error: null, blog: data }; + case "public/setSubscribe": + return { ...state, loading: false, error: null, selectedSubscribe: data }; + case "public/province": + return { ...state, loading: false, error: null, province: data }; + case "public/city": + return { ...state, loading: false, error: null, city: data }; + case "public/selectMenu": + return { ...state, loading: false, error: null, selectedMenu: data }; + case "public/VOD/homePage": + return { ...state, loading: false, error: null, header: data }; + case "loading": + return { ...state, loading: true }; + case "error": + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/qr.js b/src/redux/reducers/qr.js new file mode 100644 index 0000000..6b7e646 --- /dev/null +++ b/src/redux/reducers/qr.js @@ -0,0 +1,32 @@ +const initialState = { + loading: false, + error: null, + list: null, +}; +export default function qr(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "qr/list": + return { ...state, loading: false, error: null }; + case "qr/update": + return { ...state, loading: false, error: null }; + case "qr/add": + return { ...state, loading: false, error: null }; + case "qr/delete": + return { ...state, loading: false, error: null }; + case "qr/info": + return { + ...state, + loading: false, + list: data, + error: null, + }; + ///////////// + case "loading": + return { ...state, loading: true }; + case "error": + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} \ No newline at end of file diff --git a/src/redux/reducers/scroll.js b/src/redux/reducers/scroll.js new file mode 100644 index 0000000..5dfe9f0 --- /dev/null +++ b/src/redux/reducers/scroll.js @@ -0,0 +1,185 @@ +import scroll from "../../utils/scroll"; +const height = window.innerHeight; +const width = window.innerWidth; +const prevScroll = localStorage.getItem("prevScroll"); + +const initialState = { + page1TopPosition: scroll.homeScrollHandler(1), + page2TopPosition: scroll.homeScrollHandler(2), + page2RotateX: scroll.linearFormula( + scroll.linearFormula( + prevScroll > height ? height : prevScroll, + 45, + 0, + 0, + height + ) + ), + page2BoxPosition: scroll.initializeBoxPosition(prevScroll), + page2MobilePosition: scroll.linearFormula( + prevScroll > 2.5 * height ? 2.5 * height : prevScroll, + -(((height * 10) / 20 / width) * 100), + 6, + 2 * height, + 2.5 * height + ), + page2VideoPosition: + window.scrollY > 4 * height + ? scroll.videoLinearFormula(4 * height) + : window.scrollY > height + ? scroll.videoLinearFormula(window.scrollY) + : null, + page2VideoTopPosition: + prevScroll > 3 * height + ? scroll.linearFormula(3 * height, 70, 50, 2.8 * height, 3 * height) + : scroll.linearFormula(prevScroll, 70, 50, 2.8 * height, 3 * height), + page2MobileUnit: scroll.initializeMobileUnit(prevScroll), + videoTubeTopPosition: scroll.homeScrollHandler(3), + testTranslateY: scroll.linearFormula( + prevScroll > 5 * window.innerHeight ? 5 * window.innerHeight : prevScroll, + 0, + -101, + 4.5 * height, + 5 * height + ), + page3TopPosition: scroll.homeScrollHandler(4), + page3TestTranslateY: + prevScroll < 6.3 * height + ? 0 + : scroll.linearFormula( + prevScroll > 7 * height ? 7 * height : prevScroll, + 0, + 100, + 6.3 * height, + 7 * height + ), + page4TopPosition: scroll.homeScrollHandler(5), +}; + +export default function scrollAction(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "scroll/page1/floatMouse": + return { ...state, floatMouseToggle: data }; + case "scroll/page1/top": + return { ...state, page1TopPosition: scroll.homeScrollHandler(1) }; + case "scroll/page2/top": + return { ...state, page2TopPosition: scroll.homeScrollHandler(2) }; + case "scroll/page2/rotateX": + return { + ...state, + page2RotateX: scroll.linearFormula(window.scrollY, 45, 0, 0, height), + }; + case "scroll/page2/boxPosition": + return { + ...state, + page2BoxPosition: { + translateY: scroll.linearFormula( + data.scrollY, + data.translateY.pos1, + data.translateY.pos2, + data.start, + data.end + ), + translateX: scroll.linearFormula( + data.scrollY, + data.translateX.pos1, + data.translateX.pos2, + data.start, + data.end + ), + rotate: scroll.linearFormula( + data.scrollY, + data.rotate.pos1, + data.rotate.pos2, + data.start, + data.end + ), + }, + page2TopPosition: 0, + page2RotateX: 0, + }; + case "scroll/page2/mobilePosition": + return { + ...state, + page2MobilePosition: scroll.linearFormula( + window.scrollY, + -(((height * 10) / 20 / width) * 100), + 6, + 2 * height, + 2.5 * height + ), + page2BoxPosition: { translateX: 32, translateY: 10, rotate: 0 }, + }; + case "scroll/page2/videoPosition": + return { + ...state, + page2VideoPosition: scroll.videoLinearFormula(window.scrollY), + page2VideoTopPosition: 50, + }; + case "scroll/page2/videoTopPosition": + return { + ...state, + page2VideoTopPosition: scroll.linearFormula( + window.scrollY, + 70, + 50, + 2.8 * height, + 3 * height + ), + page2MobilePosition: 6, + }; + case "scroll/page2/mobileUnit": + return { + ...state, + page2MobileUnit: scroll.initializeMobileUnit(window.scrollY), + }; + case "scroll/videoTube/top": + return { ...state, videoTubeTopPosition: scroll.homeScrollHandler(3) }; + case "scroll/test/translateY": + const joiRect = JSON.parse(localStorage.getItem("joiRect")); + return { + ...state, + testTranslateY: scroll.linearFormula( + window.scrollY, + 0, + -101, + 4.5 * height, + 5 * height + ), + videoTubeTopPosition: 0, + page2VideoPosition: { + width: joiRect.width, + height: joiRect.height, + top: joiRect.top, + left: joiRect.left, + }, + }; + case "scroll/page3/top": + return { + ...state, + page3TopPosition: scroll.homeScrollHandler(4), + testTranslateY: -101, + }; + case "scroll/page3/testTranslateY": + return { + ...state, + page3TestTranslateY: scroll.linearFormula( + window.scrollY, + 0, + 100, + 6.3 * height, + 7 * height + ), + page3TopPosition: 0, + }; + case "scroll/page4/top": + return { + ...state, + page4TopPosition: scroll.homeScrollHandler(5), + page3TestTranslateY: 100, + }; + default: + return state; + } +} diff --git a/src/redux/reducers/user.js b/src/redux/reducers/user.js new file mode 100644 index 0000000..3b6ff71 --- /dev/null +++ b/src/redux/reducers/user.js @@ -0,0 +1,49 @@ +import proxy from "../proxy"; +import { toast } from "react-toastify"; + +const initialState = { + status: proxy.status(), + loading: false, + error: null, + list: null, + domains: [], + mothers: [], + profileStatus: false, + setDone: false, + setLogin : false, +}; +export default function user(state = initialState, action) { + let { type, data } = action; + switch (type) { + // case "user/login": + // case "user/register": + // case "user/switchRole": + case "public/sendOTP": + return { ...state, loading: false, status: data.profile, error: null }; + case "user/login": + case "user/otp/login": + return { + ...state, + loading: false, + status: data.profile, + error: null, + setLogin: !state.setLogin, + }; + case "user/getProfile": + localStorage.setItem("userData", JSON.stringify(data)); + return { ...state, loading: false, status: data, error: null, setDone : false, }; + case "user/logout": + return { ...state, loading: false, status: proxy.status(), error: null }; + case "user/getUserRole": + return { ...state, loading: false, userRoles: data, error: null }; + case "user/setProfile": + toast.success("تغییرات اعمال شد."); + return { ...state, loading: false, error: null, setDone : true }; + case "loading": + return { ...state, loading: true }; + case "error": + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/userFactor.js b/src/redux/reducers/userFactor.js new file mode 100644 index 0000000..ae95fa3 --- /dev/null +++ b/src/redux/reducers/userFactor.js @@ -0,0 +1,57 @@ +import { toast } from "react-toastify"; +const initialState = { + loading: false, + error: null, + list: null, + info: null, + sum: null, + checkEmpty: false, + isVerified: null, +}; +export default function userFactor(state = initialState, action) { + let { type, data } = action; + switch (type) { + //dnvn + case "userFactor/list": + const checkEmpty = data.filter( + (item) => item.condition === 2 && item.product.productType === (1 || 3) + ); + return { + ...state, + loading: false, + list: data, + checkEmpty: checkEmpty.length > 0 ? false : true, + error: null, + }; + case "userFactor/info": + return { ...state, loading: false, info: data, error: null }; + case "userFactor/add": + toast.success("درخواست شما با موفقیت انجام شد."); + return { ...state, loading: false, error: null, sum: data.payPrice }; + case "userFactor/delete": + return { ...state, loading: false, error: null }; + case "userFactor/payment": + window.location.replace(data); + return { ...state, loading: false, error: null }; + //vod + case "userFactor/myList": + return { ...state, loading: false, list: data, error: null }; + case "userFactor/update": + toast.success("درخواست شما با موفقیت انجام شد."); + return { ...state, loading: false, error: null }; + case "userFactor/deleteUserOffCode": + return { ...state, loading: false, error: null }; + case "userFactor/paymentVOD": + window.location.replace(data); + return { ...state, loading: false, error: null, isVerified: false }; + case "userFactor/verifyVOD": + return { ...state, loading: false, error: null, isVerified: true }; + case "userFactor/loading": + return { ...state, loading: true }; + case "userFactor/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/reducers/userProduct.js b/src/redux/reducers/userProduct.js new file mode 100644 index 0000000..80ade2d --- /dev/null +++ b/src/redux/reducers/userProduct.js @@ -0,0 +1,50 @@ +import { toast } from "react-toastify"; + +const initialState = { + loading: false, + error: null, + list: [], + info: null, + sum: null, + checkEmpty: false, + hasPhysical: false, +}; +export default function userFactor(state = initialState, action) { + let { type, data } = action; + switch (type) { + case "userProduct/list": + const checkEmpty = data.filter( + (item) => item.condition === 2 && item.product.productType === (1 || 3) + ); + const hasPhysical = + data.filter((item) => item.product.productType === 2).length > 0 + ? true + : false; + return { + ...state, + loading: false, + list: data, + checkEmpty: checkEmpty.length > 0 ? false : true, + error: null, + hasPhysical: hasPhysical, + }; + case "userProduct/info": + return { ...state, loading: false, info: data, error: null }; + case "userProduct/update": + return { ...state, loading: false, error: null }; + case "userProduct/add": + if (window.location.pathname.indexOf("products") !== -1) { + toast.success("درخواست شما با موفقیت انجام شد."); + } + return { ...state, loading: false, error: null, sum: data.payPrice }; + case "userProduct/delete": + return { ...state, loading: false, error: null }; + case "userProduct/loading": + return { ...state, loading: true }; + case "userProduct/error": + toast.error(data.message); + return { ...state, loading: false, error: data.message }; + default: + return state; + } +} diff --git a/src/redux/root-reducer.js b/src/redux/root-reducer.js new file mode 100644 index 0000000..bf6870c --- /dev/null +++ b/src/redux/root-reducer.js @@ -0,0 +1,24 @@ +import { combineReducers } from 'redux' +import { persistReducer } from 'redux-persist' +import storage from 'redux-persist/lib/storage' + +import userReducer from './user/user.reducer.js' +import cartReducer from './cart/cart.reducer.js' +import directoryReducer from './directory/directory.reducer' +import shopReducer from './shop/shop.reducer' + + +const persistConfig = { + key: 'root', + storage, + whitelist: ['cart'] +} + +const rootReducer = combineReducers({ + user: userReducer, + cart: cartReducer, + directory: directoryReducer, + shop: shopReducer, +}) + +export default persistReducer(persistConfig, rootReducer) \ No newline at end of file diff --git a/src/redux/shop/shop.data.js b/src/redux/shop/shop.data.js new file mode 100644 index 0000000..ff369bf --- /dev/null +++ b/src/redux/shop/shop.data.js @@ -0,0 +1,254 @@ +const SHOP_DATA = [ + { + id: 1, + title: "mouse", + routeName: "mouse", + items: [ + { + id: 1, + name: "ماوس ریزر مدل DEATHADDER ESSENTIAL RZ01", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/114510799.jpg", + price: 73000, + adress: '/products/razor-mouse-deathadder-rz01', + description: { + content: 'لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.', + } + }, + { + id: 2, + name: "ماوس مخصوص بازی مدل V8", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/eddb26c7043d4092e17ba4e05a19f5b49f20f0dc_1633724598.jpg", + price: 290000 + }, + { + id: 3, + name: "ماوس مخصوص بازی زویا مدل MMR1", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/2c9f4388ced87e860a9c9d0fccc595f3b64a55a2_1610015683.jpg", + price: 210000 + }, + { + id: 4, + name: "ماوس مخصوص بازی تسکو مدل TSCO TM 764 GA", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/d0cc25319e2fce02acb42f679ff282b59182ed54_1597813753.jpg", + price: 186000 + }, + { + id: 5, + name: "ماوس مخصوص بازی مدل GM02", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/33b0985d01fe4b1ec2542bd03f3b7998e68981ed_1636141537.jpg", + price: 297270 + }, + { + id: 6, + name: "ماوس بی سیم ریزر مدل Basilisk Ultimate", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/81ad2dd69067d43c967ed76faf928837629ece45_1630752955.jpg", + price: 5250000 + }, + { + id: 7, + name: "ماوس مخصوص بازی ریزر مدل Viper Mini", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/878005cff2b58c0d0d0ac4e9ca7eaa21d3987c2c_1600681192.jpg", + price: 1460000 + }, + { + id: 8, + name: "ماوس تسکو مدل TM 291", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/27e2b2852f53615b577fc9130b97675cb77067ba_1628667044.jpg", + price: 83800 + }, + { + id: 9, + name: "ماوس آرمو مدل M25", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/4b757355ca6dcae804f34d4c6af66305903b379c_1596460030.jpg", + price: 160000 + } + ] + }, + { + id: 2, + title: "وبکم", + routeName: "webcam", + items: [ + { + id: 10, + name: "وب کم ایکس اچ سی مدل 48O", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/6f167d1f3b0aa40e19760d5f5240912e00e31dc9_1632987698.jpg", + price: '340,000' + }, + { + id: 11, + name: "وب کم مدل PGR-008", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/3fa4c49aed640c53560fd32a117c7685923123db_1615139913.jpg", + price: '2,070,000' + }, + { + id: 12, + name: "وب کم مایکروسافت مدل لایف کم سینما", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/32558.jpg", + price: 110 + }, + { + id: 13, + name: "وب کم ای فورتک مدل PK-635G", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/2190153c71b9fd3ba9f191f23fa767d8b2cd9200_1601221909.jpg", + price: '630,000' + }, + { + id: 14, + name: "وب کم HD مایکروسافت مدل لایف کم HD-3000", + imageUrl: "https://dkstatics-public.digikala.com/digikala-products/15382.jpg", + price: '1,300,000' + }, + // { + // id: 15, + // name: "Nike Brown High Tops", + // imageUrl: "https://i.ibb.co/fMTV342/nike-brown.png", + // price: 160 + // }, + // { + // id: 16, + // name: "Air Jordan Limited", + // imageUrl: "https://i.ibb.co/w4k6Ws9/nike-funky.png", + // price: 190 + // }, + // { + // id: 17, + // name: "Timberlands", + // imageUrl: "https://i.ibb.co/Mhh6wBg/timberlands.png", + // price: 200 + // } + ] + }, + { + id: 3, + title: "Jackets", + routeName: "jackets", + items: [ + { + id: 18, + name: "Black Jean Shearling", + imageUrl: "https://i.ibb.co/XzcwL5s/black-shearling.png", + price: 125 + }, + { + id: 19, + name: "Blue Jean Jacket", + imageUrl: "https://i.ibb.co/mJS6vz0/blue-jean-jacket.png", + price: 90 + }, + { + id: 20, + name: "Grey Jean Jacket", + imageUrl: "https://i.ibb.co/N71k1ML/grey-jean-jacket.png", + price: 90 + }, + { + id: 21, + name: "Brown Shearling", + imageUrl: "https://i.ibb.co/s96FpdP/brown-shearling.png", + price: 165 + }, + { + id: 22, + name: "Tan Trench", + imageUrl: "https://i.ibb.co/M6hHc3F/brown-trench.png", + price: 185 + } + ] + }, + { + id: 4, + title: "Womens", + routeName: "womens", + items: [ + { + id: 23, + name: "Blue Tanktop", + imageUrl: "https://i.ibb.co/7CQVJNm/blue-tank.png", + price: 25 + }, + { + id: 24, + name: "Floral Blouse", + imageUrl: "https://i.ibb.co/4W2DGKm/floral-blouse.png", + price: 20 + }, + { + id: 25, + name: "Floral Dress", + imageUrl: "https://i.ibb.co/KV18Ysr/floral-skirt.png", + price: 80 + }, + { + id: 26, + name: "Red Dots Dress", + imageUrl: "https://i.ibb.co/N3BN1bh/red-polka-dot-dress.png", + price: 80 + }, + { + id: 27, + name: "Striped Sweater", + imageUrl: "https://i.ibb.co/KmSkMbH/striped-sweater.png", + price: 45 + }, + { + id: 28, + name: "Yellow Track Suit", + imageUrl: "https://i.ibb.co/v1cvwNf/yellow-track-suit.png", + price: 135 + }, + { + id: 29, + name: "White Blouse", + imageUrl: "https://i.ibb.co/qBcrsJg/white-vest.png", + price: 20 + } + ] + }, + { + id: 5, + title: "Mens", + routeName: "mens", + items: [ + { + id: 30, + name: "Camo Down Vest", + imageUrl: "https://i.ibb.co/xJS0T3Y/camo-vest.png", + price: 325 + }, + { + id: 31, + name: "Floral T-shirt", + imageUrl: "https://i.ibb.co/qMQ75QZ/floral-shirt.png", + price: 20 + }, + { + id: 32, + name: "Black & White Longsleeve", + imageUrl: "https://i.ibb.co/55z32tw/long-sleeve.png", + price: 25 + }, + { + id: 33, + name: "Pink T-shirt", + imageUrl: "https://i.ibb.co/RvwnBL8/pink-shirt.png", + price: 25 + }, + { + id: 34, + name: "Jean Long Sleeve", + imageUrl: "https://i.ibb.co/VpW4x5t/roll-up-jean-shirt.png", + price: 40 + }, + { + id: 35, + name: "Burgundy T-shirt", + imageUrl: "https://i.ibb.co/mh3VM1f/polka-dot-shirt.png", + price: 25 + } + ] + } +]; + +export default SHOP_DATA; + diff --git a/src/redux/shop/shop.reducer.js b/src/redux/shop/shop.reducer.js new file mode 100644 index 0000000..2042117 --- /dev/null +++ b/src/redux/shop/shop.reducer.js @@ -0,0 +1,14 @@ +import SHOP_DATA from './shop.data'; + +const INITIAL_STATE = { + collections: SHOP_DATA +}; + +const shopReducer = (state = INITIAL_STATE, action) => { + switch (action.type) { + default: + return state; + } +}; + +export default shopReducer; \ No newline at end of file diff --git a/src/redux/shop/shop.selectors.js b/src/redux/shop/shop.selectors.js new file mode 100644 index 0000000..ee1470d --- /dev/null +++ b/src/redux/shop/shop.selectors.js @@ -0,0 +1,8 @@ +import { createSelector } from 'reselect' + +const selectShop = state => state.shop + +export const selectCollections = createSelector( + [selectShop], + shop => shop.collections +); diff --git a/src/redux/store.js b/src/redux/store.js new file mode 100644 index 0000000..ecaf6db --- /dev/null +++ b/src/redux/store.js @@ -0,0 +1,14 @@ +import { createStore, applyMiddleware } from 'redux'; +import { composeWithDevTools } from 'redux-devtools-extension'; +import { combineReducers } from 'redux'; +import * as reducers from './reducers'; +import thunk from 'redux-thunk'; +const initialState = {}; +const middleware = [thunk]; +const store = createStore( + combineReducers(reducers), + initialState, + composeWithDevTools(applyMiddleware(...middleware)) +); +export default store; + diff --git a/src/redux/user/user.actions.js b/src/redux/user/user.actions.js new file mode 100644 index 0000000..2e8df2c --- /dev/null +++ b/src/redux/user/user.actions.js @@ -0,0 +1,6 @@ +import { UserActionTypes } from './user.types.js' + +export const setCurrentUser = user => ({ + type: UserActionTypes.SET_CURRENT_USER, + payload: user +}) \ No newline at end of file diff --git a/src/redux/user/user.reducer.js b/src/redux/user/user.reducer.js new file mode 100644 index 0000000..c15b079 --- /dev/null +++ b/src/redux/user/user.reducer.js @@ -0,0 +1,19 @@ +import { UserActionTypes } from './user.types.js' + +const INITIAL_STATE = { + currentUser: null +} + +const userReducer = (state = INITIAL_STATE, action ) => { + switch(action.type){ + case UserActionTypes.SET_CURRENT_USER: + return{ + ...state, + currentUser: action.payload + } + default: + return state; + } +} + +export default userReducer; \ No newline at end of file diff --git a/src/redux/user/user.selector.js b/src/redux/user/user.selector.js new file mode 100644 index 0000000..40ba3f9 --- /dev/null +++ b/src/redux/user/user.selector.js @@ -0,0 +1,9 @@ +import { createSelector } from 'reselect'; + +const selectUser = state => state.user; + +export const selectCurrentUser = createSelector( + [selectUser], + user => user.currentUser +) + diff --git a/src/redux/user/user.types.js b/src/redux/user/user.types.js new file mode 100644 index 0000000..86c4fc9 --- /dev/null +++ b/src/redux/user/user.types.js @@ -0,0 +1,3 @@ +export const UserActionTypes = { + SET_CURRENT_USER: "SET_CURRENT_USER" +}; \ No newline at end of file diff --git a/src/utils/comments.js b/src/utils/comments.js new file mode 100644 index 0000000..5b6cfd8 --- /dev/null +++ b/src/utils/comments.js @@ -0,0 +1,22 @@ +export const connectToParent = (list) => { + let comments = []; + for (let item of list) { + comments.push({ ...item, child: [] }); + } + + for (let comment1 of comments) { + if (comment1.pid !== null) { + const index = comments.indexOf( + comments.filter((comment2) => comment2.id === comment1.pid)[0] + ); + comments[index] = { + ...comments[index], + child: [...comments[index].child, comment1], + }; + } else { + + } + } + // comments = comments.filter((comment) => comment.pid === null); + console.log(comments); +}; diff --git a/src/utils/location.js b/src/utils/location.js new file mode 100644 index 0000000..aa083ce --- /dev/null +++ b/src/utils/location.js @@ -0,0 +1,11 @@ + +class location { + getId = () => { + const pathname = window.location.pathname; + return pathname.slice(pathname.lastIndexOf('/') + 1, pathname.length); + } +} + +const _location = new location(); + +export default _location; \ No newline at end of file diff --git a/src/utils/onInput.js b/src/utils/onInput.js new file mode 100644 index 0000000..0a45958 --- /dev/null +++ b/src/utils/onInput.js @@ -0,0 +1,282 @@ +import { toast } from "react-toastify"; + +class onInput { + persianOnly = (txt) => { + let newText = txt; + newText = newText.replace(/`/g, ""); + newText = newText.replace(/0/g, ""); + newText = newText.replace(/1/g, ""); + newText = newText.replace(/2/g, ""); + newText = newText.replace(/3/g, ""); + newText = newText.replace(/4/g, ""); + newText = newText.replace(/5/g, ""); + newText = newText.replace(/6/g, ""); + newText = newText.replace(/7/g, ""); + newText = newText.replace(/8/g, ""); + newText = newText.replace(/9/g, ""); + newText = newText.replace(/0/g, ""); + newText = newText.replace(/q/g, ""); + newText = newText.replace(/w/g, ""); + newText = newText.replace(/e/g, ""); + newText = newText.replace(/r/g, ""); + newText = newText.replace(/t/g, ""); + newText = newText.replace(/y/g, ""); + newText = newText.replace(/u/g, ""); + newText = newText.replace(/i/g, ""); + newText = newText.replace(/o/g, ""); + newText = newText.replace(/p/g, ""); + newText = newText.replace(/\[/g, ""); + newText = newText.replace(/\]/g, ""); + newText = newText.replace(/a/g, ""); + newText = newText.replace(/s/g, ""); + newText = newText.replace(/d/g, ""); + newText = newText.replace(/f/g, ""); + newText = newText.replace(/g/g, ""); + newText = newText.replace(/h/g, ""); + newText = newText.replace(/j/g, ""); + newText = newText.replace(/k/g, ""); + newText = newText.replace(/l/g, ""); + newText = newText.replace(/;/g, ""); + newText = newText.replace(/'/g, ""); + newText = newText.replace(/z/g, ""); + newText = newText.replace(/x/g, ""); + newText = newText.replace(/c/g, ""); + newText = newText.replace(/v/g, ""); + newText = newText.replace(/b/g, ""); + newText = newText.replace(/n/g, ""); + newText = newText.replace(/m/g, ""); + newText = newText.replace(/,/g, ""); + newText = newText.replace(/./g, ""); + newText = newText.replace(/\//g, ""); + newText = newText.replace(/~/g, " "); + newText = newText.replace(/Q/g, ""); + newText = newText.replace(/W/g, ""); + newText = newText.replace(/E/g, ""); + newText = newText.replace(/R/g, ""); + newText = newText.replace(/T/g, ""); + newText = newText.replace(/Y/g, ""); + newText = newText.replace(/U/g, ""); + newText = newText.replace(/I/g, ""); + newText = newText.replace(/O/g, ""); + newText = newText.replace(/P/g, ""); + newText = newText.replace(/A/g, ""); + newText = newText.replace(/S/g, ""); + newText = newText.replace(/G/g, ""); + newText = newText.replace(/H/g, ""); + newText = newText.replace(/J/g, ""); + newText = newText.replace(/K/g, ""); + newText = newText.replace(/L/g, ""); + newText = newText.replace(/Z/g, ""); + newText = newText.replace(/X/g, ""); + newText = newText.replace(/B/g, ""); + newText = newText.replace(/N/g, ""); + newText = newText.replace(/M/g, ""); + newText = newText.replace(/\?/g, ""); + if (!newText && newText.length !== 0) { + toast.info("از کاراکتر فارسی استفاده کنید"); + } + return newText; + }; + englishAndNumberWithoutSpace = (txt) => { + let newText = txt; + newText = newText.replace(/`/g, ""); + newText = newText.replace(/0/g, "0"); + newText = newText.replace(/1/g, "1"); + newText = newText.replace(/2/g, "2"); + newText = newText.replace(/3/g, "3"); + newText = newText.replace(/4/g, "4"); + newText = newText.replace(/5/g, "5"); + newText = newText.replace(/6/g, "6"); + newText = newText.replace(/7/g, "7"); + newText = newText.replace(/8/g, "8"); + newText = newText.replace(/9/g, "9"); + newText = newText.replace(/ا/g, ""); + newText = newText.replace(/ب/g, ""); + newText = newText.replace(/پ/g, ""); + newText = newText.replace(/ت/g, ""); + newText = newText.replace(/ث/g, ""); + newText = newText.replace(/ج/g, ""); + newText = newText.replace(/چ/g, ""); + newText = newText.replace(/ح/g, ""); + newText = newText.replace(/خ/g, ""); + newText = newText.replace(/د/g, ""); + newText = newText.replace(/\[/g, ""); + newText = newText.replace(/\]/g, ""); + newText = newText.replace(/ذ/g, ""); + newText = newText.replace(/ر/g, ""); + newText = newText.replace(/ز/g, ""); + newText = newText.replace(/ژ/g, ""); + newText = newText.replace(/ط/g, ""); + newText = newText.replace(/ظ/g, ""); + newText = newText.replace(/ع/g, ""); + newText = newText.replace(/غ/g, ""); + newText = newText.replace(/ف/g, ""); + newText = newText.replace(/;/g, ""); + newText = newText.replace(/'/g, ""); + newText = newText.replace(/ق/g, ""); + newText = newText.replace(/س/g, ""); + newText = newText.replace(/ش/g, ""); + newText = newText.replace(/ص/g, ""); + newText = newText.replace(/ض/g, ""); + newText = newText.replace(/ک/g, ""); + newText = newText.replace(/گ/g, ""); + newText = newText.replace(/,/g, ""); + newText = newText.replace(/\./g, ""); + newText = newText.replace(/\//g, ""); + newText = newText.replace(/~/g, " "); + newText = newText.replace(/ل/g, ""); + newText = newText.replace(/م/g, ""); + newText = newText.replace(/ن/g, ""); + newText = newText.replace(/و/g, ""); + newText = newText.replace(/ه/g, ""); + newText = newText.replace(/ی/g, ""); + newText = newText.replace(/\?/g, ""); + if (!newText && newText.length !== 0) { + toast.info("از کاراکتر انگلیسی واعداداستفاده کنید"); + } + return newText; + }; + numberOnly = (txt) => { + let newText = txt; + newText = newText.replace(/`/g, ""); + newText = newText.replace(/0/g, "0"); + newText = newText.replace(/1/g, "1"); + newText = newText.replace(/2/g, "2"); + newText = newText.replace(/3/g, "3"); + newText = newText.replace(/4/g, "4"); + newText = newText.replace(/5/g, "5"); + newText = newText.replace(/6/g, "6"); + newText = newText.replace(/7/g, "7"); + newText = newText.replace(/8/g, "8"); + newText = newText.replace(/9/g, "9"); + newText = newText.replace(/ا/g, ""); + newText = newText.replace(/ب/g, ""); + newText = newText.replace(/پ/g, ""); + newText = newText.replace(/ت/g, ""); + newText = newText.replace(/ث/g, ""); + newText = newText.replace(/ج/g, ""); + newText = newText.replace(/چ/g, ""); + newText = newText.replace(/ح/g, ""); + newText = newText.replace(/خ/g, ""); + newText = newText.replace(/د/g, ""); + newText = newText.replace(/\[/g, ""); + newText = newText.replace(/\]/g, ""); + newText = newText.replace(/ذ/g, ""); + newText = newText.replace(/ر/g, ""); + newText = newText.replace(/ز/g, ""); + newText = newText.replace(/ژ/g, ""); + newText = newText.replace(/ط/g, ""); + newText = newText.replace(/ظ/g, ""); + newText = newText.replace(/ع/g, ""); + newText = newText.replace(/غ/g, ""); + newText = newText.replace(/ف/g, ""); + newText = newText.replace(/;/g, ""); + newText = newText.replace(/'/g, ""); + newText = newText.replace(/ق/g, ""); + newText = newText.replace(/س/g, ""); + newText = newText.replace(/ش/g, ""); + newText = newText.replace(/ص/g, ""); + newText = newText.replace(/ض/g, ""); + newText = newText.replace(/ک/g, ""); + newText = newText.replace(/گ/g, ""); + newText = newText.replace(/\,/g, ""); + newText = newText.replace(/\./g, ""); + newText = newText.replace(/\//g, ""); + newText = newText.replace(/~/g, " "); + newText = newText.replace(/ل/g, ""); + newText = newText.replace(/م/g, ""); + newText = newText.replace(/ن/g, ""); + newText = newText.replace(/و/g, ""); + newText = newText.replace(/ه/g, ""); + newText = newText.replace(/ی/g, ""); + newText = newText.replace(/\?/g, ""); + newText = newText.replace(/q/g, ""); + newText = newText.replace(/w/g, ""); + newText = newText.replace(/e/g, ""); + newText = newText.replace(/r/g, ""); + newText = newText.replace(/t/g, ""); + newText = newText.replace(/y/g, ""); + newText = newText.replace(/u/g, ""); + newText = newText.replace(/i/g, ""); + newText = newText.replace(/o/g, ""); + newText = newText.replace(/p/g, ""); + newText = newText.replace(/a/g, ""); + newText = newText.replace(/s/g, ""); + newText = newText.replace(/d/g, ""); + newText = newText.replace(/f/g, ""); + newText = newText.replace(/g/g, ""); + newText = newText.replace(/h/g, ""); + newText = newText.replace(/j/g, ""); + newText = newText.replace(/k/g, ""); + newText = newText.replace(/l/g, ""); + newText = newText.replace(/z/g, ""); + newText = newText.replace(/x/g, ""); + newText = newText.replace(/c/g, ""); + newText = newText.replace(/v/g, ""); + newText = newText.replace(/b/g, ""); + newText = newText.replace(/n/g, ""); + newText = newText.replace(/m/g, ""); + newText = newText.replace(/Q/g, ""); + newText = newText.replace(/W/g, ""); + newText = newText.replace(/E/g, ""); + newText = newText.replace(/R/g, ""); + newText = newText.replace(/T/g, ""); + newText = newText.replace(/Y/g, ""); + newText = newText.replace(/U/g, ""); + newText = newText.replace(/I/g, ""); + newText = newText.replace(/O/g, ""); + newText = newText.replace(/P/g, ""); + newText = newText.replace(/A/g, ""); + newText = newText.replace(/S/g, ""); + newText = newText.replace(/G/g, ""); + newText = newText.replace(/H/g, ""); + newText = newText.replace(/J/g, ""); + newText = newText.replace(/K/g, ""); + newText = newText.replace(/L/g, ""); + newText = newText.replace(/Z/g, ""); + newText = newText.replace(/X/g, ""); + newText = newText.replace(/B/g, ""); + newText = newText.replace(/N/g, ""); + newText = newText.replace(/M/g, ""); + if (!newText && newText.length !== 0) { + toast.info("از اعداداستفاده کنید"); + } + return newText; + }; + dayHandler = (num) => { + let newNum = this.numberOnly(num); + if (newNum > 31) { + toast.error("روز نباید بزرگتر از 31 باشد."); + return Math.floor(newNum / 10); + } + return newNum; + }; + monthHandler = (num) => { + let newNum = this.numberOnly(num); + if (newNum > 12 || newNum < 0) { + toast.error("ماه باید بین 1 تا 12 باشد."); + return Math.floor(newNum / 10); + } + return newNum; + }; + yearHandler = (num) => { + let newNum = this.numberOnly(num); + if (newNum > 1395) { + toast.error("سال باید کوچک‌تر از 1395 باشد."); + return Math.floor(newNum / 10); + } + return newNum; + }; + phonenumber = (value) => { + let formattedValue = value + .replace(/[\u0660-\u0669\u06f0-\u06f9]/g, function (c) { + return c.charCodeAt(0) & 0xf; + }) + .replace(/[^\d]/, ""); + return formattedValue; + }; +} + +const _onInput = new onInput(); + +export default _onInput; diff --git a/src/utils/scroll.js b/src/utils/scroll.js new file mode 100644 index 0000000..61b1486 --- /dev/null +++ b/src/utils/scroll.js @@ -0,0 +1,213 @@ +class scroll { + goToTop = () => { + window.scrollTo(0, 0); + }; + + homeScrollHandler = (index) => { + const prevScroll = Number(localStorage.getItem('prevScroll')); + const height = Number(window.innerHeight); + const scrollY = Number(window.scrollY); + if (index === 1) { + if (scrollY === 0) { + return 0; + }else + if (scrollY > 0 && scrollY <= height) { + return -scrollY; + } + if (scrollY > height) { + return -height; + } + } else if (index === 2) { + if (scrollY === 0) { + return height; + } + if (scrollY > 0 && scrollY <= height) { + return height - scrollY; + } + if (scrollY > 10 * height) { + return -1 * height; + } + } else if (index === 3) { + if (scrollY <= 3.5 * height) { + return height; + } + if (scrollY > 3.5 * height && scrollY <= 4 * height) { + return 4 * height - scrollY; + } + if (scrollY > 10 * height) { + return -height; + } + } else if (index === 4) { + if (scrollY <= 5 * height) { + return height; + } else if (scrollY > 5 * height && scrollY < 6 * height) { + return 6 * height - scrollY; + } + if (scrollY === 10 * height) { + return -height; + } + } else if (index === 5) { + if (scrollY <= 7.3 * height) { + return height; + } else if (scrollY > 7.3 * height && scrollY < 8.3 * height) { + return 8.3 * height - scrollY; + } + if (scrollY === 10 * height) { + return -height; + } + } + }; + + linearFormula = (currentScroll, position1, position2, scroll1, scroll2) => { + const alpha = (currentScroll - scroll1) / (scroll2 - scroll1); + const deltaPosition = position2 - position1; + const currentPosition = position1 + deltaPosition * alpha; + return currentPosition; + }; + + videoLinearFormula = (currentScroll) => { + if (!localStorage.getItem("htmlRect")) { + localStorage.setItem( + "htmlRect", + JSON.stringify(document.getElementById("video").getBoundingClientRect()) + ); + } + const htmlRect = + JSON.parse(localStorage.getItem("htmlRect")) || + document.getElementById("video").getBoundingClientRect(); + const joiRect = JSON.parse(localStorage.getItem("joiRect")); + + const currentWidth = this.linearFormula( + currentScroll, + htmlRect.width, + joiRect.width, + 3.5 * window.innerHeight, + 4 * window.innerHeight + ); + const currentHeight = this.linearFormula( + currentScroll, + htmlRect.height, + joiRect.height, + 3.5 * window.innerHeight, + 4 * window.innerHeight + ); + const currentLeft = this.linearFormula( + currentScroll, + htmlRect.left, + joiRect.left, + 3.5 * window.innerHeight, + 4 * window.innerHeight + ); + + const currentTop = this.linearFormula( + currentScroll, + htmlRect.top, + joiRect.top - window.innerHeight, + 3.5 * window.innerHeight, + 4 * window.innerHeight + ); + return { + width: currentWidth, + height: currentHeight, + top: currentTop, + left: currentLeft, + }; + }; + + testLinearFolmula = (currentScroll) => { + const testRect = JSON.parse(localStorage.getItem("testRect")); + const currentWidth = this.linearFormula( + currentScroll, + testRect.width, + window.innerWidth, + 4.5 * window.innerHeight, + 5 * window.innerHeight + ); + const currentHeight = this.linearFormula( + currentScroll, + testRect.height, + window.innerHeight, + 4.5 * window.innerHeight, + 5 * window.innerHeight + ); + const currentLeft = this.linearFormula( + currentScroll, + testRect.left, + 0, + 4.5 * window.innerHeight, + 5 * window.innerHeight + ); + + const currentTop = this.linearFormula( + currentScroll, + testRect.top, + 0, + 4.5 * window.innerHeight, + 5 * window.innerHeight + ); + + return { + width: currentWidth, + height: currentHeight, + top: currentTop, + left: currentLeft, + }; + }; + + initializeBoxPosition = (currentScroll) => { + const height= window.innerHeight; + if(currentScroll < height){ + console.log(currentScroll); + return { + translateX: -5, + translateY: -5, + rotate: 5 + } + } + if(currentScroll > height && currentScroll < 2 * height){ + return { + translateX: this.linearFormula(currentScroll, -5, 32, height, 2 * height), + translateY: this.linearFormula(currentScroll, -5, 10, height, 2 * height), + rotate: this.linearFormula(currentScroll, 5, 0, height, 2 * height) + } + } + if(currentScroll > 2 * height && currentScroll <= 2.5 * height){ + return { + translateX: 32, + translateY: 10, + rotate: 0 + } + } + if(currentScroll > 2.5 * height && currentScroll <= 3 * height){ + return { + translateX: this.linearFormula(currentScroll, 32, 32, 2.5 * height, 3 * height), + translateY: this.linearFormula(currentScroll, 10, -30, 2.5 * height, 3 * height), + rotate: this.linearFormula(currentScroll, 0, 0, 2.5 * height, 3 * height) + } + } + if(currentScroll > 3 * height){ + return { + translateX: 32, + translateY: -30, + rotate: 0 + } + } + }; + + initializeMobileUnit = (currentScroll) => { + const height = window.innerHeight; + if (currentScroll > 2 * height && currentScroll <= 2.3 * height) { + return 1; + } else if (currentScroll > 2.3 * height && currentScroll <= 2.7 * height) { + return 2; + } else if (currentScroll > 2.7 * height && currentScroll <= 2.8 * height) { + return 3; + } else if (currentScroll > 2.8 * height && currentScroll < 3.5 * height) { + return 4; + } + } +} + +const _scroll = new scroll(); + +export default _scroll; diff --git a/src/view/services/index.js b/src/view/services/index.js index a43a3b7..7d18964 100644 --- a/src/view/services/index.js +++ b/src/view/services/index.js @@ -1,18 +1,83 @@ -import React from "react"; +import React, {useEffect, useState} from "react"; import Class from "../../components/products/classes"; -import PLATFORM_DATA from "../../store"; -const Services = () => { +import { book, publicApi } from "../../redux/actions"; +import { connect } from 'react-redux'; +import { Link } from "react-router-dom"; +import Product from '../../components/Product'; +const Services = ({ isMobile, + books, + getList, + grades, + gradeFilter, + selectedGrade, + gradeFilterBooks, + setHeaderOptions, + headerOptions, + videos, + }) => { + + const [filter, setFilter] = useState({ + search: "", + grade: "", + productsType: "کتاب", + }); + + + const onChange = (name, value) => { + setFilter({ ...filter, [name]: value }); + }; + + useEffect(() => { + getList(); + setHeaderOptions(headerOptions); + }, []); + + useEffect(() => { + gradeFilter(filter.grade); + }, [filter]); + + return(
- - { - PLATFORM_DATA.classes.map((item, idx) => ( - - )) - } + + { books?.map((product, index) => ( + + + + ))}
); }; -export default Services; \ No newline at end of file +const mapStateToProps = (state) => ({ + isDark: state.publicApi.isDark, + isMobile: state.publicApi.isMobile, + books: state.book.list, + grades: state.publicApi.grades, + gradeFilterBooks: state.book.gradeFilterBooks, + selectedGrade: state.book.selectedGrade, + }); + + const mapDispatchToProps = { + getList: book.list, + gradeFilter: book.gradeFilter, + setHeaderOptions: publicApi.setHeaderOptions, + }; + + export default connect(mapStateToProps, mapDispatchToProps)(Services); + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b6a8ee0..ccc2f24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2400,6 +2400,13 @@ "resolved" "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz" "version" "4.3.5" +"axios@^0.25.0": + "integrity" "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==" + "resolved" "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" + "version" "0.25.0" + dependencies: + "follow-redirects" "^1.14.7" + "axobject-query@^2.2.0": "integrity" "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" @@ -2899,6 +2906,11 @@ "resolved" "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" "version" "1.0.4" +"clsx@^1.1.1": + "integrity" "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + "resolved" "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" + "version" "1.1.1" + "co@^4.6.0": "integrity" "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" @@ -4343,10 +4355,10 @@ "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz" "version" "3.2.4" -"follow-redirects@^1.0.0": - "integrity" "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz" - "version" "1.14.6" +"follow-redirects@^1.0.0", "follow-redirects@^1.14.7": + "integrity" "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" + "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz" + "version" "1.14.8" "fork-ts-checker-webpack-plugin@^6.5.0": "integrity" "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==" @@ -7318,7 +7330,7 @@ "strip-ansi" "^6.0.1" "text-table" "^0.2.0" -"react-dom@*", "react-dom@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react-dom@^17.0.2", "react-dom@>=16.8": +"react-dom@*", "react-dom@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react-dom@^17.0.2", "react-dom@>=16", "react-dom@>=16.8": "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" "version" "17.0.2" @@ -7456,7 +7468,14 @@ "@tweenjs/tween.js" "^18.1.2" "resize-observer-polyfill" "^1.5.1" -"react@*", "react@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react@^16.8.3 || ^17", "react@^17.0.2", "react@>= 16", "react@>= 16.8", "react@>=16.8", "react@17.0.2": +"react-toastify@^8.1.1": + "integrity" "sha512-KQa+j+JHjy69xpPYheaWUq3SjVw1sV2D7/QsXW6Tpo2x9HhUCvASezAMYDmLhfAYoSnaXUVnTNFAgZQA75SExQ==" + "resolved" "https://registry.npmjs.org/react-toastify/-/react-toastify-8.1.1.tgz" + "version" "8.1.1" + dependencies: + "clsx" "^1.1.1" + +"react@*", "react@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react@^16.8.3 || ^17", "react@^17.0.2", "react@>= 16", "react@>= 16.8", "react@>=16", "react@>=16.8", "react@17.0.2": "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" "version" "17.0.2" @@ -7508,7 +7527,17 @@ "indent-string" "^4.0.0" "strip-indent" "^3.0.0" -"redux@^4.0.0", "redux@^4.1.2": +"redux-devtools-extension@^2.13.9": + "integrity" "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==" + "resolved" "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz" + "version" "2.13.9" + +"redux-thunk@^2.4.1": + "integrity" "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" + "resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz" + "version" "2.4.1" + +"redux@^3.1.0 || ^4.0.0", "redux@^4", "redux@^4.0.0", "redux@^4.1.2": "integrity" "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==" "resolved" "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz" "version" "4.1.2"