js.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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, productName, productAmount, sum}){
  21. if (!state){ //начальная уборка в ларьке:
  22. return {
  23. пиво: {
  24. amount: 100,
  25. price: 35,
  26. },
  27. чипсы: {
  28. amount: 100,
  29. price: 28,
  30. },
  31. сиги: {
  32. amount: 100,
  33. price: 90,
  34. },
  35. }
  36. }
  37. if (type === 'Купить' && productAmount <= state[productName].amount && sum >= state[productName].price * productAmount){ //если тип action - КУПИТЬ, то:
  38. return {
  39. ...state, //берем все что было из ассортимента
  40. [productName]: {
  41. amount: state[productName].amount - productAmount,
  42. price: state[productName].price
  43. },
  44. }
  45. }
  46. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  47. }
  48. function actionCreator (type, productName, productAmount, sum){
  49. return {
  50. type,
  51. productName,
  52. productAmount,
  53. sum
  54. }
  55. }
  56. let store = createStore(reducer);
  57. myState = store.getState()
  58. const showCase = document.createElement('section')
  59. document.body.append(showCase)
  60. showCase.classList.add('showCase')
  61. const productSelect = document.createElement('select')
  62. document.body.append(productSelect)
  63. const productQuantityOrderTitle = document.createElement('div')
  64. productQuantityOrderTitle.innerText = 'Количество:'
  65. document.body.append(productQuantityOrderTitle)
  66. const productQuantityInput = document.createElement('input')
  67. productQuantityInput.type = 'number'
  68. productQuantityInput.min = '0'
  69. document.body.append(productQuantityInput)
  70. const moneyTitle = document.createElement('div')
  71. moneyTitle.innerText = 'Деньги:'
  72. document.body.append(moneyTitle)
  73. const money = document.createElement('input')
  74. money.type = 'number'
  75. money.min = '0'
  76. document.body.append(money)
  77. const buttonBuy = document.createElement('button')
  78. buttonBuy.value = 'Купить'
  79. buttonBuy.innerText = 'Купить'
  80. document.body.append(buttonBuy)
  81. buttonBuy.onclick = () => {
  82. store.dispatch(actionCreator(buttonBuy.value, productSelect.value, +productQuantityInput.value, +money.value))
  83. }
  84. for (const product in store.getState()){
  85. const productCard = document.createElement('div')
  86. productCard.classList.add('productCard')
  87. const productName = document.createElement('h2')
  88. productName.innerText = product
  89. productName.classList.add('productName')
  90. const productPrice = document.createElement('div')
  91. productPrice.innerText = store.getState()[product].price + ' грн'
  92. productPrice.classList.add('productPrice')
  93. const productAmount = document.createElement('div')
  94. productAmount.innerText = store.getState()[product].amount + ' шт'
  95. productAmount.classList.add('productQuantity')
  96. productCard.append(productName, productAmount, productPrice)
  97. showCase.append(productCard)
  98. const productOption = document.createElement('option')
  99. productOption.innerText = product
  100. productSelect.append(productOption)
  101. const productAmountChange= store.subscribe( () => {
  102. productAmount.innerText = store.getState()[product].amount + ' шт'
  103. })
  104. }