getGQL.html 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <header>
  2. </header>
  3. <body>
  4. <script>
  5. {
  6. function cartReducer(state = {}, action) { // диспетчер обработки
  7. switch (action.type) {
  8. case 'CART_ADD':
  9. if (action.count >= 0) {
  10. let newState = { ...state };
  11. let { count } = state[action.good._id] ?? { count: 0 };
  12. newState[action.good._id] = { count: action.count + count, good: { ...action.good } }
  13. return newState;
  14. }
  15. case 'CART_SUB':
  16. if (action.count >= 0) {
  17. let newState = { ...state };
  18. let { count } = state[action.good._id] ?? { count: 0 };
  19. if (count >= action.count) {
  20. newState[action.good._id] = { count: action.count - count, good: { ...action.good } }
  21. return newState;
  22. }
  23. }
  24. break;
  25. case 'CART_DEL':
  26. {
  27. let newState = { ...state };
  28. delete newState[action.good._id];
  29. return newState;
  30. }
  31. case 'CART_SET':
  32. {
  33. let newState = { ...state };
  34. newState[action.good._id] = { count: action.count, good: { ...action.good } };
  35. return newState;
  36. }
  37. case 'CART_CLEAR':
  38. return {};
  39. }
  40. return state;
  41. }
  42. function createStore(reducer) {
  43. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  44. let cbs = [] //массив подписчиков
  45. const getState = () => state //функция, возвращающая переменную из замыкания
  46. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  47. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  48. function dispatch(action) {
  49. if (typeof action === 'function') { //если action - не объект, а функция
  50. return action(dispatch, getState) //запускаем эту функцию и даем ей dispatch и getState для работы
  51. }
  52. const newState = reducer(state, action) //пробуем запустить редьюсер
  53. if (newState !== state) { //проверяем, смог ли редьюсер обработать action
  54. state = newState //если смог, то обновляем state
  55. for (let cb of cbs) cb() //и запускаем подписчиков
  56. }
  57. }
  58. return {
  59. getState, //добавление функции getState в результирующий объект
  60. dispatch,
  61. subscribe //добавление subscribe в объект
  62. }
  63. }
  64. const actionCartAdd = (good, count = 1) => ({ type: 'CART_ADD', count: count, good: good });
  65. const actionCartSub = (good, count = 1) => ({ type: 'CART_SUB', count, good }); //Уменьшение количества товара. Должен уменьшать количество товара в state, или удалять его если количество будет 0 или отрицательным
  66. const actionCartDel = (good) => ({ type: 'CART_DEL', good }); //Удаление товара. Должен удалять ключ из state
  67. const actionCartSet = (good, count = 1) => ({ type: 'CART_SET', count, good }); //Задание количества товара. В отличие от добавления и уменьшения, не учитывает того количества, которое уже было в корзине, а тупо назначает количество поверху (или создает новый ключ, если в корзине товара не было). Если count 0 или отрицательное число - удаляем ключ из корзины;
  68. const actionCartClear = () => ({ type: 'CART_CLEAR' }); //Очистка корзины. state должен стать пустым объектом {}
  69. }
  70. /////////////////////////////////////////////////////////////
  71. function getGql(url) {
  72. return function gql(query, vars = undefined) {
  73. let fetchSettings =
  74. {
  75. method: "POST",
  76. headers:
  77. {
  78. "Content-Type": "application/json",
  79. "Accept": "application/json"
  80. },
  81. body: JSON.stringify(
  82. {
  83. query: query,
  84. variables: vars
  85. })
  86. };
  87. if (window.localStorage.authToken) {
  88. fetchSettings.headers["Authorization"] = `Bearer ${window.localStorage.authToken}`;
  89. }
  90. //return fetch(url, fetchSettings).then(res => res.json());
  91. return fetch(url, fetchSettings)
  92. .then(res => {
  93. if (!res.ok) {
  94. throw Error(res.statusText);
  95. }
  96. return res.json().data[0];
  97. });
  98. }
  99. }
  100. function localStoredReducer(originalReducer, localStorageKey) {
  101. let firstRun = true;
  102. function wrapper(state, action) {
  103. if (firstRun) {
  104. firstRun = false;
  105. try {
  106. return JSON.parse(localStorage[localStorageKey]);
  107. }
  108. catch { }
  109. }
  110. let res = originalReducer(state, action);
  111. localStorage[localStorageKey] = JSON.stringify(res);
  112. return res;
  113. }
  114. return wrapper
  115. }
  116. {
  117. /*const store = createStore(localStoredReducer(cartReducer, 'cart'))
  118. store.subscribe(() => console.log(store.getState())) //
  119. store.dispatch(actionCartAdd({ _id: 'пиво', price: 50 }))
  120. store.dispatch(actionCartAdd({ _id: 'чипсы', price: 75 })) */
  121. }
  122. </script>
  123. </body>
  124. query roots {
  125. CategoryFind(query: "[{\"parent\": null }]") {
  126. _id
  127. name
  128. }
  129. }
  130. query CategoryFindOne($qq: String) {
  131. CategoryFindOne(query: $qq) {
  132. _id
  133. name
  134. parent {
  135. _id
  136. name
  137. }
  138. subCategories {
  139. _id
  140. name
  141. }
  142. goods {
  143. _id
  144. name
  145. price
  146. description
  147. images {
  148. url
  149. }
  150. }
  151. }
  152. }
  153. mutation UserRegistration($login: String, $password: String) {
  154. UserUpsert(user: {login: $login, password: $password}) {
  155. _id
  156. createdAt
  157. }
  158. }
  159. query Login($login: String, $password: String) {
  160. login(login: $login, password: $password)
  161. }
  162. mutation OrderCreate($order: OrderInput) {
  163. OrderUpsert(order: $order) {
  164. _id
  165. orderGoods {
  166. _id
  167. price
  168. count
  169. total
  170. good {
  171. name
  172. }
  173. }
  174. }
  175. }
  176. query OrderFind{
  177. OrderFind(query:"[{}]") {
  178. _id
  179. total
  180. orderGoods {
  181. _id
  182. price
  183. count
  184. total
  185. good {
  186. name
  187. }
  188. }
  189. }
  190. }
  191. ///
  192. {
  193. "q": "[{\"_id\": \"62c94b10b74e1f5f2ec1a0dd\"}]",
  194. "qq": "[{\"_id\": \"6262ca7dbf8b206433f5b3d1\"}]",
  195. "login": "Berg",
  196. "password": "123456789",
  197. "order": {"orderGoods":[{"good": {"_id": "62d30938b74e1f5f2ec1a124" },"count": 2}, {"good": {"_id":
  198. "62d3099ab74e1f5f2ec1a125" },"count": 2}]}
  199. }