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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/assets/index-DianSEHM.css vendored Normal file

File diff suppressed because one or more lines are too long

153
dist/assets/index-H9RMF-3p.js vendored Normal file

File diff suppressed because one or more lines are too long

4
dist/index.html vendored
View File

@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ЭКСА — Ваш мост в мир цифровых активов</title>
<script type="module" crossorigin src="/assets/index-CaE9L7n1.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-B4e0MRDx.css">
<script type="module" crossorigin src="/assets/index-H9RMF-3p.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DianSEHM.css">
</head>
<body>
<div id="root"></div>

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}>