script.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. function createStore(reducer){
  2. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  3. let cbs = [] //массив подписчиков
  4. const getState = () => state //функция, возвращающая переменную из замыкания
  5. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  6. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  7. const dispatch = action => {
  8. const newState = reducer(state, action) //пробуем запустить редьюсер
  9. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  10. state = newState //если смог, то обновляем state
  11. for (let cb of cbs) cb() //и запускаем подписчиков
  12. }
  13. }
  14. return {
  15. getState, //добавление функции getState в результирующий объект
  16. dispatch,
  17. subscribe //добавление subscribe в объект
  18. }
  19. }
  20. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  21. if (!state){
  22. return {
  23. пиво: {count: 100, price: 50},
  24. чипсы: {count: 100, price: 32},
  25. сиги: {count: 100, price: 70},
  26. касса: 0,
  27. }
  28. }
  29. if (type === 'КУПИТЬ'){
  30. if (ШО in state && БАБЛО > state[ШО].price * СКОКА && СКОКА <= state[ШО].count){
  31. return {
  32. ...state,
  33. [ШО]: {count: state[ШО].count - СКОКА, price: state[ШО].price},
  34. касса: +state.касса + (СКОКА * state[ШО].price),
  35. }
  36. }
  37. }
  38. return state
  39. }
  40. const store = createStore(reducer)
  41. for (let good of Object.entries(store.getState())) {
  42. if (good[0] !== 'касса') {
  43. let listOption = document.createElement('option');
  44. listOption.textContent = good[0];
  45. goods.append(listOption);
  46. }
  47. }
  48. const buys = (product, count, money) => ({type: 'КУПИТЬ', ШО: product, СКОКА: count, БАБЛО: money});
  49. buy.onclick = () => {
  50. store.dispatch(buys(goods.value, quantity.value, money.value));
  51. }
  52. const unsubscribe = store.subscribe(() => console.log(store.getState()))
  53. function product(){
  54. for (let good of Object.entries(store.getState())) {
  55. if (good[0] !== 'касса') {
  56. let h1 = document.createElement('h1');
  57. shop.append(h1);
  58. store.subscribe(() => h1.innerText = `${good[0]}: количество ${store.getState()[good[0]].count}, цена: ${store.getState()[good[0]].price}`);
  59. h1.innerText = `${good[0]}: количество ${store.getState()[good[0]].count}, цена ${store.getState()[good[0]].price}`;
  60. }
  61. }
  62. }
  63. function casa(){
  64. const h1 = document.createElement('h1');
  65. shop.append(h1);
  66. store.subscribe(() => h1.innerText = `Денег в кассе = ${store.getState().касса}`);
  67. h1.innerText = `Денег в кассе = ${store.getState().касса}`;
  68. }
  69. product()
  70. casa();