Hard mute (#12376)
* feat(backend,misskey-js): hard mute storage in backend * fix(backend,misskey-js): mute word record type * chore(frontend): generalize XWordMute * feat(frontend): configure hard mute * feat(frontend): hard mute notes on the timelines * lint(backend,frontend): fix lint failure * chore(misskey-js): update api.md * fix(backend): test failure * chore(frontend): check word mute for reply * chore: limit hard mute count
This commit is contained in:
		| @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only | ||||
|  | ||||
| <template> | ||||
| <div | ||||
| 	v-if="!muted" | ||||
| 	v-if="!hardMuted && !muted" | ||||
| 	v-show="!isDeleted" | ||||
| 	ref="el" | ||||
| 	v-hotkey="keymap" | ||||
| @@ -133,7 +133,7 @@ SPDX-License-Identifier: AGPL-3.0-only | ||||
| 		</div> | ||||
| 	</article> | ||||
| </div> | ||||
| <div v-else :class="$style.muted" @click="muted = false"> | ||||
| <div v-else-if="!hardMuted" :class="$style.muted" @click="muted = false"> | ||||
| 	<I18n :src="i18n.ts.userSaysSomething" tag="small"> | ||||
| 		<template #name> | ||||
| 			<MkA v-user-preview="appearNote.userId" :to="userPage(appearNote.user)"> | ||||
| @@ -183,6 +183,7 @@ const props = withDefaults(defineProps<{ | ||||
| 	note: Misskey.entities.Note; | ||||
| 	pinned?: boolean; | ||||
| 	mock?: boolean; | ||||
| 	withHardMute?: boolean; | ||||
| }>(), { | ||||
| 	mock: false, | ||||
| }); | ||||
| @@ -239,13 +240,23 @@ const urls = $computed(() => parsed ? extractUrlFromMfm(parsed) : null); | ||||
| const isLong = shouldCollapsed(appearNote, urls ?? []); | ||||
| const collapsed = ref(appearNote.cw == null && isLong); | ||||
| const isDeleted = ref(false); | ||||
| const muted = ref($i ? checkWordMute(appearNote, $i, $i.mutedWords) : false); | ||||
| const muted = ref(checkMute(appearNote, $i?.mutedWords)); | ||||
| const hardMuted = ref(props.withHardMute && checkMute(appearNote, $i?.hardMutedWords)); | ||||
| const translation = ref<any>(null); | ||||
| const translating = ref(false); | ||||
| const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.user.instance); | ||||
| const canRenote = computed(() => ['public', 'home'].includes(appearNote.visibility) || (appearNote.visibility === 'followers' && appearNote.userId === $i.id)); | ||||
| let renoteCollapsed = $ref(defaultStore.state.collapseRenotes && isRenote && (($i && ($i.id === note.userId || $i.id === appearNote.userId)) || (appearNote.myReaction != null))); | ||||
|  | ||||
| function checkMute(note: Misskey.entities.Note, mutedWords: Array<string | string[]> | undefined | null): boolean { | ||||
| 	if (mutedWords == null) return false; | ||||
|  | ||||
| 	if (checkWordMute(note, $i, mutedWords)) return true; | ||||
| 	if (note.reply && checkWordMute(note.reply, $i, mutedWords)) return true; | ||||
| 	if (note.renote && checkWordMute(note.renote, $i, mutedWords)) return true; | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| const keymap = { | ||||
| 	'r': () => reply(true), | ||||
| 	'e|a|plus': () => react(true), | ||||
|   | ||||
| @@ -24,7 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only | ||||
| 				:ad="true" | ||||
| 				:class="$style.notes" | ||||
| 			> | ||||
| 				<MkNote :key="note._featuredId_ || note._prId_ || note.id" :class="$style.note" :note="note"/> | ||||
| 				<MkNote :key="note._featuredId_ || note._prId_ || note.id" :class="$style.note" :note="note" :withHardMute="true"/> | ||||
| 			</MkDateSeparatedList> | ||||
| 		</div> | ||||
| 	</template> | ||||
|   | ||||
| @@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only | ||||
|  | ||||
| 		<template #default="{ items: notifications }"> | ||||
| 			<MkDateSeparatedList v-slot="{ item: notification }" :class="$style.list" :items="notifications" :noGap="true"> | ||||
| 				<MkNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :key="notification.id" :note="notification.note"/> | ||||
| 				<MkNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :key="notification.id" :note="notification.note" :withHardMute="true"/> | ||||
| 				<XNotification v-else :key="notification.id" :notification="notification" :withTime="true" :full="true" class="_panel"/> | ||||
| 			</MkDateSeparatedList> | ||||
| 		</template> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 anatawa12
					anatawa12