feat(login): add plugin seam for default landing path
Plugins can supply `LoginPlugin.resolveDefaultPath` to override the post-login redirect target. checkDefaultPage consults the hook and uses the returned path when non-null; otherwise falls back to the existing admin/non-admin defaults. The lookup runs in parallel with the IS_FIRST_LOGIN read. Applies to both first-login and subsequent-login flows.
This commit is contained in:
@@ -1,29 +1,48 @@
|
|||||||
import { DEFAULT_ENTER_PAGE } from '@/config/settings';
|
import { DEFAULT_ENTER_PAGE } from '@/config/settings';
|
||||||
|
import { getGPUStackPlugin } from '@/plugins';
|
||||||
import { isOnline } from '@/utils';
|
import { isOnline } from '@/utils';
|
||||||
import {
|
import {
|
||||||
IS_FIRST_LOGIN,
|
IS_FIRST_LOGIN,
|
||||||
readState,
|
readState,
|
||||||
writeState
|
writeState
|
||||||
} from '@/utils/localstore/index';
|
} from '@/utils/localstore/index';
|
||||||
import { history } from '@umijs/max';
|
import { history, request } from '@umijs/max';
|
||||||
|
|
||||||
|
const resolvePluginPath = async (
|
||||||
|
userInfo: any
|
||||||
|
): Promise<string | null | undefined> => {
|
||||||
|
try {
|
||||||
|
return await getGPUStackPlugin()?.login?.resolveDefaultPath?.(userInfo, {
|
||||||
|
request
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const checkDefaultPage = async (userInfo: any, replace: boolean) => {
|
export const checkDefaultPage = async (userInfo: any, replace: boolean) => {
|
||||||
const isFirstLogin = await readState(IS_FIRST_LOGIN);
|
const [isFirstLogin, overridePath] = await Promise.all([
|
||||||
|
readState(IS_FIRST_LOGIN),
|
||||||
|
resolvePluginPath(userInfo)
|
||||||
|
]);
|
||||||
|
|
||||||
if (isFirstLogin === null && isOnline()) {
|
if (isFirstLogin === null && isOnline()) {
|
||||||
writeState(IS_FIRST_LOGIN, true);
|
writeState(IS_FIRST_LOGIN, true);
|
||||||
const pathname =
|
const pathname =
|
||||||
userInfo && userInfo?.is_admin
|
overridePath ||
|
||||||
|
(userInfo && userInfo?.is_admin
|
||||||
? DEFAULT_ENTER_PAGE.adminForFirst
|
? DEFAULT_ENTER_PAGE.adminForFirst
|
||||||
: DEFAULT_ENTER_PAGE.user;
|
: DEFAULT_ENTER_PAGE.user);
|
||||||
history.push(pathname);
|
history.push(pathname);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await writeState(IS_FIRST_LOGIN, false);
|
await writeState(IS_FIRST_LOGIN, false);
|
||||||
|
|
||||||
const pathname = userInfo?.is_admin
|
const pathname =
|
||||||
? DEFAULT_ENTER_PAGE.adminForNormal
|
overridePath ||
|
||||||
: DEFAULT_ENTER_PAGE.user;
|
(userInfo?.is_admin
|
||||||
|
? DEFAULT_ENTER_PAGE.adminForNormal
|
||||||
|
: DEFAULT_ENTER_PAGE.user);
|
||||||
|
|
||||||
history.push(pathname, { replace: replace });
|
history.push(pathname, { replace: replace });
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -48,6 +48,15 @@ export interface LoginKit {
|
|||||||
export interface LoginPlugin {
|
export interface LoginPlugin {
|
||||||
shouldUseCustomLogin?: (enterpriseSettings: any) => boolean;
|
shouldUseCustomLogin?: (enterpriseSettings: any) => boolean;
|
||||||
CustomLoginComponent?: ComponentType<{ kit: LoginKit }>;
|
CustomLoginComponent?: ComponentType<{ kit: LoginKit }>;
|
||||||
|
/**
|
||||||
|
* Seam for plugins to override the default landing path after login.
|
||||||
|
* Returning a path overrides both the admin and non-admin defaults;
|
||||||
|
* returning null/undefined falls back to the built-in behavior.
|
||||||
|
*/
|
||||||
|
resolveDefaultPath?: (
|
||||||
|
userInfo: any,
|
||||||
|
ctx: { request: <T = any>(url: string, options?: any) => Promise<T> }
|
||||||
|
) => Promise<string | null | undefined> | string | null | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user