hw13.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  2. if (!state){
  3. return {
  4. пиво: {
  5. колличество: 100,
  6. цена: 52
  7. },
  8. сиги: {
  9. колличество: 200,
  10. цена: 86
  11. },
  12. чипсы: {
  13. колличество: 50,
  14. цена: 43
  15. },
  16. ЧЕК: 0,
  17. СДАЧА: 0,
  18. КАССА: 0,
  19. }
  20. }
  21. switch({type, ШО, СКОКА, БАБЛО}.type) {
  22. case 'КУПИТЬ':
  23. if (state[ШО].колличество <= СКОКА){
  24. alert(`Товара ${[ШО]} нет в таком колличестве, есть только ${state[ШО].колличество}`)
  25. }
  26. if (БАБЛО < state.ЧЕК ) {
  27. alert(`Не хватает ${state.ЧЕК - БАБЛО}. Приходи, когда будет БАБЛО!`)
  28. }
  29. else {
  30. return {
  31. ...state,
  32. [ШО]: {...state[ШО], колличество: state[ШО].колличество >= СКОКА ? state[ШО].колличество - СКОКА : state[ШО].колличество},
  33. КАССА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? state.ЧЕК : 0,
  34. СДАЧА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? БАБЛО - state.ЧЕК : 0
  35. }
  36. }
  37. case 'СУММА ПОКУПКИ':
  38. return {
  39. ...state,
  40. ЧЕК: state[ШО].цена * СКОКА,
  41. }
  42. default:
  43. return state
  44. }
  45. }
  46. function createStore(reducer){
  47. let state = reducer(undefined, {})
  48. let cbs = []
  49. const getState = () => state
  50. const subscribe = cb => (cbs.push(cb), () => cbs = cbs.filter(c => c !== cb))
  51. const dispatch = action => {
  52. const newState = reducer(state, action)
  53. if (newState !== state){
  54. state = newState
  55. for (let cb of cbs) cb()
  56. }
  57. }
  58. return {
  59. getState,
  60. dispatch,
  61. subscribe
  62. }
  63. }
  64. function createAction (){
  65. return {
  66. type: 'КУПИТЬ',
  67. ШО: selectProduct.value,
  68. СКОКА: +countGoods.value,
  69. БАБЛО: +moneys.value,
  70. }
  71. }
  72. const kiosk = reducer(undefined, {})
  73. const store = createStore(reducer)
  74. for (let i = 0; i < Object.keys(kiosk).length; i ++) {
  75. if (typeof Object.values(kiosk)[i] === 'object') {
  76. selectProduct.appendChild(document.createElement('option')).innerHTML = Object.keys(kiosk)[i]
  77. }
  78. }
  79. beerCount.value = kiosk.пиво.колличество
  80. sigiCount.value = kiosk.сиги.колличество
  81. chipsCount.value = kiosk.чипсы.колличество
  82. store.subscribe( () => beerCount.value = store.getState().пиво.колличество, beer.innerHTML += ` ${store.getState().пиво.цена} UAH/бут.` )
  83. store.subscribe( () => sigiCount.value = store.getState().сиги.колличество, sigi.innerHTML += ` ${store.getState().сиги.цена} UAH/пачку`)
  84. store.subscribe( () => chipsCount.value = store.getState().чипсы.колличество, chips.innerHTML += ` ${store.getState().чипсы.цена} UAH/пачку`)
  85. store.subscribe( () => giveMoney.value = store.getState().ЧЕК)
  86. store.subscribe( () => turningIn.value = store.getState().СДАЧА)
  87. countGoods.oninput = () => {
  88. store.dispatch({...createAction(), type: 'СУММА ПОКУПКИ'})
  89. }
  90. buy.onclick = () => {
  91. store.dispatch(createAction())
  92. console.log(store.getState())
  93. }