import { useState } from 'react' import { useConverter, progressPercent } from '@widgets/currency-converter' import { useDebounce } from '@shared/lib/hooks/useDebounce' import { usePaymentQuote, usePaymentQuoteByRub, usePaymentConfig, useCreateOrder } from '@features/payment' import { CommissionPanel } from './CommissionPanel' import { AgreementCheck } from './AgreementCheck' import styles from './ConverterSection.module.css' import { GAS_PRICE, MIN_RUB_AMOUNT } from '@shared/config/constants' export function ConverterSection() { const c = useConverter({ usdtRate: 0 }) const [direction, setDirection] = useState<'usdt_to_rub' | 'rub_to_usdt'>('usdt_to_rub') const [rubInputVal, setRubInputVal] = useState(String(MIN_RUB_AMOUNT)) const { data: config } = usePaymentConfig() const configUsdtRate = Number(config?.usdt_exchange_rate) || 0 const gasPriceRub = Number(config?.gas_fee) || GAS_PRICE const isUsdtToRub = direction === 'usdt_to_rub' const debouncedUsdt = useDebounce(c.numRub, 400) const { data: quoteUsdtToRub, isError: quoteError } = usePaymentQuote(isUsdtToRub ? debouncedUsdt : 0) const numRubInput = Number.parseFloat(rubInputVal) || 0 const debouncedRub = useDebounce(numRubInput, 400) const { data: quoteRubToUsdt, isError: quoteRubError } = usePaymentQuoteByRub(!isUsdtToRub ? debouncedRub : 0) const rubBelowMin = !isUsdtToRub && numRubInput > 0 && numRubInput < MIN_RUB_AMOUNT function updateRubInput(raw: string) { setRubInputVal(raw.replace(/[^0-9.]/g, '')) } function handleSwap() { setDirection(d => d === 'usdt_to_rub' ? 'rub_to_usdt' : 'usdt_to_rub') } const rubTotal = quoteUsdtToRub?.total_price ?? '' const rubTotalNum = Number(rubTotal) || 0 const usdtFromRub = quoteRubToUsdt?.usdt_amount ?? '' const usdtFromRubNum = Number(usdtFromRub) || 0 const commission = isUsdtToRub ? Number(quoteUsdtToRub?.service_fee) || 0 : Number(quoteRubToUsdt?.service_fee) || 0 const displayRubAmount = isUsdtToRub ? rubTotalNum : numRubInput const effectiveRate = isUsdtToRub ? (c.numRub > 0 ? rubTotalNum / c.numRub : 0) : (usdtFromRubNum > 0 ? numRubInput / usdtFromRubNum : 0) const { mutate: submitOrder, isPending } = useCreateOrder() function handlePay() { if (isUsdtToRub) { submitOrder({ usdt_amount: c.numRub, usdt_exchange_rate: 1, gas_fee: 1, total_price: Number(rubTotal) || 0, }) } else { submitOrder({ usdt_amount: usdtFromRubNum, usdt_exchange_rate: 1, gas_fee: 1, total_price: numRubInput, }) } } const isPayDisabled = isUsdtToRub ? (!rubTotal || isPending || !c.agreed) : (!usdtFromRub || isPending || !c.agreed || rubBelowMin) return (

Конвертация

Данные обновляются в реальном времени
Цена газа в RUB {gasPriceRub.toFixed(2)} RUB
USDT/RUB {configUsdtRate.toFixed(2)} ₽
КУПИТЬ
{isUsdtToRub ? ( <>
Конвертируете
c.updateRub(e.target.value)} placeholder="0" inputMode="decimal" />
USDT
{quoteError && (
Сумма слишком большая и превышает 600 000 ₽
)}
Платите
RUB
) : ( <>
Конвертируете
updateRubInput(e.target.value)} placeholder="0" inputMode="decimal" />
RUB
{rubBelowMin && (
Минимальная сумма: {MIN_RUB_AMOUNT.toLocaleString('ru-RU')} ₽
)} {quoteRubError && !rubBelowMin && (
Сумма слишком большая и превышает 600 000 ₽
)}
Платите
USDT
)}
c.setAgreed(!c.agreed)} />
) }