|
@@ -0,0 +1,100 @@
|
|
|
+// общие правила
|
|
|
+
|
|
|
+// * влияние на store (изменение state) происходит через store.dispatch(какой-то экшон криейтор(какие-то параметры))
|
|
|
+// * отображение состояния state на экране происходит через store.subscribe(какая-то ваша функция, которая делает
|
|
|
+// store.getState() и меняет DOM)
|
|
|
+
|
|
|
+// Менять код createStore не надо
|
|
|
+
|
|
|
+// Задачи
|
|
|
+
|
|
|
+// * сделать отображение всего того, что есть в ларьке (можете хоть витрину нарисовать, если интересно) с количествами;
|
|
|
+// * сделать select для выбора товара и input type='number' для выбора количества и кнопку "купить", которая посылает action
|
|
|
+// в store используя actionCreator для создания action
|
|
|
+// * добавить в reducer проверку на уход в минус, что бы нельзя было продать то, чего нет в должном количестве.
|
|
|
+// * добавить в state цену каждого товара и поле касса. Для этого вместо структуры вида beer: 100 используйте beer:
|
|
|
+// КАКОЙ-ТО ОБЪЕКТ С КОЛИЧЕСТВОМ И СТОИМОСТЬЮ ОДНОЙ ЕДИНИЦЫ. В action добавьте поле "бабло".
|
|
|
+// Всё это пишется в reducer, не забудьте проверки что бабла хватает.
|
|
|
+// * добавьте в интерфейс поле для денег.
|
|
|
+
|
|
|
+function reducer(state, { type, obj, amount }) {
|
|
|
+
|
|
|
+ if (!state) {
|
|
|
+ return {
|
|
|
+ beer: { number: 100, price: 5 },
|
|
|
+ chips: { number: 50, price: 3 },
|
|
|
+ smoke: { number: 50, price: 7 },
|
|
|
+ cash: { cashbox: 0, mycash: 100 }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (type === 'BUY') {
|
|
|
+ if ((state[obj].number) >= 0 && state.cash.mycash - state[obj].price * amount >= 0) {
|
|
|
+ if ((amount >= 0)) {
|
|
|
+ return {
|
|
|
+ ...state,
|
|
|
+ [obj]: { ...state[obj], number: state[obj].number - amount },
|
|
|
+ cash: {
|
|
|
+ mycash: state.cash.mycash - state[obj].price * amount,
|
|
|
+ cashbox: state.cash.cashbox + state[obj].price * amount
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (amount < 0){
|
|
|
+ return{
|
|
|
+ ...state, cashbox: state.cashbox * 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return state
|
|
|
+}
|
|
|
+
|
|
|
+function createStore(reducer) {
|
|
|
+ let state = reducer(undefined, {})
|
|
|
+ let cbs = []
|
|
|
+
|
|
|
+ const getState = () => state
|
|
|
+ const subscribe = cb => (cbs.push(cb),
|
|
|
+ () => cbs = cbs.filter(c => c !== cb))
|
|
|
+
|
|
|
+ const dispatch = action => {
|
|
|
+ const newState = reducer(state, action)
|
|
|
+ if (newState !== state) {
|
|
|
+ state = newState
|
|
|
+ for (let cb of cbs) cb()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ getState,
|
|
|
+ dispatch,
|
|
|
+ subscribe
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const store = createStore(reducer)
|
|
|
+console.log(store.getState())
|
|
|
+
|
|
|
+let productN = document.getElementById("product");
|
|
|
+let numberN = document.getElementById("number");
|
|
|
+let buttonN = document.getElementById("button");
|
|
|
+
|
|
|
+let pivoN = document.getElementById("pivo").innerHTML = store.getState().beer.number
|
|
|
+let chipsN = document.getElementById("chips").innerHTML = store.getState().chips.number
|
|
|
+let sigiN = document.getElementById("sigi").innerHTML = store.getState().smoke.number
|
|
|
+
|
|
|
+let pivoM = document.getElementById("pivoK").innerHTML = store.getState().beer.price + '$'
|
|
|
+let chipsM = document.getElementById("chipsK").innerHTML = store.getState().chips.price + '$'
|
|
|
+let sigiM = document.getElementById("sigiK").innerHTML = store.getState().smoke.price + '$'
|
|
|
+
|
|
|
+let kassaN = document.getElementById("kassa").innerHTML = store.getState().cash.cashbox + '$'
|
|
|
+let moneyN = document.getElementById("money").innerHTML = store.getState().cash.mycash + '$'
|
|
|
+
|
|
|
+buttonN.onclick = () => {
|
|
|
+ store.dispatch({ type: 'BUY', obj: productN.value, amount: numberN.value })
|
|
|
+ let pivoN = document.getElementById("pivo").innerHTML = store.getState().beer.number
|
|
|
+ let chipsN = document.getElementById("chips").innerHTML = store.getState().chips.number
|
|
|
+ let sigiN = document.getElementById("sigi").innerHTML = store.getState().smoke.number
|
|
|
+ let kassaN = document.getElementById("kassa").innerHTML = store.getState().cash.cashbox + '$'
|
|
|
+ let moneyN = document.getElementById("money").innerHTML = store.getState().cash.mycash + '$'
|
|
|
+}
|