main.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. const КУПИТЬ = 'КУПИТЬ'
  2. function reducer(state, { type, ШО, СКОКА, БАБЛО }) { //объект action деструктуризируется на три переменных
  3. if (!state) { //начальная уборка в ларьке:
  4. return {
  5. пиво: {
  6. quantity: 100,
  7. price: 20
  8. },
  9. чипсы: {
  10. quantity: 100,
  11. price: 25
  12. },
  13. сиги: {
  14. quantity: 100,
  15. price: 60
  16. },
  17. сникерс: {
  18. quantity: 100,
  19. price: 15
  20. },
  21. вода: {
  22. quantity: 100,
  23. price: 10
  24. },
  25. касса: 0,
  26. }
  27. }
  28. if (type === КУПИТЬ) { //если тип action - КУПИТЬ, то:
  29. if ((state[ШО].quantity - СКОКА) < 0) {
  30. alert('упс, вы ушли в минус, введите корректное количество')
  31. return {
  32. ...state, //берем все что было из ассортимента
  33. }
  34. }
  35. if (БАБЛО < state[ШО].price * СКОКА) {
  36. alert('упс, НЕ ХВАТАЕТ БАБЛА')
  37. return {
  38. ...state, //берем все что было из ассортимента
  39. }
  40. } else if ((БАБЛО > 0) && (СКОКА > 0)) {
  41. {
  42. return {
  43. ...state, //берем все что было из ассортимента
  44. [ШО]: {
  45. ...state[ШО],
  46. quantity: state[ШО].quantity - СКОКА
  47. },
  48. касса: state.касса + state[ШО].price * СКОКА,
  49. БАБЛО: БАБЛО - state[ШО].price * СКОКА
  50. }
  51. }
  52. } else alert('вы внесли некорректные данные... попробуйте еще раз ...')
  53. }
  54. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  55. }
  56. function createStore(reducer) {
  57. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  58. let cbs = [] //массив подписчиков
  59. const getState = () => state //функция, возвращающая переменную из замыкания
  60. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  61. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  62. const dispatch = action => {
  63. const newState = reducer(state, action) //пробуем запустить редьюсер
  64. if (newState !== state) { //проверяем, смог ли редьюсер обработать action
  65. state = newState //если смог, то обновляем state
  66. for (let cb of cbs) cb() //и запускаем подписчиков
  67. }
  68. }
  69. return {
  70. getState, //добавление функции getState в результирующий объект
  71. dispatch,
  72. subscribe //добавление subscribe в объект
  73. }
  74. }
  75. const store = createStore(reducer)
  76. store.subscribe(() => console.log(store.getState()))
  77. let selectProduct = document.createElement('select')
  78. selectProduct.id = "select"
  79. let input = document.createElement('input')
  80. input.placeholder = "quantity"
  81. input.type = "number"
  82. input.min = 0
  83. document.body.appendChild(input)
  84. let inputMoney = document.createElement('input')
  85. inputMoney.placeholder = "money"
  86. inputMoney.type = "number"
  87. inputMoney.min = 0
  88. document.body.appendChild(inputMoney)
  89. for (let key in (store.getState())) {
  90. let option = document.createElement('option')
  91. option.innerHTML = key
  92. selectProduct.appendChild(option)
  93. }
  94. document.body.appendChild(selectProduct)
  95. let br = document.createElement("br")
  96. let table = document.createElement("table")
  97. document.body.append(table)
  98. function createTable() {
  99. table.innerHTML = ""
  100. for (let [keyName, storeValue] of Object.entries(store.getState())) {
  101. let tr = document.createElement('tr')
  102. if (typeof storeValue === "object") {
  103. let thProduct = document.createElement('th')
  104. thProduct.innerHTML = `${keyName}`
  105. tr.appendChild(thProduct)
  106. for (let [key, value] of Object.entries(storeValue)) {
  107. let thKey = document.createElement('th')
  108. let thValue = document.createElement('td')
  109. thKey.innerHTML = ` ${key}`;
  110. thValue.innerHTML = `${value}`
  111. tr.appendChild(thKey)
  112. tr.appendChild(thValue)
  113. }
  114. } else {
  115. let thKey2 = document.createElement('th')
  116. let thValue2 = document.createElement('td')
  117. thKey2.innerHTML = `${keyName}`;
  118. thValue2.innerHTML = ` ${storeValue}`
  119. tr.appendChild(thKey2)
  120. tr.appendChild(thValue2)
  121. }
  122. table.append(tr)
  123. }
  124. }
  125. createTable()
  126. store.subscribe(() => createTable())
  127. let labelProduct = document.createElement('label')
  128. document.body.appendChild(br)
  129. document.body.appendChild(labelProduct)
  130. let btn = document.getElementById("btn")
  131. btn.onclick = (e) => {
  132. store.dispatch({ type: КУПИТЬ, ШО: selectProduct.value, СКОКА: input.value, БАБЛО: inputMoney.value })
  133. }