fix types

This commit is contained in:
kakkokari-gtyih 2025-11-21 18:54:42 +09:00
parent 0240e0895e
commit b1ee7149ba
14 changed files with 70 additions and 83 deletions

View File

@ -38,11 +38,7 @@ export interface BroadcastTypes {
emojis: Packed<'EmojiDetailed'>[]; emojis: Packed<'EmojiDetailed'>[];
}; };
emojiDeleted: { emojiDeleted: {
emojis: { emojis: Packed<'EmojiDetailed'>[];
id?: string;
name: string;
[other: string]: any;
}[];
}; };
announcementCreated: { announcementCreated: {
announcement: Packed<'Announcement'>; announcement: Packed<'Announcement'>;

View File

@ -41,7 +41,7 @@ export class EmojiEntityService {
@bindThis @bindThis
public packSimpleMany( public packSimpleMany(
emojis: any[], emojis: (MiEmoji['id'] | MiEmoji)[],
) { ) {
return Promise.all(emojis.map(x => this.packSimple(x))); return Promise.all(emojis.map(x => this.packSimple(x)));
} }
@ -69,7 +69,7 @@ export class EmojiEntityService {
@bindThis @bindThis
public packDetailedMany( public packDetailedMany(
emojis: any[], emojis: (MiEmoji['id'] | MiEmoji)[],
): Promise<Packed<'EmojiDetailed'>[]> { ): Promise<Packed<'EmojiDetailed'>[]> {
return Promise.all(emojis.map(x => this.packDetailed(x))); return Promise.all(emojis.map(x => this.packDetailed(x)));
} }

View File

@ -24,39 +24,7 @@ export const meta = {
optional: false, nullable: false, optional: false, nullable: false,
items: { items: {
type: 'object', type: 'object',
optional: false, nullable: false, ref: 'EmojiDetailed',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
},
aliases: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'string',
optional: false, nullable: false,
},
},
name: {
type: 'string',
optional: false, nullable: false,
},
category: {
type: 'string',
optional: false, nullable: true,
},
host: {
type: 'string',
optional: false, nullable: true,
description: 'The local host is represented with `null`. The field exists for compatibility with other API endpoints that return files.',
},
url: {
type: 'string',
optional: false, nullable: false,
},
},
}, },
}, },
} as const; } as const;

View File

@ -231,17 +231,17 @@ function rename() {
} }
function move() { function move() {
selectDriveFolder(null).then(folder => { selectDriveFolder(null).then(({ canceled, folders }) => {
if (folder[0] && folder[0].id === props.folder.id) return; if (canceled || (folders[0] && folders[0].id === props.folder.id)) return;
misskeyApi('drive/folders/update', { misskeyApi('drive/folders/update', {
folderId: props.folder.id, folderId: props.folder.id,
parentId: folder[0] ? folder[0].id : null, parentId: folders[0] ? folders[0].id : null,
}).then(() => { }).then(() => {
globalEvents.emit('driveFoldersUpdated', [{ globalEvents.emit('driveFoldersUpdated', [{
...props.folder, ...props.folder,
parentId: folder[0] ? folder[0].id : null, parentId: folders[0] ? folders[0].id : null,
parent: folder[0] ?? null, parent: folders[0] ?? null,
}]); }]);
}); });
}); });

View File

@ -533,17 +533,19 @@ function cd(target?: Misskey.entities.DriveFolder | Misskey.entities.DriveFolder
async function moveFilesBulk() { async function moveFilesBulk() {
if (selectedFiles.value.length === 0) return; if (selectedFiles.value.length === 0) return;
const toFolder = await selectDriveFolder(folder.value ? folder.value.id : null); const { canceled, folders } = await selectDriveFolder(folder.value ? folder.value.id : null);
if (canceled) return;
await os.apiWithDialog('drive/files/move-bulk', { await os.apiWithDialog('drive/files/move-bulk', {
fileIds: selectedFiles.value.map(f => f.id), fileIds: selectedFiles.value.map(f => f.id),
folderId: toFolder[0] ? toFolder[0].id : null, folderId: folders[0] ? folders[0].id : null,
}); });
globalEvents.emit('driveFilesUpdated', selectedFiles.value.map(x => ({ globalEvents.emit('driveFilesUpdated', selectedFiles.value.map(x => ({
...x, ...x,
folderId: toFolder[0] ? toFolder[0].id : null, folderId: folders[0] ? folders[0].id : null,
folder: toFolder[0] ?? null, folder: folders[0] ?? null,
}))); })));
} }

View File

@ -42,7 +42,7 @@ import { i18n } from '@/i18n.js';
type TypesMap = Record<typeof notificationTypes[number], Ref<boolean>>; type TypesMap = Record<typeof notificationTypes[number], Ref<boolean>>;
const emit = defineEmits<{ const emit = defineEmits<{
(ev: 'done', v: { excludeTypes: string[] }): void, (ev: 'done', v: { excludeTypes: typeof notificationTypes[number][] }): void,
(ev: 'closed'): void, (ev: 'closed'): void,
}>(); }>();

View File

@ -71,7 +71,8 @@ SPDX-License-Identifier: AGPL-3.0-only
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, defineAsyncComponent, markRaw, ref } from 'vue'; import * as Misskey from 'misskey-js';
import { computed, markRaw, ref } from 'vue';
import MkButton from '@/components/MkButton.vue'; import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue'; import MkInput from '@/components/MkInput.vue';
import MkPagination from '@/components/MkPagination.vue'; import MkPagination from '@/components/MkPagination.vue';
@ -116,7 +117,7 @@ const selectAll = () => {
} }
}; };
const toggleSelect = (emoji) => { const toggleSelect = (emoji: Misskey.entities.EmojiDetailed) => {
if (selectedEmojis.value.includes(emoji.id)) { if (selectedEmojis.value.includes(emoji.id)) {
selectedEmojis.value = selectedEmojis.value.filter(x => x !== emoji.id); selectedEmojis.value = selectedEmojis.value.filter(x => x !== emoji.id);
} else { } else {
@ -124,19 +125,23 @@ const toggleSelect = (emoji) => {
} }
}; };
const add = async (ev: MouseEvent) => { const add = async () => {
const { dispose } = await os.popupAsyncWithDialog(import('./emoji-edit-dialog.vue').then(x => x.default), { const { dispose } = await os.popupAsyncWithDialog(import('./emoji-edit-dialog.vue').then(x => x.default), {
}, { }, {
done: result => { done: result => {
if (result.created) { if (result.created) {
paginator.prepend(result.created); const nowIso = (new Date()).toISOString();
paginator.prepend({
...result.created,
createdAt: nowIso,
});
} }
}, },
closed: () => dispose(), closed: () => dispose(),
}); });
}; };
const edit = async (emoji) => { const edit = async (emoji: Misskey.entities.EmojiDetailed) => {
const { dispose } = await os.popupAsyncWithDialog(import('./emoji-edit-dialog.vue').then(x => x.default), { const { dispose } = await os.popupAsyncWithDialog(import('./emoji-edit-dialog.vue').then(x => x.default), {
emoji: emoji, emoji: emoji,
}, { }, {

View File

@ -131,10 +131,11 @@ function move() {
const f = file.value; const f = file.value;
selectDriveFolder(null).then(folder => { selectDriveFolder(null).then(({ canceled, folders }) => {
if (canceled) return;
misskeyApi('drive/files/update', { misskeyApi('drive/files/update', {
fileId: f.id, fileId: f.id,
folderId: folder[0] ? folder[0].id : null, folderId: folders[0] ? folders[0].id : null,
}).then(async () => { }).then(async () => {
await _fetch_(); await _fetch_();
}); });

View File

@ -66,7 +66,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkInfo warn>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn }}</MkInfo> <MkInfo warn>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn }}</MkInfo>
</div> </div>
</MkFolder> </MkFolder>
<MkSwitch v-model="isSensitive">isSensitive</MkSwitch> <MkSwitch v-model="isSensitive">{{ i18n.ts.sensitive }}</MkSwitch>
<MkSwitch v-model="localOnly">{{ i18n.ts.localOnly }}</MkSwitch> <MkSwitch v-model="localOnly">{{ i18n.ts.localOnly }}</MkSwitch>
<MkButton v-if="emoji" danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> <MkButton v-if="emoji" danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
</div> </div>
@ -99,7 +99,7 @@ const props = defineProps<{
}>(); }>();
const emit = defineEmits<{ const emit = defineEmits<{
(ev: 'done', v: { deleted?: boolean; updated?: Misskey.entities.AdminEmojiUpdateRequest; created?: Misskey.entities.AdminEmojiUpdateRequest }): void, (ev: 'done', v: { deleted?: boolean; updated?: Misskey.entities.EmojiDetailed; created?: Misskey.entities.EmojiDetailed }): void,
(ev: 'closed'): void (ev: 'closed'): void
}>(); }>();
@ -157,19 +157,29 @@ async function done() {
localOnly: localOnly.value, localOnly: localOnly.value,
roleIdsThatCanBeUsedThisEmojiAsReaction: rolesThatCanBeUsedThisEmojiAsReaction.value.map(x => x.id), roleIdsThatCanBeUsedThisEmojiAsReaction: rolesThatCanBeUsedThisEmojiAsReaction.value.map(x => x.id),
fileId: file.value ? file.value.id : undefined, fileId: file.value ? file.value.id : undefined,
}; } satisfies Misskey.entities.AdminEmojiUpdateRequest;
if (props.emoji) { if (props.emoji) {
const emojiDetailed = {
id: props.emoji.id,
aliases: params.aliases,
name: params.name,
category: params.category,
host: props.emoji.host,
url: file.value ? file.value.url : props.emoji.url,
license: params.license,
isSensitive: params.isSensitive,
localOnly: params.localOnly,
roleIdsThatCanBeUsedThisEmojiAsReaction: params.roleIdsThatCanBeUsedThisEmojiAsReaction,
} satisfies Misskey.entities.EmojiDetailed;
await os.apiWithDialog('admin/emoji/update', { await os.apiWithDialog('admin/emoji/update', {
id: props.emoji.id, id: props.emoji.id,
...params, ...params,
}); });
emit('done', { emit('done', {
updated: { updated: emojiDetailed,
id: props.emoji.id,
...params,
},
}); });
windowEl.value?.close(); windowEl.value?.close();

View File

@ -296,8 +296,9 @@ if (prefer.s.uploadFolder) {
} }
function chooseUploadFolder() { function chooseUploadFolder() {
selectDriveFolder(null).then(async folder => { selectDriveFolder(null).then(async ({ canceled, folders }) => {
prefer.commit('uploadFolder', folder[0] ? folder[0].id : null); if (canceled) return;
prefer.commit('uploadFolder', folders[0] ? folders[0].id : null);
os.success(); os.success();
if (prefer.s.uploadFolder) { if (prefer.s.uploadFolder) {
uploadFolder.value = await misskeyApi('drive/folders/show', { uploadFolder.value = await misskeyApi('drive/folders/show', {

View File

@ -300,13 +300,25 @@ export async function createCroppedImageDriveFileFromImageDriveFile(imageDriveFi
}); });
} }
export async function selectDriveFolder(initialFolder: Misskey.entities.DriveFolder['id'] | null): Promise<(Misskey.entities.DriveFolder | null)[]> { export async function selectDriveFolder(initialFolder: Misskey.entities.DriveFolder['id'] | null): Promise<{
canceled: false;
folders: (Misskey.entities.DriveFolder | null)[];
} | {
canceled: true;
folders: undefined;
}> {
return new Promise(async resolve => { return new Promise(async resolve => {
const { dispose } = await os.popupAsyncWithDialog(import('@/components/MkDriveFolderSelectDialog.vue').then(x => x.default), { const { dispose } = await os.popupAsyncWithDialog(import('@/components/MkDriveFolderSelectDialog.vue').then(x => x.default), {
initialFolder, initialFolder,
}, { }, {
done: folders => { done: folders => {
resolve(folders); resolve(folders == null ? {
canceled: true,
folders: undefined,
} : {
canceled: false,
folders,
});
}, },
closed: () => dispose(), closed: () => dispose(),
}); });

View File

@ -44,10 +44,11 @@ async function describe(file: Misskey.entities.DriveFile) {
} }
function move(file: Misskey.entities.DriveFile) { function move(file: Misskey.entities.DriveFile) {
selectDriveFolder(null).then(folder => { selectDriveFolder(null).then(({ canceled, folders }) => {
if (canceled) return;
misskeyApi('drive/files/update', { misskeyApi('drive/files/update', {
fileId: file.id, fileId: file.id,
folderId: folder[0] ? folder[0].id : null, folderId: folders[0] ? folders[0].id : null,
}); });
}); });
} }

View File

@ -95,11 +95,11 @@ const fetch = () => {
}; };
const choose = () => { const choose = () => {
selectDriveFolder(null).then(folder => { selectDriveFolder(null).then(({ folders, canceled }) => {
if (folder[0] == null) { if (canceled || folders[0] == null) {
return; return;
} }
widgetProps.folderId = folder[0].id; widgetProps.folderId = folders[0].id;
save(); save();
fetch(); fetch();
}); });

View File

@ -8217,16 +8217,7 @@ export interface operations {
[name: string]: unknown; [name: string]: unknown;
}; };
content: { content: {
'application/json': { 'application/json': components['schemas']['EmojiDetailed'][];
/** Format: id */
id: string;
aliases: string[];
name: string;
category: string | null;
/** @description The local host is represented with `null`. The field exists for compatibility with other API endpoints that return files. */
host: string | null;
url: string;
}[];
}; };
}; };
/** @description Client error */ /** @description Client error */