diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue index a194b9a94f..437bf22363 100644 --- a/packages/frontend/src/pages/admin-user.vue +++ b/packages/frontend/src/pages/admin-user.vue @@ -6,58 +6,57 @@ SPDX-License-Identifier: AGPL-3.0-only @@ -224,7 +222,6 @@ import MkButton from '@/components/MkButton.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkKeyValue from '@/components/MkKeyValue.vue'; import MkSelect from '@/components/MkSelect.vue'; -import FormSuspense from '@/components/form/suspense.vue'; import MkFileListForAdmin from '@/components/MkFileListForAdmin.vue'; import MkInfo from '@/components/MkInfo.vue'; import * as os from '@/os.js'; @@ -232,11 +229,13 @@ import { misskeyApi } from '@/utility/misskey-api.js'; import { acct } from '@/filters/user.js'; import { definePage } from '@/page.js'; import { i18n } from '@/i18n.js'; -import { iAmAdmin, $i, iAmModerator } from '@/i.js'; +import { ensureSignin, iAmAdmin, iAmModerator } from '@/i.js'; import MkRolePreview from '@/components/MkRolePreview.vue'; import MkPagination from '@/components/MkPagination.vue'; import { Paginator } from '@/utility/paginator.js'; +const $i = ensureSignin(); + const props = withDefaults(defineProps<{ userId: string; initialTab?: string; @@ -244,18 +243,19 @@ const props = withDefaults(defineProps<{ initialTab: 'overview', }); +const result = await _fetch_(); + const tab = ref(props.initialTab); const chartSrc = ref('per-user-notes'); -const user = ref(); -const init = ref>(); -const info = ref(); -const ips = ref(null); +const user = ref(result.user); +const info = ref(result.info); +const ips = ref(result.ips); const ap = ref(null); -const moderator = ref(false); -const silenced = ref(false); -const suspended = ref(false); -const isSystem = ref(false); -const moderationNote = ref(''); +const moderator = ref(info.value.isModerator); +const silenced = ref(info.value.isSilenced); +const suspended = ref(info.value.isSuspended); +const isSystem = ref(user.value.host == null && user.value.username.includes('.')); +const moderationNote = ref(info.value.moderationNote); const filesPaginator = markRaw(new Paginator('admin/drive/files', { limit: 10, computedParams: computed(() => ({ @@ -272,34 +272,37 @@ const announcementsPaginator = markRaw(new Paginator('admin/announcements/list', status: announcementsStatus.value, })), })); -const expandedRoles = ref([]); +const expandedRoleIds = ref<(typeof info.value.roles[number]['id'])[]>([]); -function createFetcher() { - return () => Promise.all([misskeyApi('users/show', { +function _fetch_() { + return Promise.all([misskeyApi('users/show', { userId: props.userId, }), misskeyApi('admin/show-user', { userId: props.userId, }), iAmAdmin ? misskeyApi('admin/get-user-ips', { userId: props.userId, - }) : Promise.resolve(null)]).then(([_user, _info, _ips]) => { - user.value = _user; - info.value = _info; - ips.value = _ips; - moderator.value = info.value.isModerator; - silenced.value = info.value.isSilenced; - suspended.value = info.value.isSuspended; - moderationNote.value = info.value.moderationNote; - isSystem.value = user.value.host == null && user.value.username.includes('.'); - - watch(moderationNote, async () => { - await misskeyApi('admin/update-user-note', { userId: user.value.id, text: moderationNote.value }); - await refreshUser(); - }); - }); + }) : Promise.resolve(null)]).then(([_user, _info, _ips]) => ({ + user: _user, + info: _info, + ips: _ips, + })); } -function refreshUser() { - init.value = createFetcher(); +watch(moderationNote, async () => { + await misskeyApi('admin/update-user-note', { userId: user.value.id, text: moderationNote.value }); + await refreshUser(); +}); + +async function refreshUser() { + const result = await _fetch_(); + user.value = result.user; + info.value = result.info; + ips.value = result.ips; + moderator.value = info.value.isModerator; + silenced.value = info.value.isSilenced; + suspended.value = info.value.isSuspended; + isSystem.value = user.value.host == null && user.value.username.includes('.'); + moderationNote.value = info.value.moderationNote; } async function updateRemoteUser() { @@ -456,7 +459,7 @@ async function assignRole() { refreshUser(); } -async function unassignRole(role, ev) { +async function unassignRole(role: typeof info.value.roles[number], ev: MouseEvent) { os.popupMenu([{ text: i18n.ts.unassign, icon: 'ti ti-x', @@ -468,11 +471,11 @@ async function unassignRole(role, ev) { }], ev.currentTarget ?? ev.target); } -function toggleRoleItem(role) { - if (expandedRoles.value.includes(role.id)) { - expandedRoles.value = expandedRoles.value.filter(x => x !== role.id); +function toggleRoleItem(role: typeof info.value.roles[number]) { + if (expandedRoleIds.value.includes(role.id)) { + expandedRoleIds.value = expandedRoleIds.value.filter(x => x !== role.id); } else { - expandedRoles.value.push(role.id); + expandedRoleIds.value.push(role.id); } } @@ -493,12 +496,6 @@ async function editAnnouncement(announcement) { }); } -watch(() => props.userId, () => { - init.value = createFetcher(); -}, { - immediate: true, -}); - watch(user, () => { misskeyApi('ap/get', { uri: user.value.uri ?? `${url}/users/${user.value.id}`, diff --git a/packages/frontend/src/pages/settings/statusbar.statusbar.vue b/packages/frontend/src/pages/settings/statusbar.statusbar.vue index dbb640123a..561d31148f 100644 --- a/packages/frontend/src/pages/settings/statusbar.statusbar.vue +++ b/packages/frontend/src/pages/settings/statusbar.statusbar.vue @@ -36,7 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only - + @@ -48,7 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only