From 4f5d3f6f7d724eafa6cf82a3ce24f8fbb7fe7f84 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Thu, 31 Jul 2025 21:45:34 +0900 Subject: fix(frontend): MkNotesTimelineの日付dividerのスタイル修正 (#16306) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkStreamingNotesTimeline.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'packages/frontend/src/components/MkStreamingNotesTimeline.vue') diff --git a/packages/frontend/src/components/MkStreamingNotesTimeline.vue b/packages/frontend/src/components/MkStreamingNotesTimeline.vue index 3e50bdefd2..c2b4d6cd04 100644 --- a/packages/frontend/src/components/MkStreamingNotesTimeline.vue +++ b/packages/frontend/src/components/MkStreamingNotesTimeline.vue @@ -32,9 +32,9 @@ SPDX-License-Identifier: AGPL-3.0-only - diff --git a/packages/frontend/src/components/MkStreamingNotificationsTimeline.vue b/packages/frontend/src/components/MkStreamingNotificationsTimeline.vue index ac1f06619a..93ffee8d98 100644 --- a/packages/frontend/src/components/MkStreamingNotificationsTimeline.vue +++ b/packages/frontend/src/components/MkStreamingNotificationsTimeline.vue @@ -33,7 +33,7 @@ SPDX-License-Identifier: AGPL-3.0-only - diff --git a/packages/frontend/src/directives/appear.ts b/packages/frontend/src/directives/appear.ts index 802477e00b..f5fec108dc 100644 --- a/packages/frontend/src/directives/appear.ts +++ b/packages/frontend/src/directives/appear.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import { throttle } from 'throttle-debounce'; import type { Directive } from 'vue'; export default { @@ -10,12 +11,14 @@ export default { const fn = binding.value; if (fn == null) return; - const observer = new IntersectionObserver(entries => { + const check = throttle(1000, (entries) => { if (entries.some(entry => entry.isIntersecting)) { fn(); } }); + const observer = new IntersectionObserver(check); + observer.observe(src); src._observer_ = observer; -- cgit v1.2.3-freya From 05cc8047fae2d827ed3d98e735d19cd704f6126d Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:58:57 +0900 Subject: refactor --- .../src/components/MkStreamingNotesTimeline.vue | 59 +++++++++++++++------- packages/frontend/src/pages/user/home.vue | 4 +- packages/frontend/src/ui/_common_/navbar.vue | 2 +- .../src/ui/_common_/statusbar-federation.vue | 6 +-- .../src/ui/_common_/statusbar-user-list.vue | 6 +-- packages/frontend/src/ui/_common_/titlebar.vue | 2 +- 6 files changed, 50 insertions(+), 29 deletions(-) (limited to 'packages/frontend/src/components/MkStreamingNotesTimeline.vue') diff --git a/packages/frontend/src/components/MkStreamingNotesTimeline.vue b/packages/frontend/src/components/MkStreamingNotesTimeline.vue index 9ace0b32d5..bc6ebf0918 100644 --- a/packages/frontend/src/components/MkStreamingNotesTimeline.vue +++ b/packages/frontend/src/components/MkStreamingNotesTimeline.vue @@ -297,76 +297,97 @@ function prepend(note: Misskey.entities.Note & MisskeyEntity) { } } -let connection: Misskey.IChannelConnection | null = null; -let connection2: Misskey.IChannelConnection | null = null; - const stream = store.s.realtimeMode ? useStream() : null; +const connections = { + antenna: null as Misskey.IChannelConnection | null, + homeTimeline: null as Misskey.IChannelConnection | null, + localTimeline: null as Misskey.IChannelConnection | null, + hybridTimeline: null as Misskey.IChannelConnection | null, + globalTimeline: null as Misskey.IChannelConnection | null, + main: null as Misskey.IChannelConnection | null, + userList: null as Misskey.IChannelConnection | null, + channel: null as Misskey.IChannelConnection | null, + roleTimeline: null as Misskey.IChannelConnection | null, +}; + function connectChannel() { if (stream == null) return; if (props.src === 'antenna') { if (props.antenna == null) return; - connection = stream.useChannel('antenna', { + connections.antenna = stream.useChannel('antenna', { antennaId: props.antenna, }); + connections.antenna.on('note', prepend); } else if (props.src === 'home') { - connection = stream.useChannel('homeTimeline', { + connections.homeTimeline = stream.useChannel('homeTimeline', { withRenotes: props.withRenotes, withFiles: props.onlyFiles ? true : undefined, }); - connection2 = stream.useChannel('main'); + connections.main = stream.useChannel('main'); + connections.homeTimeline.on('note', prepend); } else if (props.src === 'local') { - connection = stream.useChannel('localTimeline', { + connections.localTimeline = stream.useChannel('localTimeline', { withRenotes: props.withRenotes, withReplies: props.withReplies, withFiles: props.onlyFiles ? true : undefined, }); + connections.localTimeline.on('note', prepend); } else if (props.src === 'social') { - connection = stream.useChannel('hybridTimeline', { + connections.hybridTimeline = stream.useChannel('hybridTimeline', { withRenotes: props.withRenotes, withReplies: props.withReplies, withFiles: props.onlyFiles ? true : undefined, }); + connections.hybridTimeline.on('note', prepend); } else if (props.src === 'global') { - connection = stream.useChannel('globalTimeline', { + connections.globalTimeline = stream.useChannel('globalTimeline', { withRenotes: props.withRenotes, withFiles: props.onlyFiles ? true : undefined, }); + connections.globalTimeline.on('note', prepend); } else if (props.src === 'mentions') { - connection = stream.useChannel('main'); - connection.on('mention', prepend); + connections.main = stream.useChannel('main'); + connections.main.on('mention', prepend); } else if (props.src === 'directs') { const onNote = note => { if (note.visibility === 'specified') { prepend(note); } }; - connection = stream.useChannel('main'); - connection.on('mention', onNote); + connections.main = stream.useChannel('main'); + connections.main.on('mention', onNote); } else if (props.src === 'list') { if (props.list == null) return; - connection = stream.useChannel('userList', { + connections.userList = stream.useChannel('userList', { withRenotes: props.withRenotes, withFiles: props.onlyFiles ? true : undefined, listId: props.list, }); + connections.userList.on('note', prepend); } else if (props.src === 'channel') { if (props.channel == null) return; - connection = stream.useChannel('channel', { + connections.channel = stream.useChannel('channel', { channelId: props.channel, }); + connections.channel.on('note', prepend); } else if (props.src === 'role') { if (props.role == null) return; - connection = stream.useChannel('roleTimeline', { + connections.roleTimeline = stream.useChannel('roleTimeline', { roleId: props.role, }); + connections.roleTimeline.on('note', prepend); } - if (props.src !== 'directs' && props.src !== 'mentions') connection?.on('note', prepend); } function disconnectChannel() { - if (connection) connection.dispose(); - if (connection2) connection2.dispose(); + for (const key in connections) { + const conn = connections[key as keyof typeof connections]; + if (conn != null) { + conn.dispose(); + connections[key as keyof typeof connections] = null; + } + } } if (store.s.realtimeMode) { diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index e10c44960a..6933d64214 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -54,7 +54,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + {{ role.name }} @@ -249,7 +249,7 @@ const style = computed(() => { }); const age = computed(() => { - return calcAge(props.user.birthday); + return props.user.birthday ? calcAge(props.user.birthday) : NaN; }); function menu(ev: MouseEvent) { diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue index 28913a54ab..4c43bf2b3b 100644 --- a/packages/frontend/src/ui/_common_/navbar.vue +++ b/packages/frontend/src/ui/_common_/navbar.vue @@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only