バックグラウンドで一定時間経過したらページネーションのアイテム更新をしない (#10053)
This commit is contained in:
parent
1c9c9745f5
commit
cc8d60e53b
2 changed files with 53 additions and 3 deletions
|
@ -42,6 +42,7 @@ import { computed, ComputedRef, isRef, nextTick, onActivated, onBeforeUnmount, o
|
||||||
import * as misskey from 'misskey-js';
|
import * as misskey from 'misskey-js';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { onScrollTop, isTopVisible, getBodyScrollHeight, getScrollContainer, onScrollBottom, scrollToBottom, scroll, isBottomVisible } from '@/scripts/scroll';
|
import { onScrollTop, isTopVisible, getBodyScrollHeight, getScrollContainer, onScrollBottom, scrollToBottom, scroll, isBottomVisible } from '@/scripts/scroll';
|
||||||
|
import { useDocumentVisibility } from '@/scripts/use-document-visibility';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
import { defaultStore } from '@/store';
|
import { defaultStore } from '@/store';
|
||||||
import { MisskeyEntity } from '@/types/date-separated-list';
|
import { MisskeyEntity } from '@/types/date-separated-list';
|
||||||
|
@ -107,6 +108,12 @@ const {
|
||||||
const contentEl = $computed(() => props.pagination.pageEl ?? rootEl);
|
const contentEl = $computed(() => props.pagination.pageEl ?? rootEl);
|
||||||
const scrollableElement = $computed(() => getScrollContainer(contentEl));
|
const scrollableElement = $computed(() => getScrollContainer(contentEl));
|
||||||
|
|
||||||
|
const visibility = useDocumentVisibility();
|
||||||
|
|
||||||
|
let isPausingUpdate = false;
|
||||||
|
let timerForSetPause: number | null = null;
|
||||||
|
const BACKGROUND_PAUSE_WAIT_SEC = 10;
|
||||||
|
|
||||||
// 先頭が表示されているかどうかを検出
|
// 先頭が表示されているかどうかを検出
|
||||||
// https://qiita.com/mkataigi/items/0154aefd2223ce23398e
|
// https://qiita.com/mkataigi/items/0154aefd2223ce23398e
|
||||||
let scrollObserver = $ref<IntersectionObserver>();
|
let scrollObserver = $ref<IntersectionObserver>();
|
||||||
|
@ -279,6 +286,28 @@ const fetchMoreAhead = async (): Promise<void> => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isTop = (): boolean => isBackTop.value || (props.pagination.reversed ? isBottomVisible : isTopVisible)(contentEl, TOLERANCE);
|
||||||
|
|
||||||
|
watch(visibility, () => {
|
||||||
|
if (visibility.value === 'hidden') {
|
||||||
|
timerForSetPause = window.setTimeout(() => {
|
||||||
|
isPausingUpdate = true;
|
||||||
|
timerForSetPause = null;
|
||||||
|
},
|
||||||
|
BACKGROUND_PAUSE_WAIT_SEC * 1000);
|
||||||
|
} else { // 'visible'
|
||||||
|
if (timerForSetPause) {
|
||||||
|
clearTimeout(timerForSetPause);
|
||||||
|
timerForSetPause = null;
|
||||||
|
} else {
|
||||||
|
isPausingUpdate = false;
|
||||||
|
if (isTop()) {
|
||||||
|
executeQueue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const prepend = (item: MisskeyEntity): void => {
|
const prepend = (item: MisskeyEntity): void => {
|
||||||
// 初回表示時はunshiftだけでOK
|
// 初回表示時はunshiftだけでOK
|
||||||
if (!rootEl) {
|
if (!rootEl) {
|
||||||
|
@ -286,9 +315,7 @@ const prepend = (item: MisskeyEntity): void => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isTop = isBackTop.value || (props.pagination.reversed ? isBottomVisible : isTopVisible)(contentEl, TOLERANCE);
|
if (isTop() && !isPausingUpdate) unshiftItems([item]);
|
||||||
|
|
||||||
if (isTop) unshiftItems([item]);
|
|
||||||
else prependQueue(item);
|
else prependQueue(item);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -357,6 +384,10 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
|
if (timerForSetPause) {
|
||||||
|
clearTimeout(timerForSetPause);
|
||||||
|
timerForSetPause = null;
|
||||||
|
}
|
||||||
scrollObserver.disconnect();
|
scrollObserver.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
19
packages/frontend/src/scripts/use-document-visibility.ts
Normal file
19
packages/frontend/src/scripts/use-document-visibility.ts
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import { onMounted, onUnmounted, ref, Ref } from 'vue';
|
||||||
|
|
||||||
|
export function useDocumentVisibility(): Ref<DocumentVisibilityState> {
|
||||||
|
const visibility = ref(document.visibilityState);
|
||||||
|
|
||||||
|
const onChange = (): void => {
|
||||||
|
visibility.value = document.visibilityState;
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
document.addEventListener('visibilitychange', onChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
document.removeEventListener('visibilitychange', onChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
return visibility;
|
||||||
|
}
|
Loading…
Reference in a new issue