import clsx from 'clsx' import React from 'react' import { useUser } from 'web/hooks/use-user' import { formatMoney } from 'common/util/format' import { Col } from './layout/col' import { SiteLink } from './site-link' import { ENV_CONFIG } from 'common/envs/constants' import { useWindowSize } from 'web/hooks/use-window-size' export function AmountInput(props: { amount: number | undefined onChange: (newAmount: number | undefined) => void error: string | undefined label: string disabled?: boolean className?: string inputClassName?: string // Needed to focus the amount input inputRef?: React.MutableRefObject }) { const { amount, onChange, error, label, disabled, className, inputClassName, inputRef, } = props const onAmountChange = (str: string) => { const amount = parseInt(str.replace(/\D/g, '')) const isInvalid = !str || isNaN(amount) onChange(isInvalid ? undefined : amount) } const { width } = useWindowSize() const isMobile = (width ?? 0) < 768 return ( {error && (
{error === 'Insufficient balance' ? ( <> Not enough funds. Buy more? ) : ( error )}
)} ) } export function BuyAmountInput(props: { amount: number | undefined onChange: (newAmount: number | undefined) => void error: string | undefined setError: (error: string | undefined) => void minimumAmount?: number disabled?: boolean showSliderOnMobile?: boolean className?: string inputClassName?: string // Needed to focus the amount input inputRef?: React.MutableRefObject }) { const { amount, onChange, error, setError, showSliderOnMobile: showSlider, disabled, className, inputClassName, minimumAmount, inputRef, } = props const user = useUser() const onAmountChange = (amount: number | undefined) => { onChange(amount) // Check for errors. if (amount !== undefined) { if (user && user.balance < amount) { setError('Insufficient balance') } else if (minimumAmount && amount < minimumAmount) { setError('Minimum amount: ' + formatMoney(minimumAmount)) } else { setError(undefined) } } else { setError(undefined) } } const parseRaw = (x: number) => { if (x <= 100) return x if (x <= 130) return 100 + (x - 100) * 5 return 250 + (x - 130) * 10 } const getRaw = (x: number) => { if (x <= 100) return x if (x <= 250) return 100 + (x - 100) / 5 return 130 + (x - 250) / 10 } return ( <> {showSlider && ( onAmountChange(parseRaw(parseInt(e.target.value)))} className="range range-lg only-thumb z-40 mb-2 xl:hidden" step="5" /> )} ) }