|
|
|
import { getActivePinia } from 'pinia'
|
|
|
|
import type { Actions, AppInfo, Getters, State } from './types'
|
|
|
|
import type { NcProjectType } from '#imports'
|
|
|
|
|
|
|
|
export function useGlobalActions(state: State, getters: Getters): Actions {
|
|
|
|
const isTokenUpdatedTab = useState('isTokenUpdatedTab', () => false)
|
|
|
|
|
|
|
|
const setIsMobileMode = (isMobileMode: boolean) => {
|
|
|
|
state.isMobileMode.value = isMobileMode
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Sign out by deleting the token from localStorage */
|
|
|
|
const signOut: Actions['signOut'] = async ({
|
|
|
|
redirectToSignin,
|
|
|
|
signinUrl = '/signin',
|
|
|
|
skipApiCall = false,
|
|
|
|
}: SignOutParams = {}) => {
|
|
|
|
try {
|
|
|
|
// call and invalidate refresh token only if user manually triggered logout
|
|
|
|
if (!skipApiCall) {
|
|
|
|
const nuxtApp = useNuxtApp()
|
|
|
|
await nuxtApp.$api.auth.signout()
|
|
|
|
}
|
|
|
|
} catch {
|
|
|
|
// ignore error
|
|
|
|
} finally {
|
|
|
|
state.token.value = null
|
|
|
|
state.user.value = null
|
|
|
|
|
|
|
|
if (redirectToSignin) {
|
|
|
|
await navigateTo(signinUrl)
|
|
|
|
}
|
|
|
|
|
|
|
|
// clear all stores data on logout
|
|
|
|
const pn = getActivePinia()
|
|
|
|
if (pn) {
|
|
|
|
pn._s.forEach((store) => {
|
|
|
|
store.$dispose()
|
|
|
|
delete pn.state.value[store.$id]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Sign in by setting the token in localStorage
|
|
|
|
* keepProps - is for keeping any existing role info if user id is same as previous user
|
|
|
|
* */
|
|
|
|
const signIn: Actions['signIn'] = (newToken, keepProps = false) => {
|
|
|
|
isTokenUpdatedTab.value = true
|
|
|
|
state.token.value = newToken
|
|
|
|
|
|
|
|
if (state.jwtPayload.value) {
|
|
|
|
state.user.value = {
|
|
|
|
...(keepProps && state.user.value?.id === state.jwtPayload.value.id ? state.user.value || {} : {}),
|
|
|
|
id: state.jwtPayload.value.id,
|
|
|
|
email: state.jwtPayload.value.email,
|
|
|
|
firstname: state.jwtPayload.value.firstname,
|
|
|
|
lastname: state.jwtPayload.value.lastname,
|
|
|
|
roles: state.jwtPayload.value.roles,
|
|
|
|
display_name: state.jwtPayload.value.display_name,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** manually try to refresh token */
|
|
|
|
const _refreshToken = async ({
|
|
|
|
axiosInstance,
|
|
|
|
skipSignOut = false,
|
|
|
|
}: {
|
|
|
|
axiosInstance?: any
|
|
|
|
skipSignOut?: boolean
|
|
|
|
} = {}) => {
|
|
|
|
const nuxtApp = useNuxtApp()
|
|
|
|
const t = nuxtApp.vueApp.i18n.global.t
|
|
|
|
|
|
|
|
isTokenRefreshInProgress.value = true
|
|
|
|
|
|
|
|
if (!axiosInstance) {
|
|
|
|
axiosInstance = nuxtApp.$api?.instance
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const response = await axiosInstance.post('/auth/token/refresh', null, {
|
|
|
|
withCredentials: true,
|
|
|
|
})
|
|
|
|
if (response.data?.token) {
|
|
|
|
signIn(response.data.token, true)
|
|
|
|
return response.data.token
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
} catch (e) {
|
|
|
|
if (state.token.value && state.user.value && !skipSignOut) {
|
|
|
|
await signOut({
|
|
|
|
skipApiCall: true,
|
|
|
|
})
|
|
|
|
message.error(t('msg.error.youHaveBeenSignedOut'))
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const refreshToken = useSharedExecutionFn('refreshToken', _refreshToken, {
|
|
|
|
timeout: 10000,
|
|
|
|
})
|
|
|
|
|
|
|
|
const loadAppInfo = async () => {
|
|
|
|
try {
|
|
|
|
const nuxtApp = useNuxtApp()
|
|
|
|
state.appInfo.value = (await nuxtApp.$api.utils.appInfo()) as AppInfo
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const navigateToProject = ({
|
|
|
|
workspaceId: _workspaceId,
|
|
|
|
type: _type,
|
|
|
|
baseId,
|
|
|
|
query,
|
|
|
|
}: {
|
|
|
|
workspaceId?: string
|
|
|
|
baseId?: string
|
|
|
|
type?: NcProjectType
|
|
|
|
query?: any
|
|
|
|
}) => {
|
|
|
|
const workspaceId = _workspaceId || 'nc'
|
|
|
|
let path: string
|
|
|
|
|
|
|
|
const queryParams = query ? `?${new URLSearchParams(query).toString()}` : ''
|
|
|
|
|
|
|
|
if (baseId) {
|
|
|
|
path = `/${workspaceId}/${baseId}${queryParams}`
|
|
|
|
} else {
|
|
|
|
path = `/${workspaceId}${queryParams}`
|
|
|
|
}
|
|
|
|
|
|
|
|
navigateTo({
|
|
|
|
path,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const ncNavigateTo = ({
|
|
|
|
workspaceId: _workspaceId,
|
|
|
|
type: _type,
|
|
|
|
baseId,
|
|
|
|
query,
|
|
|
|
tableId,
|
|
|
|
viewId,
|
|
|
|
}: {
|
|
|
|
workspaceId?: string
|
|
|
|
baseId?: string
|
|
|
|
type?: NcProjectType
|
|
|
|
query?: any
|
|
|
|
tableId?: string
|
|
|
|
viewId?: string
|
|
|
|
}) => {
|
|
|
|
const tablePath = tableId ? `/${tableId}${viewId ? `/${viewId}` : ''}` : ''
|
|
|
|
const workspaceId = _workspaceId || 'nc'
|
|
|
|
let path: string
|
|
|
|
|
|
|
|
const queryParams = query ? `?${new URLSearchParams(query).toString()}` : ''
|
|
|
|
|
|
|
|
if (baseId) {
|
|
|
|
path = `/${workspaceId}/${baseId}${tablePath}${queryParams}`
|
|
|
|
} else {
|
|
|
|
path = `/${workspaceId}${queryParams}`
|
|
|
|
}
|
|
|
|
|
|
|
|
navigateTo({
|
|
|
|
path,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const getBaseUrl = (workspaceId: string) => {
|
|
|
|
// if baseUrl is set in appInfo, use it
|
|
|
|
if (state.appInfo.value.baseUrl) {
|
|
|
|
return state.appInfo.value.baseUrl
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state.appInfo.value.baseHostName && location.hostname !== `${workspaceId}.${state.appInfo.value.baseHostName}`) {
|
|
|
|
return `https://${workspaceId}.${state.appInfo.value.baseHostName}`
|
|
|
|
}
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
const getMainUrl = () => {
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
const setGridViewPageSize = (pageSize: number) => {
|
|
|
|
state.gridViewPageSize.value = pageSize
|
|
|
|
}
|
|
|
|
|
|
|
|
const setLeftSidebarSize = ({ old, current }: { old?: number; current?: number }) => {
|
|
|
|
state.leftSidebarSize.value = {
|
|
|
|
old: old ?? state.leftSidebarSize.value.old,
|
|
|
|
current: current ?? state.leftSidebarSize.value.current,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const setAddNewRecordGridMode = (isGridMode: boolean) => {
|
|
|
|
state.isAddNewRecordGridMode.value = isGridMode
|
|
|
|
}
|
|
|
|
|
|
|
|
const updateSyncDataUpvotes = (upvotes: string[]) => {
|
|
|
|
state.syncDataUpvotes.value = upvotes
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
signIn,
|
|
|
|
signOut,
|
|
|
|
refreshToken,
|
|
|
|
loadAppInfo,
|
|
|
|
setIsMobileMode,
|
|
|
|
navigateToProject,
|
|
|
|
getBaseUrl,
|
|
|
|
ncNavigateTo,
|
|
|
|
getMainUrl,
|
|
|
|
setGridViewPageSize,
|
|
|
|
setLeftSidebarSize,
|
|
|
|
setAddNewRecordGridMode,
|
|
|
|
updateSyncDataUpvotes,
|
|
|
|
}
|
|
|
|
}
|