Cleanup storage code

This allows us to use either session or local storage, for issue #120.
This commit is contained in:
N-Pex 2021-05-10 11:13:22 +02:00
parent af04dd39f7
commit 0ac3cefb03
9 changed files with 144 additions and 89 deletions

View file

@ -2,31 +2,119 @@ import Vue from 'vue'
import Vuex from 'vuex'
import VuexPersist from 'vuex-persist'
import { auth } from './auth.module';
Vue.use(Vuex)
const vuexPersist = new VuexPersist({
// A Vuex plugin to persist the user object to either session or local storage, based on flag in the store state.
//
const persistUserPlugin = store => {
var user;
if (store.state.useLocalStorage) {
user = JSON.parse(window.localStorage.getItem('user'));
} else {
user = JSON.parse(window.sessionStorage.getItem('user'));
}
const initialState = user ? { status: { loggedIn: true }, user } : { status: { loggedIn: false }, user: null };
store.state.auth = initialState;
store.subscribe((mutation, state) => {
if (mutation.type == 'setUser' || mutation.type == 'setUseLocalStorage') {
if (state.useLocalStorage) {
window.localStorage.setItem('user', JSON.stringify(state.auth.user));
window.sessionStorage.removeItem('user');
} else {
window.sessionStorage.setItem('user', JSON.stringify(state.auth.user));
window.localStorage.removeItem('user');
}
}
})
}
const vuexPersistLocalStorage = new VuexPersist({
key: 'settings',
storage: localStorage,
reducer: state => ({
currentRoomId: state.currentRoomId
})
})
reducer: state => {
if (state.useLocalStorage) {
return {
currentRoomId: state.currentRoomId,
};
} else {
return {};
}
}
})
const vuexPersistSessionStorage = new VuexPersist({
key: 'settings',
storage: sessionStorage,
reducer: state => {
if (!state.useLocalStorage) {
return {
currentRoomId: state.currentRoomId,
};
} else {
return {};
}
}
})
const defaultUseSessionStorage = (sessionStorage.getItem('user') != null);
export default new Vuex.Store({
state: {
currentRoomId: null
},
state: { currentRoomId: null, auth: null, tempuser: null, useLocalStorage: !defaultUseSessionStorage },
mutations: {
loginSuccess(state, user) {
state.auth.status.loggedIn = true;
state.auth.user = user;
},
loginFailure(state) {
state.auth.status.loggedIn = false;
state.auth.user = null;
},
logout(state) {
state.auth.status.loggedIn = false;
state.auth.user = null;
},
setCurrentRoomId(state, roomId) {
state.currentRoomId = roomId;
},
setUser(state, user) {
state.auth.user = JSON.stringify(user);
},
setTempUser(state, user) {
state.tempuser = JSON.stringify(user);
},
setUseLocalStorage(state, useLocalStorage) {
state.useLocalStorage = useLocalStorage;
}
},
actions: {
login({ commit }, user) {
return this._vm.$matrix.login(user).then(
user => {
commit('loginSuccess', user);
return Promise.resolve(user);
},
error => {
commit('loginFailure');
return Promise.reject(error);
}
);
},
logout({ commit }) {
this._vm.$matrix.logout();
commit('logout');
},
},
modules: {
auth
getters: {
storage: state => {
if (state.useLocalStorage) {
return window.localStorage;
} else {
return window.sessionStorage;
}
}
},
plugins: [vuexPersist.plugin]
plugins: [vuexPersistLocalStorage.plugin, vuexPersistSessionStorage.plugin, persistUserPlugin]
})