redux.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. function createStore(reducer){
  2. let state = reducer(undefined, {})
  3. let cbs = []
  4. return {
  5. dispatch(action){
  6. const newState = reducer(state, action)
  7. if (newState !== state){
  8. state = newState
  9. for (let cb of cbs)
  10. cb()
  11. }
  12. },
  13. getState(){
  14. return state
  15. },
  16. subscribe(cb){
  17. cbs.push(cb)
  18. return () => cbs = cbs.filter(c => c !== cb)
  19. }
  20. }
  21. }
  22. function createKiosk(state){
  23. let div = document.getElementById('content')
  24. div.innerHTML = ''
  25. let hello = document.createElement('span')
  26. hello.innerHTML = 'ГАСТРОНОМ "У ЛЮСИ" <br />'
  27. hello.style.color = '#4B0082'
  28. div.appendChild(hello)
  29. let pivo = document.createElement('span')
  30. pivo.innerHTML = `- Пивасик по ${state.пивасик.БАБЛО} грн,\n`
  31. div.appendChild(pivo)
  32. let pivoAmount = document.createElement('span')
  33. pivoAmount.innerHTML = `${state.пивасик.СКОКА}\n банок в наличии<br />`
  34. div.appendChild(pivoAmount)
  35. let chips = document.createElement('span')
  36. chips.innerHTML = `- Чипсики по ${state.чипсики.БАБЛО} грн,\n`
  37. div.appendChild(chips)
  38. let chipsAmount = document.createElement('span')
  39. chipsAmount.innerHTML = `${state.чипсики.СКОКА}\n пачек в наличии<br />`
  40. div.appendChild(chipsAmount)
  41. let cigi = document.createElement('span')
  42. cigi.innerHTML = `- Сиги по ${state.сиги.БАБЛО} грн,\n`
  43. div.appendChild(cigi)
  44. let cigiAmount = document.createElement('span')
  45. cigiAmount.innerHTML = `${state.сиги.СКОКА}\n пачек в наличии<br />`
  46. div.appendChild(cigiAmount)
  47. let kassa = document.createElement('span')
  48. kassa.innerText = `- Бабосиков в кассе: ${state.касса} грн\n`
  49. div.appendChild(kassa)
  50. let select = document.createElement('select')
  51. div.appendChild(select)
  52. let pruduct = document.createElement('option')
  53. pruduct.innerText = 'Выберите товар'
  54. select.appendChild(pruduct)
  55. let pivasik = document.createElement('option')
  56. pivasik.innerText = 'пивасик'
  57. select.appendChild(pivasik)
  58. let chipsiki = document.createElement('option')
  59. chipsiki.innerText = 'чипсики'
  60. select.appendChild(chipsiki)
  61. let cigarette = document.createElement('option')
  62. cigarette.innerText = 'сиги'
  63. select.appendChild(cigarette)
  64. let inputAmount = document.createElement('input')
  65. inputAmount.type = 'number'
  66. inputAmount.min = '1'
  67. div.appendChild(inputAmount)
  68. let button = document.createElement('button')
  69. button.innerText = "Купить"
  70. div.appendChild(button)
  71. button.onclick = () => {
  72. if(state[select.value].СКОКА >= inputAmount.value){
  73. let pieces = inputAmount.value
  74. let price = select.value
  75. store.dispatch(купи(price, pieces))
  76. } else{
  77. alert("А ты не лопнишь, деточка?...ладно, шучу:D - такого количества товара в наличии попросту нет!")
  78. }
  79. }
  80. return state
  81. }
  82. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  83. if (!state){
  84. return {
  85. пивасик: {СКОКА: 100, БАБЛО: 30},
  86. чипсики: {СКОКА: 100, БАБЛО: 20},
  87. сиги: {СКОКА : 100, БАБЛО: 40},
  88. касса: 0
  89. }
  90. }
  91. if (type === 'КУПИТЬ'){
  92. return {
  93. ...state,
  94. [ШО]: {...state[ШО], СКОКА: state[ШО].СКОКА - СКОКА},
  95. касса: state[ШО].БАБЛО * СКОКА + state.касса
  96. }
  97. }
  98. return state
  99. }
  100. const store = createStore(reducer)
  101. const unsubscribe1 = store.subscribe(() => console.log('подписчик 1', store.getState()))
  102. const kiosk = store.subscribe(() => createKiosk(store.getState()))
  103. const купиПивасик = СКОКА => ({type: 'КУПИТЬ', ШО: 'пивасик', СКОКА})
  104. const купиЧипсики = СКОКА => ({type: 'КУПИТЬ', ШО: 'чипсики', СКОКА})
  105. const купиСиги = СКОКА => ({type: 'КУПИТЬ', ШО: 'сиги', СКОКА})
  106. const купи = (ШО,СКОКА) => ({type: 'КУПИТЬ', ШО, СКОКА})
  107. store.dispatch(купиЧипсики(0))
  108. store.dispatch(купиПивасик(0))
  109. store.dispatch(купиСиги(0))