src/pages/transactions/_components/DfTx/DfTxSetOracleData.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import { DfTx, SetOracleData } from "@defichain/jellyfish-transaction";
import BigNumber from "bignumber.js";
import { format, fromUnixTime } from "date-fns";

import { AdaptiveList } from "@components/commons/AdaptiveList";
import { AdaptiveTable } from "@components/commons/AdaptiveTable";
import { TokenAmount } from "@defichain/jellyfish-transaction/dist/script/dftx/dftx_price";
import { DfTxHeader } from "./DfTxHeader";

interface DfTxSetOracleDataProps {
  dftx: DfTx<SetOracleData>;
}

export function DfTxSetOracleData(props: DfTxSetOracleDataProps): JSX.Element {
  return (
    <div>
      <DfTxHeader name="Set Oracle Data" />
      <div className="mt-5 flex flex-col space-y-6 items-start lg:flex-row lg:space-x-8 lg:space-y-0">
        <SetOracleDataDetails
          oracleId={props.dftx.data.oracleId}
          timestamp={props.dftx.data.timestamp}
        />
        {props.dftx.data.tokens.length > 0 && (
          <AdaptiveTable className="w-full lg:w-1/2">
            <AdaptiveTable.Header>
              <AdaptiveTable.Head>TOKEN</AdaptiveTable.Head>
              <AdaptiveTable.Head>AMOUNT</AdaptiveTable.Head>
              <AdaptiveTable.Head>CURRENCY</AdaptiveTable.Head>
            </AdaptiveTable.Header>
            {props.dftx.data.tokens.map((tokenPrice) => {
              return tokenPrice.prices.map((price) => {
                return (
                  <SetOracleDataTokenRow
                    token={tokenPrice.token}
                    price={price}
                    key={`${tokenPrice.token}-${price.currency}`}
                  />
                );
              });
            })}
          </AdaptiveTable>
        )}
      </div>
    </div>
  );
}

function SetOracleDataDetails(props: {
  oracleId: string;
  timestamp: BigNumber;
}): JSX.Element {
  return (
    <AdaptiveList className="w-full lg:w-1/2">
      <AdaptiveList.Row
        name="Oracle ID"
        className="break-all"
        testId="DfTxSetOracleData.OracleId"
      >
        {props.oracleId}
      </AdaptiveList.Row>
      <AdaptiveList.Row
        name="Received Time"
        testId="DfTxSetOracleData.Timestamp"
      >
        {format(fromUnixTime(props.timestamp.toNumber()), "PPpp")}
      </AdaptiveList.Row>
    </AdaptiveList>
  );
}

function SetOracleDataTokenRow(props: {
  token: string;
  price: TokenAmount;
}): JSX.Element {
  return (
    <AdaptiveTable.Row className="dark:text-gray-100">
      <AdaptiveTable.Cell title="TOKEN" className="align-middle">
        <div
          className="flex items-center"
          data-testid="DfTxSetOracleData.Token"
        >
          {props.token}
        </div>
      </AdaptiveTable.Cell>
      <AdaptiveTable.Cell title="AMOUNT" className="align-middle">
        <span data-testid="DfTxSetOracleData.Amount">
          {props.price.amount.toFixed(8)}
        </span>
      </AdaptiveTable.Cell>
      <AdaptiveTable.Cell title="CURRENCY" className="align-middle">
        <span data-testid="DfTxSetOracleData.Currency">
          {props.price.currency}
        </span>
      </AdaptiveTable.Cell>
    </AdaptiveTable.Row>
  );
}