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

View File

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

View File

@@ -3,4 +3,10 @@
font-weight: 700; font-weight: 700;
font-size: 48px; font-size: 48px;
margin-top: 16px; 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) { @media (max-width: 640px) {
.wrap { .wrap {
padding: 0; padding: 0;

View File

@@ -5,12 +5,12 @@ import { usePaymentQuote, usePaymentQuoteByRub, usePaymentConfig, useCreateOrder
import { CommissionPanel } from './CommissionPanel' import { CommissionPanel } from './CommissionPanel'
import { AgreementCheck } from './AgreementCheck' import { AgreementCheck } from './AgreementCheck'
import styles from './ConverterSection.module.css' 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() { export function ConverterSection() {
const c = useConverter({ usdtRate: 0 }) const c = useConverter({ usdtRate: 0 })
const [direction, setDirection] = useState<'usdt_to_rub' | 'rub_to_usdt'>('usdt_to_rub') 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() const { data: config } = usePaymentConfig()
@@ -26,6 +26,8 @@ export function ConverterSection() {
const debouncedRub = useDebounce(numRubInput, 400) const debouncedRub = useDebounce(numRubInput, 400)
const { data: quoteRubToUsdt, isError: quoteRubError } = 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) { function updateRubInput(raw: string) {
setRubInputVal(raw.replace(/[^0-9.]/g, '')) setRubInputVal(raw.replace(/[^0-9.]/g, ''))
} }
@@ -70,7 +72,7 @@ export function ConverterSection() {
const isPayDisabled = isUsdtToRub const isPayDisabled = isUsdtToRub
? (!rubTotal || isPending || !c.agreed) ? (!rubTotal || isPending || !c.agreed)
: (!usdtFromRub || isPending || !c.agreed) : (!usdtFromRub || isPending || !c.agreed || rubBelowMin)
return ( return (
<div className={styles.wrap}> <div className={styles.wrap}>
@@ -168,7 +170,12 @@ export function ConverterSection() {
RUB RUB
</div> </div>
</div> </div>
{quoteRubError && ( {rubBelowMin && (
<div className={styles.fieldError}>
Минимальная сумма: {MIN_RUB_AMOUNT.toLocaleString('ru-RU')}
</div>
)}
{quoteRubError && !rubBelowMin && (
<div className={styles.fieldError}> <div className={styles.fieldError}>
Сумма слишком большая и превышает 600 000 Сумма слишком большая и превышает 600 000
</div> </div>

View File

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

View File

@@ -1,5 +1,5 @@
import { useState } from 'react' 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 { useConverter } from '../model/useConverter'
import { progressPercent } from '../model/tiers' import { progressPercent } from '../model/tiers'
import { usePaymentConfig, usePaymentQuote, usePaymentQuoteByRub } from '@features/payment' import { usePaymentConfig, usePaymentQuote, usePaymentQuoteByRub } from '@features/payment'
@@ -13,7 +13,7 @@ import { ROUTES } from '@shared/config/routes'
export function Converter() { export function Converter() {
const { data: config } = usePaymentConfig() const { data: config } = usePaymentConfig()
const [direction, setDirection] = useState<'usdt_to_rub' | 'rub_to_usdt'>('usdt_to_rub') 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 configUsdtRate = Number(config?.usdt_exchange_rate) || USDT_RATE
const gasPriceRub = Number(config?.gas_fee) || GAS_PRICE const gasPriceRub = Number(config?.gas_fee) || GAS_PRICE
@@ -27,7 +27,9 @@ export function Converter() {
const numRubInput = Number.parseFloat(rubInputVal) || 0 const numRubInput = Number.parseFloat(rubInputVal) || 0
const debouncedRub = useDebounce(numRubInput, 400) 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) { function updateRubInput(raw: string) {
setRubInputVal(raw.replace(/[^0-9.]/g, '')) setRubInputVal(raw.replace(/[^0-9.]/g, ''))
@@ -137,6 +139,16 @@ export function Converter() {
<span className={`${styles.currencyIcon} ${styles.currencyRub}`}></span> RUB <span className={`${styles.currencyIcon} ${styles.currencyRub}`}></span> RUB
</div> </div>
</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>
<div className={styles.swapWrap}> <div className={styles.swapWrap}>