redux.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 createDom (state) {
  23. let content = document.getElementById('content')
  24. content.innerHTML = ''
  25. let spanBeerAmount = document.createElement('span')
  26. spanBeerAmount = `Цена - ${state.пиво.БАБЛО} грн | В наличии:${state.пиво.СКОКА} шт.`
  27. let spanImgBeer = document.createElement('span')
  28. let imgBeer = document.createElement('img')
  29. imgBeer.src = "https://www.meme-arsenal.com/memes/a47737a30a10732b77d522f44f43ea3d.jpg"
  30. spanImgBeer.append(imgBeer)
  31. imgBeer.style.width = '200px'
  32. content.append(spanImgBeer)
  33. content.append(spanBeerAmount)
  34. let spanChipsAmount = document.createElement('span')
  35. spanChipsAmount = `Цена = ${state.чипсы.БАБЛО} грн | В наличии: ${state.чипсы.СКОКА} пачек`
  36. let spanImgChips = document.createElement('span')
  37. spanImgChips.style.marginLeft = '50px'
  38. let imgChips = document.createElement('img')
  39. imgChips.src = "chips.png"
  40. imgChips.style.width = '150px'
  41. imgChips.style.marginRight = '30px'
  42. spanImgChips.append(imgChips)
  43. content.append(spanImgChips)
  44. content.append(spanChipsAmount)
  45. let spanCigarettesAmount = document.createElement('span')
  46. spanCigarettesAmount = `Цена: ${state.сиги.БАБЛО} грн | В наличии: ${state.сиги.СКОКА} пачек`
  47. let spanImgCigarettes = document.createElement('span')
  48. let imgCigarettes = document.createElement('img')
  49. imgCigarettes.src = 'cigi.png'
  50. imgCigarettes.style.width = '200px'
  51. spanImgCigarettes.style.marginLeft = '10px'
  52. spanImgCigarettes.append(imgCigarettes)
  53. content.append(spanImgCigarettes)
  54. content.append(spanCigarettesAmount)
  55. let cashbox = document.createElement('span')
  56. let cashboxImg = document.createElement('img')
  57. cashboxImg.src = "kassa.png"
  58. cashboxImg.style.width = '200px'
  59. cashboxImg.style.position = 'relative'
  60. cashboxImg.style.top = '60px'
  61. cashboxImg.style.left = '50px'
  62. cashbox.style.position = 'relative'
  63. cashbox.style.top = '5px'
  64. cashbox.style.left = '100px'
  65. cashbox.innerHTML = `В кассе: ${state.касса} грн. `
  66. content.append(cashboxImg)
  67. content.append(cashbox)
  68. let btnCashbox = document.createElement('button')
  69. btnCashbox.innerHTML = "Посмотреть сколько в кассе"
  70. btnCashbox.style.marginLeft = '80px'
  71. content.append(btnCashbox)
  72. let btnHidden = document.createElement('button')
  73. btnHidden.hidden = true
  74. btnHidden.innerHTML = 'Скрыть'
  75. btnHidden.style.position = 'relative'
  76. btnHidden.style.top = '40px'
  77. btnHidden.style.left = '20px'
  78. content.append(btnHidden)
  79. cashbox.hidden = true
  80. btnCashbox.hidden = false
  81. btnCashbox.onclick = () => {
  82. alert ("Только для продавщицы!!!")
  83. let password = prompt('Введите пароль для продавщицы')
  84. if (password == 'qwerty'){
  85. cashbox.hidden = false
  86. btnCashbox.hidden = true
  87. btnHidden.hidden = false}
  88. else {
  89. alert ("Куда лезешь?")
  90. }
  91. }
  92. btnHidden.onclick = () => {
  93. cashbox.hidden = true
  94. btnCashbox.hidden = false
  95. btnHidden.hidden = true
  96. }
  97. let selectProducts = document.createElement('select')
  98. content.append(selectProducts)
  99. selectProducts.style.marginLeft = '300px'
  100. let option = document.createElement('option')
  101. option.innerHTML = 'Выберите продукт'
  102. selectProducts.append(option)
  103. let inputAmount = document.createElement('input')
  104. inputAmount.type = 'number'
  105. content.append(inputAmount)
  106. inputAmount.style.marginLeft = '20px'
  107. inputAmount.placeholder = 'Количество товара'
  108. let beer = document.createElement('option')
  109. beer.innerHTML = 'пиво'
  110. selectProducts.append(beer)
  111. let chips = document.createElement('option')
  112. chips.innerHTML = 'чипсы'
  113. selectProducts.append(chips)
  114. let cigarettes = document.createElement('option')
  115. cigarettes.innerHTML = 'сиги'
  116. selectProducts.append(cigarettes)
  117. let btn = document.createElement('button')
  118. content.append(btn)
  119. btn.innerHTML = 'Купить'
  120. btn.style.marginLeft = '20px'
  121. btn.onclick = () => {
  122. if(state[selectProducts.value].СКОКА >= inputAmount.value){
  123. let amount = inputAmount.value
  124. let selectNum = selectProducts.value
  125. store.dispatch(купиШото(amount,selectNum))
  126. }
  127. else {
  128. alert('В наличие столько нету!')
  129. }
  130. }
  131. return state
  132. }
  133. function reducer(state, {type, ШО, СКОКА,БАБЛО}){
  134. if (!state){
  135. return {
  136. пиво: {СКОКА:100,БАБЛО:60},
  137. чипсы: {СКОКА:100,БАБЛО:30},
  138. сиги: {СКОКА:100 , БАБЛО:50},
  139. касса: 0
  140. }
  141. }
  142. if (type === 'КУПИТЬ'){
  143. return {
  144. ...state,
  145. [ШО]: {...state[ШО], СКОКА: state[ШО].СКОКА - СКОКА },
  146. касса: state[ШО].БАБЛО * СКОКА + state.касса
  147. }
  148. }
  149. return state
  150. }
  151. const store = createStore(reducer)
  152. const unsubscribe2 = store.subscribe(() => console.log('подписчик 2', store.getState()))
  153. const shop = store.subscribe(() => createDom(store.getState()))
  154. const купиПиво = СКОКА => ({type: 'КУПИТЬ', ШО: "пиво", СКОКА})
  155. const купиЧипсы = СКОКА => ({type: 'КУПИТЬ', ШО: "чипсы", СКОКА})
  156. const купиСиги = СКОКА => ({type: 'КУПИТЬ', ШО: "сиги", СКОКА})
  157. const купиШото = (СКОКА,ШО) => ({type: 'КУПИТЬ', ШО, СКОКА})
  158. store.dispatch(купиПиво(0))
  159. store.dispatch(купиЧипсы(0))
  160. store.dispatch(купиСиги(0))