import React, { useCallback, useEffect, useState } from 'react'; import { Box, Row, Icon, StatelessTextInput } from '@tlon/indigo-react'; import { DEFAULT_GAS_PRICE_GWEI } from 'lib/constants'; import useGasPrice from 'lib/useGasPrice'; import Dropdown from './Dropdown'; import './FeeDropdown.scss'; import { defaultGasValues } from 'lib/getSuggestedGasPrice'; const PRICE_LABELS = ['Fast', 'Normal', 'Slow']; export interface GasPriceData { price: number; wait: string; maxFeePerGas: string; // hex maxPriorityFeePerGas: number; suggestedBaseFeePerGas: number; } export const formatDisplay = ({ price, wait }: GasPriceData) => `${price} gwei (${wait} min)`; export default function FeeDropdown({ setGasPrice, }: { setGasPrice: (g: GasPriceData) => void; }) { const { suggestedGasPrices }: { suggestedGasPrices: { fast: GasPriceData, average: GasPriceData, low: GasPriceData, }} = useGasPrice(DEFAULT_GAS_PRICE_GWEI); const [open, setOpen] = useState(false); const [useCustom, setUseCustom] = useState(false); const [custom, setCustom] = useState(); const [selected, setSelected] = useState( suggestedGasPrices.average ); const handleCustom = (e: React.ChangeEvent) => { const cleanedValue = e.target.value.replace(/[^0-9]/g, ''); const cleanedNum = Number(cleanedValue); setCustom(cleanedValue); setGasPrice(defaultGasValues(cleanedNum).average); let customWait = 'Unknown'; const { fast, average, low } = suggestedGasPrices; if (cleanedNum < low.price) { customWait = `> ${low.wait}`; } else if (cleanedNum < average.price) { customWait = `~${low.wait}`; } else if (cleanedNum < fast.price) { customWait = `~${average.wait}`; } else { customWait = `< ${fast.wait}`; } setSelected({ price: cleanedNum, wait: customWait, maxFeePerGas: cleanedNum, maxPriorityFeePerGas: cleanedNum, suggestedBaseFeePerGas: cleanedNum }); }; useEffect(() => { setSelected(suggestedGasPrices.average); }, [suggestedGasPrices]); const selectPrice = useCallback( (value: GasPriceData) => () => { setSelected(value); setGasPrice(value); setOpen(false); }, [setGasPrice, setSelected, setOpen] ); if (useCustom) { return ( { setOpen(true); setUseCustom(false); setCustom(''); }} /> ); } return ( setOpen(!open)}> {Object.values(suggestedGasPrices).map( (value: GasPriceData, ind: number) => ( {PRICE_LABELS[ind]} {formatDisplay(value)} ) )} setUseCustom(true)}> Custom... ); }