Skip to content
Closed
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
fcdd5db
Merge version '2025.4.1-mhq.12a' into io
github-actions[bot] Feb 1, 2026
c6ff7f1
2025.4.1-io.12a (MisskeyIO#1426)
github-actions[bot] Feb 1, 2026
a996520
Merge version '2025.4.1-mhq.12b' into io
github-actions[bot] Feb 1, 2026
fb6fbea
2025.4.1-io.12b (MisskeyIO#1431)
github-actions[bot] Feb 1, 2026
a59abd3
Merge version '2025.4.1-mhq.13' into io
github-actions[bot] Mar 22, 2026
d7a7bd0
2025.4.1-io.13 (MisskeyIO#1453)
github-actions[bot] Mar 22, 2026
a3464d4
Merge branch 'next-main' into next
u1-liquid Apr 11, 2026
28b6d08
fix(MSKY-207): 次元機能が無効になっていたのを修正
mattyatea Apr 25, 2026
7fb0ed5
fix(MSKY-214): グローバルタイムラインの初回表示で返信が欠ける問題を修正
mattyatea Apr 25, 2026
bb87535
fix(MSKY-213): アンテナ名変更後にデッキヘッダーを更新
mattyatea Apr 25, 2026
871302b
fix(MSKY-215): 概要タブでもチャンネル投稿を取得する
mattyatea Apr 25, 2026
2bb8399
fix(MSKY-212): 投稿アカウント切替アイコンにアバターデコレーションを反映
mattyatea Apr 25, 2026
e4920f6
fix(MSKY-209): 権限がない場合は予約投稿を表示しない
mattyatea Apr 25, 2026
4ecfa0d
fix(MSKY-210): アップロード破棄キャンセル後に入力不能になる問題を修正
mattyatea Apr 25, 2026
18e368c
fix(MSKY-211): カスタム絵文字詳細ダイアログに閉じる導線を追加
mattyatea Apr 25, 2026
6587ec6
fix(MSKY-206): ワードミュート判定と解除操作を安定化
mattyatea Apr 25, 2026
536d771
fix(MSKY-208): 投稿エラー後もチャンネルコンテキストを保持する
mattyatea Apr 25, 2026
75f27b4
fix(MSKY-206): ミュート展開時にノート本体を表示する
mattyatea Apr 25, 2026
982c0f1
Fix: 次元周りのバグを修正
mattyatea Apr 25, 2026
63c3af8
予約投稿ダイアログで閉じるボタンがないのを修正
mattyatea Apr 26, 2026
76e4f4c
不要なものを削除
mattyatea Apr 26, 2026
e73ab18
予約投稿の未使用ロールポリシーを削除
mattyatea Apr 27, 2026
9d00400
Fix: canScheduleNoteベースのUI側の権限制御を追加
mattyatea Apr 27, 2026
d2e2105
fix: focus trapの相互操作状態を復元
mattyatea Apr 28, 2026
d4a4245
fix(MSKY-214): fanout timelineの次元0取得を修正
mattyatea Apr 28, 2026
1e1669e
fix(MSKY-206): ワードミュートの静的解析指摘を修正
mattyatea Apr 28, 2026
e4fa506
fix: focus trapの静的解析指摘を修正
mattyatea Apr 28, 2026
26d15fa
fix: CI環境のlintとFederation testを修正
mattyatea Apr 28, 2026
75bfffe
Fix: index.d.tsを更新
mattyatea Apr 28, 2026
cb93650
fix(MSKY-206): ワードミュートのレビュー指摘を反映
mattyatea Apr 30, 2026
37ce235
fix: focus trapのレビュー指摘を反映
mattyatea Apr 30, 2026
077de10
fix: カスタム絵文字詳細の未使用スタイルを削除
mattyatea Apr 30, 2026
9ef6c28
fix: 投稿フォームメニューの型エラーを修正
mattyatea Apr 30, 2026
597bda5
fix: リストTL購読の未対応パラメータを削除
mattyatea Apr 30, 2026
c3b4403
Fix: withOkButton || withCloseButton は間違っている
mattyatea Apr 30, 2026
132155a
fix: focus trapの下位トラップ解放を修正
mattyatea Apr 30, 2026
9040a75
Revert "fix(MSKY-207): 次元機能が無効になっていたのを修正"
mattyatea Apr 30, 2026
3b0374d
Revert "fix(MSKY-214): fanout timelineの次元0取得を修正"
mattyatea Apr 30, 2026
1ed1d62
Fix: テストを修正
mattyatea Apr 30, 2026
6dfd899
Enhance: Mute周りがわかりにくいのでいい感じにする
mattyatea May 3, 2026
3ae7a62
fix: focus trapの解放対象がinertに戻る問題を修正
mattyatea May 7, 2026
2edbc2e
fix: hideMutedNotes有効時にミュート表示を隠す
mattyatea May 7, 2026
97583d2
fix: focus trapの解放状態を再計算する
mattyatea May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion locales/ca-ES.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2103,7 +2103,6 @@ _role:
uploadableFileTypes_caption: "Especifica el tipus MIME. Es poden especificar diferents tipus MIME separats amb una nova línia, i es poden especificar comodins amb asteriscs (*). (Per exemple: image/*)"
uploadableFileTypes_caption2: "Pot que no sigui possible determinar el tipus MIME d'alguns arxius. Per permetre aquests tipus d'arxius afegeix {x} a les especificacions."
noteDraftLimit: "Nombre possible d'esborranys de notes al servidor"
scheduledNoteLimit: "Màxim nombre de notes programades que es poden crear simultàniament"
watermarkAvailable: "Pots fer servir la marca d'aigua"
_condition:
roleAssignedTo: "Assignat a rols manuals"
Expand Down
1 change: 0 additions & 1 deletion locales/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2234,7 +2234,6 @@ _role:
chatAvailability: "Allow Chat"
canSearchUsers: 'User search'
noteDraftLimit: 'Number of possible drafts of server notes'
scheduledNoteLimit: 'Maximum number of simultaneous scheduled notes'
uploadableFileTypes: 'Uploadable file types'
uploadableFileTypes_caption: 'Specifies the allowed MIME/file types. Multiple MIME types can be specified by separating them with a new line, and wildcards can be specified with an asterisk (*). (e.g., image/*)'
uploadableFileTypes_caption2: 'Some files types might fail to be detected. To allow such files, add {x} to the specification.'
Expand Down
1 change: 0 additions & 1 deletion locales/es-ES.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2103,7 +2103,6 @@ _role:
uploadableFileTypes_caption: "Especifica los tipos MIME/archivos permitidos. Se pueden especificar varios tipos MIME separándolos con una nueva línea, y se pueden especificar comodines con un asterisco (*). (por ejemplo, image/*)"
uploadableFileTypes_caption2: "Es posible que no se detecten algunos tipos de archivos. Para permitir estos archivos, añade {x} a la especificación."
noteDraftLimit: "Número de posibles borradores de notas del servidor"
scheduledNoteLimit: "Máximo número de notas programadas que se pueden crear simultáneamente."
watermarkAvailable: "Disponibilidad de la función de marca de agua"
_condition:
roleAssignedTo: "Asignado a roles manuales"
Expand Down
4 changes: 0 additions & 4 deletions locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8734,10 +8734,6 @@ export interface Locale extends ILocale {
* サーバーサイドのノートの下書きの作成可能数
*/
"noteDraftLimit": string;
/**
* 予約投稿の同時作成可能数
*/
"scheduledNoteLimit": string;
/**
* アップロード可能なファイル種別
*/
Expand Down
1 change: 0 additions & 1 deletion locales/it-IT.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2101,7 +2101,6 @@ _role:
uploadableFileTypes_caption: "Specifica il tipo MIME. Puoi specificare più valori separandoli andando a capo, oppure indicare caratteri jolly con un asterisco (*). Ad esempio: image/*"
uploadableFileTypes_caption2: "A seconda del file, il tipo potrebbe non essere determinato. Se si desidera consentire tali file, aggiungere {x} alla specifica."
noteDraftLimit: "Numero massimo di Note in bozza, lato server"
scheduledNoteLimit: "Quantità di Note pianificabili contemporaneamente"
watermarkAvailable: "Disponibilità della funzione filigrana"
_condition:
roleAssignedTo: "Assegnato a ruoli manualmente"
Expand Down
1 change: 0 additions & 1 deletion locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2253,7 +2253,6 @@ _role:
mutualLinkLimit: "セクション内の相互リンクの最大数"
chatAvailability: "チャットを許可"
noteDraftLimit: 'サーバーサイドのノートの下書きの作成可能数'
scheduledNoteLimit: '予約投稿の同時作成可能数'
uploadableFileTypes: 'アップロード可能なファイル種別'
uploadableFileTypes_caption: 'MIMEタイプを指定します。改行で区切って複数指定できるほか、アスタリスク(*)でワイルドカード指定できます。(例: image/*)'
uploadableFileTypes_caption2: 'ファイルによっては種別を判定できないことがあります。そのようなファイルを許可する場合は {x} を指定に追加してください。'
Expand Down
1 change: 0 additions & 1 deletion locales/ko-KR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2231,7 +2231,6 @@ _role:
uploadableFileTypes_caption: "MIME 유형을 "
uploadableFileTypes_caption2: "파일에 따라서는 유형을 검사하지 못하는 경우가 있습니다. 그러한 파일을 허가하는 경우에는 {x}를 지정으로 추가해주십시오."
noteDraftLimit: "서버측 노트 초안 작성 가능 수"
scheduledNoteLimit: "예약 게시물의 동시 작성 가능 수"
watermarkAvailable: "워터마크 기능의 사용 여부"
_condition:
roleAssignedTo: "수동 역할에 이미 할당됨"
Expand Down
1 change: 0 additions & 1 deletion locales/pt-PT.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2052,7 +2052,6 @@ _role:
uploadableFileTypes_caption: "Especifica tipos MIME permitidos. Múltiplos tipos MIME podem ser especificados separando-os por linha. Curingas podem ser especificados com um asterisco (*). (exemplo, image/*)"
uploadableFileTypes_caption2: "Alguns tipos de arquivos podem não ser detectados. Para permiti-los, adicione {x} à especificação."
noteDraftLimit: "Limite de rascunhos possíveis"
scheduledNoteLimit: "Número máximo de notas agendadas simultâneas"
watermarkAvailable: "Disponibilidade da função de marca d'água"
_condition:
roleAssignedTo: "Atribuído a cargos manuais"
Expand Down
1 change: 0 additions & 1 deletion locales/th-TH.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2053,7 +2053,6 @@ _role:
uploadableFileTypes_caption: "สามารถระบุ MIME type ได้ โดยใช้การขึ้นบรรทัดใหม่เพื่อแยกหลายรายการ และสามารถใช้ดอกจัน (*) เพื่อระบุแบบไวลด์การ์ดได้ (เช่น: image/*)"
uploadableFileTypes_caption2: "ไฟล์บางประเภทอาจไม่สามารถระบุชนิดได้ หากต้องการอนุญาตไฟล์ลักษณะนั้น กรุณาเพิ่ม {x} ลงในรายการที่อนุญาต"
noteDraftLimit: "จำนวนโน้ตฉบับร่างที่สามารถสร้างได้บนฝั่งเซิร์ฟเวอร์"
scheduledNoteLimit: "จำนวนโพสต์กำหนดเวลาที่สร้างพร้อมกันได้"
watermarkAvailable: "มีฟังก์ชั่นลายน้ำให้เลือกใช้"
_condition:
roleAssignedTo: "มอบหมายให้มีบทบาทแบบทำมือ"
Expand Down
1 change: 0 additions & 1 deletion locales/zh-CN.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2122,7 +2122,6 @@ _role:
uploadableFileTypes_caption: "指定 MIME 类型。可用换行指定多个类型,也可以用星号(*)作为通配符。(如 image/*)"
uploadableFileTypes_caption2: "文件根据文件的不同,可能无法判断其类型。若要允许此类文件,请在指定中添加 {x}。"
noteDraftLimit: "可在服务器上创建多少草稿"
scheduledNoteLimit: "可同时创建的定时帖子数量"
watermarkAvailable: "能否使用水印功能"
_condition:
roleAssignedTo: "已分配给手动角色"
Expand Down
1 change: 0 additions & 1 deletion locales/zh-TW.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2104,7 +2104,6 @@ _role:
uploadableFileTypes_caption: "請指定 MIME 類型。可以用換行區隔多個類型,也可以使用星號(*)作為萬用字元進行指定。(例如:image/*)\n"
uploadableFileTypes_caption2: "有些檔案可能無法判斷其類型。若要允許這類檔案,請在指定中加入 {x}。"
noteDraftLimit: "伺服器端可建立的貼文草稿數量上限\n"
scheduledNoteLimit: "同時建立的排定發布數量"
watermarkAvailable: "浮水印功能是否可用"
_condition:
roleAssignedTo: "手動指派角色完成"
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "misskey",
"version": "2025.11.1-mhq.0",
"version": "2025.11.1-io.0",
"codename": "nasubi",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/core/FanoutTimelineEndpointService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export class FanoutTimelineEndpointService {
const idCompare: (a: string, b: string) => number = ascending ? (a, b) => a < b ? -1 : 1 : (a, b) => a > b ? -1 : 1;

const dimension = normalizeDimension(ps.viewerDimension, this.meta.dimensions ?? 1);
const redisResult = dimension == null
const redisResult = dimension == null || dimension === 0
? await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId)
: await this.fanoutTimelineService.getMultiDimension(ps.redisTimelines, dimension, ps.untilId, ps.sinceId);

Expand Down
3 changes: 0 additions & 3 deletions packages/backend/src/core/RoleService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ export type RolePolicies = {
chatAvailability: 'available' | 'readonly' | 'unavailable';
uploadableFileTypes: string[];
noteDraftLimit: number;
scheduledNoteLimit: number;
watermarkAvailable: boolean;
};

Expand Down Expand Up @@ -153,7 +152,6 @@ export const DEFAULT_POLICIES: RolePolicies = {
'audio/*',
],
noteDraftLimit: 10,
scheduledNoteLimit: 1, // FIXME Check
watermarkAvailable: true,
};

Expand Down Expand Up @@ -522,7 +520,6 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
return [...set];
}),
noteDraftLimit: calc('noteDraftLimit', vs => Math.max(...vs)),
scheduledNoteLimit: calc('scheduledNoteLimit', vs => Math.max(...vs)),
watermarkAvailable: calc('watermarkAvailable', vs => vs.some(v => v === true)),
};

Expand Down
80 changes: 50 additions & 30 deletions packages/backend/src/misc/check-word-mute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,26 @@

const acCache = new Map<string, AhoCorasick>();

function matchesMutedFilter(filter: string | string[], text: string): boolean {
if (Array.isArray(filter)) {
return filter.every(keyword => text.includes(keyword));
}

// represents RegExp
const regexp = filter.match(/^\/(.+)\/(.*)$/);

// This should never happen due to input sanitisation.
if (!regexp) return false;

try {
return new RE2(regexp[1], regexp[2]).test(text);
} catch (err) {
// This should never happen due to input sanitisation.
return false;
}
}

export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: Array<string | string[]>): Promise<boolean> {

Check failure on line 42 in packages/backend/src/misc/check-word-mute.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=MisskeyIO_misskey&issues=AZ3UJPpDPsByiq4cIqws&open=AZ3UJPpDPsByiq4cIqws&pullRequest=1463
// 自分自身
if (me && (note.userId === me.id)) return false;

Expand All @@ -29,39 +48,40 @@

if (text === '') return false;

const acable = mutedWords.filter(filter => Array.isArray(filter) && filter.length === 1).map(filter => filter[0]).sort();
const unacable = mutedWords.filter(filter => !Array.isArray(filter) || filter.length !== 1);
const acCacheKey = acable.join('\n');
const ac = acCache.get(acCacheKey) ?? AhoCorasick.withPatterns(acable);
acCache.delete(acCacheKey);
for (const obsoleteKeys of acCache.keys()) {
if (acCache.size > 1000) {
acCache.delete(obsoleteKeys);
}
}
acCache.set(acCacheKey, ac);
if (ac.isMatch(text)) {
return true;
}
const normalizeKeywordFilter = (keywords: string[]): string[] => {
return keywords
.map(keyword => keyword.trim())
.filter(keyword => keyword !== '');
};

const normalizedWords = mutedWords
.map(filter => {
if (!Array.isArray(filter)) return filter;
return normalizeKeywordFilter(filter);
})
.filter((filter): filter is string | string[] => !Array.isArray(filter) || filter.length > 0);

const matched = unacable.some(filter => {
if (Array.isArray(filter)) {
return filter.every(keyword => text.includes(keyword));
} else {
// represents RegExp
const regexp = filter.match(/^\/(.+)\/(.*)$/);

// This should never happen due to input sanitisation.
if (!regexp) return false;

try {
return new RE2(regexp[1], regexp[2]).test(text);
} catch (err) {
// This should never happen due to input sanitisation.
return false;
const acable = normalizedWords
.filter((filter): filter is string[] => Array.isArray(filter) && filter.length === 1)
.map(filter => filter[0])
.sort((a, b) => a.localeCompare(b));
const unacable = normalizedWords.filter(filter => !Array.isArray(filter) || filter.length !== 1);
if (acable.length > 0) {
const acCacheKey = acable.join('\n');
const ac = acCache.get(acCacheKey) ?? AhoCorasick.withPatterns(acable);
acCache.delete(acCacheKey);
for (const obsoleteKeys of acCache.keys()) {
if (acCache.size > 1000) {
acCache.delete(obsoleteKeys);
}
}
});
acCache.set(acCacheKey, ac);
if (ac.isMatch(text)) {
return true;
}
}

const matched = unacable.some(filter => matchesMutedFilter(filter, text));

if (matched) return true;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/misc/dimension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type { MiNoteWithDimension } from '@/models/Note.js';
export function normalizeDimension(value: number | null | undefined, dimensionCount: number): number | null {
const count = Math.max(1, dimensionCount);
if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isInteger(value)) return null;
if (value <= 0 || value >= count) return null;
if (value < 0 || value >= count) return null;
return value;
}

Expand Down
4 changes: 0 additions & 4 deletions packages/backend/src/models/json-schema/role.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,10 +381,6 @@ export const packedRolePoliciesSchema = {
type: 'integer',
optional: false, nullable: false,
},
scheduledNoteLimit: {
type: 'integer',
optional: false, nullable: false,
},
watermarkAvailable: {
type: 'boolean',
optional: false, nullable: false,
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/test-federation/compose.a.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ services:
volumes:
- type: bind
source: ./volumes/db.a
target: /var/lib/postgresql/data
target: /var/lib/postgresql
Comment thread
mattyatea marked this conversation as resolved.
bind:
create_host_path: true

Expand Down
2 changes: 1 addition & 1 deletion packages/backend/test-federation/compose.b.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ services:
volumes:
- type: bind
source: ./volumes/db.b
target: /var/lib/postgresql/data
target: /var/lib/postgresql
Comment thread
mattyatea marked this conversation as resolved.
bind:
create_host_path: true

Expand Down
5 changes: 5 additions & 0 deletions packages/backend/test/unit/misc/check-word-mute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ describe(checkWordMute, () => {
it('should return false when the note is written by me even if text contains muted words', async () => {
expect(await checkWordMute({ userId: '1', text: 'foo bar' }, { id: '1' }, [['foo', 'bar']])).toBe(false);
});
it('should ignore empty keywords in keyword filters', async () => {
expect(await checkWordMute({ userId: '1', text: 'foo bar' }, null, [['foo', '']])).toBe(true);
expect(await checkWordMute({ userId: '1', text: 'foo bar' }, null, [['', 'bar']])).toBe(true);
expect(await checkWordMute({ userId: '1', text: 'foo bar' }, null, [['']])).toBe(false);
});
});
describe('RegExp mode', () => {
it('should return false if text does not contain muted words', async () => {
Expand Down
1 change: 0 additions & 1 deletion packages/frontend/.storybook/fakes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,6 @@ export function userDetailed(id = 'someuserid', username = 'miskist', host: enti
rateLimitFactor: 0,
scheduleNoteLimit: 0,
scheduleNoteMaxDays: 0,
scheduledNoteLimit: 0,
skipNsfwDetection: false,
uploadableFileTypes: [],
userEachUserListsLimit: 0,
Expand Down
15 changes: 14 additions & 1 deletion packages/frontend/src/components/MkCustomEmojiDetailedDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-->

<template>
<MkModalWindow ref="dialogEl" @close="cancel()" @closed="emit('closed')">
<MkModalWindow ref="dialogEl" @close="cancel()" @closed="emit('closed')" >
<template #header>:{{ emoji.name }}:</template>
<template #default>
<div class="_spacer">
Expand Down Expand Up @@ -91,6 +91,19 @@ function cancel() {
overflow-y: hidden;
}

.actions {
display: flex;
justify-content: flex-end;
}

.closeButton {
width: 32px;
height: 32px;
border-radius: 999px;
color: var(--MI_THEME-fg);
background: light-dark(rgba(0, 0, 0, 0.04), rgba(255, 255, 255, 0.08));
}

.aliases {
display: flex;
flex-wrap: wrap;
Expand Down
2 changes: 1 addition & 1 deletion packages/frontend/src/components/MkModalWindow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkModal ref="modal" v-slot="{ type }" hasInteractionWithOtherFocusTrappedEls :preferType="deviceKind === 'smartphone' ? 'drawer' : 'dialog'" @click="onBgClick" @closed="emit('closed')" @esc="emit('esc')">
<div ref="rootEl" :class="[$style.root, type === 'drawer' ? $style.asDrawer : null]" :style="{ width: type === 'drawer' ? '' : `${width}px`, height: type === 'drawer' ? '' : `min(${height}px, 100%)` }">
<div ref="headerEl" :class="$style.header">
<button v-if="withOkButton && withCloseButton" :class="$style.headerButton" class="_button" @click="emit('close')"><i class="ti ti-x"></i></button>
<button v-if="withOkButton || withCloseButton" :class="$style.headerButton" class="_button" @click="emit('close')"><i class="ti ti-x"></i></button>
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
<span :class="$style.title">
<slot name="header"></slot>
</span>
Expand Down
8 changes: 7 additions & 1 deletion packages/frontend/src/components/MkNote.vue
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</article>
</div>
<div v-else :class="$style.muted" :style="hideMutedNotes ? 'display: none' : undefined" @click="muted = false">
<div v-else :class="$style.muted" :style="hideMutedNotes ? 'display: none' : undefined" @click="toggleMute">
<I18n v-if="muted === 'sensitiveMute'" :src="i18n.ts.userSaysSomethingSensitive" tag="small">
<template #name>
<MkA v-user-preview="appearNote.userId" :to="userPage(appearNote.user)">
Expand Down Expand Up @@ -321,6 +321,12 @@ const renoteCollapsed = ref(
);
const hideMutedNotes = prefer.s.hideMutedNotes;

function toggleMute(ev: MouseEvent): void {
muted.value = false;
hardMuted.value = false;
ev.stopPropagation();
}

const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({
type: 'lookup',
url: `https://${host}/notes/${appearNote.id}`,
Expand Down
8 changes: 7 additions & 1 deletion packages/frontend/src/components/MkNoteDetailed.vue
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</div>
</div>
<div v-else-if="muted" class="_panel" :class="$style.muted" @click="muted = false">
<div v-else-if="muted" class="_panel" :class="$style.muted" @click="toggleMute">
<small>
{{ i18n.tsx.userSaysSomething({ name: '' }) }}
<MkA v-user-preview="appearNote.userId" :to="userPage(appearNote.user)">
Expand Down Expand Up @@ -326,6 +326,12 @@ const isMyRenote = $i && ($i.id === note.userId);
const showContent = ref(false);
const isDeleted = ref(false);
const muted = ref($i ? checkWordMute(appearNote, $i, $i.mutedWords) : false);

function toggleMute(ev: MouseEvent): void {
muted.value = false;
ev.stopPropagation();
}

const translation = ref<Misskey.entities.NotesTranslateResponse | null>(null);
const translating = ref(false);
const parsed = appearNote.text ? mfm.parse(appearNote.text) : null;
Expand Down
1 change: 1 addition & 0 deletions packages/frontend/src/components/MkNoteScheduledDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:width="600"
:height="650"
:withOkButton="false"
:withCloseButton="true"
@click="cancel()"
@close="cancel()"
@closed="emit('closed')"
Expand Down
7 changes: 6 additions & 1 deletion packages/frontend/src/components/MkNoteSub.vue
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkA class="_link" :to="notePage(note)">{{ i18n.ts.continueThread }} <i class="ti ti-chevron-double-right"></i></MkA>
</div>
</div>
<div v-else :class="$style.muted" @click="muted = false">
<div v-else :class="$style.muted" @click="toggleMute">
<I18n :src="i18n.ts.userSaysSomething" tag="small">
<template #name>
<MkA v-user-preview="note.userId" :to="userPage(note.user)">
Expand Down Expand Up @@ -67,6 +67,11 @@ const props = withDefaults(defineProps<{

const muted = ref(props.note && $i ? checkWordMute(props.note, $i, $i.mutedWords) : false);

function toggleMute(ev: MouseEvent): void {
muted.value = false;
ev.stopPropagation();
}

const showContent = ref(false);
const replies = ref<Misskey.entities.Note[]>([]);

Expand Down
Loading
Loading