import React, { useState } from "react"; type ProfileBalanceCardProps = { contractId: string; orgName: string; contract: string; balance: string; limit: string; limitLeft: string; ordersSum: string; days: string; daysLeft: string; paid: string; inputValue: string; buttonLabel: string; onTopUp: (contractId: string, amount: number) => Promise; isOverLimit?: boolean; isCreatingInvoice?: boolean; }; const ProfileBalanceCard: React.FC = ({ contractId, orgName, contract, balance, limit, limitLeft, ordersSum, days, daysLeft, paid, inputValue, buttonLabel, onTopUp, isOverLimit = false, isCreatingInvoice = false }) => { const [value, setValue] = useState(""); const [editing, setEditing] = useState(false); const [loading, setLoading] = useState(false); const inputRef = React.useRef(null); React.useEffect(() => { if (editing && inputRef.current) { inputRef.current.focus(); } }, [editing]); const handleBlur = () => setEditing(false); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") setEditing(false); }; const handleTopUp = async () => { const amount = parseFloat(value.replace(/[^\d.,]/g, '').replace(',', '.')); if (isNaN(amount) || amount <= 0) { alert('Введите корректную сумму для пополнения'); return; } if (isCreatingInvoice) { return; // Не делаем ничего, если уже создается счет } setLoading(true); try { await onTopUp(contractId, amount); setValue(""); setEditing(false); } catch (error) { console.error('Ошибка пополнения:', error); } finally { setLoading(false); } }; return (
{orgName}
{contract}
Баланс
{balance}
Лимит отсрочки
{limit}
{limitLeft.includes('Не установлен') ? limitLeft : `Осталось ${limitLeft}`}
Сумма заказов
{ordersSum}
{days}
{daysLeft}
Оплачено
{paid}
{editing ? ( setValue(e.target.value)} onBlur={handleBlur} onKeyDown={handleKeyDown} placeholder="Введите сумму пополнения" className="gap-2.5 self-stretch px-6 py-4 w-full text-sm leading-snug bg-white rounded border border-solid border-stone-300 min-h-[52px] text-gray-950 max-md:px-5 outline-none focus:ring-0 focus:border-stone-400 placeholder-neutral-500" /> ) : (
setEditing(true)} > {value || "Введите сумму пополнения"}
)}
{ if (!(loading || isCreatingInvoice || !value.trim())) handleTopUp(); }} onKeyDown={e => { if ((e.key === 'Enter' || e.key === ' ') && !(loading || isCreatingInvoice || !value.trim())) { handleTopUp(); } }} className={`gap-2.5 self-start px-5 py-4 mt-4 text-base font-medium leading-tight text-center text-white whitespace-nowrap rounded-xl min-h-[50px] transition-colors duration-150 ${loading || isCreatingInvoice || !value.trim() ? 'bg-red-300 cursor-not-allowed' : 'bg-red-600 hover:bg-red-700 cursor-pointer'} `} > {isCreatingInvoice ? 'Создаем счет...' : loading ? 'Пополняем...' : buttonLabel}
); }; export default ProfileBalanceCard;