147 lines
4.4 KiB
JavaScript
147 lines
4.4 KiB
JavaScript
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');
|
|
}
|
|
}
|
|
});
|