src/pages/vaults/_components/commons/VaultTable.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import {
  LoanVaultActive,
  LoanVaultLiquidated,
} from "@defichain/whale-api-client/dist/api/loan";
import { OverflowTable } from "@components/commons/OverflowTable";
import { Link } from "@components/commons/link/Link";
import React from "react";
import { calculateLiquidationValues } from "../../utils/LiquidatedVaultDerivedValues";
import { VaultTableRow } from "./VaultTableRow";

interface VaultTableProps {
  items: Array<LoanVaultActive | LoanVaultLiquidated>;
}

export function VaultTable(props: VaultTableProps): JSX.Element {
  return (
    <OverflowTable>
      <OverflowTable.Header>
        <OverflowTable.Head
          title="Vault ID"
          testId="VaultsTable.VaultID"
          sticky
        />

        <OverflowTable.Head
          title="Status"
          infoDesc={<VaultStatusInfo />}
          testId="VaultsTable.Status"
        />

        <OverflowTable.Head
          alignRight
          title="Loan Taken"
          testId="VaultsTable.Loans"
        />

        <OverflowTable.Head
          alignRight
          title="Loan Value (USD)"
          infoDesc="Loan token(s) and value (in USD) taken by a vault."
          testId="VaultsTable.LoansValue"
        />

        <OverflowTable.Head
          alignRight
          title="Collaterals"
          testId="VaultsTable.Collaterals"
        />

        <OverflowTable.Head
          alignRight
          title="Collateral Value (USD)"
          infoDesc="Value of tokens (in USD) deposited as collateral in a vault."
          testId="VaultsTable.CollateralValue"
        />

        <OverflowTable.Head
          alignRight
          title="Collateralization Ratio / Min."
          infoDesc={<CollateralizationRatioMinInfo />}
          testId="VaultsTable.CollateralizationRatios"
        />
      </OverflowTable.Header>
      {props.items.map((vault) => {
        return (
          <Link
            href={{ pathname: `/vaults/${vault.vaultId}` }}
            key={vault.vaultId}
          >
            <a className="contents">
              <VaultTableRow
                vault={vault}
                liquidatedVaultDerivedValues={calculateLiquidationValues(vault)}
              />
            </a>
          </Link>
        );
      })}
    </OverflowTable>
  );
}

function VaultStatusInfo(): JSX.Element {
  return (
    <div className="p-3 space-y-2 font-normal text-sm bg-white text-left text-gray-900 rounded-lg border border-gray-100 shadow-md max-w-xs dark:bg-gray-800 dark:border-gray-700 dark:text-dark-gray-900">
      <div>
        <span className="font-medium">Empty</span>: When a vault has been
        created but no collateral has been deposited yet.
      </div>
      <div>
        <span className="font-medium">Ready</span>: When collateral has been
        deposited into the vault, but no loan has been taken yet.
      </div>
      <div>
        <span className="font-medium">Active</span>: When a vault's
        collateralization ratio is above its minimum requirement.
      </div>
      <div>
        <span className="font-medium">In Liquidation</span>: When a vault’s
        collateralization ratio falls below the minimum requirement
      </div>
      <div>
        <span className="font-medium">Halted</span>: When any token in the vault
        (collateral or loan tokens) has fluctuated more than 30% in the past
        hour
      </div>
    </div>
  );
}

function CollateralizationRatioMinInfo(): JSX.Element {
  return (
    <div className="px-3 py-3 font-normal text-sm bg-white text-left text-gray-900 rounded-lg border border-gray-100 shadow-md max-w-xs dark:bg-gray-800 dark:border-gray-700 dark:text-dark-gray-900">
      <span className="font-medium">Collateralization Ratio</span>: Percentage
      of collaterals deposited in a vault in relation to the amount of loan
      taken.
      <br />
      <br />
      <span className="font-medium">Min. Collateralization Ratio</span>: Minimum
      required collateral ratio based on vault scheme selected by vault owner.
    </div>
  );
}