diff --git a/CHANGELOG.md b/CHANGELOG.md
index 026903afe..5c49f4b5e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
- Fix: システムアカウントが削除できる問題を修正
### Client
+- Enhance: モデレーターがセンシティブ設定を変更する際に確認ダイアログを出すように
- Fix: 削除して編集の削除タイミングを投稿後になるように `#14498`
### Server
diff --git a/locales/index.d.ts b/locales/index.d.ts
index dfdc5a3b3..947b57779 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -5262,6 +5262,14 @@ export interface Locale extends ILocale {
* " {emoji} " をリアクションしますか?
*/
"reactAreYouSure": ParameterizedString<"emoji">;
+ /**
+ * このメディアをセンシティブとして設定しますか?
+ */
+ "markAsSensitiveConfirm": string;
+ /**
+ * このメディアのセンシティブ指定を解除しますか?
+ */
+ "unmarkAsSensitiveConfirm": string;
"_accountSettings": {
/**
* コンテンツの表示にログインを必須にする
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index c3d6fa5a4..fbe4d9889 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1311,6 +1311,8 @@ federationSpecified: "このサーバーはホワイトリスト連合で運用
federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。"
confirmOnReact: "リアクションする際に確認する"
reactAreYouSure: "\" {emoji} \" をリアクションしますか?"
+markAsSensitiveConfirm: "このメディアをセンシティブとして設定しますか?"
+unmarkAsSensitiveConfirm: "このメディアのセンシティブ指定を解除しますか?"
_accountSettings:
requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
diff --git a/packages/frontend/src/components/MkMediaAudio.vue b/packages/frontend/src/components/MkMediaAudio.vue
index 8cf88abaa..3d2795b37 100644
--- a/packages/frontend/src/components/MkMediaAudio.vue
+++ b/packages/frontend/src/components/MkMediaAudio.vue
@@ -259,7 +259,14 @@ function showMenu(ev: MouseEvent) {
});
}
-function toggleSensitive(file: Misskey.entities.DriveFile) {
+async function toggleSensitive(file: Misskey.entities.DriveFile) {
+ const { canceled } = await os.confirm({
+ type: 'warning',
+ text: file.isSensitive ? i18n.ts.unmarkAsSensitiveConfirm : i18n.ts.markAsSensitiveConfirm,
+ });
+
+ if (canceled) return;
+
os.apiWithDialog('drive/files/update', {
fileId: file.id,
isSensitive: !file.isSensitive,
diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue
index 3645a4a66..8ab990b92 100644
--- a/packages/frontend/src/components/MkMediaImage.vue
+++ b/packages/frontend/src/components/MkMediaImage.vue
@@ -124,11 +124,21 @@ function showMenu(ev: MouseEvent) {
if (iAmModerator) {
menuItems.push({
- text: i18n.ts.markAsSensitive,
+ text: props.image.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
icon: 'ti ti-eye-exclamation',
danger: true,
- action: () => {
- os.apiWithDialog('drive/files/update', { fileId: props.image.id, isSensitive: true });
+ action: async () => {
+ const { canceled } = await os.confirm({
+ type: 'warning',
+ text: props.image.isSensitive ? i18n.ts.unmarkAsSensitiveConfirm : i18n.ts.markAsSensitiveConfirm,
+ });
+
+ if (canceled) return;
+
+ os.apiWithDialog('drive/files/update', {
+ fileId: props.image.id,
+ isSensitive: !props.image.isSensitive,
+ });
},
});
}
diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue
index 26372e1a5..682da2271 100644
--- a/packages/frontend/src/components/MkMediaVideo.vue
+++ b/packages/frontend/src/components/MkMediaVideo.vue
@@ -284,7 +284,14 @@ function showMenu(ev: MouseEvent) {
});
}
-function toggleSensitive(file: Misskey.entities.DriveFile) {
+async function toggleSensitive(file: Misskey.entities.DriveFile) {
+ const { canceled } = await os.confirm({
+ type: 'warning',
+ text: file.isSensitive ? i18n.ts.unmarkAsSensitiveConfirm : i18n.ts.markAsSensitiveConfirm,
+ });
+
+ if (canceled) return;
+
os.apiWithDialog('drive/files/update', {
fileId: file.id,
isSensitive: !file.isSensitive,
diff --git a/packages/frontend/src/pages/admin-file.vue b/packages/frontend/src/pages/admin-file.vue
index 60f6be51d..7ccb996ff 100644
--- a/packages/frontend/src/pages/admin-file.vue
+++ b/packages/frontend/src/pages/admin-file.vue
@@ -36,8 +36,9 @@ SPDX-License-Identifier: AGPL-3.0-only