This commit is contained in:
かっこかり 2024-11-22 01:10:49 +00:00 committed by GitHub
commit 774b4624b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 7 deletions

View File

@ -98,6 +98,15 @@ windowRouter.addListener('replace', ctx => {
history.value.push({ path: ctx.path, key: ctx.key });
});
windowRouter.navHook = (path) => {
const res = windowRouter.resolve(path);
if (res?.route.path === '/:(*)') {
window.open(path, '_blank', 'noopener');
return true;
}
return res ?? false;
};
windowRouter.init();
provide('router', windowRouter);

View File

@ -109,7 +109,13 @@ export interface IRouter extends EventEmitter<RouterEvent> {
current: Resolved;
currentRef: ShallowRef<Resolved>;
currentRoute: ShallowRef<RouteDef>;
navHook: ((path: string, flag?: RouterFlag) => boolean) | null;
/**
*
*
* `true``false`Resolvedオブジェクトでナビゲーションを続行
*/
navHook: ((path: string, flag?: RouterFlag) => boolean | Resolved) | null;
/**
* eventListenerの定義後に必ず呼び出すこと
@ -199,7 +205,7 @@ export class Router extends EventEmitter<RouterEvent> implements IRouter {
private currentKey = Date.now().toString();
private redirectCount = 0;
public navHook: ((path: string, flag?: RouterFlag) => boolean) | null = null;
public navHook: ((path: string, flag?: RouterFlag) => boolean | Resolved) | null = null;
constructor(routes: Router['routes'], currentPath: Router['currentPath'], isLoggedIn: boolean, notFoundPageComponent: Component) {
super();
@ -412,11 +418,20 @@ export class Router extends EventEmitter<RouterEvent> implements IRouter {
this.emit('same');
return;
}
let res: Resolved | null = null;
if (this.navHook) {
const cancel = this.navHook(path, flag);
if (cancel) return;
const hookRes = this.navHook(path, flag);
if (hookRes === true) return;
if (hookRes !== false) {
res = hookRes;
}
}
const res = this.navigate(path, null);
if (res == null) {
res = this.navigate(path, null);
}
if (res.route.path === '/:(*)') {
location.href = path;
} else {

View File

@ -135,11 +135,16 @@ const columnComponents = {
roleTimeline: XRoleTimelineColumn,
};
mainRouter.navHook = (path, flag): boolean => {
mainRouter.navHook = (path, flag) => {
if (flag === 'forcePage') return false;
const noMainColumn = !deckStore.state.columns.some(x => x.type === 'main');
if (deckStore.state.navWindow || noMainColumn) {
os.pageWindow(path);
const res = mainRouter.resolve(path);
if (res?.route.path === '/:(*)') {
window.open(path, '_blank', 'noopener');
} else {
os.pageWindow(path);
}
return true;
}
return false;