From b0394de1644fbf5e251f1031d62bb9a4e562fea2 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:20:31 -0700 Subject: [PATCH] add loading states for creators + server details (#7033) * add loading states for creators + server details * prepr --- apps/frontend/src/pages/[type]/[project].vue | 19 ++++- .../project/ProjectSidebarCreators.vue | 81 +++++++++++-------- .../project/ProjectSidebarServerInfo.vue | 23 +++++- .../server/ServerModpackContentCard.vue | 5 ++ 4 files changed, 92 insertions(+), 36 deletions(-) diff --git a/apps/frontend/src/pages/[type]/[project].vue b/apps/frontend/src/pages/[type]/[project].vue index 25f5022078..fe34c4ec58 100644 --- a/apps/frontend/src/pages/[type]/[project].vue +++ b/apps/frontend/src/pages/[type]/[project].vue @@ -432,7 +432,8 @@
{ }) // Members -const { data: allMembersRaw, error: _membersError } = useQuery({ +const { + data: allMembersRaw, + error: _membersError, + isPending: membersPending, +} = useQuery({ queryKey: computed(() => ['project', projectId.value, 'members']), queryFn: () => client.labrinth.projects_v3.getMembers(projectId.value), staleTime: STALE_TIME, @@ -1074,7 +1080,7 @@ const { // Organization // Only fetch organization if project belongs to one -const { data: organizationRaw } = useQuery({ +const { data: organizationRaw, isPending: organizationPending } = useQuery({ queryKey: computed(() => ['project', projectId.value, 'organization']), queryFn: () => client.labrinth.projects_v3.getOrganization(projectId.value), staleTime: STALE_TIME, @@ -1085,6 +1091,13 @@ const { data: organizationRaw } = useQuery({ // Return null when the project no longer belongs to an organization. const organization = computed(() => (projectRaw.value?.organization ? organizationRaw.value : null)) +const creatorsLoading = computed( + () => + !projectRaw.value || + membersPending.value || + (!!projectRaw.value.organization && organizationPending.value), +) + const { data: thread } = useQuery({ queryKey: computed(() => ['thread', projectRaw.value?.thread_id]), queryFn: () => client.labrinth.threads_v3.getThread(projectRaw.value.thread_id), diff --git a/packages/ui/src/components/project/ProjectSidebarCreators.vue b/packages/ui/src/components/project/ProjectSidebarCreators.vue index 0e58d1b997..1eab4a2d36 100644 --- a/packages/ui/src/components/project/ProjectSidebarCreators.vue +++ b/packages/ui/src/components/project/ProjectSidebarCreators.vue @@ -2,45 +2,59 @@

{{ formatMessage(messages.title) }}

- @@ -80,6 +94,7 @@ const props = defineProps<{ userLink: (username: string) => string linkTarget?: string userLinkTarget?: string | null + loading?: boolean }>() function resolveLinkTarget(target: string | null | undefined): string | null { @@ -113,6 +128,8 @@ const sortedMembers = computed(() => { return owner ? [owner, ...rest] : rest }) +const isEmpty = computed(() => !props.organization && sortedMembers.value.length === 0) + const messages = defineMessages({ title: { id: 'project.about.creators.title', diff --git a/packages/ui/src/components/project/ProjectSidebarServerInfo.vue b/packages/ui/src/components/project/ProjectSidebarServerInfo.vue index f025f93afa..0c6767b788 100644 --- a/packages/ui/src/components/project/ProjectSidebarServerInfo.vue +++ b/packages/ui/src/components/project/ProjectSidebarServerInfo.vue @@ -1,5 +1,5 @@