UI / src / components / CurrencyInputPanel / index.tsx
index.tsx
Raw
import { Button } from '@ui/Button/Button';
import Flex from '@ui/Flex/Flex';
import Input from '@ui/Input/Input';

import { CurrencyIcon } from '@components/CurrencyIcon';
import useHasMounted from '@hooks/useHasMounted';
import type { IToken } from '@store/store';
import { searchAtom } from '@store/store';
import { CurrencyInputPanelSkeleton } from '@ui/Skeleton';
import { formatNumber } from '@utils/bignumber';
import { useAtom } from 'jotai';
import React, { useState } from 'react';
import { Modal } from '../Modal/Modal';
import TokenListModal from '../TokenListModal';

interface ICurrencyInputPanel {
  disabled?: boolean;
  setToken: () => void;
  setAmount: React.Dispatch<React.SetStateAction<string | undefined>>;
  selectedCurrency?: IToken;
  currencyBalance?: string;
  amount?: string;
  placeholder?: string;
  tokenList: IToken[];
}

export default function CurrencyInputPanel({
  disabled,
  setToken,
  selectedCurrency,
  currencyBalance,
  setAmount,
  amount,
  tokenList,
  placeholder,
}: ICurrencyInputPanel) {
  const [open, setOpen] = useState(false);
  const [search, setSearch] = useAtom(searchAtom);
  const hasMounted = useHasMounted();

  if (!hasMounted) {
    return <CurrencyInputPanelSkeleton />;
  }

  return (
    <Flex
      direction="column"
      width="full"
      customStyle={`rounded-xl p-4 h-42 space-y-1 bg-gray-800 shadow-3xl`}
    >
      <Flex
        customStyle="text-gray-300 px-2 text-xs font-semibold"
        justifyContent="between"
      >
        <span className="text-wheat-300">
          Balance:{' '}
          {currencyBalance && Number(currencyBalance) > 0
            ? formatNumber(currencyBalance, 5)
            : '0'}
        </span>
        {!disabled && (
          <button
            onClick={
              currencyBalance ? () => setAmount(currencyBalance) : undefined
            }
            className=" text-wheat-300 transition hover:text-wheat-900"
          >
            MAX
          </button>
        )}
      </Flex>
      <Flex justifyContent="between" alignItems="center">
        <Input
          type="text"
          pattern="^[0-9]*[.,]?[0-9]*$"
          autoCorrect="off"
          autoComplete="off"
          spellCheck="false"
          inputMode="decimal"
          placeholder={placeholder}
          disabled={disabled}
          onChange={(e) => setAmount(e.target.value)}
          fontSize="lg"
          value={amount}
        />
        <Button onClick={() => setOpen(true)} intent="wheat">
          {selectedCurrency ? (
            <Flex justifyContent="evenly" alignItems="center">
              <CurrencyIcon
                size="lg"
                detail={selectedCurrency.detail}
                chainId={selectedCurrency.detail?.chainId}
              />
              <h3>{selectedCurrency.detail?.symbol}</h3>
            </Flex>
          ) : (
            'Select'
          )}
        </Button>
        <Modal
          isOpen={open}
          closeOnOverlayClick
          onDismiss={() => setOpen(false)}
        >
          <TokenListModal
            setToken={setToken}
            tokens={tokenList}
            onDismiss={() => setOpen(false)}
            search={search}
            setSearch={setSearch}
            selectedCurrency={selectedCurrency}
          />
        </Modal>
      </Flex>
    </Flex>
  );
}