Skip to content

Commit

Permalink
refactor(web): improve loading experience by reduce flashing (#1511)
Browse files Browse the repository at this point in the history
  • Loading branch information
hyrious authored May 9, 2022
1 parent 97f8324 commit bd44f96
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,16 @@ export const CloudStorageContainer = observer<CloudStorageContainerProps>(
function CloudStorageContainer({ store }) {
const { t } = useTranslation();
const cloudStorageContainerRef = useRef<HTMLDivElement>(null);
const [skeletonsVisible, setSkeletonsVisible] = useState(false);
const [isH5PanelVisible, setH5PanelVisible] = useState(false);
const [isAtTheBottom, setIsAtTheBottom] = useState(false);

// Wait 200ms before showing skeletons to reduce flashing.
useEffect(() => {
const ticket = window.setTimeout(() => setSkeletonsVisible(true), 200);
return () => window.clearTimeout(ticket);
}, []);

useEffect(() => {
if (isAtTheBottom) {
void store.fetchMoreCloudStorageData(store.cloudStorageDataPagination + 1);
Expand Down Expand Up @@ -147,9 +154,9 @@ export const CloudStorageContainer = observer<CloudStorageContainerProps>(
isLoadingData={store.isFetchingFiles}
store={store}
/>
) : (
) : skeletonsVisible ? (
<CloudStorageSkeletons isCompactMode={store.compact} />
)}
) : null}
</div>
<CSSTransition
mountOnEnter
Expand Down
85 changes: 32 additions & 53 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 27 additions & 3 deletions web/flat-web/src/AppRoutes/AppRouteContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ export interface AppRouteContainerProps {
routeProps: RouteComponentProps;
}

const componentCache = new Map<RouteNameType, ComponentType<any>>();
// Preload components every 2 seconds.
const preloadComponents = async (): Promise<void> => {
for (const name of Object.keys(routePages) as RouteNameType[]) {
if (!componentCache.has(name)) {
const { default: Component } = await routePages[name].component();
componentCache.set(name, Component);
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
};
window.setTimeout(preloadComponents, 5000);

export const AppRouteContainer = observer<AppRouteContainerProps>(function AppRouteContainer({
name,
Comp,
Expand All @@ -38,14 +51,25 @@ export const AppRouteContainer = observer<AppRouteContainerProps>(function AppRo
window.getSelection()?.removeAllRanges();
}, [t, title]);

useEffect(() => {
if (!componentCache.has(name)) {
Comp().then(({ default: Component }) => {
componentCache.set(name, Component);
});
}
}, [Comp, name]);

const hasHeader = pageStore.name && routePages[pageStore.name].hasHeader;

return (
<FlatThemeBodyProvider prefersColorScheme={configStore.prefersColorScheme}>
<AppRouteErrorBoundary
Comp={loadable(Comp, {
fallback: <LoadingPage hasHeader={hasHeader} />,
})}
Comp={
componentCache.get(name) ||
loadable(Comp, {
fallback: <LoadingPage hasHeader={hasHeader} />,
})
}
{...{ title, routeProps }}
/>
</FlatThemeBodyProvider>
Expand Down
Loading

0 comments on commit bd44f96

Please sign in to comment.