fix(fe2): not firing workspace invites queries if FF is off (#2685)
* fix(fe2): not firing workspace invites queries if FF is off * added .value to ref
This commit is contained in:
committed by
GitHub
parent
e2d7172b0a
commit
248511070a
@@ -32,7 +32,7 @@
|
||||
<AuthLoginWithEmailBlock
|
||||
v-if="hasLocalStrategy"
|
||||
:challenge="challenge"
|
||||
:workspace-invite="result?.workspaceInvite || undefined"
|
||||
:workspace-invite="workspaceInvite || undefined"
|
||||
/>
|
||||
<div v-if="!forcedInviteEmail" class="text-center text-body-sm">
|
||||
<span class="mr-2">Don't have an account?</span>
|
||||
@@ -52,7 +52,10 @@ import { useLoginOrRegisterUtils, useAuthManager } from '~~/lib/auth/composables
|
||||
import { LayoutDialog } from '@speckle/ui-components'
|
||||
import { ArrowRightIcon } from '@heroicons/vue/20/solid'
|
||||
import { registerRoute } from '~~/lib/common/helpers/route'
|
||||
import { authLoginPanelQuery } from '~/lib/auth/graphql/queries'
|
||||
import {
|
||||
authLoginPanelQuery,
|
||||
authLoginPanelWorkspaceInviteQuery
|
||||
} from '~/lib/auth/graphql/queries'
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
@@ -71,9 +74,19 @@ const { appId, challenge } = useLoginOrRegisterUtils()
|
||||
const { isLoggedIn } = useActiveUser()
|
||||
const { inviteToken } = useAuthManager()
|
||||
const router = useRouter()
|
||||
const { result } = useQuery(authLoginPanelQuery, () => ({
|
||||
token: inviteToken.value
|
||||
}))
|
||||
const isWorkspacesEnabled = useIsWorkspacesEnabled()
|
||||
|
||||
const { result } = useQuery(authLoginPanelQuery)
|
||||
|
||||
const { result: workspaceInviteResult } = useQuery(
|
||||
authLoginPanelWorkspaceInviteQuery,
|
||||
() => ({
|
||||
token: inviteToken.value
|
||||
}),
|
||||
() => ({
|
||||
enabled: isWorkspacesEnabled.value
|
||||
})
|
||||
)
|
||||
|
||||
const finalRegisterRoute = computed(() => {
|
||||
const result = router.resolve({
|
||||
@@ -87,7 +100,7 @@ const concreteComponent = computed(() => {
|
||||
return props.dialogMode ? LayoutDialog : 'div'
|
||||
})
|
||||
|
||||
const workspaceInvite = computed(() => result.value?.workspaceInvite)
|
||||
const workspaceInvite = computed(() => workspaceInviteResult.value?.workspaceInvite)
|
||||
const forcedInviteEmail = computed(() => workspaceInvite.value?.email)
|
||||
|
||||
const serverInfo = computed(() => result.value?.serverInfo)
|
||||
|
||||
@@ -72,6 +72,11 @@ const registerPanelQuery = graphql(`
|
||||
id
|
||||
email
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
const registerPanelWorkspaceInviteQuery = graphql(`
|
||||
query AuthRegisterPanelWorkspaceInvite($token: String) {
|
||||
workspaceInvite(token: $token) {
|
||||
id
|
||||
...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator
|
||||
@@ -79,10 +84,20 @@ const registerPanelQuery = graphql(`
|
||||
}
|
||||
`)
|
||||
|
||||
const isWorkspacesEnabled = useIsWorkspacesEnabled()
|
||||
const { appId, challenge, inviteToken } = useLoginOrRegisterUtils()
|
||||
const { result } = useQuery(registerPanelQuery, () => ({
|
||||
token: inviteToken.value
|
||||
}))
|
||||
const { result: workspaceInviteResult } = useQuery(
|
||||
registerPanelWorkspaceInviteQuery,
|
||||
() => ({
|
||||
token: inviteToken.value
|
||||
}),
|
||||
() => ({
|
||||
enabled: isWorkspacesEnabled.value
|
||||
})
|
||||
)
|
||||
|
||||
const newsletterConsent = ref(false)
|
||||
|
||||
@@ -97,5 +112,5 @@ const hasThirdPartyStrategies = computed(() =>
|
||||
)
|
||||
|
||||
const isInviteOnly = computed(() => !!serverInfo.value?.inviteOnly)
|
||||
const workspaceInvite = computed(() => result.value?.workspaceInvite)
|
||||
const workspaceInvite = computed(() => workspaceInviteResult.value?.workspaceInvite)
|
||||
</script>
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
<div>
|
||||
<Portal to="primary-actions"></Portal>
|
||||
<ProjectsDashboardHeader
|
||||
:user="projectsPanelResult?.activeUser || undefined"
|
||||
:projects-invites="projectsPanelResult?.activeUser || undefined"
|
||||
:workspaces-invites="workspacesInvitesResult?.activeUser || undefined"
|
||||
class="mb-10"
|
||||
/>
|
||||
|
||||
@@ -61,7 +62,10 @@ import {
|
||||
useQueryLoading,
|
||||
useSubscription
|
||||
} from '@vue/apollo-composable'
|
||||
import { projectsDashboardQuery } from '~~/lib/projects/graphql/queries'
|
||||
import {
|
||||
projectsDashboardQuery,
|
||||
projectsDashboardWorkspaceInvitesQuery
|
||||
} from '~~/lib/projects/graphql/queries'
|
||||
import { graphql } from '~~/lib/common/generated/gql'
|
||||
import {
|
||||
getCacheId,
|
||||
@@ -88,6 +92,7 @@ const { activeUser, isGuest } = useActiveUser()
|
||||
const { triggerNotification } = useGlobalToast()
|
||||
const areQueriesLoading = useQueryLoading()
|
||||
const apollo = useApolloClient().client
|
||||
const isWorkspacesEnabled = useIsWorkspacesEnabled()
|
||||
|
||||
const {
|
||||
on,
|
||||
@@ -109,6 +114,14 @@ const {
|
||||
}
|
||||
}))
|
||||
|
||||
const { result: workspacesInvitesResult } = useQuery(
|
||||
projectsDashboardWorkspaceInvitesQuery,
|
||||
undefined,
|
||||
() => ({
|
||||
enabled: isWorkspacesEnabled.value
|
||||
})
|
||||
)
|
||||
|
||||
onProjectsResult((res) => {
|
||||
cursor.value = res.data?.activeUser?.projects.cursor || null
|
||||
infiniteLoaderId.value = JSON.stringify(projectsVariables.value?.filter || {})
|
||||
|
||||
@@ -6,8 +6,14 @@
|
||||
<div v-if="showChecklist">
|
||||
<OnboardingChecklistV1 show-intro />
|
||||
</div>
|
||||
<ProjectsInviteBanners v-if="user?.projectInvites?.length" :invites="user" />
|
||||
<WorkspaceInviteBanners v-if="user?.workspaceInvites?.length" :invites="user" />
|
||||
<ProjectsInviteBanners
|
||||
v-if="projectsInvites?.projectInvites?.length"
|
||||
:invites="projectsInvites"
|
||||
/>
|
||||
<WorkspaceInviteBanners
|
||||
v-if="workspacesInvites?.workspaceInvites?.length"
|
||||
:invites="workspacesInvites"
|
||||
/>
|
||||
<ProjectsNewSpeckleBanner
|
||||
v-if="showNewSpeckleBanner"
|
||||
@dismissed="onDismissNewSpeckleBanner"
|
||||
@@ -19,18 +25,27 @@
|
||||
<script setup lang="ts">
|
||||
import { useSynchronizedCookie } from '~/lib/common/composables/reactiveCookie'
|
||||
import { graphql } from '~/lib/common/generated/gql'
|
||||
import type { ProjectsDashboardHeader_UserFragment } from '~/lib/common/generated/gql/graphql'
|
||||
import type {
|
||||
ProjectsDashboardHeaderProjects_UserFragment,
|
||||
ProjectsDashboardHeaderWorkspaces_UserFragment
|
||||
} from '~/lib/common/generated/gql/graphql'
|
||||
import type { PromoBanner } from '~/lib/promo-banners/types'
|
||||
|
||||
graphql(`
|
||||
fragment ProjectsDashboardHeader_User on User {
|
||||
fragment ProjectsDashboardHeaderProjects_User on User {
|
||||
...ProjectsInviteBanners
|
||||
}
|
||||
`)
|
||||
|
||||
graphql(`
|
||||
fragment ProjectsDashboardHeaderWorkspaces_User on User {
|
||||
...WorkspaceInviteBanners_User
|
||||
}
|
||||
`)
|
||||
|
||||
const props = defineProps<{
|
||||
user?: ProjectsDashboardHeader_UserFragment
|
||||
projectsInvites?: ProjectsDashboardHeaderProjects_UserFragment
|
||||
workspacesInvites?: ProjectsDashboardHeaderWorkspaces_UserFragment
|
||||
}>()
|
||||
|
||||
const promoBanners = ref<PromoBanner[]>([
|
||||
@@ -89,7 +104,10 @@ const showChecklist = computed(() => {
|
||||
|
||||
const showNewSpeckleBanner = computed(() => {
|
||||
if (hasDismissedNewSpeckleBanner.value) return false
|
||||
if (props.user?.projectInvites.length || props.user?.workspaceInvites?.length)
|
||||
if (
|
||||
props.projectsInvites?.projectInvites.length ||
|
||||
props.workspacesInvites?.workspaceInvites?.length
|
||||
)
|
||||
return false
|
||||
|
||||
return true
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
import { graphql } from '~~/lib/common/generated/gql'
|
||||
|
||||
export const authLoginPanelQuery = graphql(`
|
||||
query AuthLoginPanel($token: String) {
|
||||
workspaceInvite(token: $token) {
|
||||
id
|
||||
email
|
||||
...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator
|
||||
...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator
|
||||
}
|
||||
query AuthLoginPanel {
|
||||
serverInfo {
|
||||
authStrategies {
|
||||
id
|
||||
@@ -17,6 +11,17 @@ export const authLoginPanelQuery = graphql(`
|
||||
}
|
||||
`)
|
||||
|
||||
export const authLoginPanelWorkspaceInviteQuery = graphql(`
|
||||
query AuthLoginPanelWorkspaceInvite($token: String) {
|
||||
workspaceInvite(token: $token) {
|
||||
id
|
||||
email
|
||||
...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator
|
||||
...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
export const authorizableAppMetadataQuery = graphql(`
|
||||
query AuthorizableAppMetadata($id: String!) {
|
||||
app(id: $id) {
|
||||
|
||||
@@ -14,7 +14,8 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
|
||||
*/
|
||||
const documents = {
|
||||
"\n fragment AuthLoginWithEmailBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n email\n user {\n id\n }\n }\n": types.AuthLoginWithEmailBlock_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n": types.AuthRegisterPanelDocument,
|
||||
"\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n }\n": types.AuthRegisterPanelDocument,
|
||||
"\n query AuthRegisterPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n": types.AuthRegisterPanelWorkspaceInviteDocument,
|
||||
"\n fragment ServerTermsOfServicePrivacyPolicyFragment on ServerInfo {\n termsOfService\n }\n": types.ServerTermsOfServicePrivacyPolicyFragmentFragmentDoc,
|
||||
"\n query EmailVerificationBannerState {\n activeUser {\n id\n email\n verified\n hasPendingVerification\n }\n }\n": types.EmailVerificationBannerStateDocument,
|
||||
"\n mutation RequestVerification {\n requestVerification\n }\n": types.RequestVerificationDocument,
|
||||
@@ -84,7 +85,8 @@ const documents = {
|
||||
"\n fragment ProjectsPageTeamDialogManagePermissions_Project on Project {\n id\n visibility\n role\n }\n": types.ProjectsPageTeamDialogManagePermissions_ProjectFragmentDoc,
|
||||
"\n subscription OnUserProjectsUpdate {\n userProjectsUpdated {\n type\n id\n project {\n ...ProjectDashboardItem\n }\n }\n }\n ": types.OnUserProjectsUpdateDocument,
|
||||
"\n fragment ProjectsDashboardFilled on ProjectCollection {\n items {\n ...ProjectDashboardItem\n }\n }\n": types.ProjectsDashboardFilledFragmentDoc,
|
||||
"\n fragment ProjectsDashboardHeader_User on User {\n ...ProjectsInviteBanners\n ...WorkspaceInviteBanners_User\n }\n": types.ProjectsDashboardHeader_UserFragmentDoc,
|
||||
"\n fragment ProjectsDashboardHeaderProjects_User on User {\n ...ProjectsInviteBanners\n }\n": types.ProjectsDashboardHeaderProjects_UserFragmentDoc,
|
||||
"\n fragment ProjectsDashboardHeaderWorkspaces_User on User {\n ...WorkspaceInviteBanners_User\n }\n": types.ProjectsDashboardHeaderWorkspaces_UserFragmentDoc,
|
||||
"\n fragment ProjectsInviteBanner on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": types.ProjectsInviteBannerFragmentDoc,
|
||||
"\n fragment ProjectsInviteBanners on User {\n projectInvites {\n ...ProjectsInviteBanner\n }\n }\n": types.ProjectsInviteBannersFragmentDoc,
|
||||
"\n fragment SettingsDialog_User on User {\n workspaces {\n items {\n id\n name\n }\n }\n }\n": types.SettingsDialog_UserFragmentDoc,
|
||||
@@ -97,8 +99,8 @@ const documents = {
|
||||
"\n fragment UserProfileEditDialogBio_User on User {\n id\n name\n company\n bio\n ...UserProfileEditDialogAvatar_User\n }\n": types.UserProfileEditDialogBio_UserFragmentDoc,
|
||||
"\n fragment UserProfileEditDialogAvatar_User on User {\n id\n avatar\n ...ActiveUserAvatar\n }\n": types.UserProfileEditDialogAvatar_UserFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesGeneral_Workspace on Workspace {\n ...SettingsWorkspaceGeneralDeleteDialog_Workspace\n id\n name\n logo\n description\n }\n": types.SettingsWorkspacesGeneral_WorkspaceFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n": types.SettingsWorkspacesMembers_WorkspaceFragmentDoc,
|
||||
"\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n": types.SettingsWorkspaceGeneralDeleteDialog_WorkspaceFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n": types.SettingsWorkspacesMembers_WorkspaceFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesMembersInvitesTable_Workspace on Workspace {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam(filter: $invitesFilter) {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n": types.SettingsWorkspacesMembersInvitesTable_WorkspaceFragmentDoc,
|
||||
"\n fragment SettingsWorkspacesMembersMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n role\n user {\n id\n avatar\n name\n company\n verified\n }\n }\n": types.SettingsWorkspacesMembersMembersTable_WorkspaceCollaboratorFragmentDoc,
|
||||
@@ -118,7 +120,8 @@ const documents = {
|
||||
"\n mutation CreateOnboardingProject {\n projectMutations {\n createForOnboarding {\n ...ProjectPageProject\n ...ProjectDashboardItem\n }\n }\n }\n ": types.CreateOnboardingProjectDocument,
|
||||
"\n mutation FinishOnboarding {\n activeUserMutations {\n finishOnboarding\n }\n }\n": types.FinishOnboardingDocument,
|
||||
"\n mutation RequestVerificationByEmail($email: String!) {\n requestVerificationByEmail(email: $email)\n }\n": types.RequestVerificationByEmailDocument,
|
||||
"\n query AuthLoginPanel($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n": types.AuthLoginPanelDocument,
|
||||
"\n query AuthLoginPanel {\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n": types.AuthLoginPanelDocument,
|
||||
"\n query AuthLoginPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n }\n": types.AuthLoginPanelWorkspaceInviteDocument,
|
||||
"\n query AuthorizableAppMetadata($id: String!) {\n app(id: $id) {\n id\n name\n description\n trustByDefault\n redirectUrl\n scopes {\n name\n description\n }\n author {\n name\n id\n avatar\n }\n }\n }\n": types.AuthorizableAppMetadataDocument,
|
||||
"\n fragment FunctionRunStatusForSummary on AutomateFunctionRun {\n id\n status\n }\n": types.FunctionRunStatusForSummaryFragmentDoc,
|
||||
"\n fragment TriggeredAutomationsStatusSummary on TriggeredAutomationsStatus {\n id\n automationRuns {\n id\n functionRuns {\n id\n ...FunctionRunStatusForSummary\n }\n }\n }\n": types.TriggeredAutomationsStatusSummaryFragmentDoc,
|
||||
@@ -137,7 +140,8 @@ const documents = {
|
||||
"\n query ServerInfoAllScopes {\n serverInfo {\n scopes {\n name\n description\n }\n }\n }\n": types.ServerInfoAllScopesDocument,
|
||||
"\n query ProjectModelsSelectorValues($projectId: String!, $cursor: String) {\n project(id: $projectId) {\n id\n models(limit: 100, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...CommonModelSelectorModel\n }\n }\n }\n }\n": types.ProjectModelsSelectorValuesDocument,
|
||||
"\n query MainServerInfoData {\n serverInfo {\n adminContact\n blobSizeLimitBytes\n canonicalUrl\n company\n description\n guestModeEnabled\n inviteOnly\n name\n termsOfService\n version\n automateUrl\n }\n }\n": types.MainServerInfoDataDocument,
|
||||
"\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n": types.DashboardProjectsPageQueryDocument,
|
||||
"\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n": types.DashboardProjectsPageQueryDocument,
|
||||
"\n query DashboardProjectsPageWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n": types.DashboardProjectsPageWorkspaceInvitesQueryDocument,
|
||||
"\n mutation DeleteAccessToken($token: String!) {\n apiTokenRevoke(token: $token)\n }\n": types.DeleteAccessTokenDocument,
|
||||
"\n mutation CreateAccessToken($token: ApiTokenCreateInput!) {\n apiTokenCreate(token: $token)\n }\n": types.CreateAccessTokenDocument,
|
||||
"\n mutation DeleteApplication($appId: String!) {\n appDelete(appId: $appId)\n }\n": types.DeleteApplicationDocument,
|
||||
@@ -187,7 +191,8 @@ const documents = {
|
||||
"\n mutation CreateTestAutomation(\n $projectId: ID!\n $input: ProjectTestAutomationCreateInput!\n ) {\n projectMutations {\n automationMutations(projectId: $projectId) {\n createTestAutomation(input: $input) {\n id\n ...ProjectPageAutomationsRow_Automation\n }\n }\n }\n }\n": types.CreateTestAutomationDocument,
|
||||
"\n query ProjectAccessCheck($id: String!) {\n project(id: $id) {\n id\n }\n }\n": types.ProjectAccessCheckDocument,
|
||||
"\n query ProjectRoleCheck($id: String!) {\n project(id: $id) {\n id\n role\n }\n }\n": types.ProjectRoleCheckDocument,
|
||||
"\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n": types.ProjectsDashboardQueryDocument,
|
||||
"\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n": types.ProjectsDashboardQueryDocument,
|
||||
"\n query ProjectsDashboardWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n": types.ProjectsDashboardWorkspaceInvitesQueryDocument,
|
||||
"\n query ProjectPageQuery($id: String!, $token: String) {\n project(id: $id) {\n ...ProjectPageProject\n }\n projectInvite(projectId: $id, token: $token) {\n ...ProjectsInviteBanner\n }\n }\n": types.ProjectPageQueryDocument,
|
||||
"\n query ProjectLatestModels($projectId: String!, $filter: ProjectModelsFilter) {\n project(id: $projectId) {\n id\n models(cursor: null, limit: 16, filter: $filter) {\n totalCount\n cursor\n items {\n ...ProjectPageLatestItemsModelItem\n }\n }\n pendingImportedModels {\n ...PendingFileUpload\n }\n }\n }\n": types.ProjectLatestModelsDocument,
|
||||
"\n query ProjectLatestModelsPagination(\n $projectId: String!\n $filter: ProjectModelsFilter\n $cursor: String = null\n ) {\n project(id: $projectId) {\n id\n models(cursor: $cursor, limit: 16, filter: $filter) {\n totalCount\n cursor\n items {\n ...ProjectPageLatestItemsModelItem\n }\n }\n }\n }\n": types.ProjectLatestModelsPaginationDocument,
|
||||
@@ -306,7 +311,11 @@ export function graphql(source: "\n fragment AuthLoginWithEmailBlock_PendingWor
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n"): (typeof documents)["\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n"];
|
||||
export function graphql(source: "\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n }\n"): (typeof documents)["\n query AuthRegisterPanel($token: String) {\n serverInfo {\n inviteOnly\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n ...ServerTermsOfServicePrivacyPolicyFragment\n }\n serverInviteByToken(token: $token) {\n id\n email\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query AuthRegisterPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n"): (typeof documents)["\n query AuthRegisterPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -586,7 +595,11 @@ export function graphql(source: "\n fragment ProjectsDashboardFilled on Project
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n fragment ProjectsDashboardHeader_User on User {\n ...ProjectsInviteBanners\n ...WorkspaceInviteBanners_User\n }\n"): (typeof documents)["\n fragment ProjectsDashboardHeader_User on User {\n ...ProjectsInviteBanners\n ...WorkspaceInviteBanners_User\n }\n"];
|
||||
export function graphql(source: "\n fragment ProjectsDashboardHeaderProjects_User on User {\n ...ProjectsInviteBanners\n }\n"): (typeof documents)["\n fragment ProjectsDashboardHeaderProjects_User on User {\n ...ProjectsInviteBanners\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n fragment ProjectsDashboardHeaderWorkspaces_User on User {\n ...WorkspaceInviteBanners_User\n }\n"): (typeof documents)["\n fragment ProjectsDashboardHeaderWorkspaces_User on User {\n ...WorkspaceInviteBanners_User\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -638,11 +651,11 @@ export function graphql(source: "\n fragment SettingsWorkspacesGeneral_Workspac
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n"];
|
||||
export function graphql(source: "\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n"): (typeof documents)["\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n"): (typeof documents)["\n fragment SettingsWorkspaceGeneralDeleteDialog_Workspace on Workspace {\n id\n name\n }\n"];
|
||||
export function graphql(source: "\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembers_Workspace on Workspace {\n id\n role\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -722,7 +735,11 @@ export function graphql(source: "\n mutation RequestVerificationByEmail($email:
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query AuthLoginPanel($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n"): (typeof documents)["\n query AuthLoginPanel($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n"];
|
||||
export function graphql(source: "\n query AuthLoginPanel {\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n"): (typeof documents)["\n query AuthLoginPanel {\n serverInfo {\n authStrategies {\n id\n }\n ...AuthStategiesServerInfoFragment\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query AuthLoginPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n }\n"): (typeof documents)["\n query AuthLoginPanelWorkspaceInvite($token: String) {\n workspaceInvite(token: $token) {\n id\n email\n ...AuthWorkspaceInviteHeader_PendingWorkspaceCollaborator\n ...AuthLoginWithEmailBlock_PendingWorkspaceCollaborator\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -798,7 +815,11 @@ export function graphql(source: "\n query MainServerInfoData {\n serverInfo
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n"): (typeof documents)["\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n"];
|
||||
export function graphql(source: "\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n"): (typeof documents)["\n query DashboardProjectsPageQuery {\n activeUser {\n id\n projects(limit: 3) {\n items {\n ...DashboardProjectCard_Project\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query DashboardProjectsPageWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n"): (typeof documents)["\n query DashboardProjectsPageWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -998,7 +1019,11 @@ export function graphql(source: "\n query ProjectRoleCheck($id: String!) {\n
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n"): (typeof documents)["\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeader_User\n }\n }\n"];
|
||||
export function graphql(source: "\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n"): (typeof documents)["\n query ProjectsDashboardQuery($filter: UserProjectsFilter, $cursor: String) {\n activeUser {\n id\n projects(filter: $filter, limit: 6, cursor: $cursor) {\n cursor\n totalCount\n items {\n ...ProjectDashboardItem\n }\n }\n ...ProjectsDashboardHeaderProjects_User\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query ProjectsDashboardWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n"): (typeof documents)["\n query ProjectsDashboardWorkspaceInvitesQuery {\n activeUser {\n id\n ...ProjectsDashboardHeaderWorkspaces_User\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -9,7 +9,16 @@ export const dashboardProjectsPageQuery = graphql(`
|
||||
...DashboardProjectCard_Project
|
||||
}
|
||||
}
|
||||
...ProjectsDashboardHeader_User
|
||||
...ProjectsDashboardHeaderProjects_User
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
export const dashboardProjectsPageWorkspaceInvitesQuery = graphql(`
|
||||
query DashboardProjectsPageWorkspaceInvitesQuery {
|
||||
activeUser {
|
||||
id
|
||||
...ProjectsDashboardHeaderWorkspaces_User
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
@@ -28,7 +28,16 @@ export const projectsDashboardQuery = graphql(`
|
||||
...ProjectDashboardItem
|
||||
}
|
||||
}
|
||||
...ProjectsDashboardHeader_User
|
||||
...ProjectsDashboardHeaderProjects_User
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
export const projectsDashboardWorkspaceInvitesQuery = graphql(`
|
||||
query ProjectsDashboardWorkspaceInvitesQuery {
|
||||
activeUser {
|
||||
id
|
||||
...ProjectsDashboardHeaderWorkspaces_User
|
||||
}
|
||||
}
|
||||
`)
|
||||
|
||||
@@ -70,7 +70,7 @@ export default defineNuxtRouteMiddleware(async (to) => {
|
||||
]
|
||||
: [])
|
||||
])
|
||||
if (workspaceInviteData.data?.workspaceInvite) {
|
||||
if (workspaceInviteData?.data?.workspaceInvite) {
|
||||
workspaceInvite.value = workspaceInviteData.data.workspaceInvite
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
<template>
|
||||
<div class="flex flex-col gap-y-12">
|
||||
<ProjectsDashboardHeader :user="projectsResult?.activeUser || undefined" />
|
||||
<ProjectsDashboardHeader
|
||||
:projects-invites="projectsResult?.activeUser || undefined"
|
||||
:workspaces-invites="workspaceInvitesResult?.activeUser || undefined"
|
||||
/>
|
||||
|
||||
<section>
|
||||
<h2 class="text-heading-sm text-foreground-2">Quick start</h2>
|
||||
@@ -48,7 +51,10 @@
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { type LayoutDialogButton } from '@speckle/ui-components'
|
||||
import { dashboardProjectsPageQuery } from '~~/lib/dashboard/graphql/queries'
|
||||
import {
|
||||
dashboardProjectsPageQuery,
|
||||
dashboardProjectsPageWorkspaceInvitesQuery
|
||||
} from '~~/lib/dashboard/graphql/queries'
|
||||
import type { QuickStartItem } from '~~/lib/dashboard/helpers/types'
|
||||
import { getResizedGhostImage } from '~~/lib/dashboard/helpers/utils'
|
||||
import { useQuery } from '@vue/apollo-composable'
|
||||
@@ -68,7 +74,15 @@ definePageMeta({
|
||||
|
||||
const config = useRuntimeConfig()
|
||||
const mixpanel = useMixpanel()
|
||||
const isWorkspacesEnabled = useIsWorkspacesEnabled()
|
||||
const { result: projectsResult } = useQuery(dashboardProjectsPageQuery)
|
||||
const { result: workspaceInvitesResult } = useQuery(
|
||||
dashboardProjectsPageWorkspaceInvitesQuery,
|
||||
undefined,
|
||||
() => ({
|
||||
enabled: isWorkspacesEnabled.value
|
||||
})
|
||||
)
|
||||
const { triggerNotification } = useGlobalToast()
|
||||
const { isGuest } = useActiveUser()
|
||||
const { data: tutorials } = await useLazyAsyncData('tutorials', fetchTutorials, {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import type { Optional } from '@speckle/shared'
|
||||
import { activeUserQuery } from '~/lib/auth/composables/activeUser'
|
||||
import { authLoginPanelQuery } from '~/lib/auth/graphql/queries'
|
||||
import {
|
||||
authLoginPanelQuery,
|
||||
authLoginPanelWorkspaceInviteQuery
|
||||
} from '~/lib/auth/graphql/queries'
|
||||
import { usePreloadApolloQueries } from '~/lib/common/composables/graphql'
|
||||
import { mainServerInfoDataQuery } from '~/lib/core/composables/server'
|
||||
import { projectAccessCheckQuery } from '~/lib/projects/graphql/queries'
|
||||
@@ -67,7 +70,12 @@ export default defineNuxtPlugin(async (ctx) => {
|
||||
// Unable to preload this from vue components due to SSR being essentially turned off for the viewer
|
||||
promises.push(
|
||||
preload({
|
||||
queries: [{ query: authLoginPanelQuery }]
|
||||
queries: [
|
||||
{ query: authLoginPanelQuery },
|
||||
...(isWorkspacesEnabled.value
|
||||
? [{ query: authLoginPanelWorkspaceInviteQuery }]
|
||||
: [])
|
||||
]
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
@@ -245,8 +245,9 @@ extend type User {
|
||||
"""
|
||||
Get all invitations to workspaces that the active user has
|
||||
"""
|
||||
workspaceInvites: [PendingWorkspaceCollaborator!]
|
||||
workspaceInvites: [PendingWorkspaceCollaborator!]!
|
||||
@hasServerRole(role: SERVER_GUEST)
|
||||
@hasScope(scope: "workspace:read")
|
||||
@isOwner
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,7 @@ export = !FF_WORKSPACES_MODULE_ENABLED
|
||||
throw new WorkspacesModuleDisabledError()
|
||||
},
|
||||
workspaceInvite: async () => {
|
||||
// Easier to manage in FE if this doesn't throw, just returns null
|
||||
return null
|
||||
throw new WorkspacesModuleDisabledError()
|
||||
}
|
||||
},
|
||||
Mutation: {
|
||||
@@ -69,8 +68,7 @@ export = !FF_WORKSPACES_MODULE_ENABLED
|
||||
throw new WorkspacesModuleDisabledError()
|
||||
},
|
||||
workspaceInvites: async () => {
|
||||
// Easier to manage in FE if this doesn't throw, just returns empty
|
||||
return []
|
||||
throw new WorkspacesModuleDisabledError()
|
||||
}
|
||||
},
|
||||
Project: {
|
||||
|
||||
Reference in New Issue
Block a user