From b812ddbbf28804b2ab23dc2a0cc6a6d79295c889 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 4 Aug 2026 17:38:18 +0900 Subject: [PATCH] make calculateMuteStatus return array with checkOnly = true and split calculateMuteStatus into word mute part and built-in soft mute part (#17829) * refactor: make calculateMuteStatus return array even when checkOnly = true * refactor: simplify calculateMuteStatus result type * refactor: split calculateMuteStatus into word mute part and built-in part --- packages/frontend/src/composables/use-note.ts | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/frontend/src/composables/use-note.ts b/packages/frontend/src/composables/use-note.ts index d32e3a38b1..b0385684c7 100644 --- a/packages/frontend/src/composables/use-note.ts +++ b/packages/frontend/src/composables/use-note.ts @@ -62,36 +62,34 @@ export interface UseNoteOptions { currentAntenna?: Ref | null; } -export function calculateMuteStatus< - CheckOnly extends boolean, - CheckForSensitiveMedia extends boolean, - ReturnTypeA = CheckOnly extends true ? boolean : Array | false | 'sensitiveMute', - ReturnTypeB = CheckForSensitiveMedia extends true ? ReturnTypeA : Exclude, ->( +export function checkNoteWordMute( noteToCheck: Misskey.entities.Note, user: typeof $i, mutedWords: Array | null, - checkForSensitiveMedia: CheckForSensitiveMedia, - checkOnly: CheckOnly = false as CheckOnly, -): ReturnTypeB { +): Array | false { if (mutedWords != null) { const result = checkWordMute(noteToCheck, user, mutedWords); - if (Array.isArray(result)) return checkOnly ? (result.length > 0) as ReturnTypeB : result as ReturnTypeB; + if (Array.isArray(result)) return result; const replyResult = noteToCheck.reply && checkWordMute(noteToCheck.reply, user, mutedWords); - if (Array.isArray(replyResult)) return checkOnly ? (replyResult.length > 0) as ReturnTypeB : replyResult as ReturnTypeB; + if (Array.isArray(replyResult)) return replyResult; const renoteResult = noteToCheck.renote && checkWordMute(noteToCheck.renote, user, mutedWords); - if (Array.isArray(renoteResult)) return checkOnly ? (renoteResult.length > 0) as ReturnTypeB : renoteResult as ReturnTypeB; + if (Array.isArray(renoteResult)) return renoteResult; } - if (checkOnly) return false as ReturnTypeB; + return false; +} +export function checkBuiltinSoftMute( + noteToCheck: Misskey.entities.Note, + checkForSensitiveMedia: boolean, +): 'sensitiveMute' | false { if (checkForSensitiveMedia && noteToCheck.files?.some((v) => v.isSensitive)) { - return 'sensitiveMute' as ReturnTypeB; + return 'sensitiveMute' as never; } - return false as ReturnTypeB; + return false; } /** MkNote, MkNoteDetailedの共通ロジック */ @@ -146,8 +144,8 @@ export function useNote( // ミュート判定 // mutedはミュート解除の操作で書き換わるのでrefだが、hardMutedは解除できないのでリアクティブにしない - const muted = ref($i ? calculateMuteStatus(appearNote, $i, $i.mutedWords, inTimeline && !tl_withSensitive.value) : false); - const hardMuted = props.withHardMute && $i ? calculateMuteStatus(appearNote, $i, $i.hardMutedWords, inTimeline && !tl_withSensitive.value, true) : false; + const muted = ref($i ? checkNoteWordMute(appearNote, $i, $i.mutedWords) || checkBuiltinSoftMute(appearNote, inTimeline && !tl_withSensitive.value) : false); + const hardMuted = props.withHardMute && $i ? checkNoteWordMute(appearNote, $i, $i.hardMutedWords) : false; // 導出値 // rawNote / appearNote / $i.id / prefer.s は変化しないので一度だけ計算する