refactor: improve client modules types (#6742)

This commit is contained in:
Joshua Chen 2022-02-23 15:45:23 +08:00 committed by GitHub
parent cfcc8b31f4
commit ddad9713e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 24 deletions

View file

@ -6,8 +6,9 @@
*/
declare module '@generated/client-modules' {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const clientModules: readonly any[];
import type {ClientModule} from '@docusaurus/types';
const clientModules: readonly (ClientModule & {default: ClientModule})[];
export default clientModules;
}

View file

@ -11,6 +11,7 @@ import type {CommanderStatic} from 'commander';
import type {ParsedUrlQueryInput} from 'querystring';
import type Joi from 'joi';
import type {Overwrite, DeepPartial} from 'utility-types';
import type {Location} from 'history';
export type ReportingSeverity = 'ignore' | 'log' | 'warn' | 'error' | 'throw';
@ -448,3 +449,11 @@ export interface TOCItem {
}
export type RouteChunksTree = {[x: string | number]: string | RouteChunksTree};
export type ClientModule = {
onRouteUpdate?: (args: {
previousLocation: Location | null;
location: Location;
}) => void;
onRouteUpdateDelayed?: (args: {location: Location}) => void;
};

View file

@ -69,12 +69,7 @@ class PendingNavigation extends React.Component<Props, State> {
});
// Route has loaded, we can reset previousLocation.
this.previousLocation = null;
this.setState(
{
nextRouteHasLoaded: true,
},
this.stopProgressBar,
);
this.setState({nextRouteHasLoaded: true}, this.stopProgressBar);
const {hash} = nextLocation;
if (!hash) {
window.scrollTo(0, 0);

View file

@ -6,32 +6,28 @@
*/
import clientModules from '@generated/client-modules';
import type {ClientModule} from '@docusaurus/types';
interface Dispatchers {
onRouteUpdate: (...args: unknown[]) => void;
onRouteUpdateDelayed: (...args: unknown[]) => void;
}
function dispatchLifecycleAction(
lifecycleAction: keyof Dispatchers,
...args: unknown[]
function dispatchLifecycleAction<K extends keyof ClientModule>(
lifecycleAction: K,
args: Parameters<NonNullable<ClientModule[K]>>,
) {
clientModules.forEach((clientModule) => {
const lifecycleFunction =
clientModule?.default?.[lifecycleAction] ?? clientModule[lifecycleAction];
const lifecycleFunction = (clientModule?.default?.[lifecycleAction] ??
clientModule[lifecycleAction]) as
| ((...a: Parameters<NonNullable<ClientModule[K]>>) => void)
| undefined;
if (lifecycleFunction) {
lifecycleFunction(...args);
}
lifecycleFunction?.(...args);
});
}
const clientLifecyclesDispatchers: Dispatchers = {
const clientLifecyclesDispatchers: Required<ClientModule> = {
onRouteUpdate(...args) {
dispatchLifecycleAction('onRouteUpdate', ...args);
dispatchLifecycleAction('onRouteUpdate', args);
},
onRouteUpdateDelayed(...args) {
dispatchLifecycleAction('onRouteUpdateDelayed', ...args);
dispatchLifecycleAction('onRouteUpdateDelayed', args);
},
};