From 5b1803cdd05890ab94d2cc7d70ee52ab55ec62c6 Mon Sep 17 00:00:00 2001 From: Ayo Date: Sat, 22 Nov 2025 18:42:48 +0100 Subject: [PATCH 1/4] fix: paginator values being cloned --- app/composables/masto/notification.ts | 3 ++- app/composables/paginator.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/composables/masto/notification.ts b/app/composables/masto/notification.ts index 2f5cfdcd..6b474b30 100644 --- a/app/composables/masto/notification.ts +++ b/app/composables/masto/notification.ts @@ -45,9 +45,10 @@ export function useNotifications() { const position = await client.value.v1.markers.fetch({ timeline: ['notifications'] }) const paginator = client.value.v1.notifications.list({ limit: 30 }) + const paginatorValues = paginator.values() do { - const result = await paginator.values().next() + const result = await paginatorValues.next() if (!result.done && result.value.length) { for (const notification of result.value) { if (notification.id === position.notifications.lastReadId) diff --git a/app/composables/paginator.ts b/app/composables/paginator.ts index 83b51eef..674193e9 100644 --- a/app/composables/paginator.ts +++ b/app/composables/paginator.ts @@ -13,6 +13,7 @@ export function usePaginator( // and we need its initial state after HMR // so clone it + const paginatorValues = paginator.values() const state = ref(isHydrated.value ? 'idle' : 'loading') const items = ref([]) const nextItems = ref([]) @@ -74,7 +75,7 @@ export function usePaginator( state.value = 'loading' try { - const result = await paginator.values().next() + const result = await paginatorValues.next() if (!result.done && result.value.length) { const preprocessedItems = preprocess([...nextItems.value, ...result.value] as (U | T)[]) From 45fc6b3ed8a230f17ab0bae1e14fca6afe5c83da Mon Sep 17 00:00:00 2001 From: Ayo Date: Sat, 22 Nov 2025 19:16:04 +0100 Subject: [PATCH 2/4] fix: fetch of followed tags on public timelines --- app/components/timeline/TimelinePublic.vue | 6 ++++-- app/components/timeline/TimelinePublicLocal.vue | 6 ++++-- app/pages/[[server]]/tags/[tag].vue | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/components/timeline/TimelinePublic.vue b/app/components/timeline/TimelinePublic.vue index 1ee571b2..2193f0b2 100644 --- a/app/components/timeline/TimelinePublic.vue +++ b/app/components/timeline/TimelinePublic.vue @@ -7,9 +7,11 @@ function reorderAndFilter(items: mastodon.v1.Status[]) { return reorderedTimeline(items, 'public') } -let followedTags: mastodon.v1.Tag[] | undefined +let followedTags: mastodon.v1.Tag[] if (currentUser.value !== undefined) { - followedTags = (await useMasto().client.value.v1.followedTags.list({ limit: 0 })) + const { client } = useMasto() + const paginator = client.value.v1.followedTags.list() + followedTags = (await paginator.values().next()).value ?? [] } diff --git a/app/components/timeline/TimelinePublicLocal.vue b/app/components/timeline/TimelinePublicLocal.vue index 8a1312f4..f3514bfd 100644 --- a/app/components/timeline/TimelinePublicLocal.vue +++ b/app/components/timeline/TimelinePublicLocal.vue @@ -7,9 +7,11 @@ function reorderAndFilter(items: mastodon.v1.Status[]) { return reorderedTimeline(items, 'public') } -let followedTags: mastodon.v1.Tag[] | undefined +let followedTags: mastodon.v1.Tag[] if (currentUser.value !== undefined) { - followedTags = (await useMasto().client.value.v1.followedTags.list({ limit: 0 })) + const { client } = useMasto() + const paginator = client.value.v1.followedTags.list() + followedTags = (await paginator.values().next()).value ?? [] } diff --git a/app/pages/[[server]]/tags/[tag].vue b/app/pages/[[server]]/tags/[tag].vue index 913ccc27..b74c6c96 100644 --- a/app/pages/[[server]]/tags/[tag].vue +++ b/app/pages/[[server]]/tags/[tag].vue @@ -26,9 +26,11 @@ onReactivated(() => { refresh() }) -let followedTags: mastodon.v1.Tag[] | undefined +let followedTags: mastodon.v1.Tag[] if (currentUser.value !== undefined) { - followedTags = (await useMasto().client.value.v1.followedTags.list({ limit: 0 })) + const { client } = useMasto() + const paginator = client.value.v1.followedTags.list() + followedTags = (await paginator.values().next()).value ?? [] } From 9ad34e8298b7ba46009ba314a516d9cabc7c7ee2 Mon Sep 17 00:00:00 2001 From: Ayo Date: Sat, 22 Nov 2025 19:21:08 +0100 Subject: [PATCH 3/4] fix: prevent undefined error on getBoundingClientRect --- .../modal/ModalMediaPreviewCarousel.vue | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/components/modal/ModalMediaPreviewCarousel.vue b/app/components/modal/ModalMediaPreviewCarousel.vue index 43eb6f7d..2e56e608 100644 --- a/app/components/modal/ModalMediaPreviewCarousel.vue +++ b/app/components/modal/ModalMediaPreviewCarousel.vue @@ -159,14 +159,16 @@ function handleTap([positionX, positionY]: Vector2) { goToFocusedSlide() } else { - const focusedSlideBounding = slide.value[modelValue.value].getBoundingClientRect() - const slideCenterX = focusedSlideBounding.left + focusedSlideBounding.width / 2 - const slideCenterY = focusedSlideBounding.top + focusedSlideBounding.height / 2 + const focusedSlideBounding = slide.value[modelValue.value]?.getBoundingClientRect() + if (focusedSlideBounding) { + const slideCenterX = focusedSlideBounding.left + focusedSlideBounding.width / 2 + const slideCenterY = focusedSlideBounding.top + focusedSlideBounding.height / 2 - scale.value = 3 - x.value += positionX - slideCenterX - y.value += positionY - slideCenterY - restrictShiftToInsideSlide() + scale.value = 3 + x.value += positionX - slideCenterX + y.value += positionY - slideCenterY + restrictShiftToInsideSlide() + } } } From 06bef4902e1345383d48359ff4d60c22b6060195 Mon Sep 17 00:00:00 2001 From: Ayo Date: Sat, 22 Nov 2025 19:59:41 +0100 Subject: [PATCH 4/4] chore: restore package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb13d2d8..418654f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@elk-zone/elk", "type": "module", - "version": "0.17.1", + "version": "0.17.2", "packageManager": "pnpm@10.23.0", "license": "MIT", "homepage": "https://elk.zone/",