summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/get-note-versions-menu.ts
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-25 16:14:53 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-25 16:14:53 -0400
commitd8908ef2d8fa84d8e0fc1d30ab90a600a3d88054 (patch)
tree0c8d3e0385ce7021c7187ef8b608f1abd87496e5 /packages/frontend/src/utility/get-note-versions-menu.ts
parentmerge: enhance: Update de-DE.yml (!949) (diff)
parentenhance(frontend): 設定の移行を手動でトリガーできるように (diff)
downloadsharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.tar.gz
sharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.tar.bz2
sharkey-d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054.zip
merge upstream
Diffstat (limited to 'packages/frontend/src/utility/get-note-versions-menu.ts')
-rw-r--r--packages/frontend/src/utility/get-note-versions-menu.ts69
1 files changed, 69 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/get-note-versions-menu.ts b/packages/frontend/src/utility/get-note-versions-menu.ts
new file mode 100644
index 0000000000..345cec9018
--- /dev/null
+++ b/packages/frontend/src/utility/get-note-versions-menu.ts
@@ -0,0 +1,69 @@
+/*
+ * SPDX-FileCopyrightText: marie and other Sharkey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Ref, defineAsyncComponent } from 'vue';
+import * as Misskey from 'misskey-js';
+import { i18n } from '@/i18n.js';
+import * as os from '@/os.js';
+import { misskeyApi } from './misskey-api.js';
+import { MenuItem } from '@/types/menu.js';
+import { dateTimeFormat } from './intl-const.js';
+
+export async function getNoteVersionsMenu(props: {
+ note: Misskey.entities.Note;
+ menuButton: Ref<HTMLElement>;
+}) {
+ const isRenote = (
+ props.note.renote != null &&
+ props.note.text == null &&
+ props.note.fileIds.length === 0 &&
+ props.note.poll == null
+ );
+
+ const appearNote = isRenote ? props.note.renote as Misskey.entities.Note : props.note;
+
+ const cleanups = [] as (() => void)[];
+
+ function openVersion(info): void {
+ const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/SkOldNoteWindow.vue')), {
+ note: appearNote,
+ oldText: info.text,
+ updatedAt: info.oldDate ? info.oldDate : info.updatedAt,
+ }, {
+ closed: () => dispose(),
+ });
+ }
+
+ const menu: MenuItem[] = [];
+ const statePromise = misskeyApi('notes/versions', {
+ noteId: appearNote.id,
+ });
+
+ await statePromise.then((versions) => {
+ for (const edit of versions) {
+ const _time = edit.oldDate == null ? NaN :
+ typeof edit.oldDate === 'number' ? edit.oldDate :
+ (edit.oldDate instanceof Date ? edit.oldDate : new Date(edit.oldDate)).getTime();
+
+ menu.push({
+ icon: 'ph-pencil-simple ph-bold ph-lg',
+ text: _time ? dateTimeFormat.format(_time) : dateTimeFormat.format(new Date(edit.updatedAt)),
+ action: () => openVersion(edit),
+ });
+ }
+ });
+
+ const cleanup = () => {
+ if (_DEV_) console.log('note menu cleanup', cleanups);
+ for (const cl of cleanups) {
+ cl();
+ }
+ };
+
+ return {
+ menu,
+ cleanup,
+ };
+}