function createStore(reducer){
let state = reducer(undefined, {})
let cbs = []
return {
dispatch(action){
const newState = reducer(state, action)
if (newState !== state){
state = newState
for (let cb of cbs)
cb()
}
},
getState(){
return state
},
subscribe(cb){
cbs.push(cb)
return () => cbs = cbs.filter(c => c !== cb)
}
}
}
function createKiosk(state){
let div = document.getElementById('content')
div.innerHTML = ''
let hello = document.createElement('span')
hello.innerHTML = 'ГАСТРОНОМ "У ЛЮСИ"
'
hello.style.color = '#4B0082'
div.appendChild(hello)
let pivo = document.createElement('span')
pivo.innerHTML = `- Пивасик по ${state.пивасик.БАБЛО} грн,\n`
div.appendChild(pivo)
let pivoAmount = document.createElement('span')
pivoAmount.innerHTML = `${state.пивасик.СКОКА}\n банок в наличии
`
div.appendChild(pivoAmount)
let chips = document.createElement('span')
chips.innerHTML = `- Чипсики по ${state.чипсики.БАБЛО} грн,\n`
div.appendChild(chips)
let chipsAmount = document.createElement('span')
chipsAmount.innerHTML = `${state.чипсики.СКОКА}\n пачек в наличии
`
div.appendChild(chipsAmount)
let cigi = document.createElement('span')
cigi.innerHTML = `- Сиги по ${state.сиги.БАБЛО} грн,\n`
div.appendChild(cigi)
let cigiAmount = document.createElement('span')
cigiAmount.innerHTML = `${state.сиги.СКОКА}\n пачек в наличии
`
div.appendChild(cigiAmount)
let kassa = document.createElement('span')
kassa.innerText = `- Бабосиков в кассе: ${state.касса} грн\n`
div.appendChild(kassa)
let select = document.createElement('select')
div.appendChild(select)
let pruduct = document.createElement('option')
pruduct.innerText = 'Выберите товар'
select.appendChild(pruduct)
let pivasik = document.createElement('option')
pivasik.innerText = 'пивасик'
select.appendChild(pivasik)
let chipsiki = document.createElement('option')
chipsiki.innerText = 'чипсики'
select.appendChild(chipsiki)
let cigarette = document.createElement('option')
cigarette.innerText = 'сиги'
select.appendChild(cigarette)
let inputAmount = document.createElement('input')
inputAmount.type = 'number'
inputAmount.min = '1'
div.appendChild(inputAmount)
let button = document.createElement('button')
button.innerText = "Купить"
div.appendChild(button)
button.onclick = () => {
if(state[select.value].СКОКА >= inputAmount.value){
let pieces = inputAmount.value
let price = select.value
store.dispatch(купи(price, pieces))
} else{
alert("А ты не лопнишь, деточка?...ладно, шучу:D - такого количества товара в наличии попросту нет!")
}
}
return state
}
function reducer(state, {type, ШО, СКОКА, БАБЛО}){
if (!state){
return {
пивасик: {СКОКА: 100, БАБЛО: 30},
чипсики: {СКОКА: 100, БАБЛО: 20},
сиги: {СКОКА : 100, БАБЛО: 40},
касса: 0
}
}
if (type === 'КУПИТЬ'){
return {
...state,
[ШО]: {...state[ШО], СКОКА: state[ШО].СКОКА - СКОКА},
касса: state[ШО].БАБЛО * СКОКА + state.касса
}
}
return state
}
const store = createStore(reducer)
const unsubscribe1 = store.subscribe(() => console.log('подписчик 1', store.getState()))
const kiosk = store.subscribe(() => createKiosk(store.getState()))
const купиПивасик = СКОКА => ({type: 'КУПИТЬ', ШО: 'пивасик', СКОКА})
const купиЧипсики = СКОКА => ({type: 'КУПИТЬ', ШО: 'чипсики', СКОКА})
const купиСиги = СКОКА => ({type: 'КУПИТЬ', ШО: 'сиги', СКОКА})
const купи = (ШО,СКОКА) => ({type: 'КУПИТЬ', ШО, СКОКА})
store.dispatch(купиЧипсики(0))
store.dispatch(купиПивасик(0))
store.dispatch(купиСиги(0))