fix TS errors about user, info, and init

This commit is contained in:
Hazelnoot 2025-06-07 00:31:57 -04:00
parent c21209152c
commit c71f816be2

View file

@ -5,10 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only
<template> <template>
<PageWithHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs" :spacer="true" style="--MI_SPACER-w: 600px; --MI_SPACER-min: 16px; --MI_SPACER-max: 32px;"> <PageWithHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs" :spacer="true" style="--MI_SPACER-w: 600px; --MI_SPACER-min: 16px; --MI_SPACER-max: 32px;">
<div> <FormSuspense v-if="init" :p="init">
<FormSuspense :p="init"> <div v-if="user && info">
<div v-if="tab === 'overview'" class="_gaps"> <div v-if="tab === 'overview'" class="_gaps">
<div v-if="user" class="aeakzknw"> <div class="aeakzknw">
<MkAvatar class="avatar" :user="user" indicator link preview/> <MkAvatar class="avatar" :user="user" indicator link preview/>
<div class="body"> <div class="body">
<span class="name"><MkUserName class="name" :user="user"/></span> <span class="name"><MkUserName class="name" :user="user"/></span>
@ -228,14 +228,29 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
<div v-else-if="tab === 'raw'" class="_gaps_m"> <div v-else-if="tab === 'raw'" class="_gaps_m">
<MkObjectView v-if="info && $i.isAdmin" tall :value="info"> <MkFolder :sticky="false" :defaultOpen="true">
</MkObjectView> <template #icon><i class="ph-user-circle ph-bold ph-lg"></i></template>
<template #label>{{ i18n.ts.user }}</template>
<MkObjectView tall :value="user"> <MkObjectView tall :value="user"/>
</MkObjectView> </MkFolder>
<MkFolder :sticky="false">
<template #icon><i class="ti ti-info-circle"></i></template>
<template #label>{{ i18n.ts.details }}</template>
<MkObjectView tall :value="info"/>
</MkFolder>
<MkFolder v-if="ap" :sticky="false">
<template #icon><i class="ph-globe ph-bold ph-lg"></i></template>
<template #label>{{ i18n.ts.activityPub }}</template>
<MkObjectView tall :value="ap"/>
</MkFolder>
</div>
</div> </div>
</FormSuspense> </FormSuspense>
</div>
</PageWithHeader> </PageWithHeader>
</template> </template>
@ -244,6 +259,7 @@ import { computed, defineAsyncComponent, watch, ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import { url } from '@@/js/config.js'; import { url } from '@@/js/config.js';
import type { Badge } from '@/components/SkBadgeStrip.vue'; import type { Badge } from '@/components/SkBadgeStrip.vue';
import type { ChartSrc } from '@/components/MkChart.vue';
import MkChart from '@/components/MkChart.vue'; import MkChart from '@/components/MkChart.vue';
import MkObjectView from '@/components/MkObjectView.vue'; import MkObjectView from '@/components/MkObjectView.vue';
import MkTextarea from '@/components/MkTextarea.vue'; import MkTextarea from '@/components/MkTextarea.vue';
@ -276,15 +292,17 @@ const props = withDefaults(defineProps<{
userHint?: Misskey.entities.UserDetailed; userHint?: Misskey.entities.UserDetailed;
infoHint?: Misskey.entities.AdminShowUserResponse; infoHint?: Misskey.entities.AdminShowUserResponse;
ipsHint?: Misskey.entities.AdminGetUserIpsResponse; ipsHint?: Misskey.entities.AdminGetUserIpsResponse;
apHint?: Misskey.entities.ApGetResponse;
}>(), { }>(), {
initialTab: 'overview', initialTab: 'overview',
userHint: undefined, userHint: undefined,
infoHint: undefined, infoHint: undefined,
ipsHint: undefined, ipsHint: undefined,
apHint: undefined,
}); });
const tab = ref(props.initialTab); const tab = ref(props.initialTab);
const chartSrc = ref('per-user-notes'); const chartSrc = ref<ChartSrc>('per-user-notes');
const user = ref<null | Misskey.entities.UserDetailed>(); const user = ref<null | Misskey.entities.UserDetailed>();
const init = ref<ReturnType<typeof createFetcher>>(); const init = ref<ReturnType<typeof createFetcher>>();
const info = ref<Misskey.entities.AdminShowUserResponse | null>(null); const info = ref<Misskey.entities.AdminShowUserResponse | null>(null);
@ -409,7 +427,7 @@ const announcementsPagination = {
status: announcementsStatus.value, status: announcementsStatus.value,
})), })),
}; };
const expandedRoles = ref([]); const expandedRoles = ref<string[]>([]);
function createFetcher(withHint = true) { function createFetcher(withHint = true) {
return () => Promise.all([ return () => Promise.all([
@ -419,29 +437,25 @@ function createFetcher(withHint = true) {
(withHint && props.infoHint) ? props.infoHint : misskeyApi('admin/show-user', { (withHint && props.infoHint) ? props.infoHint : misskeyApi('admin/show-user', {
userId: props.userId, userId: props.userId,
}), }),
iAmAdmin (withHint && props.ipsHint) ? props.ipsHint : misskeyApi('admin/get-user-ips', {
? (withHint && props.ipsHint) ? props.ipsHint : misskeyApi('admin/get-user-ips', {
userId: props.userId, userId: props.userId,
}) }),
: null], (withHint && props.apHint) ? props.apHint : misskeyApi('ap/get', {
).then(async ([_user, _info, _ips]) => { userId: props.userId,
}).catch(() => null)],
).then(async ([_user, _info, _ips, _ap]) => {
user.value = _user; user.value = _user;
info.value = _info; info.value = _info;
ips.value = _ips; ips.value = _ips;
moderator.value = info.value.isModerator; ap.value = _ap;
silenced.value = info.value.isSilenced; moderator.value = _info.isModerator;
approved.value = info.value.approved; silenced.value = _info.isSilenced;
markedAsNSFW.value = info.value.alwaysMarkNsfw; approved.value = _info.approved;
suspended.value = info.value.isSuspended; markedAsNSFW.value = _info.alwaysMarkNsfw;
rejectQuotes.value = user.value.rejectQuotes ?? false; suspended.value = _info.isSuspended;
moderationNote.value = info.value.moderationNote; rejectQuotes.value = _user.rejectQuotes ?? false;
mandatoryCW.value = user.value.mandatoryCW; moderationNote.value = _info.moderationNote;
mandatoryCW.value = _user.mandatoryCW;
if (iAmAdmin) {
ap.value = await misskeyApi('ap/get', {
uri: _user.uri ?? `${url}/users/${props.userId}`,
}).catch(() => null);
}
}); });
} }
@ -450,9 +464,9 @@ async function refreshUser() {
await createFetcher(false)(); await createFetcher(false)();
} }
async function onMandatoryCWChanged(value: string) { async function onMandatoryCWChanged(value: string | number) {
await os.promiseDialog(async () => { await os.promiseDialog(async () => {
await misskeyApi('admin/cw-user', { userId: props.userId, cw: value }); await misskeyApi('admin/cw-user', { userId: props.userId, cw: String(value) });
await refreshUser(); await refreshUser();
}); });
} }
@ -480,7 +494,7 @@ async function resetPassword() {
return; return;
} else { } else {
const { password } = await misskeyApi('admin/reset-password', { const { password } = await misskeyApi('admin/reset-password', {
userId: user.value.id, userId: props.userId,
}); });
await os.alert({ await os.alert({
type: 'success', type: 'success',
@ -592,15 +606,16 @@ async function deleteAccount() {
text: i18n.ts.deleteThisAccountConfirm, text: i18n.ts.deleteThisAccountConfirm,
}); });
if (confirm.canceled) return; if (confirm.canceled) return;
if (!user.value) return;
const typed = await os.inputText({ const typed = await os.inputText({
text: i18n.tsx.typeToConfirm({ x: user.value?.username }), text: i18n.tsx.typeToConfirm({ x: user.value.username }),
}); });
if (typed.canceled) return; if (typed.canceled) return;
if (typed.result === user.value?.username) { if (typed.result === user.value.username) {
await os.apiWithDialog('admin/delete-account', { await os.apiWithDialog('admin/delete-account', {
userId: user.value.id, userId: props.userId,
}); });
} else { } else {
await os.alert({ await os.alert({
@ -663,7 +678,7 @@ async function unassignRole(role, ev) {
}], ev.currentTarget ?? ev.target); }], ev.currentTarget ?? ev.target);
} }
function toggleRoleItem(role) { function toggleRoleItem(role: Misskey.entities.Role) {
if (expandedRoles.value.includes(role.id)) { if (expandedRoles.value.includes(role.id)) {
expandedRoles.value = expandedRoles.value.filter(x => x !== role.id); expandedRoles.value = expandedRoles.value.filter(x => x !== role.id);
} else { } else {
@ -672,6 +687,7 @@ function toggleRoleItem(role) {
} }
function createAnnouncement() { function createAnnouncement() {
if (!user.value) return;
const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkUserAnnouncementEditDialog.vue')), { const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkUserAnnouncementEditDialog.vue')), {
user: user.value, user: user.value,
}, { }, {
@ -680,6 +696,7 @@ function createAnnouncement() {
} }
function editAnnouncement(announcement) { function editAnnouncement(announcement) {
if (!user.value) return;
const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkUserAnnouncementEditDialog.vue')), { const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkUserAnnouncementEditDialog.vue')), {
user: user.value, user: user.value,
announcement, announcement,