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

25. Форма перевода по номеру телефона

Средняя

TypeScript · 48 строк

Форма перевода по номеру телефона через СБП: по номеру подгружается список банков получателя, комиссия 0,5 % со всей суммы, если перевод больше 100 000 ₽. Сервер на успешный перевод отвечает 201 Created.

Отметьте строки с ошибками.

В работе: Переводы по номеру телефона — самая частая операция в веб-банке.

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

Источник: на задачах Альфа-Банка: переводы через СБП. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import { useEffect, useState } from "react";
  2. type Bank = { id: string; name: string };
  3. export function PhoneTransferForm({ balance }: { balance: number }) {
  4. const [phone, setPhone] = useState("");
  5. const [amount, setAmount] = useState("");
  6. const [banks, setBanks] = useState<Bank[]>([]);
  7. const [bankId, setBankId] = useState("");
  8. const [status, setStatus] = useState("");
  9. useEffect(() => {
  10. fetch(`/api/sbp/banks?phone=${phone}`)
  11. .then((r) => r.json())
  12. .then(setBanks);
  13. });
  14. const sum = parseFloat(amount);
  15. const fee = sum > 100000 ? sum * 0.005 : 0;
  16. async function submit() {
  17. if (sum > balance) {
  18. setStatus("Недостаточно средств");
  19. return;
  20. }
  21. localStorage.setItem("lastTransfer", JSON.stringify({ phone, amount }));
  22. const r = await fetch("/api/sbp/transfer", {
  23. method: "POST",
  24. headers: { "Content-Type": "application/json" },
  25. body: JSON.stringify({ phone, amount: sum, bankId }),
  26. });
  27. setStatus(r.status === 200 ? "Перевод отправлен" : "Ошибка");
  28. }
  29. return (
  30. <form onSubmit={submit}>
  31. <input value={phone} onChange={(e) => setPhone(e.target.value)} placeholder="+7 900 000-00-00" />
  32. <input value={amount} onChange={(e) => setAmount(e.target.value)} />
  33. <select value={bankId} onChange={(e) => setBankId(e.target.value)}>
  34. {banks.map((b) => (
  35. <option key={b.id} value={b.id}>{b.name}</option>
  36. ))}
  37. </select>
  38. <div>Комиссия: {fee} ₽</div>
  39. <button type="submit">Перевести</button>
  40. </form>
  41. );
  42. }