script.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const select = document.getElementById("select");
  2. const input = document.getElementById("input");
  3. const btn = document.getElementById("btn");
  4. const cash = document.querySelector(".cashbox");
  5. const bablo = document.getElementById("bablo");
  6. const cashier = document.getElementById("cashier")
  7. const store = createStore(reducer);
  8. store.subscribe(updateCashbox);
  9. const unsubscribe = store.subscribe(() => console.log(store.getState()));
  10. function reducer(state, { type, ШО, СКОКА, БАБЛО }) {
  11. //объект action деструктуризируется на три переменных
  12. if (!state) {
  13. //начальная уборка в ларьке:
  14. return {
  15. stock: {
  16. пиво: {
  17. price: 20,
  18. amount: 100,
  19. },
  20. чипсы: {
  21. price: 25,
  22. amount: 100,
  23. },
  24. сиги: {
  25. price: 50,
  26. amount: 100,
  27. },
  28. },
  29. cashbox: 0,
  30. };
  31. //
  32. }
  33. if (type === "КУПИТЬ") {
  34. //если тип action - КУПИТЬ, то:
  35. return {
  36. ...state, //берем все что было из ассортимента
  37. stock: {
  38. ...state.stock,
  39. [ШО]: {
  40. price: state.stock[ШО].price,
  41. amount: state.stock[ШО].amount - СКОКА,
  42. }
  43. }, //и уменьшаем то, что покупается на количество
  44. cashbox: state.cashbox + БАБЛО,
  45. };
  46. }
  47. return state; //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  48. }
  49. function createStore(reducer) {
  50. let state = reducer(undefined, {}); //стартовая инициализация состояния, запуск редьюсера со state === undefined
  51. let cbs = []; //массив подписчиков
  52. const getState = () => state; //функция, возвращающая переменную из замыкания
  53. const subscribe = (cb) => (
  54. cbs.push(cb), //запоминаем подписчиков в массиве
  55. () => (cbs = cbs.filter((c) => c !== cb))
  56. ); //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  57. const dispatch = (action) => {
  58. const newState = reducer(state, action); //пробуем запустить редьюсер
  59. if (newState !== state) {
  60. //проверяем, смог ли редьюсер обработать action
  61. state = newState; //если смог, то обновляем state
  62. for (let cb of cbs) cb(); //и запускаем подписчиков
  63. }
  64. };
  65. return {
  66. getState, //добавление функции getState в результирующий объект
  67. dispatch,
  68. subscribe, //добавление subscribe в объект
  69. };
  70. }
  71. let html = "";
  72. for (let key in store.getState().stock) {
  73. html += `<option>${key}</option>`;
  74. }
  75. select.innerHTML = html;
  76. btn.addEventListener("click", buy);
  77. input.addEventListener("input", counter );
  78. select.addEventListener("click", counter)
  79. function buy(e) {
  80. if(bablo.value >= (input.value * store.getState().stock[select.value].price) ){
  81. store.dispatch({
  82. type: "КУПИТЬ",
  83. ШО: select.value,
  84. СКОКА: input.value,
  85. БАБЛО: Number(bablo.value),
  86. });
  87. console.log(store);
  88. bablo.value = "";
  89. }else{
  90. alert("Не хватает бабла");
  91. }
  92. }
  93. function updateCashbox(){
  94. cash.innerText = `КАССА : ${store.getState().cashbox}`
  95. }
  96. function counter( ){
  97. cashier.innerText = ` К ОПЛАТЕ : ${ (input.value * store.getState().stock[select.value].price)}`
  98. }