summaryrefslogtreecommitdiff
path: root/packages/frontend/src/nirax.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-07-08 15:30:36 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-07-08 15:30:36 +0900
commit15683370f0379360c475a9ad77bb802c43f6d181 (patch)
treed320cbdef89b6b7bac2cb113297c311666c3aa4e /packages/frontend/src/nirax.ts
parentrefactor: use esm (diff)
downloadsharkey-15683370f0379360c475a9ad77bb802c43f6d181.tar.gz
sharkey-15683370f0379360c475a9ad77bb802c43f6d181.tar.bz2
sharkey-15683370f0379360c475a9ad77bb802c43f6d181.zip
fix(frontend): ページ遷移でスクロール位置が保持されない問題を修正
Fix #11068
Diffstat (limited to 'packages/frontend/src/nirax.ts')
-rw-r--r--packages/frontend/src/nirax.ts36
1 files changed, 28 insertions, 8 deletions
diff --git a/packages/frontend/src/nirax.ts b/packages/frontend/src/nirax.ts
index 3fa6bd55e2..3a03444de2 100644
--- a/packages/frontend/src/nirax.ts
+++ b/packages/frontend/src/nirax.ts
@@ -1,7 +1,7 @@
// NIRAX --- A lightweight router
import { EventEmitter } from 'eventemitter3';
-import { Component, shallowRef, ShallowRef } from 'vue';
+import { Component, onMounted, shallowRef, ShallowRef } from 'vue';
import { safeURIDecode } from '@/scripts/safe-uri-decode';
type RouteDef = {
@@ -267,13 +267,33 @@ export class Router extends EventEmitter<{
});
}
- public replace(path: string, key?: string | null, emitEvent = true) {
+ public replace(path: string, key?: string | null) {
this.navigate(path, key);
- if (emitEvent) {
- this.emit('replace', {
- path,
- key: this.currentKey,
- });
- }
}
}
+
+export function useScrollPositionManager(getScrollContainer: () => HTMLElement, router: Router) {
+ const scrollPosStore = new Map<string, number>();
+
+ onMounted(() => {
+ const scrollContainer = getScrollContainer();
+
+ scrollContainer.addEventListener('scroll', () => {
+ scrollPosStore.set(router.getCurrentKey(), scrollContainer.scrollTop);
+ }, { passive: true });
+
+ router.addListener('change', ctx => {
+ const scrollPos = scrollPosStore.get(ctx.key) ?? 0;
+ scrollContainer.scroll({ top: scrollPos, behavior: 'instant' });
+ if (scrollPos !== 0) {
+ window.setTimeout(() => { // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール
+ scrollContainer.scroll({ top: scrollPos, behavior: 'instant' });
+ }, 100);
+ }
+ });
+
+ router.addListener('same', () => {
+ scrollContainer.scroll({ top: 0, behavior: 'smooth' });
+ });
+ });
+}