123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <header>
- </header>
- <body>
- <script>
- {
- function cartReducer(state = {}, action) { // диспетчер обработки
- switch (action.type) {
- case 'CART_ADD':
- if (action.count >= 0) {
- let newState = { ...state };
- let { count } = state[action.good._id] ?? { count: 0 };
- newState[action.good._id] = { count: action.count + count, good: { ...action.good } }
- return newState;
- }
- case 'CART_SUB':
- if (action.count >= 0) {
- let newState = { ...state };
- let { count } = state[action.good._id] ?? { count: 0 };
- if (count >= action.count) {
- newState[action.good._id] = { count: action.count - count, good: { ...action.good } }
- return newState;
- }
- }
- break;
- case 'CART_DEL':
- {
- let newState = { ...state };
- delete newState[action.good._id];
- return newState;
- }
- case 'CART_SET':
- {
- let newState = { ...state };
- newState[action.good._id] = { count: action.count, good: { ...action.good } };
- return newState;
- }
- case 'CART_CLEAR':
- return {};
- }
- return state;
- }
- function createStore(reducer) {
- let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
- let cbs = [] //массив подписчиков
- const getState = () => state //функция, возвращающая переменную из замыкания
- const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
- () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
- function dispatch(action) {
- if (typeof action === 'function') { //если action - не объект, а функция
- return action(dispatch, getState) //запускаем эту функцию и даем ей dispatch и getState для работы
- }
- const newState = reducer(state, action) //пробуем запустить редьюсер
- if (newState !== state) { //проверяем, смог ли редьюсер обработать action
- state = newState //если смог, то обновляем state
- for (let cb of cbs) cb() //и запускаем подписчиков
- }
- }
- return {
- getState, //добавление функции getState в результирующий объект
- dispatch,
- subscribe //добавление subscribe в объект
- }
- }
- const actionCartAdd = (good, count = 1) => ({ type: 'CART_ADD', count: count, good: good });
- const actionCartSub = (good, count = 1) => ({ type: 'CART_SUB', count, good }); //Уменьшение количества товара. Должен уменьшать количество товара в state, или удалять его если количество будет 0 или отрицательным
- const actionCartDel = (good) => ({ type: 'CART_DEL', good }); //Удаление товара. Должен удалять ключ из state
- const actionCartSet = (good, count = 1) => ({ type: 'CART_SET', count, good }); //Задание количества товара. В отличие от добавления и уменьшения, не учитывает того количества, которое уже было в корзине, а тупо назначает количество поверху (или создает новый ключ, если в корзине товара не было). Если count 0 или отрицательное число - удаляем ключ из корзины;
- const actionCartClear = () => ({ type: 'CART_CLEAR' }); //Очистка корзины. state должен стать пустым объектом {}
- }
- /////////////////////////////////////////////////////////////
- function getGql(url) {
- return function gql(query, vars = undefined) {
- let fetchSettings =
- {
- method: "POST",
- headers:
- {
- "Content-Type": "application/json",
- "Accept": "application/json"
- },
- body: JSON.stringify(
- {
- query: query,
- variables: vars
- })
- };
- if (window.localStorage.authToken) {
- fetchSettings.headers["Authorization"] = `Bearer ${window.localStorage.authToken}`;
- }
- //return fetch(url, fetchSettings).then(res => res.json());
- return fetch(url, fetchSettings)
- .then(res => {
- if (!res.ok) {
- throw Error(res.statusText);
- }
- return res.json().data[0];
- });
- }
- }
- function localStoredReducer(originalReducer, localStorageKey) {
- let firstRun = true;
- function wrapper(state, action) {
- if (firstRun) {
- firstRun = false;
- try {
- return JSON.parse(localStorage[localStorageKey]);
- }
- catch { }
- }
- let res = originalReducer(state, action);
- localStorage[localStorageKey] = JSON.stringify(res);
- return res;
- }
- return wrapper
- }
- {
- /*const store = createStore(localStoredReducer(cartReducer, 'cart'))
-
- store.subscribe(() => console.log(store.getState())) //
-
- store.dispatch(actionCartAdd({ _id: 'пиво', price: 50 }))
- store.dispatch(actionCartAdd({ _id: 'чипсы', price: 75 })) */
- }
- </script>
- </body>
- query roots {
- CategoryFind(query: "[{\"parent\": null }]") {
- _id
- name
- }
- }
- query CategoryFindOne($qq: String) {
- CategoryFindOne(query: $qq) {
- _id
- name
- parent {
- _id
- name
- }
- subCategories {
- _id
- name
- }
- goods {
- _id
- name
- price
- description
- images {
- url
- }
- }
- }
- }
- mutation UserRegistration($login: String, $password: String) {
- UserUpsert(user: {login: $login, password: $password}) {
- _id
- createdAt
- }
- }
- query Login($login: String, $password: String) {
- login(login: $login, password: $password)
- }
- mutation OrderCreate($order: OrderInput) {
- OrderUpsert(order: $order) {
- _id
- orderGoods {
- _id
- price
- count
- total
- good {
- name
- }
- }
- }
- }
- query OrderFind{
- OrderFind(query:"[{}]") {
- _id
- total
- orderGoods {
- _id
- price
- count
- total
- good {
- name
- }
- }
- }
- }
- ///
- {
- "q": "[{\"_id\": \"62c94b10b74e1f5f2ec1a0dd\"}]",
- "qq": "[{\"_id\": \"6262ca7dbf8b206433f5b3d1\"}]",
- "login": "Berg",
- "password": "123456789",
- "order": {"orderGoods":[{"good": {"_id": "62d30938b74e1f5f2ec1a124" },"count": 2}, {"good": {"_id":
- "62d3099ab74e1f5f2ec1a125" },"count": 2}]}
- }
|