import { message } from 'ant-design-vue' import { Api } from 'nocodb-sdk' import type { Actions, State } from './types' import { useNuxtApp } from '#app' import { getI18n } from '~/plugins/a.i18n' export function useGlobalActions(state: State): Actions { /** detached api instance, will not trigger global loading */ const api = new Api() const nuxtApp = useNuxtApp() const { t } = getI18n().global /** Sign out by deleting the token from localStorage */ const signOut: Actions['signOut'] = () => { state.token.value = null state.user.value = null } /** Sign in by setting the token in localStorage */ const signIn: Actions['signIn'] = async (newToken) => { state.token.value = newToken if (state.jwtPayload.value) { 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, } } nuxtApp.$e?.('a:auth:sign-in') } /** manually try to refresh token */ const refreshToken = async () => { api.instance .post('/auth/refresh-token', null, { withCredentials: true, }) .then((response) => { if (response.data?.token) { signIn(response.data.token) } }) .catch((err) => { message.error(err.message || t('msg.error.youHaveBeenSignedOut')) signOut() }) } return { signIn, signOut, refreshToken } }