From 1857052b3252c88ee0359d910b4d34069e22ed5c Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 1 May 2025 18:27:03 +0900 Subject: [PATCH] wip --- packages/frontend/src/components/MkPostForm.vue | 6 +++++- packages/frontend/src/components/MkTimeline.vue | 10 ++++++++++ packages/frontend/src/events.ts | 1 + packages/frontend/src/use/use-pagination.ts | 14 ++++++++++++-- packages/frontend/src/utility/get-note-menu.ts | 10 +++++++--- 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index c4857b7f65..5114e98494 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -137,6 +137,7 @@ import { mfmFunctionPicker } from '@/utility/mfm-function-picker.js'; import { prefer } from '@/preferences.js'; import { getPluginHandlers } from '@/plugin.js'; import { DI } from '@/di.js'; +import { globalEvents } from '@/events.js'; const $i = ensureSignin(); @@ -883,12 +884,15 @@ async function post(ev?: MouseEvent) { } posting.value = true; - misskeyApi('notes/create', postData, token).then(() => { + misskeyApi('notes/create', postData, token).then((res) => { if (props.freezeAfterPosted) { posted.value = true; } else { clear(); } + + globalEvents.emit('notePosted', res.createdNote); + nextTick(() => { deleteDraft(); emit('posted'); diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue index cf1cf99e3d..03d1cf9cf7 100644 --- a/packages/frontend/src/components/MkTimeline.vue +++ b/packages/frontend/src/components/MkTimeline.vue @@ -67,6 +67,7 @@ import MkNote from '@/components/MkNote.vue'; import MkButton from '@/components/MkButton.vue'; import { i18n } from '@/i18n.js'; import { infoImageUrl } from '@/instance.js'; +import { globalEvents } from '@/events.js'; const props = withDefaults(defineProps<{ src: BasicTimelineType | 'mentions' | 'directs' | 'list' | 'antenna' | 'channel' | 'role'; @@ -122,6 +123,15 @@ if (!store.s.realtimeMode) { }); } +globalEvents.on('notePosted', (note: Misskey.entities.Note) => { + const isTop = rootEl.value == null ? false : isHeadVisible(rootEl.value, 16); + if (isTop) { + paginator.fetchNewer({ + toQueue: false, + }); + } +}); + function releaseQueue() { paginator.releaseQueue(); scrollToTop(rootEl.value); diff --git a/packages/frontend/src/events.ts b/packages/frontend/src/events.ts index dfd3d4120c..550987382a 100644 --- a/packages/frontend/src/events.ts +++ b/packages/frontend/src/events.ts @@ -10,4 +10,5 @@ export const globalEvents = new EventEmitter<{ themeChanging: () => void; themeChanged: () => void; clientNotification: (notification: Misskey.entities.Notification) => void; + notePosted: (note: Misskey.entities.Note) => void; }>(); diff --git a/packages/frontend/src/use/use-pagination.ts b/packages/frontend/src/use/use-pagination.ts index 8e7bc5e1ad..23a955f4ba 100644 --- a/packages/frontend/src/use/use-pagination.ts +++ b/packages/frontend/src/use/use-pagination.ts @@ -65,6 +65,16 @@ export function usePagination [props.ctx.endpoint, props.ctx.params], init, { deep: true }); + function getNewestId() { + // 様々な要因により並び順は保証されないのでソートが必要 + return Array.from(items.value.keys()).sort().at(-1); + } + + function getOldestId() { + // 様々な要因により並び順は保証されないのでソートが必要 + return Array.from(items.value.keys()).sort().at(0); + } + async function init(): Promise { items.value = new Map(); fetching.value = true; @@ -110,7 +120,7 @@ export function usePagination { for (let i = 0; i < res.length; i++) { @@ -141,7 +151,7 @@ export function usePagination { if (options.toQueue) { diff --git a/packages/frontend/src/utility/get-note-menu.ts b/packages/frontend/src/utility/get-note-menu.ts index dd8bdf43d7..ac75192642 100644 --- a/packages/frontend/src/utility/get-note-menu.ts +++ b/packages/frontend/src/utility/get-note-menu.ts @@ -25,6 +25,7 @@ import { getAppearNote } from '@/utility/get-appear-note.js'; import { genEmbedCode } from '@/utility/get-embed-code.js'; import { prefer } from '@/preferences.js'; import { getPluginHandlers } from '@/plugin.js'; +import { globalEvents } from '@/events.js'; export async function getNoteClipMenu(props: { note: Misskey.entities.Note; @@ -569,8 +570,9 @@ export function getRenoteMenu(props: { misskeyApi('notes/create', { renoteId: appearNote.id, channelId: appearNote.channelId, - }).then(() => { + }).then((res) => { os.toast(i18n.ts.renoted); + globalEvents.emit('notePosted', res.createdNote); }); } }, @@ -617,8 +619,9 @@ export function getRenoteMenu(props: { localOnly, visibility, renoteId: appearNote.id, - }).then(() => { + }).then((res) => { os.toast(i18n.ts.renoted); + globalEvents.emit('notePosted', res.createdNote); }); } }, @@ -658,8 +661,9 @@ export function getRenoteMenu(props: { misskeyApi('notes/create', { renoteId: appearNote.id, channelId: channel.id, - }).then(() => { + }).then((res) => { os.toast(i18n.tsx.renotedToX({ name: channel.name })); + globalEvents.emit('notePosted', res.createdNote); }); } },