main.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. /* const getGQL = url => (query,variables={}) =>
  2. fetch(url,{
  3. method:"POST",
  4. headers: {
  5. 'Accept': 'application/json',
  6. 'Content-Type': 'application/json',
  7. },
  8. body:JSON.stringify({query,variables})
  9. }).then((res) => res.json())
  10. .then((data) => {
  11. if(data.errors && !data.data){
  12. throw new Error(JSON.stringify(data.errors))
  13. } else{
  14. let value = Object.values(data.data);
  15. return value[0];
  16. }
  17. }) */
  18. //headers:{...{localStorage.authToken & {Autorization: `Bearer ${LocalStorage.authToken} : {}`}}}
  19. /* const getGQL = url =>{
  20. return async (query,variables={}) =>{
  21. let parametrs = {headers: {
  22. 'Accept': 'application/json',
  23. 'Content-Type': 'application/json',
  24. }}
  25. let authToken = localStorage.getItem("authToken")
  26. if(authToken){
  27. parametrs.headers.Authorization = "Bearer" + authToken
  28. }
  29. parametrs.body = JSON.stringify({query,variables})
  30. parametrs.method = "POST"
  31. let result = await fetch(url,parametrs)
  32. .then((res) => res.json())
  33. if("data" in result) {
  34. return result.data[Object.keys(result.data)[0]]
  35. } else if("errors" in result){
  36. throw new Error(JSON.stringify(result.errors))
  37. }
  38. }
  39. }
  40. const backendURL = 'http://shop-roles.asmer.fs.a-level.com.ua'
  41. const gql = getGQL('http://shop-roles.asmer.fs.a-level.com.ua/graphql'); */
  42. const getGQL = url =>
  43. (query, variables) => fetch(url, {
  44. method: 'POST',
  45. headers: {
  46. "Content-Type": "application/json",
  47. ...(localStorage.authToken ? {"Authorization": "Bearer " + localStorage.authToken} : {})
  48. },
  49. body: JSON.stringify({query, variables})
  50. }).then(res => res.json())
  51. .then(data => {
  52. if (data.data){
  53. return Object.values(data.data)[0]
  54. }
  55. else throw new Error(JSON.stringify(data.errors))
  56. })
  57. const backendURL = 'http://shop-roles.asmer.fs.a-level.com.ua'
  58. const gql = getGQL(backendURL + '/graphql')
  59. /* (async()=>{
  60. let data = await gql(`query login($login:String, $password:String){
  61. login(login:$login, password:$password)
  62. }`, {login:'Anon', password:'Anon'});
  63. localStorage.authToken = data;
  64. })(); */
  65. /*
  66. gql(`query login($login:String, $password:String){
  67. login(login:$login, password:$password)
  68. }`, {login:'Anon', password:'Anon'}) //login with gql function
  69. .then((data) => console.log(data)); */
  70. /// some queries but works not good
  71. /* query CoutCat{
  72. CategoryCount(query:"[{}]")
  73. }
  74. query findCategory {
  75. CategoryFind(query:"[{}]"){
  76. name
  77. goods{name,categories{name}}
  78. parent{parent{name}}
  79. }
  80. }
  81. mutation newGood($newGood:GoodInput){
  82. GoodUpsert(good:$newGood){
  83. name
  84. price
  85. description
  86. categories{name}
  87. }
  88. } */
  89. function promiseReducer(state={}, {type,name,status,payload,error}){
  90. /* delay1000:{status, payload,error}
  91. delay2000: {status, payload,error}*/
  92. if(!state){
  93. delay1000:{status,payload,error}
  94. delay2000:{status,payload,error}
  95. }
  96. if(type === 'PROMISE'){
  97. return{
  98. ...state,
  99. [name]:{status,payload,error}
  100. }
  101. }
  102. return state
  103. }
  104. function createStore(promiseReducer){
  105. let state = promiseReducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  106. let cbs = [] //массив подписчиков
  107. const getState = () => state //функция, возвращающая переменную из замыкания
  108. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  109. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  110. const dispatch = action => {
  111. if (typeof action === 'function'){ //если action - не объект, а функция
  112. return action(dispatch, getState) //запускаем эту функцию и даем ей dispatch и getState для работы
  113. }
  114. const newState = promiseReducer(state, action) //пробуем запустить редьюсер
  115. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  116. state = newState //если смог, то обновляем state
  117. for (let cb of cbs) cb() //и запускаем подписчиков
  118. }
  119. }
  120. return {
  121. getState, //добавление функции getState в результирующий объект
  122. dispatch,
  123. subscribe //добавление subscribe в объект
  124. }
  125. }
  126. const combineReducers = (reducers) =>
  127. (state={},action) => {
  128. const newState = {}
  129. for(const [reduceName, reducer] of Object.entries(reducers)){
  130. let newSubState = reducer(state[reduceName],action);
  131. if(state[reduceName] !== newSubState){
  132. newState[reduceName] = newSubState
  133. }
  134. }
  135. if(Object.keys(newState).length){
  136. state = {...state, ...newState}
  137. }
  138. return state;
  139. }
  140. /* let store = createStore(promiseReducer);
  141. store.subscribe(()=>console.log(store.getState())); */
  142. const actionPending = name => ({name,type:"PROMISE",status:'PENDING'})
  143. const actionFulfiled = (name,payload) =>({name,type:"PROMISE",status:'FULFILLED',payload})
  144. const actionrRejected = (name,error) => ({name,type:"PROMISE",status:'REJECTED',error})
  145. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  146. /* store.subscribe(() => console.log(store.getState())); */
  147. /* store.dispatch(actionPending('delay1000'))
  148. //{ 1
  149. // delay1000: {status: 'PENDING'}
  150. //}
  151. delay(1000).then(result => store.dispatch(actionFulfiled('delay1000', result)))
  152. /* console.log(store.getState()); */
  153. //{ 3
  154. // delay1000: {status: 'FULFILLED', payload: 1000},
  155. // delay2000: {status: 'PENDING'}
  156. //}
  157. /* store.dispatch(actionPending('delay2000'))
  158. //{ 2
  159. // delay1000: {status: 'FULFILLED', payload: 1000},
  160. // delay2000: {status: 'PENDING'}
  161. //}
  162. delay(2000).then(result => store.dispatch(actionFulfiled('delay2000', result))) */
  163. //{ 4
  164. // delay1000: {status: 'FULFILLED', payload: 1000},
  165. // delay2000: {status: 'FULFILLED', payload: 2000}
  166. //} */
  167. const jwtDecode = token =>{
  168. try{
  169. let payload = JSON.parse(atob(token.split('.')[1]));
  170. return payload;
  171. } catch(e){
  172. }
  173. }
  174. console.log(jwtDecode(localStorage.getItem('authToken')));
  175. function authReducer(state,{type, token}){
  176. if(state === undefined){
  177. if(localStorage.authToken){
  178. type = 'AUTH_LOGIN';
  179. token = localStorage.authToken
  180. }
  181. }
  182. if(type === 'AUTH_LOGIN'){
  183. let payload = jwtDecode(token);
  184. if(payload){
  185. localStorage.authToken = token;
  186. return {token,payload}
  187. }
  188. }
  189. if(type === 'AUTH_LOGOUT'){
  190. localStorage.authToken = '';
  191. return {};
  192. }
  193. return state || {};
  194. }
  195. function cartReducer(state={},{type, good, count=1}){
  196. /* _id1: {count:1, good: {_id1,name,price,images}}
  197. _id2: {count:1, good: {_id2,name,price,images}}
  198. */
  199. if (type === 'CART_ADD'){
  200. /* if(good._id in state){
  201. return{
  202. ...state,
  203. [good._id]: {count:state[good._id].count+count,good}
  204. }
  205. }else{ */
  206. return{
  207. ...state,
  208. [good._id] : {count: count + (good._id in state ? state[good._id].count : 0),good}
  209. }
  210. }
  211. if (type === 'CART_CHANGE'){
  212. /* let _id1 = good._id;
  213. console.log(_id1); */
  214. return{
  215. ...state,
  216. [good._id]: {count:count,good:good}
  217. }
  218. }
  219. if (type === 'CART_DELETE'){
  220. /* const clone = {...state}
  221. delete clone[good._id]
  222. state = {...clone} */
  223. let {[good._id]: remove, ...newState} = state;
  224. return newState;
  225. }
  226. if (type === 'CART_CLEAN'){
  227. return {}
  228. }
  229. return state
  230. }
  231. const actionCartAdd = (good, count=1) => ({type:'CART_ADD', good, count})
  232. const actionCartChange = (good, count=1) => ({type:'CART_CHANGE',good,count})
  233. const actionCartDelete = (good) => ({type: 'CART_DELETE',good})
  234. const actionCartClean = () => ({type:'CART_CLEAN'})
  235. /* let store = createStore(authReducer); */
  236. /* const store = createStore(promiseReducer); */
  237. const store = createStore(combineReducers({promise: promiseReducer, auth: authReducer,cart: cartReducer}))
  238. /* store.subscribe(() => console.log(store.getState()));
  239. store.dispatch(actionCartAdd({_id:'pivas',name:'cherniga',price:50}));
  240. store.dispatch(actionCartAdd({_id: 'пиво', name: 'одеколонь', price: 30}))
  241. store.dispatch(actionCartAdd({_id: 'пиво', name: 'одеколонь', price: 30},5))
  242. store.dispatch(actionCartChange({_id: 'чипсы', name: 'одеколонь', price: 30}, 2))
  243. store.dispatch(actionCartAdd({_id:'чипсы', name: 'одеколонь', price: 30}))
  244. store.dispatch(actionCartChange({_id: 'pivas', name: 'cherniga', price: 50}, 1))
  245. store.dispatch(actionCartDelete({_id:'pivas',name:'cherniga'})); */
  246. const actionPromise = (name,promise) =>
  247. async dispatch => {
  248. dispatch(actionPending(name))
  249. try{
  250. let payload = await promise
  251. dispatch(actionFulfiled(name,payload))
  252. return payload
  253. }
  254. catch(e){
  255. dispatch(actionrRejected(name,e))
  256. }
  257. }
  258. const actionAuthLogin = (tokennn) => ({type:'AUTH_LOGIN',token:tokennn})
  259. const actionRootCats = () =>
  260. actionPromise('rootCats', gql(`query {
  261. CategoryFind(query: "[{\\"parent\\":null}]"){
  262. _id name
  263. }
  264. }`))
  265. const actionCatById = (_id) => //добавить подкатегории
  266. actionPromise('catById', gql(`query catById($q: String){
  267. CategoryFindOne(query: $q){
  268. _id name goods {
  269. _id name price images {
  270. url
  271. }
  272. }
  273. }
  274. }`, {q: JSON.stringify([{_id}])}))
  275. const actionGoodById = (_id) =>
  276. actionPromise('goodById', gql(`query goodById ($goodId: String){
  277. GoodFindOne(query:$goodId){
  278. _id name price images{
  279. url
  280. }
  281. description
  282. }
  283. }`,{goodId: JSON.stringify([{_id}])}))
  284. const actionFullRegister = (Login,password) =>
  285. actionPromise('fullRegister', gql(`mutation register($Login:String,$password:String){
  286. UserUpsert(user:{login:$Login,password:$password}){
  287. _id login
  288. }
  289. }`,{Login: Login, password: password}))
  290. const actionFullLogin = (Login,password) => async (dispatch) => {
  291. const tokennn = await dispatch(
  292. actionPromise('fullLogin', gql(`query login($Login:String,$password:String){
  293. login(login:$Login,password:$password)
  294. }`,{Login:Login,password:password}))
  295. );
  296. await dispatch(actionAuthLogin(tokennn));
  297. }
  298. const actionAllOrders = () =>
  299. actionPromise('allOrders',gql(`query orders{
  300. OrderFind(query:"[{}]"){
  301. _id total
  302. orderGoods{
  303. count total good{name,price,
  304. images{
  305. url
  306. }}
  307. }
  308. }
  309. }`))
  310. const actionCreateOrder = () => async (dispatch) =>{
  311. let orderGoods = [];
  312. Object.entries(store.getState().cart).map(([_id,{count}])=>orderGoods.push({"count":count,"good":{_id:_id}}))
  313. actionPromise('createOrder',gql(`mutation newOrder($order:OrderInput){
  314. OrderUpsert(order:$order){
  315. _id total
  316. }
  317. }`,{order:{orderGoods}}));
  318. await store.dispatch(actionCartClean());
  319. }
  320. const actionSearchGood = (good) =>
  321. actionPromise('searchGood', gql(`query gf($query: String){
  322. GoodFind(query: $query){
  323. _id, name, description, price, images{
  324. _id, url
  325. }
  326. }
  327. }`, {query: JSON.stringify([
  328. {
  329. $or: [{name: `/${good}/`}, {description: `/${good}/`}] //регулярки пишутся в строках
  330. },
  331. {
  332. sort: [{name: 1}]} //сортируем по title алфавитно
  333. ])
  334. }))
  335. store.dispatch(actionRootCats())
  336. store.subscribe(() => {
  337. const {promise:{rootCats}} = store.getState()
  338. if (rootCats?.payload){
  339. aside.innerHTML = ''
  340. for (const {_id, name} of rootCats?.payload){
  341. const link = document.createElement('a')
  342. link.href = `#/category/${_id}`
  343. link.innerText = name
  344. aside.append(link)
  345. }
  346. }
  347. })
  348. window.onhashchange = () => {
  349. const [, route, _id] = location.hash.split('/')
  350. const routes = {
  351. category(){
  352. store.dispatch(actionCatById(_id))
  353. },
  354. good(){ //задиспатчить actionGoodById
  355. store.dispatch(actionGoodById(_id));
  356. },
  357. login(){
  358. //отрисовка тут
  359. /* store.subscribe(() => { */
  360. const [,route,id] = location.hash.split('/')
  361. if(route === 'login'){
  362. main.innerHTML = `<h1>Login</h1>`
  363. let loginForm = document.createElement('div');
  364. loginForm.innerHTML = `<label>login <input id="login"></label>
  365. <label>password <input id="password"></label>
  366. <button id="logButton">Login</button>`
  367. main.append(loginForm);
  368. logButton.addEventListener('click', function Login(){
  369. console.log(login.value, password.value);
  370. store.dispatch(actionFullLogin(login.value, password.value))
  371. store.getState();
  372. /* store.dispatch(actionAuthLogin(store.getState().promise.fullLogin.payload))
  373. store.getState(); */
  374. })
  375. }
  376. /* }) */
  377. //по кнопке - store.dispatch(actionFullLogin(login, password))
  378. },
  379. register(){
  380. const [,route,id] = location.hash.split('/');
  381. if(route === 'register'){
  382. main.innerHTML = `<h1>Register</h1>`
  383. let registerForm = document.createElement('div');
  384. /* registerForm.innerHTML = `<label>login <input id="login"></label>
  385. <label>password <input id="password" type="paasword"></label>
  386. <button id="registerButton">Register</button>` */
  387. let labelLog = document.createElement('label');
  388. labelLog.innerText = 'login';
  389. let login = document.createElement('input');
  390. labelLog.append(login);
  391. let labelPswd = document.createElement('label');
  392. labelPswd.innerText = 'Password';
  393. let password = document.createElement('input');
  394. password.type = 'password';
  395. labelPswd.append(password);
  396. let registerButton = document.createElement('button');
  397. registerButton.innerText = 'Register';
  398. registerForm.append(labelLog);
  399. registerForm.append(labelPswd);
  400. registerForm.append(registerButton);
  401. main.append(registerForm);
  402. registerButton.addEventListener('click', function register(){
  403. console.log(login.value, password.value);
  404. store.dispatch(actionFullRegister(login.value, password.value))
  405. })
  406. }
  407. //отрисовка тут
  408. //по кнопке - store.dispatch(actionFullRegister(login, password))
  409. },
  410. dashboard(){
  411. store.dispatch(actionAllOrders());
  412. },
  413. cart(){
  414. const[,route,id] = location.hash.split('/')
  415. const cart = store.getState().cart;
  416. if(route === 'cart'){
  417. main.innerHTML = `<h1>Cart</h1>`
  418. for(let good in cart){
  419. /* goods.innerHTML = `<img src="${backendURL}/${cart[good].good.images[0].url}">
  420. <p>${cart[good].good.name}</p>
  421. <input type="number" value=${cart[good].count} min="0" id="count">
  422. <button id="plusCount">+</button> <button id="minusCount">-</button>
  423. ` */
  424. let goods = document.createElement('div');
  425. let img = document.createElement('img');
  426. img.src = `${backendURL}/${cart[good].good.images[0].url}`;
  427. let name = document.createElement('p');
  428. name.innerText = `${cart[good].good.name}`
  429. let count = document.createElement('input');
  430. count.type = 'number';
  431. count.min = 1;
  432. count.value = cart[good].count;
  433. let countPlus = document.createElement('button');
  434. countPlus.innerText = '+'
  435. let countMinus = document.createElement('button');
  436. countMinus.innerText = '-';
  437. countPlus.onclick = () => {
  438. cart[good].count++;
  439. count.value = cart[good].count;
  440. store.dispatch(actionCartChange(cart[good].good, +count.value))
  441. }
  442. countMinus.onclick = () =>{
  443. cart[good].count--;
  444. count.value = cart[good].count;
  445. if(cart[good].count < 1){
  446. count.value = 1;
  447. cart[good].count = 1;
  448. store.dispatch(actionCartChange(cart[good].good, +count.value))
  449. }
  450. store.dispatch(actionCartChange(cart[good].good, +count.value))
  451. }
  452. count.oninput = () => {
  453. store.dispatch(actionCartChange(cart[good].good, +count.value))
  454. }
  455. let removeBtn = document.createElement('button');
  456. removeBtn.innerText = 'Remove';
  457. removeBtn.onclick = () => {
  458. store.dispatch(actionCartDelete(cart[good].good))
  459. window.onhashchange()
  460. cartIcon.innerHTML = `Cart ${cart[good].count}`
  461. }
  462. goods.append(img);
  463. goods.append(name);
  464. goods.append(count);
  465. goods.append(countPlus);
  466. goods.append(countMinus);
  467. goods.append(removeBtn);
  468. main.append(goods);
  469. }
  470. let orderButton = document.createElement('button');
  471. orderButton.innerText = 'Order';
  472. orderButton.onclick = () => {
  473. store.dispatch(actionCreateOrder());
  474. window.onhashchange()
  475. cartIcon.innerHTML = `Cart`
  476. }
  477. if(localStorage.authToken && Object.keys(cart).length !== 0){
  478. orderButton.disabled = ""
  479. } else {
  480. orderButton.disabled = "true"
  481. }
  482. main.append(orderButton);
  483. }
  484. }
  485. }
  486. if (route in routes)
  487. routes[route]()
  488. }
  489. window.onhashchange()
  490. store.subscribe(() => {
  491. const {promise: {catById}} = store.getState();
  492. const [,route,_id] = location.hash.split('/');
  493. if(catById?.payload && route === 'category'){
  494. const {name} = catById.payload;
  495. main.innerHTML = `<h1>${name}</h1> TYT PODCATEGORII`;
  496. for(const {_id,name,price,images} of catById.payload.goods){
  497. const card = document.createElement('div')
  498. /* card.innerHTML = `<h2>${name}</h2>
  499. <img src="${backendURL}/${images[0].url}">
  500. <strong>${price}UAH</strong>
  501. <a href="#/good/${_id}">ссылка на товарчик</a>
  502. <button id="buyGood">Купить</button>
  503. ` */
  504. let named = document.createElement('h2');
  505. named.innerText = `${name}`;
  506. let imaged = document.createElement('img');
  507. imaged.src = `${backendURL}/${images[0].url}`;
  508. let priced = document.createElement('strong');
  509. priced.innerText = `${price}`;
  510. let link = document.createElement('a');
  511. link.href = `#/good/${_id}`;
  512. link.innerText = 'ссылка на товарчик';
  513. let buttonBuy = document.createElement('button');
  514. buttonBuy.innerText = 'Купить';
  515. buttonBuy.onclick = () => {
  516. store.dispatch(actionGoodById(_id));
  517. store.dispatch(actionCartAdd({_id,name,price,images}));
  518. }
  519. card.append(named);
  520. card.append(imaged);
  521. card.append(priced);
  522. card.append(link);
  523. card.append(buttonBuy);
  524. main.append(card);
  525. }
  526. }
  527. })
  528. store.subscribe(() => {
  529. const {promise: {goodById}} = store.getState();
  530. const [,route,id] = location.hash.split('/')
  531. if(goodById?.payload && route === 'good'){
  532. const {name,price,description,images} = goodById.payload;
  533. main.innerHTML = `<h1>${name}</h1>`
  534. const card = document.createElement('div');
  535. card.innerHTML = `<h2>${name}</h2>
  536. <img src="${backendURL}/${images[0].url}">
  537. <p>${description}</p>
  538. <strong>${price}UAH</strong>
  539. <button id="buyGood">Купить</button>
  540. `
  541. main.append(card);
  542. let buyGood = document.getElementById('buyGood');
  543. buyGood.addEventListener('click', function addToCart(){
  544. console.log(id);
  545. store.dispatch(actionCartAdd(store.getState().promise.goodById.payload));
  546. })
  547. }
  548. })
  549. store.subscribe(() => {
  550. let counts = 0;
  551. const cartIcon = document.getElementById('cartIcon');
  552. const orders = store.getState().cart;
  553. for (let order in orders){
  554. counts += orders[order].count
  555. cartIcon.innerHTML = `<a href="#/cart">Cart ${counts}</a>`
  556. /* if(!orders[order].count){
  557. cartIcon.innerHTML = `Cart ${counts}`
  558. } */
  559. }
  560. })
  561. store.subscribe(async() => {
  562. const[,route,id] = location.hash.split('/')
  563. const {promise: {allOrders}} = await store.getState();
  564. if(route === 'dashboard' && allOrders.payload){
  565. main.innerHTML = `<h1>Dashboard</h1>`
  566. for(const{_id,total,orderGoods} of allOrders.payload){
  567. let order = document.createElement('div');
  568. let idOfOrder = document.createElement('h2');
  569. idOfOrder.innerText = `${_id}`;
  570. let totalCost = document.createElement('label');
  571. totalCost.innerText = `${total}`
  572. order.append(idOfOrder);
  573. order.append(totalCost);
  574. for(const{count,total,good} of orderGoods){
  575. let card = document.createElement('div');
  576. card.innerHTML = `<h2 id="name">${good.name}</h2>
  577. <p id="counted">${count}</p>
  578. <p id="totaled">${total}</p>
  579. <img src="${backendURL}/${good.images[0].url}">
  580. `
  581. order.append(card);
  582. }
  583. main.append(order);
  584. }
  585. }
  586. })
  587. let inputSearch = document.createElement('input');
  588. inputSearch.type = "text";
  589. let header = document.getElementById('header');
  590. header.append(inputSearch);
  591. let divWithGood = document.createElement('div');
  592. divWithGood.style.display = 'none';
  593. header.append(divWithGood);
  594. function render(parent,data){
  595. console.log(data);
  596. }
  597. store.subscribe(() => {
  598. let re = /\s* \s*/;
  599. inputSearch.oninput = () => {
  600. let newStr = inputSearch.value.trim().split(re).join("|");
  601. store.dispatch(actionSearchGood(newStr));
  602. }
  603. inputSearch.onfocus = () => {
  604. divWithGood.style.display = 'block';
  605. const searchGood = store.getState().promise.searchGood;
  606. render(divWithGood,searchGood);
  607. }
  608. inputSearch.blur = () => {
  609. divWithGood.style.display = 'none';
  610. render(divWithGood,searchGood);
  611. }
  612. })
  613. let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOiI2MWJiNjNjOWM3NTBjMTJiYTZiYTRiMzgiLCJsb2dpbiI6IkFub24iLCJhY2wiOlsiNjFiYjYzYzljNzUwYzEyYmE2YmE0YjM4IiwidXNlciJdfSwiaWF0IjoxNjQwMjAwNTU2fQ.P_JXFko7OFObxVn8uB6TR3R1V9aB1MMQrgX58MpEq5E';
  614. /* store.dispatch(actionPromise('delay1000', delay(1000)))
  615. store.dispatch(actionPromise('delay2000', delay(2000))) */
  616. // store.dispatch(actionAuthLogin(token))
  617. const actionAuthLogout= () => ({type: 'AUTH_LOGOUT'})
  618. // store.dispatch(actionAuthLogout());
  619. /* console.log(store.getState()); */
  620. /* const actionRegister = (login,password) =>
  621. actionPromise('register', gql(`mutation register($Login:String,$password:String){
  622. UserUpsert(user:{login:$Login,password:$password}){
  623. _id login
  624. }
  625. }`,{login:login,password:password}));
  626. store.dispatch(actionRegister('aufff', '123456')); */
  627. /* const combinedStore = createStore(combineReducers({promise: promiseReducer, auth: authReducer})) */
  628. //search
  629. // let re = /\s* \s*/;
  630. // let input = document.createElement('input');
  631. // input.type = 'text';
  632. // document.body.append(input);
  633. // input.oninput = () => {
  634. // let newStr = input.value.trim().split(re).join("|");
  635. // console.log(`/${newStr}/`);
  636. // }