convert
This commit is contained in:
1
dist/assets/index-B4e0MRDx.css
vendored
1
dist/assets/index-B4e0MRDx.css
vendored
File diff suppressed because one or more lines are too long
153
dist/assets/index-CaE9L7n1.js
vendored
153
dist/assets/index-CaE9L7n1.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/index-DianSEHM.css
vendored
Normal file
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
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
4
dist/index.html
vendored
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}>
|
||||||
|
|||||||
Reference in New Issue
Block a user