diff options
| author | Hazelnoot <acomputerdog@gmail.com> | 2025-03-25 16:14:53 -0400 |
|---|---|---|
| committer | Hazelnoot <acomputerdog@gmail.com> | 2025-03-25 16:14:53 -0400 |
| commit | d8908ef2d8fa84d8e0fc1d30ab90a600a3d88054 (patch) | |
| tree | 0c8d3e0385ce7021c7187ef8b608f1abd87496e5 /packages/frontend/src/utility/get-note-versions-menu.ts | |
| parent | merge: enhance: Update de-DE.yml (!949) (diff) | |
| parent | enhance(frontend): 設定の移行を手動でトリガーできるように (diff) | |
| download | sharkey-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.ts | 69 |
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, + }; +} |