123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- function reducer(state, {type, ШО, СКОКА, БАБЛО}){
- if (!state){
- return {
- пиво: {
- колличество: 100,
- цена: 52
- },
- сиги: {
- колличество: 200,
- цена: 86
- },
- чипсы: {
- колличество: 50,
- цена: 43
- },
- ЧЕК: 0,
- СДАЧА: 0,
- КАССА: 0,
- }
- }
- switch({type, ШО, СКОКА, БАБЛО}.type) {
- case 'КУПИТЬ':
- if (state[ШО].колличество <= СКОКА){
- alert(`Товара ${[ШО]} нет в таком колличестве, есть только ${state[ШО].колличество}`)
- }
- if (БАБЛО < state.ЧЕК ) {
- alert(`Не хватает ${state.ЧЕК - БАБЛО}. Приходи, когда будет БАБЛО!`)
- }
-
- else {
- return {
- ...state,
- [ШО]: {...state[ШО], колличество: state[ШО].колличество >= СКОКА ? state[ШО].колличество - СКОКА : state[ШО].колличество},
- КАССА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? state.ЧЕК : 0,
- СДАЧА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? БАБЛО - state.ЧЕК : 0
- }
- }
- case 'СУММА ПОКУПКИ':
- return {
- ...state,
- ЧЕК: state[ШО].цена * СКОКА,
- }
- default:
- 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
- }
- }
- function createAction (){
- return {
- type: 'КУПИТЬ',
- ШО: selectProduct.value,
- СКОКА: +countGoods.value,
- БАБЛО: +moneys.value,
- }
- }
- const kiosk = reducer(undefined, {})
- const store = createStore(reducer)
- for (let i = 0; i < Object.keys(kiosk).length; i ++) {
- if (typeof Object.values(kiosk)[i] === 'object') {
- selectProduct.appendChild(document.createElement('option')).innerHTML = Object.keys(kiosk)[i]
- }
- }
- beerCount.value = kiosk.пиво.колличество
- sigiCount.value = kiosk.сиги.колличество
- chipsCount.value = kiosk.чипсы.колличество
- store.subscribe( () => beerCount.value = store.getState().пиво.колличество, beer.innerHTML += ` ${store.getState().пиво.цена} UAH/бут.` )
- store.subscribe( () => sigiCount.value = store.getState().сиги.колличество, sigi.innerHTML += ` ${store.getState().сиги.цена} UAH/пачку`)
- store.subscribe( () => chipsCount.value = store.getState().чипсы.колличество, chips.innerHTML += ` ${store.getState().чипсы.цена} UAH/пачку`)
- store.subscribe( () => giveMoney.value = store.getState().ЧЕК)
- store.subscribe( () => turningIn.value = store.getState().СДАЧА)
- countGoods.oninput = () => {
- store.dispatch({...createAction(), type: 'СУММА ПОКУПКИ'})
- }
- buy.onclick = () => {
- store.dispatch(createAction())
- console.log(store.getState())
- }
- // Store FOOP ===========================================================================================================================================
- // function reducer(state, {type, ШО, СКОКА, БАБЛО}){
- // if (!state){
- // return {
- // пиво: {
- // колличество: 100,
- // цена: 52
- // },
- // сиги: {
- // колличество: 200,
- // цена: 86
- // },
- // чипсы: {
- // колличество: 50,
- // цена: 43
- // },
- // ЧЕК: 0,
- // СДАЧА: 0,
- // КАССА: 0,
- // }
- // }
- // switch({type, ШО, СКОКА, БАБЛО}.type) {
- // case 'КУПИТЬ':
- // if (state[ШО].колличество <= СКОКА){
- // alert(`Товара ${[ШО]} нет в таком колличестве, есть только ${state[ШО].колличество}`)
- // }
- // if (БАБЛО < state.ЧЕК ) {
- // alert(`Не хватает ${state.ЧЕК - БАБЛО}. Приходи, когда будет БАБЛО!`)
- // }
-
- // else {
- // return {
- // ...state,
- // [ШО]: {...state[ШО], колличество: state[ШО].колличество >= СКОКА ? state[ШО].колличество - СКОКА : state[ШО].колличество},
- // КАССА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? state.ЧЕК : 0,
- // СДАЧА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? БАБЛО - state.ЧЕК : 0
- // }
- // }
- // case 'СУММА ПОКУПКИ':
- // return {
- // ...state,
- // ЧЕК: state[ШО].цена * СКОКА,
- // }
- // default:
- // return state
- // }
- // }
- // function CreateStore(reducer){
- // let state = reducer(undefined, {})
- // let cbs = []
-
- // this.getState = () => state
- // this.subscribe = cb => (cbs.push(cb), () => cbs = cbs.filter(c => c !== cb))
- // this.dispatch = action => {
- // const newState = reducer(state, action)
- // if (newState !== state){
- // state = newState
- // for (let cb of cbs) cb()
- // }
- // }
- // }
- // function createAction (){
- // return {
- // type: 'КУПИТЬ',
- // ШО: selectProduct.value,
- // СКОКА: +countGoods.value,
- // БАБЛО: +moneys.value,
- // }
- // }
- // const kiosk = reducer(undefined, {})
- // for (let i = 0; i < Object.keys(kiosk).length; i ++) {
- // if (typeof Object.values(kiosk)[i] === 'object') {
- // selectProduct.appendChild(document.createElement('option')).innerHTML = Object.keys(kiosk)[i]
- // }
- // }
- // beerCount.value = kiosk.пиво.колличество
- // sigiCount.value = kiosk.сиги.колличество
- // chipsCount.value = kiosk.чипсы.колличество
- // const stores = new CreateStore(reducer)
- // stores.subscribe( () => beerCount.value = stores.getState().пиво.колличество, beer.innerHTML += ` ${stores.getState().пиво.цена} UAH/бут.` )
- // stores.subscribe( () => sigiCount.value = stores.getState().сиги.колличество, sigi.innerHTML += ` ${stores.getState().сиги.цена} UAH/пачку`)
- // stores.subscribe( () => chipsCount.value = stores.getState().чипсы.колличество, chips.innerHTML += ` ${stores.getState().чипсы.цена} UAH/пачку`)
- // stores.subscribe( () => giveMoney.value = stores.getState().ЧЕК)
- // stores.subscribe( () => turningIn.value = stores.getState().СДАЧА)
- // countGoods.oninput = () => {
- // stores.dispatch({...createAction(), type: 'СУММА ПОКУПКИ'})
- // }
- // buy.onclick = () => {
- // stores.dispatch(createAction())
- // console.log(stores.getState())
- // }
|