This commit is contained in:
2026-05-25 15:20:38 +03:00
parent 5e71e8b7c9
commit 91282ba908
11 changed files with 201 additions and 163 deletions

View File

@@ -1,3 +1,4 @@
export const COUNTDOWN_TARGET = new Date('2026-05-21T00:00:00').getTime()
export const USDT_RATE = 80.00
export const GAS_PRICE = 21.00
export const MIN_RUB_AMOUNT = 5000

View File

@@ -3,4 +3,10 @@
font-weight: 700;
font-size: 48px;
margin-top: 16px;
}
@media (max-width: 768px) {
.title {
font-size: clamp(2rem, 6.25vw, 3rem);
}
}

View File

@@ -233,6 +233,12 @@
}
}
@media (max-width: 768px) {
.title {
font-size: clamp(2rem, 6.25vw, 3rem);
}
}
@media (max-width: 640px) {
.wrap {
padding: 0;

View File

@@ -5,12 +5,12 @@ import { usePaymentQuote, usePaymentQuoteByRub, usePaymentConfig, useCreateOrder
import { CommissionPanel } from './CommissionPanel'
import { AgreementCheck } from './AgreementCheck'
import styles from './ConverterSection.module.css'
import { GAS_PRICE } from '@shared/config/constants'
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('1000')
const [rubInputVal, setRubInputVal] = useState(String(MIN_RUB_AMOUNT))
const { data: config } = usePaymentConfig()
@@ -26,6 +26,8 @@ export function ConverterSection() {
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, ''))
}
@@ -70,7 +72,7 @@ export function ConverterSection() {
const isPayDisabled = isUsdtToRub
? (!rubTotal || isPending || !c.agreed)
: (!usdtFromRub || isPending || !c.agreed)
: (!usdtFromRub || isPending || !c.agreed || rubBelowMin)
return (
<div className={styles.wrap}>
@@ -168,7 +170,12 @@ export function ConverterSection() {
RUB
</div>
</div>
{quoteRubError && (
{rubBelowMin && (
<div className={styles.fieldError}>
Минимальная сумма: {MIN_RUB_AMOUNT.toLocaleString('ru-RU')}
</div>
)}
{quoteRubError && !rubBelowMin && (
<div className={styles.fieldError}>
Сумма слишком большая и превышает 600 000
</div>

View File

@@ -101,6 +101,12 @@
margin-bottom: 12px;
}
.fieldError {
margin-top: 8px;
font-size: 13px;
color: var(--error);
}
.fieldLabel {
font-size: 12px;
letter-spacing: 2px;

View File

@@ -1,5 +1,5 @@
import { useState } from 'react'
import { GAS_PRICE, USDT_RATE } from '@shared/config/constants'
import { GAS_PRICE, USDT_RATE, MIN_RUB_AMOUNT } from '@shared/config/constants'
import { useConverter } from '../model/useConverter'
import { progressPercent } from '../model/tiers'
import { usePaymentConfig, usePaymentQuote, usePaymentQuoteByRub } from '@features/payment'
@@ -13,7 +13,7 @@ import { ROUTES } from '@shared/config/routes'
export function Converter() {
const { data: config } = usePaymentConfig()
const [direction, setDirection] = useState<'usdt_to_rub' | 'rub_to_usdt'>('usdt_to_rub')
const [rubInputVal, setRubInputVal] = useState('1000')
const [rubInputVal, setRubInputVal] = useState(String(MIN_RUB_AMOUNT))
const configUsdtRate = Number(config?.usdt_exchange_rate) || USDT_RATE
const gasPriceRub = Number(config?.gas_fee) || GAS_PRICE
@@ -27,7 +27,9 @@ export function Converter() {
const numRubInput = Number.parseFloat(rubInputVal) || 0
const debouncedRub = useDebounce(numRubInput, 400)
const { data: quoteRubToUsdt } = usePaymentQuoteByRub(!isUsdtToRub ? debouncedRub : 0)
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, ''))
@@ -137,6 +139,16 @@ export function Converter() {
<span className={`${styles.currencyIcon} ${styles.currencyRub}`}></span> RUB
</div>
</div>
{rubBelowMin && (
<div className={styles.fieldError}>
Минимальная сумма: {MIN_RUB_AMOUNT.toLocaleString('ru-RU')}
</div>
)}
{quoteRubError && !rubBelowMin && (
<div className={styles.fieldError}>
Сумма слишком большая и превышает 600 000
</div>
)}
</div>
<div className={styles.swapWrap}>