main.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. function reducer(state, { type, ШО, СКОКА, БАБЛО }) {
  2. if (!state) {
  3. return {
  4. пиво: {
  5. count: 100,
  6. price: 10
  7. },
  8. чипсы: {
  9. count: 100,
  10. price: 10
  11. },
  12. сиги: {
  13. count: 100,
  14. price: 10
  15. },
  16. касса: 0
  17. }
  18. }
  19. if (type === 'КУПИТЬ' && СКОКА <= state[ШО].count && БАБЛО >= state[ШО].price * СКОКА) {
  20. return {
  21. ...state,
  22. касса: state.касса + state[ШО].price * СКОКА,
  23. [ШО]: { ...state[ШО], count: state[ШО].count - СКОКА }
  24. }
  25. }
  26. return state
  27. }
  28. function createStore(reducer) {
  29. let state = reducer(undefined, {})
  30. let cbs = []
  31. const getState = () => state
  32. const subscribe = cb => (cbs.push(cb),
  33. () => cbs = cbs.filter(c => c !== cb))
  34. const dispatch = action => {
  35. const newState = reducer(state, action)
  36. if (newState !== state) {
  37. state = newState
  38. }
  39. for (let cb of cbs) {
  40. cb()
  41. }
  42. }
  43. return {
  44. getState,
  45. dispatch,
  46. subscribe
  47. }
  48. }
  49. function createTable(obj) {
  50. table.innerText = ''
  51. for (let [key, value] of Object.entries(obj)) {
  52. let tr = document.createElement('tr');
  53. let td = document.createElement('td');
  54. td.innerText = key
  55. tr.append(td);
  56. table.append(tr);
  57. if (typeof value === 'object') {
  58. for (let [key1, value1] of Object.entries(value)) {
  59. let td = document.createElement('td');
  60. td.innerText = key1 + ' : ' + value1;
  61. tr.append(td);
  62. }
  63. } else {
  64. let td = document.createElement('td');
  65. td.innerText = value;
  66. tr.append(td);
  67. }
  68. }
  69. }
  70. const store = createStore(reducer);
  71. createTable(store.getState())
  72. store.subscribe(() => createTable(store.getState()));
  73. btn.onclick = (() => store.dispatch({ type: 'КУПИТЬ', ШО: select.value, СКОКА: sum.value, БАБЛО: money.value }))