js.js 4.5 KB

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