main.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. function reducer(state, {type, ШО, СКОКА, ДЕНЬГИ}){ //объект action деструктуризируется на три переменных
  2. if (!state){ //начальная уборка в ларьке:
  3. return {
  4. пиво: {
  5. count: 100,
  6. price: 30
  7. },
  8. чипсы:{
  9. count: 100,
  10. price: 25
  11. },
  12. сиги:{
  13. count: 100,
  14. price: 60
  15. },
  16. КАССА: 0,
  17. КОШЕЛЕК: 250
  18. };
  19. }
  20. if (type === 'КУПИТЬ'){ //если тип action - КУПИТЬ, то:
  21. if(state[ШО].count < СКОКА){
  22. alert('У нас нет такого количества!');
  23. return {
  24. ...state,
  25. [ШО]: {count: state[ШО].count, price: state[ШО].price},
  26. }
  27. };
  28. if(state.КОШЕЛЕК < (state[ШО].price * СКОКА)){
  29. alert('У Вас не хватает денег!');
  30. return {
  31. ...state,
  32. [ШО]: {count: state[ШО].count, price: state[ШО].price},
  33. }
  34. };
  35. if(СКОКА <= 0){
  36. alert('Вы уверены, что ввели верное количество?');
  37. return {
  38. ...state,
  39. [ШО]: {count: state[ШО].count, price: state[ШО].price},
  40. }
  41. };
  42. //else{
  43. //console.log(`${ШО} ${СКОКА} шт`);
  44. //}
  45. return {
  46. ...state, //берем все что было из ассортимента
  47. //[ШО]: state[ШО].count - СКОКА,//и уменьшаем то, что покупается на количество
  48. [ШО]: {count: state[ШО].count - СКОКА, price: state[ШО].price},
  49. КАССА: state.КАССА + state[ШО].price * СКОКА,
  50. КОШЕЛЕК: state.КОШЕЛЕК - (state[ШО].price * СКОКА)
  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 => (cbs.push(cb), //запоминаем подписчиков в массиве
  60. () => cbs = cbs.filter(c => c !== cb)); //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  61. const dispatch = action => {
  62. const newState = reducer(state, action); //пробуем запустить редьюсер
  63. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  64. state = newState; //если смог, то обновляем state
  65. for (let cb of cbs) cb(); //и запускаем подписчиков
  66. }
  67. };
  68. return {
  69. getState, //добавление функции getState в результирующий объект
  70. dispatch,
  71. subscribe //добавление subscribe в объект
  72. }
  73. }
  74. const store = createStore(reducer);
  75. function createGoods(select, store){
  76. for(let key in store.getState()){
  77. if(key === 'КАССА'){
  78. return;
  79. } else {
  80. let option = document.createElement('option');
  81. option.value = key;
  82. option.innerHTML = key;
  83. select.appendChild(option);
  84. }
  85. }
  86. }
  87. createGoods(sel, store);
  88. store.subscribe(() => console.log(store.getState()));
  89. btn.onclick = () => store.dispatch({type: 'КУПИТЬ', ШО: sel.value, СКОКА: +input.value});
  90. function drawTable () {
  91. table.innerHTML = '<tr><th>Goods</th><th>Price</th><th>Total</th></tr>';
  92. for(let good in store.getState()){
  93. let tr = document.createElement('tr');
  94. table.appendChild(tr);
  95. tr.innerHTML = good;
  96. for(let pr = 0; pr < 1; pr++){
  97. let td = document.createElement('td');
  98. tr.appendChild(td);
  99. td.innerHTML = store.getState()[good].price + ' ' + 'грн';
  100. if(good === 'КАССА' || good === 'КОШЕЛЕК'){
  101. td.innerHTML ='';
  102. }
  103. }
  104. for(let c = 0; c < 1; c++){
  105. let td = document.createElement('td');
  106. tr.appendChild(td);
  107. td.innerHTML = store.getState()[good].count + ' ' + 'шт';
  108. if(good === 'КАССА' || good === 'КОШЕЛЕК'){
  109. td.innerHTML = store.getState()[good] + ' ' + 'грн';
  110. }
  111. }
  112. }
  113. }
  114. drawTable();
  115. store.subscribe(() =>drawTable());