main.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. function createStore(reducer){
  2. let state = reducer(undefined, {})
  3. let cbs = []
  4. const getState = () => state
  5. const subscribe = cb => (cbs.push(cb),
  6. () => cbs = cbs.filter(c => c !== cb))
  7. const dispatch = action => {
  8. const newState = reducer(state, action)
  9. if (newState !== state){
  10. state = newState
  11. for (let cb of cbs) cb()
  12. }
  13. }
  14. return {
  15. getState,
  16. dispatch,
  17. subscribe
  18. }
  19. }
  20. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  21. if (!state){
  22. return {
  23. goods: {пиво: {count: 100, price: 35},
  24. чипсы: {count: 100, price: 25},
  25. сиги: {count: 100, price: 50}
  26. },
  27. cash: 0
  28. }
  29. }
  30. if (type === 'КУПИТЬ' && ШО in state.goods && БАБЛО >= state.goods[ШО].price * СКОКА && (СКОКА <= state.goods[ШО].count && СКОКА > 0)){
  31. return {
  32. ...state,
  33. goods: {...state.goods, [ШО]: {...state.goods[ШО], count: state.goods[ШО].count - СКОКА}},
  34. cash: state.cash + БАБЛО
  35. }
  36. }
  37. return state
  38. }
  39. const actionCreatorBuy = (шо, скока, бабло) => {
  40. return ({
  41. type: 'КУПИТЬ',
  42. ШО: шо,
  43. СКОКА: скока,
  44. БАБЛО: бабло
  45. })
  46. }
  47. const showQuantity = () => {
  48. beerQuantity.innerText = store.getState().goods.пиво.count
  49. chipsQuantity.innerText = store.getState().goods.чипсы.count
  50. cigsQuantity.innerText = store.getState().goods.сиги.count
  51. }
  52. const showImages = () => {
  53. showcase.innerHTML = ''
  54. let beerImg = document.createElement('img')
  55. let beerQuantity = store.getState().goods.пиво.count
  56. if (beerQuantity >= 80) {
  57. beerImg.src = 'images/beerMany.jpg'
  58. } else if (beerQuantity >= 40) {
  59. beerImg.src = 'images/beerMiddle.png'
  60. } else if (beerQuantity > 0) {
  61. beerImg.src = 'images/beerLittle.jpg'
  62. } else if (beerQuantity === 0) {
  63. beerImg.src = 'images/beerNone.jpg'
  64. }
  65. let chipsImg = document.createElement('img')
  66. let chipsQuantity = store.getState().goods.чипсы.count
  67. if (chipsQuantity >= 80) {
  68. chipsImg.src = 'images/chipsMany.jpg'
  69. } else if (chipsQuantity >= 40) {
  70. chipsImg.src = 'images/chipsMiddle.jpg'
  71. } else if (chipsQuantity > 0) {
  72. chipsImg.src = 'images/chipsLittle.png'
  73. } else if (chipsQuantity === 0) {
  74. chipsImg.src = 'images/chipsNone.jpg'
  75. }
  76. let cigsImg = document.createElement('img')
  77. let cigsQuantity = store.getState().goods.сиги.count
  78. if (cigsQuantity >= 80) {
  79. cigsImg.src = 'images/cigsMany.jpg'
  80. } else if (cigsQuantity >= 40) {
  81. cigsImg.src = 'images/cigsMiddle.jpg'
  82. } else if (cigsQuantity > 0) {
  83. cigsImg.src = 'images/cigsLittle.jpg'
  84. } else if (cigsQuantity === 0) {
  85. cigsImg.src = 'images/cigsNone.jpg'
  86. }
  87. let nothingLeftImg = document.createElement('img')
  88. nothingLeftImg.src = 'images/nothing.jpg'
  89. if(beerQuantity === 0 && chipsQuantity === 0 && cigsQuantity === 0) {
  90. showcase.append(nothingLeftImg)
  91. } else {
  92. showcase.append(beerImg, chipsImg, cigsImg)
  93. }
  94. }
  95. const store = createStore(reducer)
  96. showQuantity()
  97. showImages()
  98. for (let [good, {price}] of Object.entries(store.getState().goods)) {
  99. let row = document.createElement('tr')
  100. let cell = document.createElement('td')
  101. let priceCell = document.createElement('td')
  102. cell.innerText = good
  103. priceCell.innerText = price
  104. row.append(cell, priceCell)
  105. pricelist.append(row)
  106. }
  107. for (let good of Object.keys(store.getState().goods)) {
  108. let option = document.createElement('option')
  109. option.value = good
  110. option.innerText = good
  111. goods.append(option)
  112. }
  113. buy.onclick = () => {
  114. store.dispatch(actionCreatorBuy(goods.value, quantity.value, +money.value))
  115. }
  116. store.subscribe(() => console.log(store.getState()))
  117. store.subscribe(() => {quantity.value = '', money.value = ''})
  118. store.subscribe(showQuantity)
  119. store.subscribe(showImages)