Commit e45a58ce authored by tom goriunov's avatar tom goriunov Committed by GitHub

Token Instance Page: move critical requests to the page root (#1959)

[performance]Token Instance Page move critical requests to the page root

Fixes #1938
parent ae20ab55
import type { GetServerSideProps, NextPage } from 'next'; import type { GetServerSideProps, NextPage } from 'next';
import dynamic from 'next/dynamic';
import React from 'react'; import React from 'react';
import type { Route } from 'nextjs-routes'; import type { Route } from 'nextjs-routes';
...@@ -11,8 +10,7 @@ import fetchApi from 'nextjs/utils/fetchApi'; ...@@ -11,8 +10,7 @@ import fetchApi from 'nextjs/utils/fetchApi';
import config from 'configs/app'; import config from 'configs/app';
import getQueryParamString from 'lib/router/getQueryParamString'; import getQueryParamString from 'lib/router/getQueryParamString';
import TokenInstance from 'ui/pages/TokenInstance';
const TokenInstance = dynamic(() => import('ui/pages/TokenInstance'), { ssr: false });
const pathname: Route['pathname'] = '/token/[hash]/instance/[id]'; const pathname: Route['pathname'] = '/token/[hash]/instance/[id]';
......
...@@ -29,7 +29,6 @@ import PageTitle from 'ui/shared/Page/PageTitle'; ...@@ -29,7 +29,6 @@ import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/pagination/Pagination'; import Pagination from 'ui/shared/pagination/Pagination';
import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages'; import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages';
import RoutedTabs from 'ui/shared/Tabs/RoutedTabs'; import RoutedTabs from 'ui/shared/Tabs/RoutedTabs';
import TabsSkeleton from 'ui/shared/Tabs/TabsSkeleton';
import TokenHolders from 'ui/token/TokenHolders/TokenHolders'; import TokenHolders from 'ui/token/TokenHolders/TokenHolders';
import TokenTransfer from 'ui/token/TokenTransfer/TokenTransfer'; import TokenTransfer from 'ui/token/TokenTransfer/TokenTransfer';
import TokenInstanceDetails from 'ui/tokenInstance/TokenInstanceDetails'; import TokenInstanceDetails from 'ui/tokenInstance/TokenInstanceDetails';
...@@ -69,7 +68,7 @@ const TokenInstanceContent = () => { ...@@ -69,7 +68,7 @@ const TokenInstanceContent = () => {
pathParams: { hash, id }, pathParams: { hash, id },
scrollRef, scrollRef,
options: { options: {
enabled: Boolean(hash && id && (!tab || tab === 'token_transfers') && !tokenInstanceQuery.isPlaceholderData && tokenInstanceQuery.data), enabled: Boolean(hash && id && (!tab || tab === 'token_transfers')),
placeholderData: getTokenInstanceTransfersStub(tokenQuery.data?.type, null), placeholderData: getTokenInstanceTransfersStub(tokenQuery.data?.type, null),
}, },
}); });
...@@ -90,6 +89,8 @@ const TokenInstanceContent = () => { ...@@ -90,6 +89,8 @@ const TokenInstanceContent = () => {
}, },
}); });
const isLoading = tokenInstanceQuery.isPlaceholderData || tokenQuery.isPlaceholderData;
React.useEffect(() => { React.useEffect(() => {
if (tokenInstanceQuery.data && !tokenInstanceQuery.isPlaceholderData && tokenQuery.data && !tokenQuery.isPlaceholderData) { if (tokenInstanceQuery.data && !tokenInstanceQuery.isPlaceholderData && tokenQuery.data && !tokenQuery.isPlaceholderData) {
metadata.update( metadata.update(
...@@ -116,15 +117,15 @@ const TokenInstanceContent = () => { ...@@ -116,15 +117,15 @@ const TokenInstanceContent = () => {
{ {
id: 'token_transfers', id: 'token_transfers',
title: 'Token transfers', title: 'Token transfers',
component: <TokenTransfer transfersQuery={ transfersQuery } tokenId={ id } token={ tokenQuery.data }/>, component: <TokenTransfer transfersQuery={ transfersQuery } tokenId={ id } token={ tokenQuery.data } shouldRender={ !isLoading }/>,
}, },
shouldFetchHolders ? shouldFetchHolders ?
{ id: 'holders', title: 'Holders', component: <TokenHolders holdersQuery={ holdersQuery } token={ tokenQuery.data }/> } : { id: 'holders', title: 'Holders', component: <TokenHolders holdersQuery={ holdersQuery } token={ tokenQuery.data } shouldRender={ !isLoading }/> } :
undefined, undefined,
{ id: 'metadata', title: 'Metadata', component: ( { id: 'metadata', title: 'Metadata', component: (
<TokenInstanceMetadata <TokenInstanceMetadata
data={ tokenInstanceQuery.data?.metadata } data={ tokenInstanceQuery.data?.metadata }
isPlaceholderData={ tokenInstanceQuery.isPlaceholderData } isPlaceholderData={ isLoading }
/> />
) }, ) },
].filter(Boolean); ].filter(Boolean);
...@@ -141,8 +142,6 @@ const TokenInstanceContent = () => { ...@@ -141,8 +142,6 @@ const TokenInstanceContent = () => {
watchlist_address_id: null, watchlist_address_id: null,
}; };
const isLoading = tokenInstanceQuery.isPlaceholderData || tokenQuery.isPlaceholderData;
const appLink = (() => { const appLink = (() => {
if (!tokenInstanceQuery.data?.external_app_url) { if (!tokenInstanceQuery.data?.external_app_url) {
return null; return null;
...@@ -226,14 +225,13 @@ const TokenInstanceContent = () => { ...@@ -226,14 +225,13 @@ const TokenInstanceContent = () => {
{ /* should stay before tabs to scroll up with pagination */ } { /* should stay before tabs to scroll up with pagination */ }
<Box ref={ scrollRef }></Box> <Box ref={ scrollRef }></Box>
{ isLoading ? <TabsSkeleton tabs={ tabs }/> : ( <RoutedTabs
<RoutedTabs tabs={ tabs }
tabs={ tabs } tabListProps={ isMobile ? { mt: 8 } : { mt: 3, py: 5, marginBottom: 0 } }
tabListProps={ isMobile ? { mt: 8 } : { mt: 3, py: 5, marginBottom: 0 } } isLoading={ isLoading }
rightSlot={ !isMobile && pagination?.isVisible ? <Pagination { ...pagination }/> : null } rightSlot={ !isMobile && pagination?.isVisible ? <Pagination { ...pagination }/> : null }
stickyEnabled={ !isMobile } stickyEnabled={ !isMobile }
/> />
) }
</> </>
); );
}; };
......
...@@ -5,6 +5,7 @@ import type { TokenInfo, TokenInstance } from 'types/api/token'; ...@@ -5,6 +5,7 @@ import type { TokenInfo, TokenInstance } from 'types/api/token';
import config from 'configs/app'; import config from 'configs/app';
import useFeatureValue from 'lib/growthbook/useFeatureValue'; import useFeatureValue from 'lib/growthbook/useFeatureValue';
import useIsMounted from 'lib/hooks/useIsMounted';
import AppActionButton from 'ui/shared/AppActionButton/AppActionButton'; import AppActionButton from 'ui/shared/AppActionButton/AppActionButton';
import useAppActionData from 'ui/shared/AppActionButton/useAppActionData'; import useAppActionData from 'ui/shared/AppActionButton/useAppActionData';
import CopyToClipboard from 'ui/shared/CopyToClipboard'; import CopyToClipboard from 'ui/shared/CopyToClipboard';
...@@ -30,6 +31,7 @@ interface Props { ...@@ -30,6 +31,7 @@ interface Props {
const TokenInstanceDetails = ({ data, token, scrollRef, isLoading }: Props) => { const TokenInstanceDetails = ({ data, token, scrollRef, isLoading }: Props) => {
const { value: isActionButtonExperiment } = useFeatureValue('action_button_exp', false); const { value: isActionButtonExperiment } = useFeatureValue('action_button_exp', false);
const appActionData = useAppActionData(token?.address, isActionButtonExperiment && !isLoading); const appActionData = useAppActionData(token?.address, isActionButtonExperiment && !isLoading);
const isMounted = useIsMounted();
const handleCounterItemClick = React.useCallback(() => { const handleCounterItemClick = React.useCallback(() => {
window.setTimeout(() => { window.setTimeout(() => {
...@@ -38,7 +40,7 @@ const TokenInstanceDetails = ({ data, token, scrollRef, isLoading }: Props) => { ...@@ -38,7 +40,7 @@ const TokenInstanceDetails = ({ data, token, scrollRef, isLoading }: Props) => {
}, 500); }, 500);
}, [ scrollRef ]); }, [ scrollRef ]);
if (!data || !token) { if (!data || !token || !isMounted) {
return null; return null;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment