From 681ae5d1d8db3be39c62320db54b659e0489caf4 Mon Sep 17 00:00:00 2001 From: Truman Gao <106889354+tdgao@users.noreply.github.com> Date: Mon, 16 Mar 2026 12:10:29 -0700 Subject: [PATCH] refactor: removing useAsyncData for tanstack query (#5262) * refactor: most places with useAsyncData replaced with tanstack query * refactor report list and report view * refactor organization page to use tanstack query * fix types * refactor collection page and include proper loading state * fix followed projects proper loading state * fix 404 handling * fix organization loading and 404 states * pnpm prepr * refactor: remove useAsyncData on newsletter button * refactor: remove useAsyncData on auth globals fetch * refactor: settings/billing/index.vue to useQuery instead of useAsyncData * refactor: user page to remove useAsyncData * pnpm prepr * fix reports pages * fix notifications page * fix billing page cannot read properties of null and prop warnings * fix refresh causing 404 by removing useBaseFetch and use api-client * fix stale data after removing organization from project * pnpm prepr * fix news erroring in build * fix: project page loads header only after content * fix: user page tanstack problems (start on migrating away from useBaseFetch) * fix: start swapping useBaseFetch usages to api-client * Revert "fix: start swapping useBaseFetch usages to api-client" This reverts commit 3df3fab11d535159132b1288dd7cacc38282b553. * fix: remove debug logging * fix: lint --------- Co-authored-by: Calum H. Co-authored-by: Calum H. (IMB11) --- .../src/components/ui/NewsletterButton.vue | 63 +- .../components/ui/create/CreateLimitAlert.vue | 11 +- .../src/components/ui/report/ReportInfo.vue | 49 +- .../src/components/ui/report/ReportView.vue | 146 +-- .../src/components/ui/report/ReportsList.vue | 155 +-- .../src/helpers/platform-notifications.ts | 6 +- apps/frontend/src/helpers/threads.js | 44 +- apps/frontend/src/layouts/default.vue | 12 +- apps/frontend/src/locales/en-US/index.json | 9 + apps/frontend/src/middleware/user.global.ts | 31 + apps/frontend/src/pages/[type]/[id].vue | 13 +- .../src/pages/[type]/[id]/moderation.vue | 15 +- .../pages/[type]/[id]/settings/members.vue | 13 +- apps/frontend/src/pages/admin/affiliates.vue | 30 +- .../frontend/src/pages/admin/billing/[id].vue | 49 +- apps/frontend/src/pages/auth/authorize.vue | 42 +- .../src/pages/auth/reset-password.vue | 18 +- apps/frontend/src/pages/auth/sign-in.vue | 19 +- apps/frontend/src/pages/auth/sign-up.vue | 18 +- apps/frontend/src/pages/collection/[id].vue | 936 ++++++++++-------- .../src/pages/dashboard/affiliate-links.vue | 16 +- .../src/pages/dashboard/analytics.vue | 10 +- .../src/pages/dashboard/collections.vue | 9 +- apps/frontend/src/pages/dashboard/index.vue | 38 +- .../src/pages/dashboard/notifications.vue | 26 +- .../src/pages/dashboard/organizations.vue | 14 +- .../src/pages/dashboard/revenue/index.vue | 48 +- .../src/pages/dashboard/revenue/transfers.vue | 15 +- apps/frontend/src/pages/hosting/index.vue | 36 +- .../manage/[id]/options/properties.vue | 2 +- apps/frontend/src/pages/legal/cmp-info.vue | 13 +- .../src/pages/moderation/reports/[id].vue | 28 +- .../src/pages/news/article/[slug].vue | 31 +- apps/frontend/src/pages/organization/[id].vue | 181 ++-- .../organization/[id]/settings/projects.vue | 14 +- .../src/pages/settings/applications.vue | 13 +- .../src/pages/settings/authorizations.vue | 49 +- .../src/pages/settings/billing/charges.vue | 32 +- .../src/pages/settings/billing/index.vue | 69 +- apps/frontend/src/pages/settings/pats.vue | 7 +- apps/frontend/src/pages/settings/sessions.vue | 8 +- apps/frontend/src/pages/user/[id].vue | 154 +-- apps/frontend/src/plugins/error-handling.ts | 5 - apps/frontend/src/plugins/tanstack.ts | 2 +- .../src/server/plugins/error-handling.ts | 5 + packages/api-client/src/modules/index.ts | 6 + .../src/modules/labrinth/auth/internal.ts | 32 + .../api-client/src/modules/labrinth/index.ts | 3 + .../src/modules/labrinth/organizations/v3.ts | 52 + .../src/modules/labrinth/payout/v3.ts | 21 + .../src/modules/labrinth/projects/v2.ts | 15 + .../api-client/src/modules/labrinth/types.ts | 22 + .../src/modules/labrinth/users/v2.ts | 110 ++ 53 files changed, 1686 insertions(+), 1079 deletions(-) create mode 100644 apps/frontend/src/middleware/user.global.ts delete mode 100644 apps/frontend/src/plugins/error-handling.ts create mode 100644 apps/frontend/src/server/plugins/error-handling.ts create mode 100644 packages/api-client/src/modules/labrinth/auth/internal.ts create mode 100644 packages/api-client/src/modules/labrinth/organizations/v3.ts create mode 100644 packages/api-client/src/modules/labrinth/payout/v3.ts diff --git a/apps/frontend/src/components/ui/NewsletterButton.vue b/apps/frontend/src/components/ui/NewsletterButton.vue index 3766b83bb..fb092bffa 100644 --- a/apps/frontend/src/components/ui/NewsletterButton.vue +++ b/apps/frontend/src/components/ui/NewsletterButton.vue @@ -1,19 +1,39 @@ diff --git a/apps/frontend/src/components/ui/create/CreateLimitAlert.vue b/apps/frontend/src/components/ui/create/CreateLimitAlert.vue index 35a89692c..8dbc29676 100644 --- a/apps/frontend/src/components/ui/create/CreateLimitAlert.vue +++ b/apps/frontend/src/components/ui/create/CreateLimitAlert.vue @@ -44,8 +44,11 @@ import { MessageIcon } from '@modrinth/assets' import { Admonition, ButtonStyled, defineMessages, useVIntl } from '@modrinth/ui' import { capitalizeString } from '@modrinth/utils' +import { useQuery } from '@tanstack/vue-query' import { computed, watch } from 'vue' +import { useBaseFetch } from '~/composables/fetch.js' + const { formatMessage } = useVIntl() const messages = defineMessages({ @@ -121,10 +124,10 @@ const apiEndpoint = computed(() => { } }) -const { data: limits } = await useAsyncData( - `limits-${props.type}`, - () => useBaseFetch(apiEndpoint.value, { apiVersion: 3 }) as Promise, -) +const { data: limits } = useQuery({ + queryKey: computed(() => ['limits', props.type]), + queryFn: () => useBaseFetch(apiEndpoint.value, { apiVersion: 3 }) as Promise, +}) const typeName = computed<{ singular: string; plural: string }>(() => { switch (props.type) { diff --git a/apps/frontend/src/components/ui/report/ReportInfo.vue b/apps/frontend/src/components/ui/report/ReportInfo.vue index d161d6278..3c4c619eb 100644 --- a/apps/frontend/src/components/ui/report/ReportInfo.vue +++ b/apps/frontend/src/components/ui/report/ReportInfo.vue @@ -1,7 +1,8 @@