cart.js 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // +сделать отображение всего того, что есть в ларьке (можете хоть витрину нарисовать, если интересно) с количествами;
  2. //+ сделать select для выбора товара и input type = 'number' для выбора количества и кнопку "купить",
  3. // которая посылает action в store используя actionCreator для создания action
  4. // +добавить в reducer проверку на уход в минус, что бы нельзя было продать то, чего нет в должном количестве.
  5. // +добавить в state цену каждого товара и поле касса.Для этого вместо структуры вида пиво: 100 используйте
  6. // пиво: КАКОЙ - ТО ОБЪЕКТ С КОЛИЧЕСТВОМ И СТОИМОСТЬЮ ОДНОЙ ЕДИНИЦЫ.
  7. // +В action добавьте поле "бабло".Всё это пишется в reducer, не забудьте проверки что бабла хватает.
  8. // +добавьте в интерфейс поле для денег.
  9. function reducer(state, { type, ШО, СКОКА, бабло }) { //объект action деструктуризируется на три переменных
  10. if (!state) { //начальная уборка в ларьке:
  11. return {
  12. пиво: { amount: 100, price: 20 },
  13. чипсы: { amount: 100, price: 15 },
  14. сиги: { amount: 100, price: 45 },
  15. касса:0
  16. }
  17. }
  18. if (type === 'КУПИТЬ') {
  19. //если тип action - КУПИТЬ, то:
  20. if ((typeof state[ШО] !== "undefined") && ((СКОКА <= state[ШО]['amount']) && СКОКА > 0) && (бабло >= state[ШО]['price'] * СКОКА)) {
  21. return {
  22. ...state, //берем все что было из ассортимента
  23. [ШО]: { 'amount': state[ШО]['amount'] - СКОКА, 'price': state[ШО]['price'] },
  24. 'касса': state['касса']+state[ШО]['price']*СКОКА
  25. //и уменьшаем то, что покупается на количество
  26. }
  27. }
  28. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  29. }
  30. }
  31. function createStore(reducer){
  32. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  33. let cbs = [] //массив подписчиков
  34. const getState = () => state //функция, возвращающая переменную из замыкания
  35. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  36. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  37. const dispatch = action => {
  38. const newState = reducer(state, action) //пробуем запустить редьюсер
  39. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  40. state = newState //если смог, то обновляем state
  41. for (let cb of cbs) cb() //и запускаем подписчиков
  42. }
  43. }
  44. return {
  45. getState, //добавление функции getState в результирующий объект
  46. dispatch,
  47. subscribe //добавление subscribe в объект
  48. }
  49. }
  50. const store = createStore(reducer);
  51. store.subscribe(() => console.log(store.getState()));
  52. store.subscribe(drawTable);
  53. for ( const item of Object.keys(store.getState())) { laryok.insertAdjacentHTML('beforeend', `<option >${item}</option>`)}
  54. buyButton.onclick = () => {
  55. store.dispatch({ type: "КУПИТЬ", ШО: laryok.value, СКОКА: amount.value, бабло:bablo.value });
  56. }
  57. function drawTable() {
  58. goodsTable.innerHTML = "";
  59. goodsTable.insertAdjacentHTML('beforeend', '<caption><b>Данные о товарах</b></caption><tr><th>Товар</th><th>Кол-во на складе</th><th>Цена</th></tr>');
  60. for (const item of Object.entries(store.getState())) {
  61. if (item[0] !== 'касса') {
  62. const good = document.createElement('tr');
  63. good.innerHTML = `<td>${item[0]}</td><td>${item[1]['amount']}</td><td>${item[1]['price']}</td>`
  64. goodsTable.appendChild(good);
  65. }
  66. }
  67. }
  68. drawTable();