index.js 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. let sigi = document.getElementById("Sigi")
  2. let chips = document.getElementById("Chips")
  3. let beer = document.getElementById("Beer")
  4. let button = document.getElementById("button")
  5. let input = document.getElementById("input")
  6. let select = document.getElementById("Select")
  7. let bablo = document.getElementById("Kasa")
  8. let sdacha = document.getElementById("sdacha")
  9. let kasa = document.getElementById("Kassa")
  10. function reducer(state, {type, ШО, СКОКА, БАБЛО}){ //объект action деструктуризируется на три переменных
  11. if (!state){ //начальная уборка в ларьке:
  12. return {
  13. пиво: {
  14. Сколько: 100,
  15. Цена: 30,
  16. },
  17. чипсы: {
  18. Сколько: 100,
  19. Цена: 20,
  20. },
  21. сиги: {
  22. Сколько: 100,
  23. Цена: 75,
  24. },
  25. Касса: 0,
  26. Сдача : 0,
  27. }
  28. }
  29. if (type === 'КУПИТЬ') { //если тип action - КУПИТЬ, то:
  30. if (СКОКА <= state[ШО].Сколько && БАБЛО - (СКОКА * state[ШО].Цена) >= 0 )
  31. return {
  32. ...state, //берем все что было из ассортимента
  33. [ШО]: {
  34. Сколько: state[ШО].Сколько - СКОКА,
  35. Цена: state[ШО].Цена //и уменьшаем то, что покупается на количество
  36. },
  37. Касса: state.Касса + (СКОКА * state[ШО].Цена),
  38. Сдача: БАБЛО - (СКОКА * state[ШО].Цена)
  39. }
  40. }
  41. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  42. }
  43. function createStore(reducer){
  44. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  45. let cbs = [] //массив подписчиков
  46. const getState = () => state //функция, возвращающая переменную из замыкания
  47. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  48. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  49. const dispatch = action => {
  50. const newState = reducer(state, action) //пробуем запустить редьюсер
  51. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  52. state = newState //если смог, то обновляем state
  53. for (let cb of cbs) cb() //и запускаем подписчиков
  54. }
  55. }
  56. return {
  57. getState, //добавление функции getState в результирующий объект
  58. dispatch,
  59. subscribe //добавление subscribe в объект
  60. }
  61. }
  62. const store = createStore(reducer)
  63. let шоЛежит = () => {
  64. let objectStore = store.getState()
  65. sigi.innerText = `Сиги : ${objectStore.сиги ['Сколько']} цена : ${objectStore.сиги['Цена']}`
  66. chips.innerText = `Чипсы : ${objectStore.чипсы['Сколько']} цена : ${objectStore.чипсы['Цена']}`
  67. beer.innerText = `Пиво : ${objectStore.пиво['Сколько']} цена : ${objectStore.пиво['Цена']}`
  68. sdacha.innerText = `Ваша сдача : ${objectStore['Сдача']}`
  69. kasa.innerText = `Касса : ${objectStore['Касса']}`
  70. bablo.value = `${objectStore['Сдача']}`
  71. }
  72. let купиШОнибудь = () => ({ type: 'КУПИТЬ', ШО: select.value, СКОКА: input.value, БАБЛО: bablo.value})
  73. button.onclick = () => {
  74. store.dispatch(купиШОнибудь())
  75. шоЛежит()
  76. }
  77. window.onload = () => {
  78. шоЛежит()
  79. }