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();
}}
>
{" "}
{asset.name}
{sliceDecimalString(
asset.balanceOf?.formatted || "0",
10,
true
)}
);
})
) : (
No assets available
)}
{
if (selectModalIsOpen || disabled) return;
handleOpenSelectModal();
}}
>
{selectedAsset ? (
{" "}
{selectedAssetName
?.toLocaleUpperCase()
.slice(0, MAX_TOKEN_NAME_CHAR)}
{selectedAssetName.length > MAX_TOKEN_NAME_CHAR && "..."}
) : (
Select Asset
)}
>
);
}