import { defineStore } from 'pinia'; import { api, jApi } from 'boot/axios'; import { i18n } from 'src/boot/i18n'; import useNotify from 'src/composables/useNotify.js'; import { useAppStore } from 'src/stores/app.js'; const { t } = i18n.global; const { notify } = useNotify(); export const useUserStore = defineStore('user', { state: () => { const token = sessionStorage.getItem('vnToken') || localStorage.getItem('vnToken'); return { token, isGuest: false, user: null, supplantedUser: null, localeOptions: [ { label: t('langs.en'), lang: 'en-US', value: 'en' }, { label: t('langs.es'), lang: 'es-ES', value: 'es' }, { label: t('langs.ca'), lang: 'ca-ES', value: 'ca' }, { label: t('langs.fr'), lang: 'fr-FR', value: 'fr' }, { label: t('langs.pt'), lang: 'pt-PT', value: 'pt' } ] }; }, getters: { loggedIn: state => state.token != null, userLocaleOption: state => state.localeOptions?.find(l => l.value === state?.user?.lang) }, actions: { async init() { this.isGuest = localStorage.getItem('hederaGuest') || false; const autoLoginStatus = await this.tryAutoLogin(); if (!autoLoginStatus) { this.router.push({ name: 'login' }); } await this.fetchUser(); await this.supplantInit(); this.updateSiteLocale(); }, async getToken() { this.token = sessionStorage.getItem('vnToken') || localStorage.getItem('vnToken'); }, async tryAutoLogin() { const guest = localStorage.getItem('hederaGuest'); if (this.isGuest || guest) { localStorage.setItem('hederaGuest', true); return true; } if (!this.token) this.getToken(); if (this.token) return true; return false; }, async login(user, password, remember) { const params = { user, password }; const res = await api.post('Accounts/login', params); if (remember) { localStorage.setItem('vnToken', res.data.token); } else { sessionStorage.setItem('vnToken', res.data.token); } this.$patch({ token: res.data.token, name: user }); }, async logout() { if (this.token != null) { try { await api.post('Accounts/logout'); } catch (e) {} localStorage.removeItem('vnToken'); sessionStorage.removeItem('vnToken'); } this.$reset(); localStorage.removeItem('hederaGuest'); useAppStore().onLogout(); }, async fetchUser(userType = 'user') { try { const userData = await jApi.getObject( 'SELECT id, nickname, name, lang FROM account.myUser' ); this.$patch({ [userType]: userData }); } catch (error) { console.error('Error fetching user: ', error); } }, async supplantUser(supplantUser) { const json = await jApi.send('client/supplant', { supplantUser }); this.token = json; sessionStorage.setItem('supplantUser', supplantUser); await this.fetchUser('supplantedUser'); }, async supplantInit() { const user = sessionStorage.getItem('supplantUser'); if (user == null) return; await this.supplantUser(user); }, async logoutSupplantedUser() { sessionStorage.removeItem('supplantUser'); this.supplantedUser = null; await api.post('Accounts/logout'); this.getToken(); await this.fetchUser(); }, updateSiteLocale(locale = null) { i18n.global.locale.value = locale || this.userLocaleOption.lang || 'en-US'; }, async updateUserLang(lang) { if (!this.user || this.user.lang === lang) return; this.user.lang = lang; this.updateSiteLocale(); notify(t('dataSaved'), 'positive'); } } });