Skip to content

Commit 6af0036

Browse files
committed
feat: add delayLoading
1 parent 63c91bd commit 6af0036

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

packages/bridge/bridge-react/src/lazy/AwaitDataFetch.tsx

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import React, { MutableRefObject, ReactNode, Suspense, useRef } from 'react';
1+
import React, {
2+
MutableRefObject,
3+
ReactNode,
4+
Suspense,
5+
useRef,
6+
useState,
7+
} from 'react';
28
import logger from './logger';
39
import {
410
DATA_FETCH_ERROR_PREFIX,
@@ -63,6 +69,7 @@ export const transformError = (err: string | Error): ErrorInfo => {
6369
export interface AwaitProps<T> {
6470
resolve: T | Promise<T>;
6571
loading?: ReactNode;
72+
delayLoading?: number;
6673
errorElement?: ReactNode | ((errorInfo: ErrorInfo) => ReactNode);
6774
children: (data: T) => ReactNode;
6875
params?: DataFetchParams;
@@ -82,6 +89,7 @@ export function AwaitDataFetch<T>({
8289
errorElement = DefaultErrorElement,
8390
children,
8491
params,
92+
delayLoading,
8593
}: AwaitProps<T>) {
8694
const dataRef = useRef<T>();
8795
const data = dataRef.current || resolve;
@@ -92,22 +100,52 @@ export function AwaitDataFetch<T>({
92100
params={params}
93101
loading={loading}
94102
errorElement={errorElement}
95-
// @ts-ignore
103+
delayLoading={delayLoading}
104+
// @ts-expect-error
96105
resolve={getData}
97106
>
98107
{children}
99108
</AwaitSuspense>
100109
);
101110
}
102111

112+
export const DelayedLoading = ({
113+
delayLoading,
114+
children,
115+
}: {
116+
delayLoading?: number;
117+
children: ReactNode;
118+
}) => {
119+
const [show, setShow] = useState(false);
120+
const timerSet = useRef(false);
121+
122+
if (!delayLoading) {
123+
return children;
124+
}
125+
126+
if (typeof window !== 'undefined' && !show && !timerSet.current) {
127+
timerSet.current = true;
128+
setTimeout(() => {
129+
setShow(true);
130+
}, delayLoading);
131+
}
132+
133+
return show ? children : null;
134+
};
135+
103136
function AwaitSuspense<T>({
104137
resolve,
105138
children,
106139
loading = DefaultLoading,
107140
errorElement = DefaultErrorElement,
141+
delayLoading,
108142
}: AwaitErrorHandlerProps<T>) {
109143
return (
110-
<Suspense fallback={loading}>
144+
<Suspense
145+
fallback={
146+
<DelayedLoading delayLoading={delayLoading}>{loading}</DelayedLoading>
147+
}
148+
>
111149
<ResolveAwait resolve={resolve} errorElement={errorElement}>
112150
{children}
113151
</ResolveAwait>
@@ -132,6 +170,7 @@ function ResolveAwait<T>({
132170
{globalThis.FEDERATION_SSR && (
133171
<script
134172
suppressHydrationWarning
173+
// eslint-disable-next-line react/no-danger
135174
dangerouslySetInnerHTML={{
136175
__html: String.raw`
137176
globalThis['${DATA_FETCH_FUNCTION}'] = globalThis['${DATA_FETCH_FUNCTION}'] || []

packages/bridge/bridge-react/src/lazy/createLazyComponent.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import React, { ReactNode, useState, useEffect } from 'react';
22
import logger from './logger';
3-
import { AwaitDataFetch, transformError } from './AwaitDataFetch';
3+
import {
4+
AwaitDataFetch,
5+
DelayedLoading,
6+
transformError,
7+
} from './AwaitDataFetch';
48
import {
59
fetchData,
610
getDataFetchItem,
@@ -9,6 +13,7 @@ import {
913
getLoadedRemoteInfos,
1014
setDataFetchItemLoadedStatus,
1115
wrapDataFetchId,
16+
isServerEnv,
1217
} from './utils';
1318
import {
1419
DATA_FETCH_ERROR_PREFIX,
@@ -33,6 +38,7 @@ export type CreateLazyComponentOptions<T, E extends keyof T> = {
3338
loader: () => Promise<T>;
3439
instance: ReturnType<typeof getInstance>;
3540
loading: React.ReactNode;
41+
delayLoading?: number;
3642
fallback: ReactNode | ((errorInfo: ErrorInfo) => ReactNode);
3743
export?: E;
3844
dataFetchParams?: DataFetchParams;
@@ -313,13 +319,13 @@ export function createLazyComponent<T, E extends keyof T>(
313319
</>
314320
),
315321
};
322+
// eslint-disable-next-line max-lines
316323
} else {
317324
throw Error(
318325
`Make sure that ${moduleId} has the correct export when export is ${String(
319326
exportName,
320327
)}`,
321328
);
322-
// eslint-disable-next-line max-lines
323329
}
324330
});
325331

@@ -334,6 +340,7 @@ export function createLazyComponent<T, E extends keyof T>(
334340
<AwaitDataFetch
335341
resolve={getData(options.noSSR)}
336342
loading={options.loading}
343+
delayLoading={options.delayLoading}
337344
errorElement={options.fallback}
338345
>
339346
{/* @ts-expect-error ignore */}
@@ -374,7 +381,11 @@ export function createLazyComponent<T, E extends keyof T>(
374381
}, []);
375382

376383
if (loading) {
377-
return <>{options.loading}</>;
384+
return (
385+
<DelayedLoading delayLoading={options.delayLoading}>
386+
{options.loading}
387+
</DelayedLoading>
388+
);
378389
}
379390

380391
if (error) {

0 commit comments

Comments
 (0)