parent
							
								
									4fd386c3dc
								
							
						
					
					
						commit
						bb68cfaa81
					
				
					 4 changed files with 22 additions and 4 deletions
				
			
		|  | @ -8,6 +8,7 @@ type RouteDef = { | ||||||
| 	component: Component; | 	component: Component; | ||||||
| 	query?: Record<string, string>; | 	query?: Record<string, string>; | ||||||
| 	name?: string; | 	name?: string; | ||||||
|  | 	hash?: string; | ||||||
| 	globalCacheKey?: string; | 	globalCacheKey?: string; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -78,7 +79,12 @@ export class Router extends EventEmitter<{ | ||||||
| 
 | 
 | ||||||
| 	public resolve(path: string): { route: RouteDef; props: Map<string, string>; } | null { | 	public resolve(path: string): { route: RouteDef; props: Map<string, string>; } | null { | ||||||
| 		let queryString: string | null = null; | 		let queryString: string | null = null; | ||||||
|  | 		let hash: string | null = null; | ||||||
| 		if (path[0] === '/') path = path.substring(1); | 		if (path[0] === '/') path = path.substring(1); | ||||||
|  | 		if (path.includes('#')) { | ||||||
|  | 			hash = path.substring(path.indexOf('#') + 1); | ||||||
|  | 			path = path.substring(0, path.indexOf('#')); | ||||||
|  | 		} | ||||||
| 		if (path.includes('?')) { | 		if (path.includes('?')) { | ||||||
| 			queryString = path.substring(path.indexOf('?') + 1); | 			queryString = path.substring(path.indexOf('?') + 1); | ||||||
| 			path = path.substring(0, path.indexOf('?')); | 			path = path.substring(0, path.indexOf('?')); | ||||||
|  | @ -127,6 +133,10 @@ export class Router extends EventEmitter<{ | ||||||
| 
 | 
 | ||||||
| 			if (parts.length !== 0) continue forEachRouteLoop; | 			if (parts.length !== 0) continue forEachRouteLoop; | ||||||
| 
 | 
 | ||||||
|  | 			if (route.hash != null && hash != null) { | ||||||
|  | 				props.set(route.hash, hash); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			if (route.query != null && queryString != null) { | 			if (route.query != null && queryString != null) { | ||||||
| 				const queryObject = [...new URLSearchParams(queryString).entries()] | 				const queryObject = [...new URLSearchParams(queryString).entries()] | ||||||
| 					.reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {}); | 					.reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {}); | ||||||
|  | @ -138,6 +148,7 @@ export class Router extends EventEmitter<{ | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
| 			return { | 			return { | ||||||
| 				route, | 				route, | ||||||
| 				props, | 				props, | ||||||
|  |  | ||||||
|  | @ -95,8 +95,14 @@ import number from '@/filters/number'; | ||||||
| import { i18n } from '@/i18n'; | import { i18n } from '@/i18n'; | ||||||
| import { definePageMetadata } from '@/scripts/page-metadata'; | import { definePageMetadata } from '@/scripts/page-metadata'; | ||||||
| 
 | 
 | ||||||
|  | const props = withDefaults(defineProps<{ | ||||||
|  | 	initialTab?: string; | ||||||
|  | }>(), { | ||||||
|  | 	initialTab: 'overview', | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| let stats = $ref(null); | let stats = $ref(null); | ||||||
| let tab = $ref('overview'); | let tab = $ref(props.initialTab); | ||||||
| 
 | 
 | ||||||
| const initStats = () => os.api('stats', { | const initStats = () => os.api('stats', { | ||||||
| }).then((res) => { | }).then((res) => { | ||||||
|  |  | ||||||
|  | @ -109,7 +109,7 @@ const menuDef = $computed(() => [{ | ||||||
| 	}, { | 	}, { | ||||||
| 		icon: 'fas fa-globe', | 		icon: 'fas fa-globe', | ||||||
| 		text: i18n.ts.federation, | 		text: i18n.ts.federation, | ||||||
| 		to: '/admin/federation', | 		to: '/about#federation', | ||||||
| 		active: props.initialPage === 'federation', | 		active: props.initialPage === 'federation', | ||||||
| 	}, { | 	}, { | ||||||
| 		icon: 'fas fa-clipboard-list', | 		icon: 'fas fa-clipboard-list', | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ export const routes = [{ | ||||||
| }, { | }, { | ||||||
| 	path: '/about', | 	path: '/about', | ||||||
| 	component: page(() => import('./pages/about.vue')), | 	component: page(() => import('./pages/about.vue')), | ||||||
|  | 	hash: 'initialTab', | ||||||
| }, { | }, { | ||||||
| 	path: '/about-misskey', | 	path: '/about-misskey', | ||||||
| 	component: page(() => import('./pages/about-misskey.vue')), | 	component: page(() => import('./pages/about-misskey.vue')), | ||||||
|  | @ -203,7 +204,7 @@ export const routes = [{ | ||||||
| 	component: page(() => import('./pages/not-found.vue')), | 	component: page(() => import('./pages/not-found.vue')), | ||||||
| }]; | }]; | ||||||
| 
 | 
 | ||||||
| export const mainRouter = new Router(routes, location.pathname + location.search); | export const mainRouter = new Router(routes, location.pathname + location.search + location.hash); | ||||||
| 
 | 
 | ||||||
| window.history.replaceState({ key: mainRouter.getCurrentKey() }, '', location.href); | window.history.replaceState({ key: mainRouter.getCurrentKey() }, '', location.href); | ||||||
| 
 | 
 | ||||||
|  | @ -228,7 +229,7 @@ mainRouter.addListener('push', ctx => { | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| window.addEventListener('popstate', (event) => { | window.addEventListener('popstate', (event) => { | ||||||
| 	mainRouter.change(location.pathname + location.search, event.state?.key); | 	mainRouter.change(location.pathname + location.search + location.hash, event.state?.key); | ||||||
| 	const scrollPos = scrollPosStore.get(event.state?.key) ?? 0; | 	const scrollPos = scrollPosStore.get(event.state?.key) ?? 0; | ||||||
| 	window.scroll({ top: scrollPos, behavior: 'instant' }); | 	window.scroll({ top: scrollPos, behavior: 'instant' }); | ||||||
| 	window.setTimeout(() => { // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール
 | 	window.setTimeout(() => { // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue