function reducer(state, {type, ШО, СКОКА, ДЕНЬГИ}){ //объект action деструктуризируется на три переменных if (!state){ //начальная уборка в ларьке: return { пиво: { count: 100, price: 30 }, чипсы:{ count: 100, price: 25 }, сиги:{ count: 100, price: 60 }, КАССА: 0, КОШЕЛЕК: 250 }; } if (type === 'КУПИТЬ'){ //если тип action - КУПИТЬ, то: if(state[ШО].count < СКОКА){ alert('У нас нет такого количества!'); return { ...state, [ШО]: {count: state[ШО].count, price: state[ШО].price}, } }; if(state.КОШЕЛЕК < (state[ШО].price * СКОКА)){ alert('У Вас не хватает денег!'); return { ...state, [ШО]: {count: state[ШО].count, price: state[ШО].price}, } }; if(СКОКА <= 0){ alert('Вы уверены, что ввели верное количество?'); return { ...state, [ШО]: {count: state[ШО].count, price: state[ШО].price}, } }; //else{ //console.log(`${ШО} ${СКОКА} шт`); //} return { ...state, //берем все что было из ассортимента //[ШО]: state[ШО].count - СКОКА,//и уменьшаем то, что покупается на количество [ШО]: {count: state[ШО].count - СКОКА, price: state[ШО].price}, КАССА: state.КАССА + state[ШО].price * СКОКА, КОШЕЛЕК: state.КОШЕЛЕК - (state[ШО].price * СКОКА) }; } return state; //если мы не поняли, что от нас просят в `action` - оставляем все как есть } function createStore(reducer){ let state = reducer(undefined, {}); //стартовая инициализация состояния, запуск редьюсера со state === undefined let cbs = []; //массив подписчиков const getState = () => state; //функция, возвращающая переменную из замыкания const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве () => cbs = cbs.filter(c => c !== cb)); //возвращаем функцию unsubscribe, которая удаляет подписчика из списка const dispatch = action => { const newState = reducer(state, action); //пробуем запустить редьюсер if (newState !== state){ //проверяем, смог ли редьюсер обработать action state = newState; //если смог, то обновляем state for (let cb of cbs) cb(); //и запускаем подписчиков } }; return { getState, //добавление функции getState в результирующий объект dispatch, subscribe //добавление subscribe в объект } } const store = createStore(reducer); function createGoods(select, store){ for(let key in store.getState()){ if(key === 'КАССА'){ return; } else { let option = document.createElement('option'); option.value = key; option.innerHTML = key; select.appendChild(option); } } } createGoods(sel, store); store.subscribe(() => console.log(store.getState())); btn.onclick = () => store.dispatch({type: 'КУПИТЬ', ШО: sel.value, СКОКА: +input.value}); function drawTable () { table.innerHTML = 'GoodsPriceTotal'; for(let good in store.getState()){ let tr = document.createElement('tr'); table.appendChild(tr); tr.innerHTML = good; for(let pr = 0; pr < 1; pr++){ let td = document.createElement('td'); tr.appendChild(td); td.innerHTML = store.getState()[good].price + ' ' + 'грн'; if(good === 'КАССА' || good === 'КОШЕЛЕК'){ td.innerHTML =''; } } for(let c = 0; c < 1; c++){ let td = document.createElement('td'); tr.appendChild(td); td.innerHTML = store.getState()[good].count + ' ' + 'шт'; if(good === 'КАССА' || good === 'КОШЕЛЕК'){ td.innerHTML = store.getState()[good] + ' ' + 'грн'; } } } } drawTable(); store.subscribe(() =>drawTable());