Procházet zdrojové kódy

+cart reducer, +orders action +gql

Ivan Asmer před 4 roky
rodič
revize
a790468355
3 změnil soubory, kde provedl 63 přidání a 14 odebrání
  1. 3 3
      src/App.js
  2. 33 10
      src/actions/index.js
  3. 27 1
      src/reducers/index.js

+ 3 - 3
src/App.js

@@ -8,7 +8,7 @@ import store from './reducers'
 import {Router, Route, Link, Switch, Redirect} from 'react-router-dom';
 import createHistory from "history/createBrowserHistory";
 
-import {actionCategories, actionLogin, actionCategory} from './actions'
+import {actionCategories, actionLogin, actionCategory, actionOrders} from './actions'
 
 
 const history = createHistory()
@@ -33,6 +33,7 @@ const CLoginForm = connect(null, {onLogin: actionLogin})(LoginForm)
 
 
 store.dispatch(actionCategories())
+store.dispatch(actionOrders())
 
 const CategoryMenuItem = ({category:{_id, name}={_id: 'NOID', name: "NO CATEGORY"}}) =>
 <li>
@@ -54,8 +55,7 @@ const CategoryMenu = ({categories=
 </aside>
 
 const CCategoryMenu = connect(state => ({categories: state.promise.categories && 
-                                                     state.promise.categories.payload && 
-                                                     state.promise.categories.payload.CategoryFind}))(CategoryMenu)
+                                                     state.promise.categories.payload}))(CategoryMenu)
 
 const defaultGoods = [
         {

+ 33 - 10
src/actions/index.js

@@ -1,7 +1,28 @@
 import { GraphQLClient } from 'graphql-request';
 
 //const gql = new GraphQLClient('/graphql', {headers: {Authorization: 'Bearer ' + ... }})
-const gql = new GraphQLClient('/graphql')
+
+const getGQL = (url='http://shop-roles.asmer.fs.a-level.com.ua/graphql', 
+    getHeaders=(()=>localStorage.authToken ? {Authorization: `Bearer ${localStorage.authToken}`} : 
+                                                     {})) =>
+(query='', variables={}) =>
+    fetch(url, {
+        method: 'POST',
+        headers:{
+             'Accept': 'application/json',
+              'Content-Type': 'application/json',
+             ...getHeaders()
+            },
+        body: JSON.stringify({query, variables})
+    }).then(res => res.json()).then(data => { 
+        if (data.errors){
+            throw new Error(JSON.stringify(data.errors, null, 4))
+        }
+        const firstKey = Object.keys(data.data)[0]
+        return firstKey ? data.data[firstKey] : data.data
+    })
+
+const gql = getGQL()
 
 export const actionSearch = text => ({type: 'SEARCH', text})
 export const actionSearchResult = payload => ({type: 'SEARCH_RESULT', payload})
@@ -26,17 +47,19 @@ export const actionPromise = (name, promise) => {
     }
 }
 
-export const actionPosts = () => {
-    return actionPromise('posts', gql.request(`query psts{
-          getPosts{
-            id, title, text    
-          }
-        }`))
+export const actionOrders = () => {
+    return actionPromise('orders', gql( `query orders($allQuery:String){
+                              OrderFind(query:$allQuery){
+                                _id total orderGoods{
+                                  total count good{ name }
+                                }
+                              }
+                            }`, {allQuery: JSON.stringify([{}])}))
 }
 
 
 export const actionCategories = () => {
-    return actionPromise('categories', gql.request(
+    return actionPromise('categories', gql(
             `query {
               CategoryFind(query:"[{\\"parent\\":null}]"){
                 _id name
@@ -47,7 +70,7 @@ export const actionCategories = () => {
 
 
 export const actionCategory = (_id) => {
-    return actionPromise('category', gql.request(
+    return actionPromise('category', gql(
                     `query cat($query:String){
                       CategoryFindOne(query:$query){
                         _id name goods{
@@ -61,7 +84,7 @@ export const actionCategory = (_id) => {
 export const actionLogin = (login,password) => 
     async dispatch => {
         console.log(login, password)
-        let result = await dispatch(actionPromise('login', gql.request(`query login($login: String!, $password: String!){
+        let result = await dispatch(actionPromise('login', gql(`query login($login: String!, $password: String!){
               login(username: $login, password: $password)
             }`, {login, password})))
         if (result){

+ 27 - 1
src/reducers/index.js

@@ -34,7 +34,33 @@ const reducers = {
             return {}
         }
         return state
-    }
+    },
+    cart: localStored('cart', (state={/*Id1: 5, Id2: 25, Id3: 1*/}, {type, _id, count}) => {
+        const types = {
+            CART_ADD(){
+                return предыдущее состояние и добавить новый товар, а если старый, то +1
+            },
+            CART_DELETE(){
+                return деструктурнуть с ... шобы лишнее удалить
+            },
+            CART_SET(){
+                return предыдущее состояние и установить количество одного конкретного товара (нужно для оформления, там обычно любое число можно)
+            },
+            CART_CLEAR(){
+                return {}
+            }
+        }
+
+        if (type in types)
+            return types[type]()
+
+        return state;
+    }),
+}
+
+function localStored(name, reducer){
+    должна сохранить и восстановить все шо можно в localstorage
+    return (state, action) => ведет себя как reducer, но по пути сохраняет или восстанавливает из localStorage
 }
 //{
 //    promise: {}