ee5ae8af62
* explicitly ordering global middlewares * various subscription fixes & WIP project invite middleware * SSR invite accept & toast notifs seem to work * backend support for mixpanel * mixpanel be logic -> shared * minor fix * finissh * lint fix * minor comment adjustments * better adblock handling
93 lines
2.2 KiB
TypeScript
93 lines
2.2 KiB
TypeScript
import {
|
|
Roles,
|
|
type MaybeNullOrUndefined,
|
|
resolveMixpanelUserId
|
|
} from '@speckle/shared'
|
|
import { useApolloClient, useQuery } from '@vue/apollo-composable'
|
|
import { graphql } from '~~/lib/common/generated/gql'
|
|
|
|
export const activeUserQuery = graphql(`
|
|
query ActiveUserMainMetadata {
|
|
activeUser {
|
|
id
|
|
email
|
|
company
|
|
bio
|
|
name
|
|
role
|
|
avatar
|
|
isOnboardingFinished
|
|
createdAt
|
|
verified
|
|
notificationPreferences
|
|
versions(limit: 0) {
|
|
totalCount
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
|
|
/**
|
|
* Lightweight composable to read user id from cache imperatively (useful for logging)
|
|
*/
|
|
export function useReadUserId() {
|
|
const client = useApolloClient().client
|
|
return () => {
|
|
return client.readQuery({ query: activeUserQuery })?.activeUser?.id
|
|
}
|
|
}
|
|
|
|
export function useResolveUserDistinctId() {
|
|
return (user: MaybeNullOrUndefined<{ email?: MaybeNullOrUndefined<string> }>) => {
|
|
if (!user) return user // null or undefined
|
|
if (!user.email) return null
|
|
|
|
return resolveMixpanelUserId(user.email)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get active user.
|
|
* undefined - not yet resolved
|
|
* null - resolved that user is a guest
|
|
*/
|
|
export function useActiveUser() {
|
|
const { result, refetch, onResult } = useQuery(activeUserQuery)
|
|
const getDistinctId = useResolveUserDistinctId()
|
|
|
|
const activeUser = computed(() =>
|
|
result.value ? result.value.activeUser : undefined
|
|
)
|
|
const isLoggedIn = computed(() => !!activeUser.value?.id)
|
|
const distinctId = computed(() => {
|
|
const user = activeUser.value
|
|
return getDistinctId(user)
|
|
})
|
|
const userId = computed(() => activeUser.value?.id)
|
|
|
|
const isGuest = computed(() => activeUser.value?.role === Roles.Server.Guest)
|
|
const isAdmin = computed(() => activeUser.value?.role === Roles.Server.Admin)
|
|
|
|
const projectVersionCount = computed(() => activeUser.value?.versions.totalCount)
|
|
|
|
return {
|
|
activeUser,
|
|
userId,
|
|
isLoggedIn,
|
|
distinctId,
|
|
refetch,
|
|
onResult,
|
|
isGuest,
|
|
isAdmin,
|
|
projectVersionCount
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prevents setup function from resolving until active user is resolved
|
|
*/
|
|
export function useWaitForActiveUser() {
|
|
const client = useApolloClient().client
|
|
return async () => await client.query({ query: activeUserQuery }).catch(() => void 0)
|
|
}
|