script.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. updateShowCase()
  9. store.subscribe(updateCashbox);
  10. store.subscribe(updateShowCase);
  11. const unsubscribe = store.subscribe(() => console.log(store.getState()));
  12. function reducer(state, { type, ШО, СКОКА, БАБЛО }) {
  13. //объект action деструктуризируется на три переменных
  14. if (!state) {
  15. //начальная уборка в ларьке:
  16. return {
  17. stock: {
  18. пиво: {
  19. price: 20,
  20. amount: 100,
  21. img : "https://pivasik.com.ua/wp-content/uploads/2019/09/orange.png",
  22. },
  23. чипсы: {
  24. price: 25,
  25. amount: 100,
  26. img : "https://cdn.27.ua/499/24/05/74757_4.jpeg",
  27. },
  28. сиги: {
  29. price: 50,
  30. amount: 100,
  31. img: "https://img1.liveinternet.ru/images/attach/c/8/100/745/100745087_kozak_bf_red500x500.jpg",
  32. },
  33. },
  34. cashbox: 0,
  35. };
  36. //
  37. }
  38. if (type === "КУПИТЬ") {
  39. //если тип action - КУПИТЬ, то:
  40. return {
  41. ...state, //берем все что было из ассортимента
  42. stock: {
  43. ...state.stock,
  44. [ШО]: {
  45. price: state.stock[ШО].price,
  46. amount: state.stock[ШО].amount - СКОКА,
  47. img: state.stock[ШО].img
  48. }
  49. }, //и уменьшаем то, что покупается на количество
  50. cashbox: state.cashbox + БАБЛО,
  51. };
  52. }
  53. return state; //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  54. }
  55. function createStore(reducer) {
  56. let state = reducer(undefined, {}); //стартовая инициализация состояния, запуск редьюсера со state === undefined
  57. let cbs = []; //массив подписчиков
  58. const getState = () => state; //функция, возвращающая переменную из замыкания
  59. const subscribe = (cb) => (
  60. cbs.push(cb), //запоминаем подписчиков в массиве
  61. () => (cbs = cbs.filter((c) => c !== cb))
  62. ); //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  63. const dispatch = (action) => {
  64. const newState = reducer(state, action); //пробуем запустить редьюсер
  65. if (newState !== state) {
  66. //проверяем, смог ли редьюсер обработать action
  67. state = newState; //если смог, то обновляем state
  68. for (let cb of cbs) cb(); //и запускаем подписчиков
  69. }
  70. };
  71. return {
  72. getState, //добавление функции getState в результирующий объект
  73. dispatch,
  74. subscribe, //добавление subscribe в объект
  75. };
  76. }
  77. let html = "";
  78. for (let key in store.getState().stock) {
  79. html += `<option>${key}</option>`;
  80. }
  81. select.innerHTML = html;
  82. btn.addEventListener("click", buy);
  83. input.addEventListener("input", counter );
  84. select.addEventListener("click", counter)
  85. function buy(e) {
  86. if(bablo.value >= (input.value * store.getState().stock[select.value].price) ){
  87. store.dispatch({
  88. type: "КУПИТЬ",
  89. ШО: select.value,
  90. СКОКА: input.value,
  91. БАБЛО: Number(bablo.value),
  92. });
  93. bablo.value = "";
  94. }else{
  95. alert("Не хватает бабла");
  96. }
  97. }
  98. function updateCashbox(){
  99. cash.innerText = `КАССА : ${store.getState().cashbox}`
  100. }
  101. function counter( ){
  102. if (input.value > store.getState().stock[select.value].amount){
  103. input.value = store.getState().stock[select.value].amount;
  104. }
  105. cashier.innerText = ` К ОПЛАТЕ : ${ (input.value * store.getState().stock[select.value].price)}`;
  106. }
  107. function updateShowCase(){
  108. const obj = store.getState().stock;
  109. const wrapperShowCase = document.querySelector(".wrapperShowCase");
  110. wrapperShowCase.innerHTML = "";
  111. let html =""
  112. for(const good in obj){
  113. html += `<div class="showCaseBlock">`;
  114. html += `<img class="img" src = ${obj[good].img}>`;
  115. html += `<p class="info">ЦЕНА: ${obj[good].price} грн</p>`;
  116. html += `<p class="info">в наличии: ${obj[good].amount} шт</p>`
  117. html += `</div>`;
  118. }
  119. wrapperShowCase.innerHTML = html;
  120. }