diff --git a/apps/next/src/hooks/useAllTokensFromEnabledNetworks.ts b/apps/next/src/hooks/useAllTokensFromEnabledNetworks.ts index 3b9a48b2c..44f47e5b5 100644 --- a/apps/next/src/hooks/useAllTokensFromEnabledNetworks.ts +++ b/apps/next/src/hooks/useAllTokensFromEnabledNetworks.ts @@ -2,8 +2,14 @@ import { useNetworkContext } from '@core/ui'; import { useAllTokens } from './useAllTokens'; // TODO: Currently the hook is using favoriteNetwork. It should be changed to enabledNetworks once added. -export const useAllTokensFromEnabledNetworks = () => { - const { favoriteNetworks } = useNetworkContext(); +export const useAllTokensFromEnabledNetworks = ( + onlyTokensWithBalances?: boolean, + hideMalicious?: boolean, +) => { + const { enabledNetworks } = useNetworkContext(); + const tokens = useAllTokens(enabledNetworks, hideMalicious); - return useAllTokens(favoriteNetworks, false); + return !onlyTokensWithBalances + ? tokens + : tokens.filter((token) => token.balance); }; diff --git a/apps/next/src/pages/Portfolio/components/ManageTokens/components/TokenSwitchList.tsx b/apps/next/src/pages/Portfolio/components/ManageTokens/components/TokenSwitchList.tsx index 7f9faf09c..255646865 100644 --- a/apps/next/src/pages/Portfolio/components/ManageTokens/components/TokenSwitchList.tsx +++ b/apps/next/src/pages/Portfolio/components/ManageTokens/components/TokenSwitchList.tsx @@ -1,7 +1,5 @@ import { useAllTokensFromEnabledNetworks } from '@/hooks/useAllTokensFromEnabledNetworks'; import { Box } from '@avalabs/k2-alpine'; -import { TokenType } from '@avalabs/vm-module-types'; -import { isTokenMalicious } from '@core/common'; import { FungibleTokenBalance } from '@core/types'; import { FC, useMemo } from 'react'; import { FixedSizeList, ListChildComponentProps } from 'react-window'; @@ -16,32 +14,20 @@ interface Props { export const TokenSwitchList: FC = ({ filter, spam }) => { const [height, containerRef] = useContainerHeight(400); - const tokensWithBalances = useAllTokensFromEnabledNetworks(); + const tokensWithBalances = useAllTokensFromEnabledNetworks(false, !spam); - const nonNative = useMemo(() => { - return tokensWithBalances.filter( - (token) => token.type !== TokenType.NATIVE, - ); - }, [tokensWithBalances]); - - const spamless = useMemo( - () => - spam ? nonNative : nonNative.filter((token) => !isTokenMalicious(token)), - [spam, nonNative], - ); - - const filtered = useMemo( + const filteredTokensList = useMemo( () => filter - ? spamless.filter((token) => { + ? tokensWithBalances.filter((token) => { const normalizedFilter = filter.toLowerCase(); return ( token.name.toLowerCase().includes(normalizedFilter) || token.symbol.toLowerCase().includes(normalizedFilter) ); }) - : spamless, - [filter, spamless], + : tokensWithBalances, + [filter, tokensWithBalances], ); return ( @@ -49,8 +35,8 @@ export const TokenSwitchList: FC = ({ filter, spam }) => { { + console.log('asset: ', asset); + return ( + + {/* Left side - Avatar */} + + + {asset.symbol} + + + + {/* Middle left side - Token info */} + + + {asset.name} + + + {asset.balanceDisplayValue} {asset.symbol} + + + + + + + + + + + + + ); +}; diff --git a/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/AssetsTab.tsx b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/AssetsTab.tsx index 7f531f68c..fdc23dd5b 100644 --- a/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/AssetsTab.tsx +++ b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/AssetsTab.tsx @@ -8,14 +8,18 @@ import { } from '@avalabs/k2-alpine'; import { FC } from 'react'; import { useTranslation } from 'react-i18next'; -import { MdCurrencyBitcoin, MdKeyboardArrowDown } from 'react-icons/md'; +import { MdKeyboardArrowDown } from 'react-icons/md'; import { useHistory } from 'react-router-dom'; -import { UnderConstruction } from './UnderConstruction'; +import { useAllTokensFromEnabledNetworks } from '@/hooks/useAllTokensFromEnabledNetworks'; import { TrendingTokenBanner } from '@/pages/TrendingTokens/components/banner/TrendingTokenBanner'; +import { AssetCard } from './AssetCard'; + export const AssetsTab: FC = () => { const { t } = useTranslation(); const { push } = useHistory(); + const assets = useAllTokensFromEnabledNetworks(true, true); + console.log('assets: ', assets); return ( @@ -40,11 +44,21 @@ export const AssetsTab: FC = () => { - } - /> + /> */} + + {assets.map((token, index) => ( + + ))} + ); }; diff --git a/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/PortfolioActionButtons.tsx b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/PortfolioActionButtons.tsx index 0d4cb6aa3..83b57d222 100644 --- a/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/PortfolioActionButtons.tsx +++ b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/PortfolioActionButtons.tsx @@ -1,6 +1,7 @@ import { BridgeIcon, SendIcon, + Slide, SquareButton, Stack, SwapIcon, @@ -27,32 +28,40 @@ const ICON_SIZE = 19.2; export const PortfolioActionButtons = () => { const { push } = useHistory(); return ( - - } - label="Send" - onClick={() => push(getSendPath())} - /> - - } - label="Swap" - onClick={() => push(getSwapPath())} - /> - } - label="Buy" - onClick={onNotImplementedClick} - /> - } - label="Bridge" - onClick={onNotImplementedClick} - /> + + {/* TODO: create the proper animation */} + + } + label="Send" + onClick={() => push(getSendPath())} + /> + + + } + label="Swap" + onClick={() => push(getSwapPath())} + /> + + + } + label="Buy" + onClick={onNotImplementedClick} + /> + + + } + label="Bridge" + onClick={onNotImplementedClick} + /> + ); }; diff --git a/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/ProfitAndLoss.tsx b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/ProfitAndLoss.tsx new file mode 100644 index 000000000..b87f6bfb3 --- /dev/null +++ b/apps/next/src/pages/Portfolio/components/PortfolioHome/components/PortolioDetails/components/ProfitAndLoss.tsx @@ -0,0 +1,109 @@ +import { + Stack, + TriangleDownIcon, + TriangleUpIcon, + Typography, + useTheme, +} from '@avalabs/k2-alpine'; +import { + FungibleTokenBalance, + getUnconfirmedBalanceInCurrency, +} from '@core/types'; +import { useSettingsContext } from '@core/ui'; +import { useMemo } from 'react'; + +export enum Trend { + Up = 'up', + Down = 'down', + NoChange = 'no-change', +} + +interface ProfitAndLossProps { + // value?: number; + // percentage?: number; + // showPercentage?: boolean; + // size?: 'big'; + asset: FungibleTokenBalance; +} + +export const ProfitAndLoss = ({ + // value, + // percentage, + // size, + // showPercentage, + // balanceInCurrency, + asset, +}: ProfitAndLossProps) => { + const { currencyFormatter } = useSettingsContext(); + const theme = useTheme(); + + const trend = + asset.priceChanges?.percentage && asset.priceChanges?.percentage > 0 + ? Trend.Up + : Trend.Down; + + const color = useMemo(() => { + if (trend === Trend.Up) { + return theme.palette.success.main; + } + if (trend === Trend.Down) { + return theme.palette.error.light; + } + return theme.palette.text.secondary; + }, [ + theme.palette.error.light, + theme.palette.success.main, + theme.palette.text.secondary, + trend, + ]); + + const Icon = () => { + if (trend === Trend.Up) { + return ; + } + if (trend === Trend.Down) { + return ; + } + }; + + if ( + !asset.priceChanges?.percentage || + !asset.priceChanges?.value || + !asset.balanceInCurrency + ) { + return <>; + } + + return ( + + {/* */} + + <> + + {/* {`${percentage.toFixed(DEFAULT_DECIMALS)}%`} */} + {currencyFormatter( + asset.balanceInCurrency + + (getUnconfirmedBalanceInCurrency(asset) ?? 0), + )} + + + + + {currencyFormatter(asset.priceChanges.value)} + + + + + ); +}; diff --git a/apps/next/src/pages/Settings/components/NetworkManagement/components/NetworkToggle/NetworkToggleList.tsx b/apps/next/src/pages/Settings/components/NetworkManagement/components/NetworkToggle/NetworkToggleList.tsx index 49e688017..662c7fec7 100644 --- a/apps/next/src/pages/Settings/components/NetworkManagement/components/NetworkToggle/NetworkToggleList.tsx +++ b/apps/next/src/pages/Settings/components/NetworkManagement/components/NetworkToggle/NetworkToggleList.tsx @@ -14,7 +14,8 @@ export const NetworkToggleList = ({ networks }: NetworkToggleListProps) => { useNetworkContext(); const history = useHistory(); - const enabledNetworksArray = enabledNetworks || []; + const enabledNetworksArray = + enabledNetworks.map((network) => network.chainId) || []; return ( { }; export const TokenCard = ({ token, last, network }: TokenCardProps) => { + console.log('token: ', token); const rank = token.rank; const { currency } = useSettingsContext(); const { t } = useTranslation(); diff --git a/packages/ui/src/contexts/NetworkProvider/NetworkProvider.tsx b/packages/ui/src/contexts/NetworkProvider/NetworkProvider.tsx index 6e3a29b68..0cbc31818 100644 --- a/packages/ui/src/contexts/NetworkProvider/NetworkProvider.tsx +++ b/packages/ui/src/contexts/NetworkProvider/NetworkProvider.tsx @@ -59,7 +59,7 @@ const NetworkContext = createContext<{ removeCustomNetwork(chainId: number): Promise; isDeveloperMode: boolean; favoriteNetworks: NetworkWithCaipId[]; - enabledNetworks: number[]; + enabledNetworks: NetworkWithCaipId[]; addFavoriteNetwork(chainId: number): void; removeFavoriteNetwork(chainId: number): void; isFavoriteNetwork(chainId: number): boolean; @@ -126,6 +126,23 @@ export function NetworkContextProvider({ children }: PropsWithChildren) { [favoriteNetworks, network, networks], ); + const getEnabledNetworks = useMemo( + () => + networks + .filter((networkItem) => { + return enabledNetworks + ? enabledNetworks.includes(networkItem.chainId) + : false; + }) + .filter((n) => { + return ( + (!network?.isTestnet && !n.isTestnet) || + (network?.isTestnet && n.isTestnet) + ); + }), + [enabledNetworks, network?.isTestnet, networks], + ); + const getCustomNetworks = useMemo( () => networks.filter((networkItem) => @@ -376,7 +393,7 @@ export function NetworkContextProvider({ children }: PropsWithChildren) { removeCustomNetwork, isDeveloperMode: !!network?.isTestnet, favoriteNetworks: getFavoriteNetworks, - enabledNetworks: enabledNetworks, + enabledNetworks: getEnabledNetworks, addFavoriteNetwork: (chainId: number) => { request({ method: ExtensionRequest.NETWORK_ADD_FAVORITE_NETWORK,