main.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Larek
  2. function createStore(reducer){
  3. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  4. let cbs = [] //массив подписчиков
  5. const getState = () => state //функция, возвращающая переменную из замыкания
  6. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  7. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  8. const dispatch = action => {
  9. const newState = reducer(state, action) //пробуем запустить редьюсер
  10. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  11. state = newState //если смог, то обновляем state
  12. for (let cb of cbs) cb() //и запускаем подписчиков
  13. }
  14. }
  15. return {
  16. getState, //добавление функции getState в результирующий объект
  17. dispatch,
  18. subscribe //добавление subscribe в объект
  19. }
  20. }
  21. function reducer(state, {type, name, sum, money}){ //объект action деструктуризируется
  22. if (!state){ //начальная уборка в ларьке:
  23. return {
  24. cash : 0,
  25. beer: {
  26. amount : 110,
  27. price : 20,
  28. },
  29. cheaps: {
  30. amount : 40,
  31. price : 33,
  32. },
  33. cigarets: {
  34. amount : 20,
  35. price : 70,
  36. },
  37. }
  38. }
  39. if (type === 'КУПИТИ'){ //если тип action - КУПИТЬ, то:
  40. if( (sum > state[name].amount) || (money < ( sum * state[name].price))){
  41. return state
  42. }
  43. return {
  44. ...state, //берем все что было из ассортимента
  45. [name]: {amount: state[name].amount - sum, price: state[name].price },
  46. cash : state.cash + (+money)
  47. }
  48. }
  49. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  50. }
  51. const store = createStore(reducer)
  52. const unsubscribe = store.subscribe(() => console.log(store.getState()))
  53. let products = Object.keys(store.getState()).slice(1)
  54. function update (){
  55. document.getElementById('section').remove()
  56. let section = document.createElement('section')
  57. section.id = "section"
  58. document.body.append(section)
  59. let select= document.createElement("select")
  60. select.id = "mySelect"
  61. document.getElementById('section').append(select)
  62. for(let i = 0;i<products.length;i++){
  63. let option = document.createElement("option")
  64. option.value = products[i]
  65. option.innerText = `${products[i]} : ${store.getState()[products[i]].amount} шт ${store.getState()[products[i]].price} uah`
  66. select.append(option)
  67. }
  68. let spanAmount = document.createElement('span')
  69. spanAmount.innerText = "Скока хоч купить?"
  70. let inputAmount = document.createElement('input')
  71. inputAmount.type = `number`
  72. let spanMoney = document.createElement('span')
  73. spanMoney.innerText = "Скока мані є?"
  74. let inputMoney = document.createElement('input')
  75. inputAmount.type = `number`
  76. let button = document.createElement('button')
  77. button.id = "myButton"
  78. button.innerText = "КУПИТИ"
  79. let spanCash = document.createElement('span')
  80. spanCash.innerText = `КАСА : ${store.getState().cash}`
  81. document.getElementById('section').append(spanAmount,inputAmount,spanMoney,
  82. inputMoney,button,spanCash)
  83. const actionBuy = (name,sum,money) =>({type:'КУПИТИ',name,sum,money})
  84. document.getElementById('myButton').addEventListener("click", ()=>{
  85. store.dispatch(actionBuy(select.value,+inputAmount.value,+inputMoney.value))
  86. update()
  87. } )
  88. }
  89. update()