// 3. Исправляем frontend/src/pages/dashboard/billing.tsx import { useState } from 'react'; import axios from 'axios'; import QRCode from 'react-qr-code'; const sbpUrl = import.meta.env.VITE_SBP_QR_URL; const cardNumber = import.meta.env.VITE_CARD_NUMBER; const Billing = () => { const [amount, setAmount] = useState(0); const [isPaymentGenerated, setIsPaymentGenerated] = useState(false); const [copyStatus, setCopyStatus] = useState(''); const [checkFile, setCheckFile] = useState(null); const [checkStatus, setCheckStatus] = useState(''); const [uploadLoading, setUploadLoading] = useState(false); const handleGeneratePayment = () => { if (amount > 0) setIsPaymentGenerated(true); }; const handleCopyCard = () => { if (cardNumber) { navigator.clipboard.writeText(cardNumber); setCopyStatus('Скопировано!'); setTimeout(() => setCopyStatus(''), 2000); } }; const handleCheckUpload = async () => { if (!checkFile || amount <= 0) return; setUploadLoading(true); try { const token = localStorage.getItem('access_token'); const formData = new FormData(); formData.append('file', checkFile); formData.append('amount', String(amount)); const response = await axios.post('https://ospab.host:5000/api/check/upload', formData, { headers: { Authorization: `Bearer ${token}`, // 'Content-Type' не указываем вручную для FormData! }, withCredentials: true, }); setCheckStatus('Чек успешно загружен! Ожидайте проверки.'); setCheckFile(null); console.log('Чек успешно загружен:', response.data); } catch (error) { setCheckStatus('Ошибка загрузки чека.'); console.error('Ошибка загрузки чека:', error); } setUploadLoading(false); }; return (

Пополнение баланса

{/* Только QR-код и карта, без реквизитов */} {!isPaymentGenerated ? (

Пополните свой баланс, чтобы оплачивать услуги. Минимальная сумма пополнения: 1 руб.

setAmount(Number(e.target.value))} className="w-full px-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-ospab-primary" min="1" />
) : (

Для пополнения баланса переведите ₽{amount}.

Ваш заказ будет обработан вручную после проверки чека.

{/* QR-код для оплаты по СБП */}

Оплата по СБП

Отсканируйте QR-код через мобильное приложение вашего банка.

{/* Номер карты с кнопкой копирования */}

Оплата по номеру карты

{cardNumber || '0000 0000 0000 0000'}

{copyStatus &&

{copyStatus}

}
{/* Форма загрузки чека и инструкции */}

Загрузите чек для проверки:

setCheckFile(e.target.files?.[0] || null)} className="mt-2 text-sm w-full" /> {checkStatus &&
{checkStatus}
}

Важно:

После оплаты сделайте скриншот или сохраните чек и загрузите его для проверки.

После подтверждения ваш баланс будет пополнен. Ожидайте проверки чека оператором.

)}
); }; export default Billing;