Войти Регистрация
Код-ревью

14. Корзина с промокодом

Лёгкая

TypeScript · 39 строк

Компонент корзины: меняет количество товаров, применяет промокод OZON300 (−300 ₽ от суммы больше 300 ₽) и оформляет заказ. Цены приходят в рублях с копейками. Отметьте строки с ошибками.

В работе: Корзина на сайте: последний шаг перед оплатой.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Reactсостояниеденьгидвойная отправка

Источник: на задачах Ozon: корзина и промокоды. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import { useState } from "react";
  2. type Item = { sku: string; title: string; price: number; qty: number };
  3. export function Cart({ initial }: { initial: Item[] }) {
  4. const [items, setItems] = useState(initial);
  5. const [promo, setPromo] = useState("");
  6. const changeQty = (sku: string, delta: number) => {
  7. const item = items.find((i) => i.sku === sku)!;
  8. item.qty += delta;
  9. setItems(items);
  10. };
  11. let total = 0;
  12. for (const i of items) total += i.price * i.qty;
  13. if (promo == "OZON300" && total > 300) total -= 300;
  14. return (
  15. <div>
  16. {items.map((i) => (
  17. <div key={i.sku}>
  18. {i.title}: {i.qty} шт.
  19. <button onClick={() => changeQty(i.sku, -1)}>−</button>
  20. <button onClick={() => changeQty(i.sku, +1)}>+</button>
  21. </div>
  22. ))}
  23. <input value={promo} onChange={(e) => setPromo(e.target.value)} />
  24. <div>Итого: {total} ₽</div>
  25. <button
  26. onClick={() =>
  27. fetch("/api/checkout", { method: "POST", body: JSON.stringify({ items, total }) })
  28. }
  29. >
  30. Оформить
  31. </button>
  32. </div>
  33. );
  34. }