script.js 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. function createStore(reducer){
  2. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  3. let cbs = [] //массив подписчиков
  4. const getState = () => state //функция, возвращающая переменную из замыкания
  5. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  6. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  7. const dispatch = action => {
  8. const newState = reducer(state, action) //пробуем запустить редьюсер
  9. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  10. state = newState //если смог, то обновляем state
  11. for (let cb of cbs) cb() //и запускаем подписчиков
  12. }
  13. }
  14. return {
  15. getState, //добавление функции getState в результирующий объект
  16. dispatch,
  17. subscribe //добавление subscribe в объект
  18. }
  19. }
  20. function reducer(state, {type, ШО, СКОКА, БАБЛО}){ //объект action деструктуризируется на три переменных
  21. if (!state){ //начальная уборка в ларьке:
  22. return {
  23. пиво: {count : 100, price: 25},
  24. чипсы: {count : 100, price: 20},
  25. сиги: {count: 100, price: 10},
  26. касса: 0
  27. }
  28. }
  29. if (type === 'КУПИТЬ'){ //если тип action - КУПИТЬ, то:
  30. if(СКОКА <= state[ШО].count && БАБЛО >= state[ШО].price * СКОКА){
  31. return {
  32. ...state, //берем все что было из ассортимента
  33. [ШО]: {...state[ШО], count: state[ШО].count - СКОКА}, //и уменьшаем то, что покупается на количество
  34. касса: state.касса + state[ШО].price * СКОКА
  35. }
  36. }
  37. }
  38. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  39. }
  40. function createTable (obj){
  41. table.innerText = ''
  42. for(let [key, value] of Object.entries(obj)){
  43. let tr = document.createElement('tr');
  44. let td = document.createElement('td');
  45. td.innerText = key
  46. tr.append(td);
  47. table.append(tr);
  48. if(typeof value === 'object'){
  49. for(let [key1,value1] of Object.entries(value)){
  50. let td = document.createElement('td');
  51. td.innerText = key1 + ' : ' + value1;
  52. tr.append(td);
  53. }
  54. } else {
  55. let td = document.createElement('td');
  56. td.innerText = value;
  57. tr.append(td);
  58. }
  59. }
  60. }
  61. const store = createStore(reducer);
  62. createTable(store.getState())
  63. for(let [key] of Object.entries(store.getState())){
  64. if (key !== 'касса'){
  65. let option = document.createElement('option');
  66. option.innerText = key
  67. shop.append(option)
  68. }
  69. }
  70. store.subscribe(()=>createTable(store.getState()));
  71. store.subscribe(() => console.log(store.getState()));
  72. btnBuy.onclick = (() => store.dispatch({type: 'КУПИТЬ', ШО : shop.value, СКОКА: inputValue.value, БАБЛО: inputMoney.value }))