Skip to content

Commit

Permalink
refactor: common assets columns, #5180
Browse files Browse the repository at this point in the history
  • Loading branch information
leocs2417 committed Dec 11, 2024
1 parent 0763b14 commit 4ee2bc7
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 160 deletions.
167 changes: 13 additions & 154 deletions packages/next-common/components/assets/assetsList.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
import { useState } from "react";
import { AssetIconPlaceholder, SystemTransfer } from "@osn/icons/subsquare";
import { SystemTransfer } from "@osn/icons/subsquare";
import ScrollerX from "next-common/components/styled/containers/scrollerX";
import { MapDataList } from "next-common/components/dataList";
import BigNumber from "bignumber.js";
import ListButton from "next-common/components/styled/listButton";
import useKnownAssetHubAssetIcon, {
useNativeTokenIcon,
} from "next-common/components/assets/known";
import BalanceDisplay from "./balanceDisplay";
import { isNil } from "lodash-es";
import Tooltip from "../tooltip";
import dynamicPopup from "next-common/lib/dynamic/popup";
import useSubAssetBalance, {
useQueryAddressAssets,
} from "next-common/components/assets/useSubAssetBalance";
import { useQueryAddressAssets } from "next-common/components/assets/useSubAssetBalance";
import {
colToken,
colId,
colName,
useColTotal,
useColTransferrable,
} from "next-common/components/assets/common/columns";

const AssetTransferPopup = dynamicPopup(() => import("./transferPopup"));

Expand Down Expand Up @@ -43,146 +42,6 @@ function TransferButton({ asset }) {
);
}

export function TokenSymbol({ type, assetId, symbol }) {
const NativeAssetIcon = useNativeTokenIcon();
const Icon = useKnownAssetHubAssetIcon(assetId);
let AssetIcon = NativeAssetIcon;
if (type !== "native") {
AssetIcon = Icon || AssetIconPlaceholder;
}

return (
<div className="flex gap-[8px] items-center text14Medium text-textPrimary">
<AssetIcon width={24} height={24} /> {symbol}
</div>
);
}

export function formatBalance(balance, decimals) {
return new BigNumber(balance)
.div(Math.pow(10, decimals))
.decimalPlaces(4, BigNumber.ROUND_FLOOR)
.toFormat({ decimalSeparator: ".", groupSeparator: ",", groupSize: 3 });
}

export function paddingDecimals(value, decimals) {
const [integerPart, fractionalPart = ""] = value.split(".");
if (fractionalPart.length < decimals) {
return `${integerPart}.${fractionalPart.padEnd(decimals, "0")}`;
}
return value;
}

export const colToken = {
name: "Token",
style: { textAlign: "left", width: "160px", minWidth: "160px" },
render: (item) => (
<TokenSymbol
key="token"
type={item.type}
assetId={item.assetId}
symbol={item.symbol}
/>
),
};

export const colId = {
name: "ID",
style: { textAlign: "left", width: "120px", minWidth: "120px" },
render: (item) => (
<span className="text14Medium text-textTertiary">
{isNil(item.assetId) ? "-" : `#${item.assetId}`}
</span>
),
};

export const colName = {
name: "Name",
style: { textAlign: "left", minWidth: "256px" },
render: (item) => (
<div
key="name"
className="text14Medium text-textTertiary truncate max-w-[240px]"
>
{item.name}
</div>
),
};

function TotalBalance({ item, address }) {
const { result } = useSubAssetBalance(item.assetId, address);

return (
<span className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(
result?.balance || item?.balance || 0,
item.decimals,
)}
/>
</span>
);
}

function TransferrableBalance({ item, address }) {
const { result } = useSubAssetBalance(item.assetId, address);

return (
<span key="transferrable" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(
result?.transferrable || item.transferrable || 0,
item.decimals,
)}
/>
</span>
);
}

export function useColTotal(address) {
return {
name: "Total",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<TotalBalance key="total" item={item} address={address} />
),
};
}

export function useColTransferrable(address) {
return {
name: "Transferrable",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => <TransferrableBalance item={item} address={address} />,
};
}

// TODO: remove (profile page & native asset)
export const colTotal = {
name: "Total",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<span key="total" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(item.balance || 0, item.decimals)}
/>
</span>
),
};

// TODO: remove (profile page & native asset)
export const colTransferrable = {
name: "Transferrable",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<span key="transferrable" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(item.transferrable || 0, item.decimals)}
/>
</span>
),
};

export const colTransfer = {
name: "",
style: { textAlign: "right", width: "80px", minWidth: "80px" },
Expand All @@ -191,15 +50,15 @@ export const colTransfer = {

export default function AssetsList({ address }) {
const { loading, assets } = useQueryAddressAssets(address);
const totalBalance = useColTotal(address);
const transferrableBalance = useColTransferrable(address);
const colTotal = useColTotal(address);
const colTransferrable = useColTransferrable(address);

const columnsDef = [
colToken,
colId,
colName,
totalBalance,
transferrableBalance,
colTotal,
colTransferrable,
colTransfer,
];

Expand Down
131 changes: 131 additions & 0 deletions packages/next-common/components/assets/common/columns.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import { AssetIconPlaceholder } from "@osn/icons/subsquare";
import useKnownAssetHubAssetIcon, {
useNativeTokenIcon,
} from "next-common/components/assets/known";
import BalanceDisplay from "next-common/components/assets/balanceDisplay";
import { isNil } from "lodash-es";
import useSubAssetBalance from "next-common/components/assets/useSubAssetBalance";
import { formatBalance } from "./index";

export function TokenSymbol({ type, assetId, symbol }) {
const NativeAssetIcon = useNativeTokenIcon();
const Icon = useKnownAssetHubAssetIcon(assetId);
let AssetIcon = NativeAssetIcon;
if (type !== "native") {
AssetIcon = Icon || AssetIconPlaceholder;
}

return (
<div className="flex gap-[8px] items-center text14Medium text-textPrimary">
<AssetIcon width={24} height={24} /> {symbol}
</div>
);
}

export const colToken = {
name: "Token",
style: { textAlign: "left", width: "160px", minWidth: "160px" },
render: (item) => (
<TokenSymbol
key="token"
type={item.type}
assetId={item.assetId}
symbol={item.symbol}
/>
),
};

export const colId = {
name: "ID",
style: { textAlign: "left", width: "120px", minWidth: "120px" },
render: (item) => (
<span className="text14Medium text-textTertiary">
{isNil(item.assetId) ? "-" : `#${item.assetId}`}
</span>
),
};

export const colName = {
name: "Name",
style: { textAlign: "left", minWidth: "256px" },
render: (item) => (
<div
key="name"
className="text14Medium text-textTertiary truncate max-w-[240px]"
>
{item.name}
</div>
),
};

function TotalBalance({ item, address }) {
const { result } = useSubAssetBalance(item.assetId, address);

return (
<span className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(
result?.balance || item?.balance || 0,
item.decimals,
)}
/>
</span>
);
}

function TransferrableBalance({ item, address }) {
const { result } = useSubAssetBalance(item.assetId, address);

return (
<span key="transferrable" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(
result?.transferrable || item.transferrable || 0,
item.decimals,
)}
/>
</span>
);
}

export function useColTotal(address) {
return {
name: "Total",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<TotalBalance key="total" item={item} address={address} />
),
};
}

export function useColTransferrable(address) {
return {
name: "Transferrable",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => <TransferrableBalance item={item} address={address} />,
};
}

export const colTotal = {
name: "Total",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<span key="total" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(item.balance || 0, item.decimals)}
/>
</span>
),
};

export const colTransferrable = {
name: "Transferrable",
style: { textAlign: "right", width: "160px", minWidth: "160px" },
render: (item) => (
<span key="transferrable" className="text14Medium text-textPrimary">
<BalanceDisplay
balance={formatBalance(item.transferrable || 0, item.decimals)}
/>
</span>
),
};
8 changes: 8 additions & 0 deletions packages/next-common/components/assets/common/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import BigNumber from "bignumber.js";

export function formatBalance(balance, decimals) {
return new BigNumber(balance)
.div(Math.pow(10, decimals))
.decimalPlaces(4, BigNumber.ROUND_FLOOR)
.toFormat({ decimalSeparator: ".", groupSeparator: ",", groupSize: 3 });
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TokenSymbol } from "next-common/components/assets/assetsList";
import { TokenSymbol } from "next-common/components/assets/common/columns";
import { useChain } from "next-common/context/chain";
import { useChainSettings } from "next-common/context/chain";
import { isAssetHubChain } from "next-common/utils/chain";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
import useSingleAccountAssets from "./useSingleAccountAssets";
import { useEffect } from "react";

// TODO: use subscribe
const useAssetHubTabsAssets = (address) => {
const [assets, setAssets] = useAssetsContext();
const [, setTotalCount] = useTotalCounts();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useNativeTokenIcon } from "next-common/components/assets/known";
import {
colTotal,
colTransferrable,
} from "next-common/components/assets/assetsList";
} from "next-common/components/assets/common/columns";
import { useMyNativeAsset } from "next-common/hooks/assets/useMyNativeAsset";

function TokenSymbol({ symbol }) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { formatBalance } from "next-common/components/assets/assetsList";
import { formatBalance } from "next-common/components/assets/common";
import BalanceDisplay from "next-common/components/assets/balanceDisplay";
import Loading from "next-common/components/loading";
import PopupLabel from "../label";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { formatBalance } from "next-common/components/assets/assetsList";
import { formatBalance } from "next-common/components/assets/common";
import BalanceDisplay from "next-common/components/assets/balanceDisplay";
import Loading from "next-common/components/loading";
import PopupLabel from "../label";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
colToken,
colTotal,
colTransferrable,
} from "next-common/components/assets/assetsList";
} from "next-common/components/assets/common/columns";
import useAssetHubTabsAssets from "next-common/components/assets/useAssetHubTabsAssets";

const columnsDef = [colToken, colId, colName, colTotal, colTransferrable];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { formatBalance } from "next-common/components/assets/assetsList";
import { formatBalance } from "next-common/components/assets/common";
import BalanceDisplay from "next-common/components/assets/balanceDisplay";
import Loading from "next-common/components/loading";
import PopupLabel from "next-common/components/popup/label";
Expand Down

0 comments on commit 4ee2bc7

Please sign in to comment.