@@ -204,6 +195,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import { computed, inject, onMounted, provide, ref, shallowRef } from 'vue';
import * as mfm from 'mfm-js';
import * as Misskey from 'misskey-js';
+import MkNoteHistory from '@/components/MkNoteHistory.vue';
import MkNoteSub from '@/components/MkNoteSub.vue';
import MkNoteSimple from '@/components/MkNoteSimple.vue';
import MkReactionsViewer from '@/components/MkReactionsViewer.vue';
@@ -355,6 +347,14 @@ const reactionsPagination = computed
(() => ({
},
}));
+const historiesPagination = computed(() => ({
+ endpoint: 'notes/histories',
+ limit: 10,
+ params: {
+ noteId: appearNote.value.id,
+ },
+}));
+
useNoteCapture({
rootEl: rootEl,
note: appearNote,
@@ -806,6 +806,10 @@ function loadConversation() {
padding: 16px;
}
+.tab_histories {
+ padding: 16px;
+}
+
.reactionTabs {
display: flex;
gap: 8px;
diff --git a/packages/frontend/src/components/MkNoteHistory.vue b/packages/frontend/src/components/MkNoteHistory.vue
new file mode 100644
index 0000000000..8645be9a32
--- /dev/null
+++ b/packages/frontend/src/components/MkNoteHistory.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts
index 3085f33e21..e3205a3b7e 100644
--- a/packages/frontend/src/os.ts
+++ b/packages/frontend/src/os.ts
@@ -13,6 +13,7 @@ import type { Form, GetFormResultType } from '@/scripts/form.js';
import { misskeyApi } from '@/scripts/misskey-api.js';
import { i18n } from '@/i18n.js';
import MkPostFormDialog from '@/components/MkPostFormDialog.vue';
+import MkEditFormDialog from '@/components/MkEditFormDialog.vue';
import MkWaitingDialog from '@/components/MkWaitingDialog.vue';
import MkPageWindow from '@/components/MkPageWindow.vue';
import MkToast from '@/components/MkToast.vue';
@@ -696,6 +697,27 @@ export function post(props: Record = {}): Promise {
});
}
+export function edit(props: Record = {}): Promise {
+ pleaseLogin(undefined, (props.initialText || props.initialNote ? {
+ type: 'share',
+ params: {
+ text: props.initialText ?? props.initialNote.text,
+ visibility: props.initialVisibility ?? props.initialNote?.visibility,
+ localOnly: (props.initialLocalOnly || props.initialNote?.localOnly) ? '1' : '0',
+ },
+ } : undefined));
+
+ showMovedDialog();
+ return new Promise(resolve => {
+ const { dispose } = popup(MkEditFormDialog, props, {
+ closed: () => {
+ resolve();
+ dispose();
+ },
+ });
+ });
+}
+
export const deckGlobalEvents = new EventEmitter();
/*
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts
index ebb96d1746..1837b16bd3 100644
--- a/packages/frontend/src/scripts/get-note-menu.ts
+++ b/packages/frontend/src/scripts/get-note-menu.ts
@@ -288,6 +288,10 @@ export function getNoteMenu(props: {
props.translation.value = res;
}
+ function edit() {
+ os.edit({ target: appearNote, renote: appearNote.renote, reply: appearNote.reply, channel: appearNote.channel });
+ }
+
let menu: MenuItem[];
if ($i) {
const statePromise = misskeyApi('notes/state', {
@@ -427,6 +431,11 @@ export function getNoteMenu(props: {
),
...(appearNote.userId === $i.id || $i.isModerator || $i.isAdmin ? [
{ type: 'divider' },
+ $i.policies.canEditNote || $i.isModerator || $i.isAdmin ? {
+ icon: 'ti ti-edit',
+ text: i18n.ts.edit,
+ action: edit,
+ } : undefined,
appearNote.userId === $i.id ? {
icon: 'ti ti-edit',
text: i18n.ts.deleteAndEdit,