App.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // общие правила
  2. // * влияние на store (изменение state) происходит через store.dispatch(какой-то экшон криейтор(какие-то параметры))
  3. // * отображение состояния state на экране происходит через store.subscribe(какая-то ваша функция, которая делает
  4. // store.getState() и меняет DOM)
  5. // Менять код createStore не надо
  6. // Задачи
  7. // * сделать отображение всего того, что есть в ларьке (можете хоть витрину нарисовать, если интересно) с количествами;
  8. // * сделать select для выбора товара и input type='number' для выбора количества и кнопку "купить", которая посылает action
  9. // в store используя actionCreator для создания action
  10. // * добавить в reducer проверку на уход в минус, что бы нельзя было продать то, чего нет в должном количестве.
  11. // * добавить в state цену каждого товара и поле касса. Для этого вместо структуры вида beer: 100 используйте beer:
  12. // КАКОЙ-ТО ОБЪЕКТ С КОЛИЧЕСТВОМ И СТОИМОСТЬЮ ОДНОЙ ЕДИНИЦЫ. В action добавьте поле "бабло".
  13. // Всё это пишется в reducer, не забудьте проверки что бабла хватает.
  14. // * добавьте в интерфейс поле для денег.
  15. function reducer(state, { type, obj, amount }) {
  16. if (!state) {
  17. return {
  18. beer: { number: 100, price: 5 },
  19. chips: { number: 50, price: 3 },
  20. smoke: { number: 50, price: 7 },
  21. cash: { cashbox: 0, mycash: 100 }
  22. }
  23. }
  24. if (type === 'BUY') {
  25. if ((state[obj].number) >= 0 && state.cash.mycash - state[obj].price * amount >= 0) {
  26. if ((amount >= 0)) {
  27. return {
  28. ...state,
  29. [obj]: { ...state[obj], number: state[obj].number - amount },
  30. cash: {
  31. mycash: state.cash.mycash - state[obj].price * amount,
  32. cashbox: state.cash.cashbox + state[obj].price * amount
  33. }
  34. }
  35. }
  36. if (amount < 0){
  37. return{
  38. ...state, cashbox: state.cashbox * 0
  39. }
  40. }
  41. }
  42. }
  43. return state
  44. }
  45. function createStore(reducer) {
  46. let state = reducer(undefined, {})
  47. let cbs = []
  48. const getState = () => state
  49. const subscribe = cb => (cbs.push(cb),
  50. () => 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. const store = createStore(reducer)
  65. console.log(store.getState())
  66. let productN = document.getElementById("product");
  67. let numberN = document.getElementById("number");
  68. let buttonN = document.getElementById("button");
  69. let pivoN = document.getElementById("pivo").innerHTML = store.getState().beer.number
  70. let chipsN = document.getElementById("chips").innerHTML = store.getState().chips.number
  71. let sigiN = document.getElementById("sigi").innerHTML = store.getState().smoke.number
  72. let pivoM = document.getElementById("pivoK").innerHTML = store.getState().beer.price + '$'
  73. let chipsM = document.getElementById("chipsK").innerHTML = store.getState().chips.price + '$'
  74. let sigiM = document.getElementById("sigiK").innerHTML = store.getState().smoke.price + '$'
  75. let kassaN = document.getElementById("kassa").innerHTML = store.getState().cash.cashbox + '$'
  76. let moneyN = document.getElementById("money").innerHTML = store.getState().cash.mycash + '$'
  77. buttonN.onclick = () => {
  78. store.dispatch({ type: 'BUY', obj: productN.value, amount: numberN.value })
  79. let pivoN = document.getElementById("pivo").innerHTML = store.getState().beer.number
  80. let chipsN = document.getElementById("chips").innerHTML = store.getState().chips.number
  81. let sigiN = document.getElementById("sigi").innerHTML = store.getState().smoke.number
  82. let kassaN = document.getElementById("kassa").innerHTML = store.getState().cash.cashbox + '$'
  83. let moneyN = document.getElementById("money").innerHTML = store.getState().cash.mycash + '$'
  84. }