opnform/client/stores/auth.js

97 lines
2.1 KiB
JavaScript
Raw Normal View History

2023-12-14 15:53:05 +00:00
import {defineStore} from 'pinia'
2023-12-09 14:47:03 +00:00
import axios from 'axios'
export const useAuthStore = defineStore('auth', {
2023-12-14 15:53:05 +00:00
state: () => {
return {
token: null,
admin_token: null,
user: null,
}
},
2023-12-09 14:47:03 +00:00
getters: {
check: (state) => (state.user !== null && state.user !== undefined),
isImpersonating: (state) => (state.admin_token !== null && state.admin_token !== undefined)
},
actions: {
// Stores admin token temporarily for impersonation
2023-12-14 15:53:05 +00:00
startImpersonating() {
this.setAdminToken(this.token)
2023-12-09 14:47:03 +00:00
},
// Stop admin impersonation
2023-12-14 15:53:05 +00:00
stopImpersonating() {
2023-12-09 14:47:03 +00:00
this.token = this.admin_token
this.admin_token = null
this.fetchUser()
},
2023-12-14 15:53:05 +00:00
setToken(token) {
useCookie('token', {maxAge: 60 * 60 * 24 * 30}).value = token
2023-12-09 14:47:03 +00:00
this.token = token
},
2023-12-14 15:53:05 +00:00
setAdminToken(token) {
useCookie('admin_token', {maxAge: 60 * 60 * 24 * 30}).value = token
this.admin_token = token
},
loadTokenFromCookie() {
this.token = useCookie('token').value
this.admin_token = useCookie('admin_token').value
},
async fetchUser() {
2023-12-09 14:47:03 +00:00
try {
2023-12-14 15:53:05 +00:00
const {data} = await axios.get('/api/user')
2023-12-09 14:47:03 +00:00
this.user = data
this.initServiceClients()
2023-12-09 14:47:03 +00:00
return data
} catch (e) {
2023-12-14 15:53:05 +00:00
this.setToken(null)
2023-12-09 14:47:03 +00:00
}
},
2023-12-14 15:53:05 +00:00
async fetchUserIfNotFetched() {
if (this.user === null && this.token) {
await this.fetchUser()
}
},
updateUser(payload) {
2023-12-09 14:47:03 +00:00
this.user = payload
2023-12-11 10:56:21 +00:00
this.initServiceClients()
2023-12-09 14:47:03 +00:00
},
initServiceClients() {
if (!this.user) return
useAmplitude().setUser(this.user)
useCrisp().setUser(this.user)
2023-12-14 15:53:05 +00:00
// Init sentry
Sentry.configureScope((scope) => {
scope.setUser({
id: this.user.id,
email: this.user.email,
subscription: this.user?.is_subscribed
})
})
},
2023-12-09 14:47:03 +00:00
2023-12-14 15:53:05 +00:00
async logout() {
2023-12-09 14:47:03 +00:00
try {
await axios.post('/api/logout')
2023-12-14 15:53:05 +00:00
} catch (e) {
}
2023-12-09 14:47:03 +00:00
this.user = null
2023-12-14 15:53:05 +00:00
this.setToken(null)
2023-12-09 14:47:03 +00:00
},
2023-12-14 15:53:05 +00:00
async fetchOauthUrl(provider) {
const {data} = await axios.post(`/api/oauth/${provider}`)
2023-12-09 14:47:03 +00:00
return data.url
}
}
})