index.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document1</title>
  8. <style>
  9. #store {
  10. background-image: url(store_1.jpg);
  11. min-height: 428px;
  12. max-width: 600px;
  13. position: relative;
  14. }
  15. #store__log {
  16. width: 195px;
  17. border: 2px solid red;
  18. position: absolute;
  19. top: 65%;
  20. right: 31%;
  21. display: flex;
  22. flex-direction: column;
  23. }
  24. #tovar__status {
  25. word-break: break-all;
  26. width: 200px;
  27. height: 155px;
  28. border: 2px solid red;
  29. background-color: lightgray;
  30. position: absolute;
  31. right: 31%;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div id="store">
  37. <div id="store__log">
  38. <select name="" id="tovar__select">
  39. <option id="tovar__option" value="пиво">пиво</option>
  40. <option id="tovar__option" value="чипсы">чипсы</option>
  41. <option id="tovar__option" value="сиги">сиги</option>
  42. </select>
  43. <input id="tovar__input" placeholder="скока?" type="number" value="">
  44. <input type="number" id="cash" placeholder="че по бабкам?" value="">
  45. <button id="tovar__btn">Купить</button>
  46. </div>
  47. <div id="tovar__status" style="font-size: 14px; line-height: 14px;"></div>
  48. </div>
  49. <script>
  50. function createStore(reducer) {
  51. let state = reducer(undefined, {}) //undefined
  52. let cbs = []
  53. return {
  54. dispatch(action) { // dispatch – функция, которая вызывает редьюсер передает туда текущее состояние и действие
  55. const newState = reducer(state, action)
  56. if (state !== newState) {
  57. state = newState
  58. cbs.forEach(cb => { cb }); // ()
  59. }
  60. },
  61. subscribe(cb) { // Функция subscribe позволяет подписываться на изменение состояния контейнера
  62. cbs.push(cb)
  63. return () => cbs = cbs.filter(c => c !== cb)
  64. },
  65. getState() {
  66. return state
  67. }
  68. }
  69. }
  70. function reducer(state, { type, шо, скока, бабос }) {
  71. if (state === undefined) {
  72. return {
  73. пиво: { колво: 100, цена: 15 },
  74. чипсы: { колво: 100, цена: 10 },
  75. сиги: { колво: 100, цена: 30 },
  76. касса: 0,
  77. }
  78. } if (скока > state[шо].колво) {
  79. alert(`Столько ${шо} нет в наличии`)
  80. return state
  81. } if (бабос < state[шо].цена * скока) {
  82. alert(`без денег ${шо} не получишь`)
  83. return state
  84. } if (бабос > state[шо].цена) {
  85. let cash = document.getElementById('cash')
  86. cash.value = бабос - state[шо].цена * скока
  87. } if (type === 'КУПИТЬ') {
  88. return {
  89. ...state, // так в редьюсере возвращаются новые данные без изменения старых
  90. касса: state.касса + state[шо].цена * скока,
  91. [шо]: {
  92. колво: state[шо].колво - скока,
  93. цена: state[шо].цена
  94. }
  95. }
  96. } else {
  97. return state
  98. }
  99. }
  100. const store = createStore(reducer)
  101. let select = document.querySelector("#tovar__select")
  102. let input = document.querySelector('#tovar__input')
  103. let button = document.querySelector('#tovar__btn')
  104. let statusDiv = document.querySelector('#tovar__status')
  105. const купи = скока => ({ type: 'КУПИТЬ', шо: `${select.value}`, скока: `${input.value}`, бабос: `${cash.value}` })
  106. statusDiv.innerHTML = `пиво: ${JSON.stringify(store.getState().пиво.колво)} бутылок <br> цена: ${JSON.stringify(store.getState().пиво.цена)} грн/шт <br><br> чипсоны: ${JSON.stringify(store.getState().чипсы.колво)} пачек <br> цена: ${JSON.stringify(store.getState().чипсы.цена)} грн/шт <br><br>сиги: ${JSON.stringify(store.getState().сиги.колво)} пачек <br> цена: ${JSON.stringify(store.getState().сиги.цена)} грн/шт <br><br> (Касса: ${JSON.stringify(store.getState().касса)})`
  107. button.addEventListener('click', function () {
  108. store.dispatch(купи()), store.getState(), statusDiv.innerHTML = `пиво: ${JSON.stringify(store.getState().пиво.колво)} бутылок <br> цена: ${JSON.stringify(store.getState().пиво.цена)} грн/шт <br><br> чипсоны: ${JSON.stringify(store.getState().чипсы.колво)} пачек <br> цена: ${JSON.stringify(store.getState().чипсы.цена)} грн/шт <br><br>сиги: ${JSON.stringify(store.getState().сиги.колво)} пачек <br> цена: ${JSON.stringify(store.getState().сиги.цена)} грн/шт <br><br> (Касса: ${JSON.stringify(store.getState().касса)})`
  109. })
  110. store.subscribe(() => { store.getState() })
  111. </script>
  112. </body>
  113. </html>