opnform-host-nginx/client/stores/auth.js

99 lines
2.5 KiB
JavaScript

import { defineStore } from "pinia"
export const useAuthStore = defineStore("auth", {
state: () => {
return {
token: null,
admin_token: null,
user: null,
}
},
getters: {
check: (state) => state.user !== null && state.user !== undefined,
has_active_license: (state) => state.user !== null && state.user !== undefined && state.user.active_license !== null,
isImpersonating: (state) =>
state.admin_token !== null && state.admin_token !== undefined,
},
actions: {
// Stores admin token temporarily for impersonation
startImpersonating() {
this.setAdminToken(this.token)
},
// Stop admin impersonation
stopImpersonating() {
// When stopping impersonation, we don't have expiration info for the admin token
// Use a default long expiration (24 hours) to ensure the admin can continue working
this.setToken(this.admin_token, 60 * 60 * 24)
this.setAdminToken(null)
},
setToken(token, expiresIn) {
// Set cookie with expiration if provided
const cookieOptions = {}
if (expiresIn) {
// expiresIn is in seconds, maxAge also needs to be in seconds
cookieOptions.maxAge = expiresIn
}
this.setCookie("token", token, cookieOptions)
this.token = token
},
setAdminToken(token) {
this.setCookie("admin_token", token)
this.admin_token = token
},
setCookie(name, value, options = {}) {
if (import.meta.client) {
useCookie(name, options).value = value
}
},
initStore(token, adminToken) {
this.token = token
this.admin_token = adminToken
},
setUser(user) {
if (!user) {
console.error("No user, logging out.")
// When logging out due to no user, clear the token with maxAge 0
this.setToken(null, 0)
}
this.user = user
this.initServiceClients()
},
updateUser(payload) {
this.user = payload
this.initServiceClients()
},
initServiceClients() {
if (!this.user) return
useAmplitude().setUser(this.user)
useCrisp().setUser(this.user)
// todo: set sentry user
},
logout() {
opnFetch("logout", { method: "POST" }).catch(() => {})
this.user = null
// Clear the token cookie by setting maxAge to 0
this.setCookie("token", null, { maxAge: 0 })
this.token = null
},
// async fetchOauthUrl() {
// const {data} = await axios.post(`/api/oauth/${provider}`)
// return data.url
// },
},
})