flaschengeist-frontend/src/plugins/user/store/user.ts

181 lines
4.4 KiB
TypeScript
Raw Normal View History

2020-10-16 06:45:40 +00:00
import { Module, MutationTree, ActionTree, GetterTree } from 'vuex';
2020-10-15 09:23:41 +00:00
import { StateInterface } from 'src/store';
import { axios } from 'boot/axios';
2020-10-16 06:45:40 +00:00
import { LoginData } from 'src/plugins/user/models';
import { AxiosResponse } from 'axios';
import { LocalStorage, Loading } from 'quasar';
2020-10-16 06:45:40 +00:00
import { Router } from 'src/router';
2020-10-15 09:23:41 +00:00
2020-10-16 06:45:40 +00:00
export interface UserStateInterface extends LoginResponse {
updateUserLoading: boolean;
getUserLoading: boolean;
2020-10-16 06:45:40 +00:00
}
export interface LoginResponse {
2020-10-21 15:39:04 +00:00
user: FG.User;
session: FG.Session;
2020-10-15 09:23:41 +00:00
}
const empty_session: FG.Session = {
2020-10-30 08:57:39 +00:00
browser: '',
expires: new Date(),
lifetime: -1,
platform: '',
token: ''
};
const empty_user: FG.User = {
2020-10-30 08:57:39 +00:00
display_name: '',
firstname: '',
lastname: '',
mail: '',
roles: [],
userid: ''
};
const state: UserStateInterface = {
user: empty_user,
session: empty_session,
updateUserLoading: false,
getUserLoading: false
2020-10-15 09:23:41 +00:00
};
2020-10-16 06:45:40 +00:00
const mutations: MutationTree<UserStateInterface> = {
2020-10-27 12:49:45 +00:00
setUser(state, data: FG.User) {
state.user = data;
2020-10-16 06:45:40 +00:00
},
2020-10-27 12:49:45 +00:00
setSession(state, data: FG.Session) {
state.session = data;
2020-10-16 06:45:40 +00:00
},
setLoading(
state,
data: { key: 'updateUserLoading' | 'getUserLoading'; data: boolean }
) {
state[data.key] = data.data;
2020-10-16 06:45:40 +00:00
},
2020-10-27 12:49:45 +00:00
showState(state) {
2020-10-16 06:45:40 +00:00
console.log(state);
2020-10-15 09:23:41 +00:00
}
};
const actions: ActionTree<UserStateInterface, StateInterface> = {
2020-10-27 12:49:45 +00:00
login({ commit }, data: LoginData) {
Loading.show({
message: 'Du wirst eingeloggt'
});
2020-10-16 06:45:40 +00:00
void axios
.post('/auth', data)
2020-10-16 06:45:40 +00:00
.then((response: AxiosResponse<LoginResponse>) => {
response.data.session.expires = new Date(response.data.session.expires);
commit('setUser', response.data.user);
commit('setSession', response.data.session);
2020-10-16 06:45:40 +00:00
commit('showState');
LocalStorage.set('user', response.data.user);
LocalStorage.set('session', response.data.session);
2020-10-16 06:45:40 +00:00
void Router.push({ name: 'user-main' });
2020-10-16 06:45:40 +00:00
})
.catch(error => {
console.exception(error);
})
.finally(() => {
Loading.hide();
2020-10-16 06:45:40 +00:00
});
},
2020-10-30 08:57:39 +00:00
doLogout({ commit }, token: string) {
Loading.show({ message: 'Du wirst ausgeloggt' });
void axios
.delete(`/auth/${token}`)
.then(() => {
commit('setUser', empty_user);
commit('setSession', empty_session);
})
.finally(() => {
LocalStorage.remove('user');
LocalStorage.remove('session');
Loading.hide();
});
},
2020-10-30 08:57:39 +00:00
logout({ dispatch }, token: string) {
dispatch('doLogout', token).finally(() => {
void Router.push({ name: 'login' });
});
},
getUser({ commit, state }) {
commit('setLoading', { key: 'getUserLoading', data: true });
axios
.get(`/users/${state.user.userid}`)
.then((response: AxiosResponse<FG.User>) => {
commit('setUser', response.data);
LocalStorage.set('user', response.data);
})
.catch(err => {
console.warn(err);
})
.finally(() => {
commit('setLoading', { key: 'getUserLoading', data: false });
});
},
updateUser({ commit, state, dispatch }, data) {
commit('setLoading', { key: 'updateUserLoading', data: true });
2020-10-27 12:49:45 +00:00
axios
.put(`/users/${state.user.userid}`, data)
.then(() => {
void dispatch('getUser');
})
2020-10-27 12:49:45 +00:00
.catch(error => {
console.log(error);
})
.finally(() => {
commit('setLoading', { key: 'updateUserLoading', data: false });
2020-10-27 12:49:45 +00:00
});
},
2020-10-27 12:49:45 +00:00
loadFromLocalStorage({ commit }) {
let data = LocalStorage.getItem('user');
2020-10-30 08:57:39 +00:00
commit('setUser', data ? data : empty_user);
data = LocalStorage.getItem('session');
2020-10-30 08:57:39 +00:00
commit('setSession', data ? data : empty_session);
commit('showState');
},
setSession({ commit }, session: FG.Session) {
if (session) {
commit('setSession', session);
LocalStorage.set('session', session);
} else {
commit('setSession', empty_session);
LocalStorage.remove('session');
}
2020-10-16 06:45:40 +00:00
}
};
const getters: GetterTree<UserStateInterface, StateInterface> = {
2020-10-27 12:49:45 +00:00
user({ user }) {
return user;
2020-10-16 06:45:40 +00:00
},
2020-10-27 12:49:45 +00:00
displayName({ user }) {
2020-10-20 17:24:37 +00:00
return user.display_name;
},
2020-10-27 12:49:45 +00:00
session({ session }) {
return session;
2020-10-16 06:45:40 +00:00
},
loading({ updateUserLoading, getUserLoading }) {
return updateUserLoading || getUserLoading;
2020-10-15 09:23:41 +00:00
}
};
2020-10-16 06:45:40 +00:00
const userStore: Module<UserStateInterface, StateInterface> = {
namespaced: true,
actions,
getters,
mutations,
state
};
export default userStore;