From 2cd63c571b3dfcdca75c0f32b7c3a3eafe581f1f Mon Sep 17 00:00:00 2001 From: Mike Date: Thu, 10 Apr 2025 20:18:26 +0200 Subject: [PATCH] Fix: Dashboard redirects (#4371) --- .../workspaces/General/DeleteDialog.vue | 3 + .../members/actions/LeaveWorkspaceDialog.vue | 6 ++ .../workspaces/members/actions/Menu.vue | 1 - .../components/workspace/CreatePage.vue | 4 +- .../frontend-2/lib/auth/graphql/queries.ts | 3 + .../lib/common/generated/gql/gql.ts | 6 +- .../lib/common/generated/gql/graphql.ts | 4 +- .../lib/navigation/composables/navigation.ts | 2 +- .../middleware/004-onboarding.global.ts | 5 +- .../middleware/dashboardRedirect.ts | 60 +++++++++++++++++++ packages/frontend-2/pages/index.vue | 2 +- .../settings/workspaces/[slug]/general.vue | 5 +- 12 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 packages/frontend-2/middleware/dashboardRedirect.ts diff --git a/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue b/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue index 69225f4c8..563d3b44e 100644 --- a/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue +++ b/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue @@ -59,6 +59,7 @@ import { homeRoute, defaultZapierWebhookUrl } from '~/lib/common/helpers/route' import { useZapier } from '~/lib/core/composables/zapier' import { useForm } from 'vee-validate' import type { MaybeNullOrUndefined } from '@speckle/shared' +import { useNavigation } from '~/lib/navigation/composables/navigation' graphql(` fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace { @@ -81,6 +82,7 @@ const apollo = useApolloClient().client const mixpanel = useMixpanel() const { sendWebhook } = useZapier() const { resetForm } = useForm<{ feedback: string }>() +const { mutateActiveWorkspaceSlug } = useNavigation() const workspaceNameInput = ref('') const feedback = ref('') @@ -144,6 +146,7 @@ const onDelete = async () => { title: `${workspaceName} workspace deleted` }) + mutateActiveWorkspaceSlug(null) router.push(homeRoute) isOpen.value = false } else { diff --git a/packages/frontend-2/components/settings/workspaces/members/actions/LeaveWorkspaceDialog.vue b/packages/frontend-2/components/settings/workspaces/members/actions/LeaveWorkspaceDialog.vue index 6da9f92b9..ca9447901 100644 --- a/packages/frontend-2/components/settings/workspaces/members/actions/LeaveWorkspaceDialog.vue +++ b/packages/frontend-2/components/settings/workspaces/members/actions/LeaveWorkspaceDialog.vue @@ -17,6 +17,8 @@ import { useWorkspaceUpdateRole } from '~/lib/workspaces/composables/management' import type { SettingsWorkspacesMembersTable_WorkspaceFragment } from '~/lib/common/generated/gql/graphql' import { useActiveUser } from '~/lib/auth/composables/activeUser' import type { MaybeNullOrUndefined } from '@speckle/shared' +import { useNavigation } from '~/lib/navigation/composables/navigation' +import { homeRoute } from '~/lib/common/helpers/route' const props = defineProps<{ workspace: MaybeNullOrUndefined @@ -31,6 +33,8 @@ const open = defineModel('open', { required: true }) const { activeUser } = useActiveUser() const updateUserRole = useWorkspaceUpdateRole() +const { mutateActiveWorkspaceSlug } = useNavigation() +const router = useRouter() const handleConfirm = async () => { if (!props.workspace?.id || !activeUser.value?.id) return @@ -41,6 +45,8 @@ const handleConfirm = async () => { workspaceId: props.workspace.id }) + mutateActiveWorkspaceSlug(null) + router.push(homeRoute) open.value = false emit('success') } diff --git a/packages/frontend-2/components/settings/workspaces/members/actions/Menu.vue b/packages/frontend-2/components/settings/workspaces/members/actions/Menu.vue index e2dddbf1c..ea8a3d31a 100644 --- a/packages/frontend-2/components/settings/workspaces/members/actions/Menu.vue +++ b/packages/frontend-2/components/settings/workspaces/members/actions/Menu.vue @@ -60,7 +60,6 @@ v-model:open="showDialog" :workspace="workspace" :is-only-admin="hasSingleAdmin" - @success="onDialogSuccess" /> diff --git a/packages/frontend-2/pages/settings/workspaces/[slug]/general.vue b/packages/frontend-2/pages/settings/workspaces/[slug]/general.vue index 9a0449a99..507afb42a 100644 --- a/packages/frontend-2/pages/settings/workspaces/[slug]/general.vue +++ b/packages/frontend-2/pages/settings/workspaces/[slug]/general.vue @@ -145,7 +145,7 @@ import { } from '~~/lib/common/helpers/graphql' import { isRequired, isStringOfLength } from '~~/lib/common/helpers/validation' import { useMixpanel } from '~/lib/core/composables/mp' -import { Roles } from '@speckle/shared' +import { Roles, WorkspacePlans } from '@speckle/shared' import { workspaceRoute } from '~/lib/common/helpers/route' import { useRoute } from 'vue-router' import { WorkspacePlanStatuses } from '~/lib/common/generated/gql/graphql' @@ -223,7 +223,8 @@ const canDeleteWorkspace = computed( ] as string[] ).includes( workspaceResult.value?.workspaceBySlug?.plan?.status as WorkspacePlanStatuses - )) + ) || + workspaceResult.value?.workspaceBySlug?.plan?.name === WorkspacePlans.Free) ) const deleteWorkspaceTooltip = computed(() => { if (needsSsoLogin.value)