main.js 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. function reducer(state, { type, ШО, СКОКА }) { // объект action деструктуризируется на три переменных
  2. if (!state) { // начальная уборка в ларьке:
  3. return {
  4. пиво: { "number": 100, "price": 10 },
  5. чипсы: { "number": 100, "price": 15 },
  6. сиги: { "number": 100, "price": 5 },
  7. бабло: { "в ларьке": 5, "в кармане": prompt("Введите сколько у вас денег в кармане", 0) }
  8. }
  9. }
  10. if (type === 'КУПИТЬ' && (state[ШО]["number"] - СКОКА) >= 0 && state["бабло"]["в кармане"] - state[ШО]["price"] * СКОКА >= 0) { //если тип action - КУПИТЬ, то:
  11. return {
  12. ...state, //берем все что было из ассортимента
  13. [ШО]: { ["number"]: state[ШО]["number"] - СКОКА, ["price"]: state[ШО]["price"] },// и уменьшаем то, что покупается на количество
  14. ["бабло"]: {
  15. ["в кармане"]: state["бабло"]["в кармане"] - state[ШО]["price"] * СКОКА,
  16. ["в ларьке"]: state["бабло"]["в ларьке"] + state[ШО]["price"] * СКОКА
  17. }
  18. }
  19. }
  20. return state // если мы не поняли, что от нас хотят в `action` - оставляем все как есть
  21. }
  22. function createStore(reducer) {
  23. let state = reducer(undefined, {}) // стартовая инициализация состояния, запуск редьюсера со state === undefined
  24. let cbs = [] // массив подписчиков
  25. const getState = () => state // функция, возвращающая переменную из замыкания
  26. const subscribe = cb => (cbs.push(cb), // пушим подписчиков в массиве
  27. () => cbs = cbs.filter(c => c !== cb)) // возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  28. const dispatch = action => {
  29. const newState = reducer(state, action) // пробуем запустить редьюсер
  30. if (newState !== state) { // проверяем, смог ли редьюсер обработать action
  31. state = newState // если смог, то обновляем state
  32. for (let cb of cbs) cb() // и запускаем подписчиков
  33. }
  34. }
  35. return {
  36. getState, // добавление функции getState в результирующий объект
  37. dispatch,
  38. subscribe // добавление subscribe в объект
  39. }
  40. }
  41. const store = createStore(reducer);
  42. store.subscribe(() => console.log(store.getState()));
  43. store.subscribe(() => createTable());
  44. const tovaryEl = document.getElementById("tovary");
  45. const numberEl = document.getElementById("number");
  46. const tableEl = document.getElementById("table");
  47. tableEl.border = 1;
  48. for (let key in store.getState()) {
  49. if (key === "бабло") continue;
  50. let optionEl = document.createElement("option");
  51. optionEl.innerHTML = key;
  52. tovaryEl.appendChild(optionEl);
  53. }
  54. const buttonEl = document.getElementById("button");
  55. buttonEl.onclick = () => {
  56. store.dispatch({ type: "КУПИТЬ", ШО: tovaryEl.value, СКОКА: numberEl.value });
  57. }
  58. createTable();
  59. function createTable() {
  60. tableEl.innerHTML = "";
  61. createTr("Наименование", "Количество", "Цена за единицу");
  62. for (let [key, value] of Object.entries(store.getState())) {
  63. if (key === "бабло") continue;
  64. createTr(key, value.number, value.price);
  65. }
  66. createTr("Касса", "в ларьке:", store.getState()["бабло"]["в ларьке"]);
  67. createTr("Касса", "в кармане:", store.getState()["бабло"]["в кармане"]);
  68. }
  69. function createTr(td1, td2, td3) {
  70. const trEl = document.createElement("tr");
  71. const td1El = document.createElement("td");
  72. const td2El = document.createElement("td");
  73. const td3El = document.createElement("td");
  74. td1El.innerText = td1;
  75. td2El.innerText = td2;
  76. td3El.innerText = td3;
  77. trEl.append(td1El, td2El, td3El);
  78. tableEl.appendChild(trEl);
  79. }