1 |
- {"ast":null,"code":"var _jsxFileName = \"/home/ilya/projects/NIX/homework/react-store/src/App.js\",\n _this = this;\n\nimport defaultLogo from \"./logo.svg\";\nimport \"./App.scss\";\nimport { Provider, connect } from \"react-redux\";\nimport { createStore, combineReducers, applyMiddleware } from \"redux\";\nimport thunk from \"redux-thunk\";\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\n\nconst jwtDecode = token => {\n try {\n let payload = JSON.parse(atob(token.split(\".\")[1]));\n return payload;\n } catch (e) {\n console.log(e);\n }\n};\n\nfunction cartReducer() {\n let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let {\n type,\n good,\n count = 1\n } = arguments.length > 1 ? arguments[1] : undefined;\n\n if (count <= 0) {\n type = \"CART_DELETE\";\n }\n\n if (type === \"CART_ADD\") {\n return { ...state,\n [good[\"_id\"]]: {\n good,\n count: good[\"_id\"] in state ? state[good._id].count + count : count\n }\n };\n }\n\n if (type === \"CART_CHANGE\") {\n return { ...state,\n [good[\"_id\"]]: {\n good,\n count: count\n }\n };\n }\n\n if (type === \"CART_DELETE\") {\n let {\n [good._id]: toRemove,\n ...newState\n } = state;\n return newState;\n }\n\n if (type === \"CART_CLEAR\") {\n return {};\n }\n\n return state;\n}\n\nfunction promiseReducer() {\n let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let {\n type,\n name,\n status,\n payload,\n error\n } = arguments.length > 1 ? arguments[1] : undefined;\n\n if (type === \"PROMISE\") {\n return { ...state,\n [name]: {\n status,\n payload,\n error\n }\n };\n }\n\n return state;\n}\n\nfunction authReducer(state, _ref) {\n let {\n type,\n token\n } = _ref;\n\n if (state === undefined) {\n if (localStorage.authToken) {\n token = localStorage.authToken;\n type = \"AUTH_LOGIN\";\n state = {};\n }\n }\n\n if (type === \"AUTH_LOGIN\") {\n if (!token || !jwtDecode(token)) return {};\n localStorage.authToken = token;\n return { ...state,\n token: token,\n payload: jwtDecode(token)\n };\n }\n\n if (type === \"AUTH_LOGOUT\") {\n localStorage.removeItem(\"authToken\");\n return {};\n }\n\n return state || {};\n}\n\nconst getGQL = url => (query, variables) => fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(localStorage.authToken ? {\n Authorization: \"Bearer \" + localStorage.authToken\n } : {})\n },\n body: JSON.stringify({\n query,\n variables\n })\n}).then(res => res.json()).then(data => {\n if (data.errors) {\n throw new Error(JSON.stringify(data.errors));\n } else return Object.values(data.data)[0];\n});\n\nconst backendURL = \"http://shop-roles.asmer.fs.a-level.com.ua\";\nconst gql = getGQL(backendURL + \"/graphql\");\nconst store = createStore(combineReducers({\n auth: authReducer,\n promise: promiseReducer,\n cart: cartReducer\n}), applyMiddleware(thunk));\n\nconst actionPending = name => ({\n type: \"PROMISE\",\n name,\n status: \"PENDING\"\n});\n\nconst actionFulfilled = (name, payload) => ({\n type: \"PROMISE\",\n name,\n status: \"FULFILLED\",\n payload\n});\n\nconst actionRejected = (name, error) => ({\n type: \"PROMISE\",\n name,\n status: \"REJECTED\",\n error\n});\n\nconst actionPromise = (name, promise) => async dispatch => {\n dispatch(actionPending(name));\n\n try {\n let payload = await promise;\n dispatch(actionFulfilled(name, payload));\n return payload;\n } catch (error) {\n dispatch(actionRejected(name, error));\n }\n};\n\nconst actionRootCats = () => actionPromise(\"rootCats\", gql(`query {\n CategoryFind(query: \"[{\\\\\"parent\\\\\":null}]\"){\n _id name\n }\n }`));\n\nconst actionGoodById = _id => actionPromise(\"good\", gql(`query GoodById($q: String){\n GoodFindOne(query: $q){\n _id name price images{\n url\n }\n }\n }`, {\n q: JSON.stringify([{\n _id\n }])\n}));\n\nconst actionCatById = (_id //добавить подкатегории\n) => actionPromise(\"catById\", gql(`query catById($q: String){\n CategoryFindOne(query: $q){\n _id name goods {\n _id name price images {\n url\n }\n }\n }\n }`, {\n q: JSON.stringify([{\n _id\n }])\n}));\n\nconst actionAuthLogin = token => ({\n type: \"AUTH_LOGIN\",\n token: token\n});\n\nconst actionLogin = (login, password) => async dispatch => {\n const token = await dispatch(actionPromise(\"login\", gql(`query log($login:String,$password:String){\n login(login:$login,password:$password)\n }\n `, {\n login: login,\n password: password\n })));\n await dispatch(actionAuthLogin(token));\n window.location = \"#/\";\n};\n\nconst actionAuthLogout = () => ({\n type: \"AUTH_LOGOUT\"\n});\n\nconst actionRegister = (login, password) => async dispatch => {\n await dispatch(actionPromise(\"register\", gql(`mutation register($login:String,$password:String){\n UserUpsert(user:{login:$login,password:$password}){\n _id login\n }\n }`, {\n login: login,\n password: password\n })));\n};\n\nconst actionCartAdd = function (good) {\n let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return {\n type: \"CART_ADD\",\n good,\n count\n };\n};\n\nconst actionCartChange = function (good) {\n let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return {\n type: \"CART_CHANGE\",\n good,\n count\n };\n};\n\nconst actionCartDelete = good => ({\n type: \"CART_DELETE\",\n good\n});\n\nconst actionCartClear = () => ({\n type: \"CART_CLEAR\"\n});\n\nstore.subscribe(() => console.log(store.getState()));\nstore.dispatch(actionRootCats());\nconst defaultCategories = [{\n _id: \"5dc458985df9d670df48cc47\",\n name: \" Smartphones\"\n}, {\n _id: \"5dc4b2553f23b553bf354101\",\n name: \"Крупная бытовая техника\"\n}, {\n _id: \"5dcac1b56d09c45440d14cf8\",\n name: \" Макароны\"\n}, {\n _id: \"5dcac6cf6d09c45440d14cfd\",\n name: \"Drinks\"\n}, {\n _id: \"5dcacaeb6d09c45440d14d04\",\n name: \"Салаты\"\n}, {\n _id: \"61715b92ef4e1b3e3b67703c\",\n name: \"Приятный бонус\"\n}, {\n _id: \"61e725dcf9be102f49b2c6c4\",\n name: \"Товарчики\"\n}, {\n _id: \"5dc94bd00e36db246e3049ee\",\n name: \"Пицца\"\n}, {\n _id: \"5dcabeeb6d09c45440d14cf6\",\n name: \"Макароны\"\n}];\n\nconst Logo = _ref2 => {\n let {\n logo = defaultLogo\n } = _ref2;\n return /*#__PURE__*/_jsxDEV(\"img\", {\n src: logo,\n className: \"Logo\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 262,\n columnNumber: 42\n }, this);\n};\n\n_c = Logo;\n\nconst RootCategories = _ref3 => {\n let {\n categories = defaultCategories,\n handleClickOnItem\n } = _ref3;\n return /*#__PURE__*/_jsxDEV(\"ul\", {\n className: \"RootCategories\",\n children: categories.map(category => /*#__PURE__*/_jsxDEV(CategoryItem, {\n category: category,\n handleClick: handleClickOnItem\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 267,\n columnNumber: 13\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 265,\n columnNumber: 5\n }, this);\n};\n\n_c2 = RootCategories;\n\nconst GoodCard = function () {\n let {\n good: {\n name,\n images,\n price,\n _id\n },\n token,\n handleOnClick\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"GoodCard row\",\n children: [/*#__PURE__*/_jsxDEV(\"img\", {\n src: `${backendURL}/${images ? images[0].url : \"\"}`,\n className: \"GoodImage col-6\",\n alt: \"\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 275,\n columnNumber: 13\n }, _this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name : \"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 278,\n columnNumber: 21\n }, _this), \" \", name]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 277,\n columnNumber: 17\n }, _this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Price : \"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 281,\n columnNumber: 21\n }, _this), \" \", price]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 280,\n columnNumber: 17\n }, _this), token ? /*#__PURE__*/_jsxDEV(\"div\", {\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => handleOnClick({\n name,\n images,\n price,\n _id\n }),\n className: \"btn btn-success px-3\",\n children: \"Buy\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 285,\n columnNumber: 25\n }, _this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 284,\n columnNumber: 21\n }, _this) : false]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 276,\n columnNumber: 13\n }, _this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 274,\n columnNumber: 9\n }, _this);\n};\n\n_c3 = GoodCard;\n\nconst GoodsList = function () {\n let {\n goods\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"GoodList row\",\n children: goods.map(good => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-12 col-md-6\",\n children: /*#__PURE__*/_jsxDEV(CGoodCard, {\n good: good\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 304,\n columnNumber: 17\n }, _this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 303,\n columnNumber: 13\n }, _this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 301,\n columnNumber: 5\n }, _this);\n};\n\n_c4 = GoodsList;\n\nconst CartItem = _ref4 => {\n let {\n order: {\n count,\n good: {\n _id,\n name,\n images,\n price\n }\n },\n handleDelete,\n handleChange\n } = _ref4;\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"CartItem row mt-3\",\n children: [/*#__PURE__*/_jsxDEV(\"img\", {\n src: `${backendURL}/${images ? images[0].url : \"\"}`,\n className: \"GoodImage col-3\",\n alt: \"\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 318,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-5\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name : \"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 321,\n columnNumber: 17\n }, this), \" \", name]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 320,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Price : \"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 324,\n columnNumber: 17\n }, this), \" \", price, \" * \", count, \" = \", +price * +count]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 323,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 319,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-4\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \" w-100 d-flex justify-content-center\",\n children: [/*#__PURE__*/_jsxDEV(\"button\", {\n className: \"btn btn-info\",\n onClick: () => handleChange({\n _id,\n name,\n images,\n price\n }, --count),\n children: \"-\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 329,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"px-3\",\n children: count\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 332,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"btn btn-info\",\n onClick: () => handleChange({\n _id,\n name,\n images,\n price\n }, ++count),\n children: \"+\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 333,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"btn btn-danger\",\n onClick: () => handleDelete({\n _id,\n name,\n images,\n price\n }),\n children: \"Delete\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 336,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 328,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 327,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 317,\n columnNumber: 5\n }, this);\n};\n\n_c5 = CartItem;\nconst CCartItem = connect(() => {}, {\n handleDelete: good => actionCartDelete(good)\n})(CartItem);\n_c6 = CCartItem;\n\nconst Cart = _ref5 => {\n let {\n cart,\n token\n } = _ref5;\n return token && Object.keys(cart).length > 0 ? /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"Cart row\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-12 header\",\n children: \"Cart\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 351,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"col-12\",\n children: Object.entries(cart).map(_ref6 => {\n let [_id, order] = _ref6;\n return /*#__PURE__*/_jsxDEV(CCartItem, {\n order: order\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 354,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 352,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 350,\n columnNumber: 9\n }, this) : false;\n};\n\n_c7 = Cart;\nconst CCart = connect(state => ({\n cart: state.cart || [],\n token: state.auth.token\n}), {\n handleDelete: good => actionCartDelete(good)\n})(Cart);\n_c8 = CCart;\nconst CGoodsList = connect(state => {\n var _state$promise, _state$promise$catByI, _state$promise$catByI2;\n\n return {\n goods: ((_state$promise = state.promise) === null || _state$promise === void 0 ? void 0 : (_state$promise$catByI = _state$promise.catById) === null || _state$promise$catByI === void 0 ? void 0 : (_state$promise$catByI2 = _state$promise$catByI.payload) === null || _state$promise$catByI2 === void 0 ? void 0 : _state$promise$catByI2.goods) || []\n };\n})(GoodsList);\n_c9 = CGoodsList;\nconst CGoodCard = connect(state => {\n var _state$auth;\n\n return {\n token: ((_state$auth = state.auth) === null || _state$auth === void 0 ? void 0 : _state$auth.token) || false\n };\n}, {\n handleOnClick: good => actionCartAdd(good)\n})(GoodCard);\n_c10 = CGoodCard;\nconst CRootCategories = connect(state => {\n var _state$promise2, _state$promise2$rootC;\n\n return {\n categories: ((_state$promise2 = state.promise) === null || _state$promise2 === void 0 ? void 0 : (_state$promise2$rootC = _state$promise2.rootCats) === null || _state$promise2$rootC === void 0 ? void 0 : _state$promise2$rootC.payload) || []\n };\n}, {\n handleClickOnItem: _id => actionCatById(_id)\n})(RootCategories);\n_c11 = CRootCategories;\nconst CLogout = connect(state => {\n var _state$auth2, _state$auth2$payload, _state$auth2$payload$;\n\n return {\n children: `Logout (${((_state$auth2 = state.auth) === null || _state$auth2 === void 0 ? void 0 : (_state$auth2$payload = _state$auth2.payload) === null || _state$auth2$payload === void 0 ? void 0 : (_state$auth2$payload$ = _state$auth2$payload.sub) === null || _state$auth2$payload$ === void 0 ? void 0 : _state$auth2$payload$.login) || \"anon\"})`\n };\n}, {\n onClick: actionAuthLogout\n})(\"button\");\n_c12 = CLogout;\n\nconst CategoryItem = _ref7 => {\n let {\n category: {\n _id,\n name\n } = {},\n handleClick\n } = _ref7;\n return /*#__PURE__*/_jsxDEV(\"li\", {\n className: \"CategoryItem\",\n onClick: () => handleClick(_id),\n children: name\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 378,\n columnNumber: 5\n }, this);\n};\n\n_c13 = CategoryItem;\n\nconst Header = _ref8 => {\n let {\n children\n } = _ref8;\n return /*#__PURE__*/_jsxDEV(\"header\", {\n children: [/*#__PURE__*/_jsxDEV(CLogout, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 385,\n columnNumber: 9\n }, this), children]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 384,\n columnNumber: 5\n }, this);\n};\n\n_c14 = Header;\n\nconst Aside = _ref9 => {\n let {\n children\n } = _ref9;\n return /*#__PURE__*/_jsxDEV(\"aside\", {\n className: \"col-4\",\n children: [/*#__PURE__*/_jsxDEV(CRootCategories, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 391,\n columnNumber: 9\n }, this), children]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 390,\n columnNumber: 5\n }, this);\n};\n\n_c15 = Aside;\n\nconst Content = _ref10 => {\n let {\n children\n } = _ref10;\n return /*#__PURE__*/_jsxDEV(\"section\", {\n className: \"Content col-8\",\n children: children\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 396,\n columnNumber: 35\n }, this);\n};\n\n_c16 = Content;\n\nconst Main = _ref11 => {\n let {\n children\n } = _ref11;\n return /*#__PURE__*/_jsxDEV(\"main\", {\n className: \"row\",\n children: [/*#__PURE__*/_jsxDEV(Aside, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 400,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(Content, {\n children: [/*#__PURE__*/_jsxDEV(CGoodsList, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 402,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(CCart, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 403,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 401,\n columnNumber: 9\n }, this), children]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 399,\n columnNumber: 5\n }, this);\n};\n\n_c17 = Main;\n\nconst Footer = _ref12 => {\n let {\n children\n } = _ref12;\n return /*#__PURE__*/_jsxDEV(\"footer\", {\n className: \"row\",\n children: children\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 409,\n columnNumber: 34\n }, this);\n};\n\n_c18 = Footer;\n\nfunction App() {\n return /*#__PURE__*/_jsxDEV(Provider, {\n store: store,\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"App container\",\n children: [/*#__PURE__*/_jsxDEV(Header, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 415,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Main, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 416,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Footer, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 417,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 414,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 413,\n columnNumber: 9\n }, this);\n}\n\n_c19 = App;\nstore.dispatch(actionCatById(\"5dc458985df9d670df48cc47\"));\nexport default App;\n\nvar _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11, _c12, _c13, _c14, _c15, _c16, _c17, _c18, _c19;\n\n$RefreshReg$(_c, \"Logo\");\n$RefreshReg$(_c2, \"RootCategories\");\n$RefreshReg$(_c3, \"GoodCard\");\n$RefreshReg$(_c4, \"GoodsList\");\n$RefreshReg$(_c5, \"CartItem\");\n$RefreshReg$(_c6, \"CCartItem\");\n$RefreshReg$(_c7, \"Cart\");\n$RefreshReg$(_c8, \"CCart\");\n$RefreshReg$(_c9, \"CGoodsList\");\n$RefreshReg$(_c10, \"CGoodCard\");\n$RefreshReg$(_c11, \"CRootCategories\");\n$RefreshReg$(_c12, \"CLogout\");\n$RefreshReg$(_c13, \"CategoryItem\");\n$RefreshReg$(_c14, \"Header\");\n$RefreshReg$(_c15, \"Aside\");\n$RefreshReg$(_c16, \"Content\");\n$RefreshReg$(_c17, \"Main\");\n$RefreshReg$(_c18, \"Footer\");\n$RefreshReg$(_c19, \"App\");","map":{"version":3,"sources":["/home/ilya/projects/NIX/homework/react-store/src/App.js"],"names":["defaultLogo","Provider","connect","createStore","combineReducers","applyMiddleware","thunk","jwtDecode","token","payload","JSON","parse","atob","split","e","console","log","cartReducer","state","type","good","count","_id","toRemove","newState","promiseReducer","name","status","error","authReducer","undefined","localStorage","authToken","removeItem","getGQL","url","query","variables","fetch","method","headers","Authorization","body","stringify","then","res","json","data","errors","Error","Object","values","backendURL","gql","store","auth","promise","cart","actionPending","actionFulfilled","actionRejected","actionPromise","dispatch","actionRootCats","actionGoodById","q","actionCatById","actionAuthLogin","actionLogin","login","password","window","location","actionAuthLogout","actionRegister","actionCartAdd","actionCartChange","actionCartDelete","actionCartClear","subscribe","getState","defaultCategories","Logo","logo","RootCategories","categories","handleClickOnItem","map","category","GoodCard","images","price","handleOnClick","GoodsList","goods","CartItem","order","handleDelete","handleChange","CCartItem","Cart","keys","length","entries","CCart","CGoodsList","catById","CGoodCard","CRootCategories","rootCats","CLogout","children","sub","onClick","CategoryItem","handleClick","Header","Aside","Content","Main","Footer","App"],"mappings":"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","sourcesContent":["import defaultLogo from \"./logo.svg\";\nimport \"./App.scss\";\n\nimport { Provider, connect } from \"react-redux\";\nimport { createStore, combineReducers, applyMiddleware } from \"redux\";\nimport thunk from \"redux-thunk\";\n\nconst jwtDecode = (token) => {\n try {\n let payload = JSON.parse(atob(token.split(\".\")[1]));\n\n return payload;\n } catch (e) {\n console.log(e);\n }\n};\n\nfunction cartReducer(state = {}, { type, good, count = 1 }) {\n if (count <= 0) {\n type = \"CART_DELETE\";\n }\n\n if (type === \"CART_ADD\") {\n return {\n ...state,\n [good[\"_id\"]]: {\n good,\n count: good[\"_id\"] in state ? state[good._id].count + count : count,\n },\n };\n }\n if (type === \"CART_CHANGE\") {\n return {\n ...state,\n [good[\"_id\"]]: {\n good,\n count: count,\n },\n };\n }\n if (type === \"CART_DELETE\") {\n let { [good._id]: toRemove, ...newState } = state;\n return newState;\n }\n if (type === \"CART_CLEAR\") {\n return {};\n }\n return state;\n}\n\nfunction promiseReducer(state = {}, { type, name, status, payload, error }) {\n if (type === \"PROMISE\") {\n return {\n ...state,\n [name]: { status, payload, error },\n };\n }\n return state;\n}\n\nfunction authReducer(state, { type, token }) {\n if (state === undefined) {\n if (localStorage.authToken) {\n token = localStorage.authToken;\n type = \"AUTH_LOGIN\";\n state = {};\n }\n }\n\n if (type === \"AUTH_LOGIN\") {\n if (!token || !jwtDecode(token)) return {};\n localStorage.authToken = token;\n return {\n ...state,\n token: token,\n payload: jwtDecode(token),\n };\n }\n\n if (type === \"AUTH_LOGOUT\") {\n localStorage.removeItem(\"authToken\");\n return {};\n }\n return state || {};\n}\n\nconst getGQL = (url) => (query, variables) =>\n fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(localStorage.authToken ? { Authorization: \"Bearer \" + localStorage.authToken } : {}),\n },\n body: JSON.stringify({ query, variables }),\n })\n .then((res) => res.json())\n .then((data) => {\n if (data.errors) {\n throw new Error(JSON.stringify(data.errors));\n } else return Object.values(data.data)[0];\n });\n\nconst backendURL = \"http://shop-roles.asmer.fs.a-level.com.ua\";\n\nconst gql = getGQL(backendURL + \"/graphql\");\n\nconst store = createStore(\n combineReducers({ auth: authReducer, promise: promiseReducer, cart: cartReducer }),\n applyMiddleware(thunk)\n);\n\nconst actionPending = (name) => ({ type: \"PROMISE\", name, status: \"PENDING\" });\nconst actionFulfilled = (name, payload) => ({ type: \"PROMISE\", name, status: \"FULFILLED\", payload });\nconst actionRejected = (name, error) => ({ type: \"PROMISE\", name, status: \"REJECTED\", error });\nconst actionPromise = (name, promise) => async (dispatch) => {\n dispatch(actionPending(name));\n try {\n let payload = await promise;\n dispatch(actionFulfilled(name, payload));\n return payload;\n } catch (error) {\n dispatch(actionRejected(name, error));\n }\n};\n\nconst actionRootCats = () =>\n actionPromise(\n \"rootCats\",\n gql(`query {\n CategoryFind(query: \"[{\\\\\"parent\\\\\":null}]\"){\n _id name\n }\n }`)\n );\n\nconst actionGoodById = (_id) =>\n actionPromise(\n \"good\",\n gql(\n `query GoodById($q: String){\n GoodFindOne(query: $q){\n _id name price images{\n url\n }\n }\n }`,\n { q: JSON.stringify([{ _id }]) }\n )\n );\n\nconst actionCatById = (\n _id //добавить подкатегории\n) =>\n actionPromise(\n \"catById\",\n gql(\n `query catById($q: String){\n CategoryFindOne(query: $q){\n _id name goods {\n _id name price images {\n url\n }\n }\n }\n }`,\n { q: JSON.stringify([{ _id }]) }\n )\n );\n\nconst actionAuthLogin = (token) => ({\n type: \"AUTH_LOGIN\",\n token: token,\n});\n\nconst actionLogin = (login, password) => async (dispatch) => {\n const token = await dispatch(\n actionPromise(\n \"login\",\n gql(\n `query log($login:String,$password:String){\n login(login:$login,password:$password)\n }\n `,\n {\n login: login,\n password: password,\n }\n )\n )\n );\n await dispatch(actionAuthLogin(token));\n window.location = \"#/\";\n};\n\nconst actionAuthLogout = () => ({ type: \"AUTH_LOGOUT\" });\n\nconst actionRegister = (login, password) => async (dispatch) => {\n await dispatch(\n actionPromise(\n \"register\",\n gql(\n `mutation register($login:String,$password:String){\n UserUpsert(user:{login:$login,password:$password}){\n _id login\n }\n }`,\n {\n login: login,\n password: password,\n }\n )\n )\n );\n};\nconst actionCartAdd = (good, count = 1) => ({ type: \"CART_ADD\", good, count });\nconst actionCartChange = (good, count = 1) => ({ type: \"CART_CHANGE\", good, count });\nconst actionCartDelete = (good) => ({ type: \"CART_DELETE\", good });\nconst actionCartClear = () => ({ type: \"CART_CLEAR\" });\n\nstore.subscribe(() => console.log(store.getState()));\nstore.dispatch(actionRootCats());\n\nconst defaultCategories = [\n {\n _id: \"5dc458985df9d670df48cc47\",\n name: \" Smartphones\",\n },\n {\n _id: \"5dc4b2553f23b553bf354101\",\n name: \"Крупная бытовая техника\",\n },\n {\n _id: \"5dcac1b56d09c45440d14cf8\",\n name: \" Макароны\",\n },\n {\n _id: \"5dcac6cf6d09c45440d14cfd\",\n name: \"Drinks\",\n },\n {\n _id: \"5dcacaeb6d09c45440d14d04\",\n name: \"Салаты\",\n },\n {\n _id: \"61715b92ef4e1b3e3b67703c\",\n name: \"Приятный бонус\",\n },\n {\n _id: \"61e725dcf9be102f49b2c6c4\",\n name: \"Товарчики\",\n },\n {\n _id: \"5dc94bd00e36db246e3049ee\",\n name: \"Пицца\",\n },\n {\n _id: \"5dcabeeb6d09c45440d14cf6\",\n name: \"Макароны\",\n },\n];\n\nconst Logo = ({ logo = defaultLogo }) => <img src={logo} className=\"Logo\" />;\n\nconst RootCategories = ({ categories = defaultCategories, handleClickOnItem }) => (\n <ul className=\"RootCategories\">\n {categories.map((category) => (\n <CategoryItem category={category} handleClick={handleClickOnItem} />\n ))}\n </ul>\n);\n\nconst GoodCard = ({ good: { name, images, price, _id }, token, handleOnClick } = {}) => {\n return (\n <div className=\"GoodCard row\">\n <img src={`${backendURL}/${images ? images[0].url : \"\"}`} className=\"GoodImage col-6\" alt=\"\" />\n <div className=\"col-6\">\n <div>\n <strong>Name : </strong> {name}\n </div>\n <div>\n <strong>Price : </strong> {price}\n </div>\n {token ? (\n <div>\n <button\n onClick={() => handleOnClick({ name, images, price, _id })}\n className=\"btn btn-success px-3\"\n >\n Buy\n </button>\n </div>\n ) : (\n false\n )}\n </div>\n </div>\n );\n};\n\nconst GoodsList = ({ goods } = {}) => (\n <div className=\"GoodList row\">\n {goods.map((good) => (\n <div className=\"col-12 col-md-6\">\n <CGoodCard good={good} />\n </div>\n ))}\n </div>\n);\nconst CartItem = ({\n order: {\n count,\n good: { _id, name, images, price },\n },\n handleDelete,\n handleChange,\n}) => (\n <div className=\"CartItem row mt-3\">\n <img src={`${backendURL}/${images ? images[0].url : \"\"}`} className=\"GoodImage col-3\" alt=\"\" />\n <div className=\"col-5\">\n <div>\n <strong>Name : </strong> {name}\n </div>\n <div>\n <strong>Price : </strong> {price} * {count} = {+price * +count}\n </div>\n </div>\n <div className=\"col-4\">\n <div className=\" w-100 d-flex justify-content-center\">\n <button className=\"btn btn-info\" onClick={() => handleChange({ _id, name, images, price }, --count)}>\n -\n </button>\n <div className=\"px-3\">{count}</div>\n <button className=\"btn btn-info\" onClick={() => handleChange({ _id, name, images, price }, ++count)}>\n +\n </button>\n <button className=\"btn btn-danger\" onClick={() => handleDelete({ _id, name, images, price })}>\n Delete\n </button>\n </div>\n </div>\n </div>\n);\n\nconst CCartItem = connect(() => {}, {\n handleDelete: (good) => actionCartDelete(good),\n})(CartItem);\n\nconst Cart = ({ cart, token }) =>\n token && Object.keys(cart).length > 0 ? (\n <div className=\"Cart row\">\n <div className=\"col-12 header\">Cart</div>\n <div className=\"col-12\">\n {Object.entries(cart).map(([_id, order]) => (\n <CCartItem order={order} />\n ))}\n </div>\n </div>\n ) : (\n false\n );\n\nconst CCart = connect((state) => ({ cart: state.cart || [], token: state.auth.token }), {\n handleDelete: (good) => actionCartDelete(good),\n})(Cart);\n\nconst CGoodsList = connect((state) => ({ goods: state.promise?.catById?.payload?.goods || [] }))(GoodsList);\nconst CGoodCard = connect((state) => ({ token: state.auth?.token || false }), {\n handleOnClick: (good) => actionCartAdd(good),\n})(GoodCard);\nconst CRootCategories = connect((state) => ({ categories: state.promise?.rootCats?.payload || [] }), {\n handleClickOnItem: (_id) => actionCatById(_id),\n})(RootCategories);\nconst CLogout = connect((state) => ({ children: `Logout (${state.auth?.payload?.sub?.login || \"anon\"})` }), {\n onClick: actionAuthLogout,\n})(\"button\");\n\nconst CategoryItem = ({ category: { _id, name } = {}, handleClick }) => (\n <li className=\"CategoryItem\" onClick={() => handleClick(_id)}>\n {name}\n </li>\n);\n\nconst Header = ({ children }) => (\n <header>\n <CLogout />\n {children}\n </header>\n);\nconst Aside = ({ children }) => (\n <aside className=\"col-4\">\n <CRootCategories />\n {children}\n </aside>\n);\n\nconst Content = ({ children }) => <section className=\"Content col-8\">{children}</section>;\n\nconst Main = ({ children }) => (\n <main className=\"row\">\n <Aside />\n <Content>\n <CGoodsList />\n <CCart />\n </Content>\n {children}\n </main>\n);\n\nconst Footer = ({ children }) => <footer className=\"row\">{children}</footer>;\n\nfunction App() {\n return (\n <Provider store={store}>\n <div className=\"App container\">\n <Header />\n <Main />\n <Footer />\n </div>\n </Provider>\n );\n}\n\nstore.dispatch(actionCatById(\"5dc458985df9d670df48cc47\"));\nexport default App;\n"]},"metadata":{},"sourceType":"module"}
|