import React from "react"; import { TAsset } from "brahma-templates-sdk"; import { formatUnits, sliceDecimalString } from "@/utils"; import FlexContainer from "../FlexContainer"; import TooltipBox from "../TooltipBox"; import Typography from "../Typography"; import { defaultTheme } from "@/lib"; import TokenInput from "../TokenInput"; import { WalletIcon } from "@/icons"; import useBoolean from "@/hooks/useBoolean"; import Modal from "../Modal"; import Spinner from "../Spinner"; import * as S from "./styles"; const MAX_TOKEN_NAME_CHAR = 7; type SwapInputProps = { inputValue: string; selectedAsset: TAsset | null; getMaxTokenBalanceAvailable: bigint; setSelectedAsset?: (asset: TAsset) => void; setInputValue: (value: string) => void; availableAssets?: TAsset[]; disabled?: boolean; inputDisabled?: boolean; inputLoading?: boolean; shouldAllowMoreThanBalance?: boolean; showInputPresets?: boolean; disabledTooltip?: string; showHandleMaxClick?: boolean; customIcon?: React.ReactNode; }; const GENERIC_URL = "https://brahma-static.s3.us-east-2.amazonaws.com/Asset/AssetGENERIC.svg"; export default function SwapInput({ inputValue, selectedAsset, setInputValue, availableAssets, disabled, setSelectedAsset, inputDisabled, inputLoading, getMaxTokenBalanceAvailable, showInputPresets = false, shouldAllowMoreThanBalance = false, disabledTooltip, showHandleMaxClick = true, customIcon, }: SwapInputProps) { const handlePercentageClick = (percentage: number) => { if (!selectedAsset?.decimals) return; const percentageBigInt = BigInt(Math.round(percentage * 100)); // Convert percentage to BigInt and scale const maxBalanceBigInt = getMaxTokenBalanceAvailable; const valueBigInt = (maxBalanceBigInt * percentageBigInt) / BigInt(10000); // Divide by 10000 to account for scaling setInputValue(formatUnits(valueBigInt, selectedAsset.decimals)); }; const maxBalance = formatUnits( getMaxTokenBalanceAvailable, selectedAsset?.decimals ); const handleMaxClick = () => handlePercentageClick(100); return ( {inputLoading ? ( ) : ( )} {!!customIcon && customIcon} <> {sliceDecimalString(maxBalance, 8, true) || "--"} {showInputPresets && ( <>   handlePercentageClick(25)}> 25%   handlePercentageClick(50)}> 50% )}   {showHandleMaxClick && ( Max )} ); } type InputAssetSelectorProps = { disabled?: boolean; selectedAsset: TAsset | null; filteredAssets: TAsset[]; setSelectedAsset?: (asset: TAsset) => void; }; function InputAssetSelector({ disabled, selectedAsset, setSelectedAsset, filteredAssets, }: InputAssetSelectorProps) { const { value: selectModalIsOpen, setTrue: handleOpenSelectModal, setFalse: handleCloseSelectModal, } = useBoolean(); const selectedAssetName = selectedAsset?.symbol || selectedAsset?.name || ""; return ( <> {filteredAssets.length > 0 ? ( filteredAssets.map((asset) => { return ( { if (!asset || !setSelectedAsset) return; setSelectedAsset(asset); handleCloseSelectModal(); }} > Logo{" "} {asset.name} {sliceDecimalString( asset.balanceOf?.formatted || "0", 10, true )} ); }) ) : ( No assets available )} { if (selectModalIsOpen || disabled) return; handleOpenSelectModal(); }} > {selectedAsset ? ( Logo{" "} {selectedAssetName ?.toLocaleUpperCase() .slice(0, MAX_TOKEN_NAME_CHAR)} {selectedAssetName.length > MAX_TOKEN_NAME_CHAR && "..."} ) : ( Select Asset )} ); }