diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1a379d53ef..4274d6005b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,6 +34,7 @@
- Enhance: 自分が押したリアクションのデザインを改善
- Enhance: ノート検索にローカルのみ検索可能なオプションの追加
- Enhance: AiScriptで`LOCALE`として現在の設定言語を取得できるように
+- Enhance: Renote自体を通報できるように
- `$[rainbow ]`記法が、動きのあるMFMが無効になっていても使用できるようになりました
- Playの操作を行うAPI TokenをAPIコンソールから発行できるように
- Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正
diff --git a/locales/index.d.ts b/locales/index.d.ts
index d281263e3b..f17ba4ca91 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -48,6 +48,7 @@ export interface Locale {
"unpin": string;
"copyContent": string;
"copyLink": string;
+ "copyLinkRenote": string;
"delete": string;
"deleteAndEdit": string;
"deleteAndEditConfirm": string;
@@ -658,6 +659,7 @@ export interface Locale {
"sample": string;
"abuseReports": string;
"reportAbuse": string;
+ "reportAbuseRenote": string;
"reportAbuseOf": string;
"fillAbuseReportDescription": string;
"abuseReported": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 90a00f0c85..d0f9f0586b 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -45,6 +45,7 @@ pin: "ピン留め"
unpin: "ピン留め解除"
copyContent: "内容をコピー"
copyLink: "リンクをコピー"
+copyLinkRenote: "Renoteのリンクをコピー"
delete: "削除"
deleteAndEdit: "削除して編集"
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、Renote、返信も全て削除されます。"
@@ -655,6 +656,7 @@ behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
+reportAbuseRenote: "Renoteを通報"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index 22610b2253..d98a6da0dc 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -29,7 +29,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@@ -161,7 +161,7 @@ import { reactionPicker } from '@/scripts/reaction-picker';
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm';
import { $i } from '@/account';
import { i18n } from '@/i18n';
-import { getNoteClipMenu, getNoteMenu } from '@/scripts/get-note-menu';
+import { getAbuseNoteMenu, getCopyNoteLinkMenu, getNoteClipMenu, getNoteMenu } from '@/scripts/get-note-menu';
import { useNoteCapture } from '@/scripts/use-note-capture';
import { deepClone } from '@/scripts/clone';
import { useTooltip } from '@/scripts/use-tooltip';
@@ -425,21 +425,34 @@ async function clip() {
}
function showRenoteMenu(viaKeyboard = false): void {
- if (!isMyRenote) return;
- pleaseLogin();
- os.popupMenu([{
- text: i18n.ts.unrenote,
- icon: 'ti ti-trash',
- danger: true,
- action: () => {
- os.api('notes/delete', {
- noteId: note.id,
- });
- isDeleted.value = true;
- },
- }], renoteTime.value, {
- viaKeyboard: viaKeyboard,
- });
+ if (isMyRenote) {
+ pleaseLogin();
+ os.popupMenu([
+ getCopyNoteLinkMenu(note, i18n.ts.copyLinkRenote),
+ null,
+ {
+ text: i18n.ts.unrenote,
+ icon: 'ti ti-trash',
+ danger: true,
+ action: () => {
+ os.api('notes/delete', {
+ noteId: note.id,
+ });
+ isDeleted.value = true;
+ },
+ },
+ ], renoteTime.value, {
+ viaKeyboard: viaKeyboard,
+ });
+ } else {
+ os.popupMenu([
+ getCopyNoteLinkMenu(note, i18n.ts.copyLinkRenote),
+ null,
+ getAbuseNoteMenu(note, i18n.ts.reportAbuseRenote),
+ ], renoteTime.value, {
+ viaKeyboard: viaKeyboard,
+ });
+ }
}
function focus() {
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts
index 1783abc51a..c8b1cb8dfc 100644
--- a/packages/frontend/src/scripts/get-note-menu.ts
+++ b/packages/frontend/src/scripts/get-note-menu.ts
@@ -92,6 +92,31 @@ export async function getNoteClipMenu(props: {
}];
}
+export function getAbuseNoteMenu(note: misskey.entities.Note, text: string): MenuItem {
+ return {
+ icon: 'ti ti-exclamation-circle',
+ text,
+ action: (): void => {
+ const u = note.url ?? note.uri ?? `${url}/notes/${note.id}`;
+ os.popup(defineAsyncComponent(() => import('@/components/MkAbuseReportWindow.vue')), {
+ user: note.user,
+ initialComment: `Note: ${u}\n-----\n`,
+ }, {}, 'closed');
+ },
+ };
+}
+
+export function getCopyNoteLinkMenu(note: misskey.entities.Note, text: string): MenuItem {
+ return {
+ icon: 'ti ti-link',
+ text,
+ action: (): void => {
+ copyToClipboard(`${url}/notes/${note.id}`);
+ os.success();
+ },
+ };
+}
+
export function getNoteMenu(props: {
note: Misskey.entities.Note;
menuButton: Ref;
@@ -266,11 +291,8 @@ export function getNoteMenu(props: {
icon: 'ti ti-copy',
text: i18n.ts.copyContent,
action: copyContent,
- }, {
- icon: 'ti ti-link',
- text: i18n.ts.copyLink,
- action: copyLink,
- }, (appearNote.url || appearNote.uri) ? {
+ }, getCopyNoteLinkMenu(appearNote, i18n.ts.copyLink)
+ , (appearNote.url || appearNote.uri) ? {
icon: 'ti ti-external-link',
text: i18n.ts.showOnRemote,
action: () => {
@@ -344,17 +366,8 @@ export function getNoteMenu(props: {
),*/
...(appearNote.userId !== $i.id ? [
null,
- {
- icon: 'ti ti-exclamation-circle',
- text: i18n.ts.reportAbuse,
- action: () => {
- const u = appearNote.url ?? appearNote.uri ?? `${url}/notes/${appearNote.id}`;
- os.popup(defineAsyncComponent(() => import('@/components/MkAbuseReportWindow.vue')), {
- user: appearNote.user,
- initialComment: `Note: ${u}\n-----\n`,
- }, {}, 'closed');
- },
- }]
+ appearNote.userId !== $i.id ? getAbuseNoteMenu(appearNote, i18n.ts.reportAbuse) : undefined,
+ ]
: []
),
...(appearNote.userId === $i.id || $i.isModerator || $i.isAdmin ? [
@@ -382,11 +395,8 @@ export function getNoteMenu(props: {
icon: 'ti ti-copy',
text: i18n.ts.copyContent,
action: copyContent,
- }, {
- icon: 'ti ti-link',
- text: i18n.ts.copyLink,
- action: copyLink,
- }, (appearNote.url || appearNote.uri) ? {
+ }, getCopyNoteLinkMenu(appearNote, i18n.ts.copyLink)
+ , (appearNote.url || appearNote.uri) ? {
icon: 'ti ti-external-link',
text: i18n.ts.showOnRemote,
action: () => {