From 295fe859d86f720546691b87661ff63303595fd9 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 2 May 2025 09:37:51 +0900 Subject: [PATCH] wip --- .../frontend/src/components/MkTimeline.vue | 48 +++++++++++++------ packages/frontend/src/use/use-pagination.ts | 31 ++++++++---- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue index aa50934225..06bff715bf 100644 --- a/packages/frontend/src/components/MkTimeline.vue +++ b/packages/frontend/src/components/MkTimeline.vue @@ -19,12 +19,10 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
-
- +
(props: { useShallowRef?: boolean; }) { const items = props.useShallowRef ? shallowRef([]) : ref([]); - const queue = props.useShallowRef ? shallowRef([]) : ref([]); + let aheadQueue: T[] = []; + const queuedAheadItemsCount = ref(0); const fetching = ref(true); const moreFetching = ref(false); const canFetchMore = ref(false); @@ -54,6 +56,9 @@ export function usePagination(props: { function getNewestId() { // 様々な要因により並び順は保証されないのでソートが必要 + if (aheadQueue.length > 0) { + return aheadQueue.map(x => x.id).sort().at(-1); + } return items.value.map(x => x.id).sort().at(-1); } @@ -64,7 +69,8 @@ export function usePagination(props: { async function init(): Promise { items.value = []; - queue.value = []; + aheadQueue = []; + queuedAheadItemsCount.value = 0; fetching.value = true; const params = props.ctx.params ? isRef(props.ctx.params) ? props.ctx.params.value : props.ctx.params : {}; await misskeyApi(props.ctx.endpoint, { @@ -143,8 +149,11 @@ export function usePagination(props: { }), }).then(res => { if (options.toQueue) { - queue.value.unshift(...res.toReversed()); - if (props.useShallowRef) triggerRef(queue); + aheadQueue.unshift(...res.toReversed()); + if (aheadQueue.length > MAX_QUEUE_ITEMS) { + aheadQueue = aheadQueue.slice(0, MAX_QUEUE_ITEMS); + } + queuedAheadItemsCount.value = aheadQueue.length; } else { items.value.unshift(...res.toReversed()); if (props.useShallowRef) triggerRef(items); @@ -173,13 +182,17 @@ export function usePagination(props: { } function enqueue(item: T) { - queue.value.unshift(item); - if (props.useShallowRef) triggerRef(queue); + aheadQueue.unshift(item); + if (aheadQueue.length > MAX_QUEUE_ITEMS) { + aheadQueue.pop(); + } + queuedAheadItemsCount.value = aheadQueue.length; } function releaseQueue() { - unshiftItems(queue.value); - queue.value = []; + unshiftItems(aheadQueue); + aheadQueue = []; + queuedAheadItemsCount.value = 0; } onMounted(() => { @@ -188,7 +201,7 @@ export function usePagination(props: { return { items, - queue, + queuedAheadItemsCount, fetching, moreFetching, canFetchMore,