hw13.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. }
  94. // Store FOOP ===========================================================================================================================================
  95. // function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  96. // if (!state){
  97. // return {
  98. // пиво: {
  99. // колличество: 100,
  100. // цена: 52
  101. // },
  102. // сиги: {
  103. // колличество: 200,
  104. // цена: 86
  105. // },
  106. // чипсы: {
  107. // колличество: 50,
  108. // цена: 43
  109. // },
  110. // ЧЕК: 0,
  111. // СДАЧА: 0,
  112. // КАССА: 0,
  113. // }
  114. // }
  115. // switch({type, ШО, СКОКА, БАБЛО}.type) {
  116. // case 'КУПИТЬ':
  117. // if (state[ШО].колличество <= СКОКА){
  118. // alert(`Товара ${[ШО]} нет в таком колличестве, есть только ${state[ШО].колличество}`)
  119. // }
  120. // if (БАБЛО < state.ЧЕК ) {
  121. // alert(`Не хватает ${state.ЧЕК - БАБЛО}. Приходи, когда будет БАБЛО!`)
  122. // }
  123. // else {
  124. // return {
  125. // ...state,
  126. // [ШО]: {...state[ШО], колличество: state[ШО].колличество >= СКОКА ? state[ШО].колличество - СКОКА : state[ШО].колличество},
  127. // КАССА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? state.ЧЕК : 0,
  128. // СДАЧА: БАБЛО >= state.ЧЕК && state[ШО].колличество >= СКОКА ? БАБЛО - state.ЧЕК : 0
  129. // }
  130. // }
  131. // case 'СУММА ПОКУПКИ':
  132. // return {
  133. // ...state,
  134. // ЧЕК: state[ШО].цена * СКОКА,
  135. // }
  136. // default:
  137. // return state
  138. // }
  139. // }
  140. // function CreateStore(reducer){
  141. // let state = reducer(undefined, {})
  142. // let cbs = []
  143. // this.getState = () => state
  144. // this.subscribe = cb => (cbs.push(cb), () => cbs = cbs.filter(c => c !== cb))
  145. // this.dispatch = action => {
  146. // const newState = reducer(state, action)
  147. // if (newState !== state){
  148. // state = newState
  149. // for (let cb of cbs) cb()
  150. // }
  151. // }
  152. // }
  153. // function createAction (){
  154. // return {
  155. // type: 'КУПИТЬ',
  156. // ШО: selectProduct.value,
  157. // СКОКА: +countGoods.value,
  158. // БАБЛО: +moneys.value,
  159. // }
  160. // }
  161. // const kiosk = reducer(undefined, {})
  162. // for (let i = 0; i < Object.keys(kiosk).length; i ++) {
  163. // if (typeof Object.values(kiosk)[i] === 'object') {
  164. // selectProduct.appendChild(document.createElement('option')).innerHTML = Object.keys(kiosk)[i]
  165. // }
  166. // }
  167. // beerCount.value = kiosk.пиво.колличество
  168. // sigiCount.value = kiosk.сиги.колличество
  169. // chipsCount.value = kiosk.чипсы.колличество
  170. // const stores = new CreateStore(reducer)
  171. // stores.subscribe( () => beerCount.value = stores.getState().пиво.колличество, beer.innerHTML += ` ${stores.getState().пиво.цена} UAH/бут.` )
  172. // stores.subscribe( () => sigiCount.value = stores.getState().сиги.колличество, sigi.innerHTML += ` ${stores.getState().сиги.цена} UAH/пачку`)
  173. // stores.subscribe( () => chipsCount.value = stores.getState().чипсы.колличество, chips.innerHTML += ` ${stores.getState().чипсы.цена} UAH/пачку`)
  174. // stores.subscribe( () => giveMoney.value = stores.getState().ЧЕК)
  175. // stores.subscribe( () => turningIn.value = stores.getState().СДАЧА)
  176. // countGoods.oninput = () => {
  177. // stores.dispatch({...createAction(), type: 'СУММА ПОКУПКИ'})
  178. // }
  179. // buy.onclick = () => {
  180. // stores.dispatch(createAction())
  181. // console.log(stores.getState())
  182. // }