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

6. Компонент истории платежей

Средняя

TypeScript · 45 строк

Компонент показывает платежи клиента с фильтром по категории («ЖКХ», «Связь», «Переводы»). При возврате на вкладку список должен обновляться. Найдите ошибки.

В работе: Раздел «История» в веб-версии банка: клиенты быстро переключают категории.

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

Источник: Сбер: собеседование фронтенд-разработчика, код-ревью компонента. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import { useEffect, useState } from "react";
  2. type Payment = { id: string; title: string; amount: number; date: string };
  3. export function PaymentsHistory({ clientId, category }: { clientId: string; category: string }) {
  4. const [items, setItems] = useState<Payment[]>([]);
  5. const [loading, setLoading] = useState(false);
  6. const [total, setTotal] = useState(0);
  7. useEffect(() => {
  8. setLoading(true);
  9. fetch(`/api/payments?client=${clientId}&category=${category}`)
  10. .then((r) => r.json())
  11. .then((data: Payment[]) => {
  12. setItems(data);
  13. setLoading(false);
  14. });
  15. }, [clientId]);
  16. useEffect(() => {
  17. let sum = 0;
  18. items.forEach((p) => (sum += p.amount));
  19. setTotal(sum);
  20. }, [items]);
  21. useEffect(() => {
  22. const onFocus = () => setItems([...items]);
  23. window.addEventListener("focus", onFocus);
  24. }, []);
  25. if (loading) return <div>Загрузка…</div>;
  26. return (
  27. <section>
  28. <h2>Платежи: {total.toFixed(2)} ₽</h2>
  29. <ul>
  30. {items.map((p, index) => (
  31. <li key={index}>
  32. {p.title} — {p.amount} ₽, {new Date(p.date).toLocaleDateString("ru-RU")}
  33. </li>
  34. ))}
  35. </ul>
  36. </section>
  37. );
  38. }