Refactor server configuration loading

- Move store cleanup to single RESET mutation
- Move showSplash, RESET and STOP_UPDATES calls into loadConfiguration
This commit is contained in:
James Lyne 2021-08-30 22:08:51 +01:00
parent 50c7018441
commit dc0a03daa8
4 changed files with 53 additions and 53 deletions

View File

@ -49,10 +49,18 @@ export default defineComponent({
configurationHash = computed(() => store.state.configurationHash), configurationHash = computed(() => store.state.configurationHash),
chatBoxEnabled = computed(() => store.state.components.chatBox), chatBoxEnabled = computed(() => store.state.components.chatBox),
chatVisible = computed(() => store.state.ui.visibleElements.has('chat')), chatVisible = computed(() => store.state.ui.visibleElements.has('chat')),
configAttempts = ref(0), loggedIn = computed(() => store.state.loggedIn),
loading = ref(false),
loadingAttempts = ref(0),
loadConfiguration = async () => { loadConfiguration = async () => {
try { try {
showSplash();
loading.value = true;
await store.dispatch(ActionTypes.STOP_UPDATES, undefined);
store.commit(MutationTypes.RESET, undefined);
await store.dispatch(ActionTypes.LOAD_CONFIGURATION, undefined); await store.dispatch(ActionTypes.LOAD_CONFIGURATION, undefined);
await store.dispatch(ActionTypes.START_UPDATES, undefined); await store.dispatch(ActionTypes.START_UPDATES, undefined);
@ -65,7 +73,7 @@ export default defineComponent({
(map as HTMLElement).focus(); (map as HTMLElement).focus();
} }
}); });
} catch(e) { } catch(e: any) {
//Request was aborted, probably because another server was selected before the request finished. Don't retry //Request was aborted, probably because another server was selected before the request finished. Don't retry
if(e instanceof DOMException && e.name === 'AbortError') { if(e instanceof DOMException && e.name === 'AbortError') {
return; return;
@ -73,8 +81,10 @@ export default defineComponent({
const error = `Failed to load server configuration for '${store.state.currentServer!.id}'`; const error = `Failed to load server configuration for '${store.state.currentServer!.id}'`;
console.error(`${error}:`, e); console.error(`${error}:`, e);
showSplashError(`${error}\n${e}`, false, ++configAttempts.value); showSplashError(`${error}\n${e}`, false, ++loadingAttempts.value);
setTimeout(() => loadConfiguration(), 1000); setTimeout(() => loadConfiguration(), 1000);
} finally {
loading.value = false;
} }
}, },
@ -141,28 +151,15 @@ export default defineComponent({
watch(title, (title) => document.title = title); watch(title, (title) => document.title = title);
watch(currentUrl, (url) => window.history.replaceState({}, '', url)); watch(currentUrl, (url) => window.history.replaceState({}, '', url));
watch(currentServer, (newServer?: LiveAtlasServerDefinition) => { watch(currentServer, (newServer?: LiveAtlasServerDefinition) => {
showSplash();
if(!newServer) { if(!newServer) {
return; return;
} }
//Cleanup
store.commit(MutationTypes.CLEAR_PLAYERS, undefined);
store.commit(MutationTypes.SET_MAX_PLAYERS, 0);
store.commit(MutationTypes.CLEAR_CURRENT_MAP, undefined);
store.commit(MutationTypes.CLEAR_PARSED_URL, undefined);
store.commit(MutationTypes.CLEAR_WORLDS, undefined);
store.commit(MutationTypes.CLEAR_MARKER_SETS, undefined);
window.history.replaceState({}, '', newServer.id); window.history.replaceState({}, '', newServer.id);
loadConfiguration(); loadConfiguration();
}, {deep: true}); }, {deep: true});
watch(configurationHash, async (newHash, oldHash) => { watch(configurationHash, async (newHash, oldHash) => {
if(newHash && oldHash) { if(newHash && oldHash) {
showSplash();
store.commit(MutationTypes.CLEAR_PARSED_URL, undefined);
await store.dispatch(ActionTypes.STOP_UPDATES, undefined);
await loadConfiguration(); await loadConfiguration();
} }
}); });

View File

@ -148,10 +148,6 @@ export const actions: ActionTree<State, State> & Actions = {
}, },
async [ActionTypes.STOP_UPDATES]({state}) { async [ActionTypes.STOP_UPDATES]({state}) {
if(!state.currentWorld) {
return Promise.reject("No current world");
}
state.currentMapProvider!.stopUpdates(); state.currentMapProvider!.stopUpdates();
}, },

View File

@ -22,10 +22,8 @@ export enum MutationTypes {
CLEAR_SERVER_CONFIGURATION_HASH = 'clearServerConfigurationHash', CLEAR_SERVER_CONFIGURATION_HASH = 'clearServerConfigurationHash',
SET_SERVER_MESSAGES = 'setServerMessages', SET_SERVER_MESSAGES = 'setServerMessages',
SET_WORLDS = 'setWorlds', SET_WORLDS = 'setWorlds',
CLEAR_WORLDS = 'clearWorlds',
SET_COMPONENTS = 'setComponents', SET_COMPONENTS = 'setComponents',
SET_MARKER_SETS = 'setMarkerSets', SET_MARKER_SETS = 'setMarkerSets',
CLEAR_MARKER_SETS = 'clearMarkerSets',
ADD_WORLD = 'addWorld', ADD_WORLD = 'addWorld',
SET_WORLD_STATE = 'setWorldState', SET_WORLD_STATE = 'setWorldState',
ADD_MARKER_SET_UPDATES = 'addMarkerSetUpdates', ADD_MARKER_SET_UPDATES = 'addMarkerSetUpdates',
@ -47,7 +45,6 @@ export enum MutationTypes {
SET_CURRENT_ZOOM = 'setCurrentZoom', SET_CURRENT_ZOOM = 'setCurrentZoom',
SET_PARSED_URL = 'setParsedUrl', SET_PARSED_URL = 'setParsedUrl',
CLEAR_PARSED_URL = 'clearParsedUrl', CLEAR_PARSED_URL = 'clearParsedUrl',
CLEAR_CURRENT_MAP = 'clearCurrentMap',
SET_FOLLOW_TARGET = 'setFollowTarget', SET_FOLLOW_TARGET = 'setFollowTarget',
SET_PAN_TARGET = 'setPanTarget', SET_PAN_TARGET = 'setPanTarget',
@ -63,4 +60,5 @@ export enum MutationTypes {
SET_SIDEBAR_SECTION_COLLAPSED_STATE = 'setSidebarSectionCollapsedState', SET_SIDEBAR_SECTION_COLLAPSED_STATE = 'setSidebarSectionCollapsedState',
SET_LOGGED_IN = 'setLoggedIn', SET_LOGGED_IN = 'setLoggedIn',
RESET = 'reset'
} }

View File

@ -56,10 +56,8 @@ export type Mutations<S = State> = {
[MutationTypes.CLEAR_SERVER_CONFIGURATION_HASH](state: S): void [MutationTypes.CLEAR_SERVER_CONFIGURATION_HASH](state: S): void
[MutationTypes.SET_SERVER_MESSAGES](state: S, messages: LiveAtlasServerMessageConfig): void [MutationTypes.SET_SERVER_MESSAGES](state: S, messages: LiveAtlasServerMessageConfig): void
[MutationTypes.SET_WORLDS](state: S, worlds: Array<LiveAtlasWorldDefinition>): void [MutationTypes.SET_WORLDS](state: S, worlds: Array<LiveAtlasWorldDefinition>): void
[MutationTypes.CLEAR_WORLDS](state: S): void
[MutationTypes.SET_COMPONENTS](state: S, components: LiveAtlasPartialComponentConfig | LiveAtlasComponentConfig): void [MutationTypes.SET_COMPONENTS](state: S, components: LiveAtlasPartialComponentConfig | LiveAtlasComponentConfig): void
[MutationTypes.SET_MARKER_SETS](state: S, worlds: Map<string, LiveAtlasMarkerSet>): void [MutationTypes.SET_MARKER_SETS](state: S, worlds: Map<string, LiveAtlasMarkerSet>): void
[MutationTypes.CLEAR_MARKER_SETS](state: S): void
[MutationTypes.ADD_WORLD](state: S, world: LiveAtlasWorldDefinition): void [MutationTypes.ADD_WORLD](state: S, world: LiveAtlasWorldDefinition): void
[MutationTypes.SET_WORLD_STATE](state: S, worldState: LiveAtlasWorldState): void [MutationTypes.SET_WORLD_STATE](state: S, worldState: LiveAtlasWorldState): void
[MutationTypes.ADD_MARKER_SET_UPDATES](state: S, updates: Map<string, DynmapMarkerSetUpdates>): void [MutationTypes.ADD_MARKER_SET_UPDATES](state: S, updates: Map<string, DynmapMarkerSetUpdates>): void
@ -82,7 +80,6 @@ export type Mutations<S = State> = {
[MutationTypes.SET_CURRENT_ZOOM](state: S, payload: number): void [MutationTypes.SET_CURRENT_ZOOM](state: S, payload: number): void
[MutationTypes.SET_PARSED_URL](state: S, payload: LiveAtlasParsedUrl): void [MutationTypes.SET_PARSED_URL](state: S, payload: LiveAtlasParsedUrl): void
[MutationTypes.CLEAR_PARSED_URL](state: S): void [MutationTypes.CLEAR_PARSED_URL](state: S): void
[MutationTypes.CLEAR_CURRENT_MAP](state: S): void
[MutationTypes.SET_FOLLOW_TARGET](state: S, payload: LiveAtlasPlayer): void [MutationTypes.SET_FOLLOW_TARGET](state: S, payload: LiveAtlasPlayer): void
[MutationTypes.SET_PAN_TARGET](state: S, payload: LiveAtlasPlayer): void [MutationTypes.SET_PAN_TARGET](state: S, payload: LiveAtlasPlayer): void
[MutationTypes.CLEAR_FOLLOW_TARGET](state: S, a?: void): void [MutationTypes.CLEAR_FOLLOW_TARGET](state: S, a?: void): void
@ -96,6 +93,7 @@ export type Mutations<S = State> = {
[MutationTypes.SET_SIDEBAR_SECTION_COLLAPSED_STATE](state: S, payload: {section: LiveAtlasSidebarSection, state: boolean}): void [MutationTypes.SET_SIDEBAR_SECTION_COLLAPSED_STATE](state: S, payload: {section: LiveAtlasSidebarSection, state: boolean}): void
[MutationTypes.SET_LOGGED_IN](state: S, payload: boolean): void [MutationTypes.SET_LOGGED_IN](state: S, payload: boolean): void
[MutationTypes.RESET](state: S): void
} }
export const mutations: MutationTree<State> & Mutations = { export const mutations: MutationTree<State> & Mutations = {
@ -211,18 +209,6 @@ export const mutations: MutationTree<State> & Mutations = {
} }
}, },
[MutationTypes.CLEAR_WORLDS](state: State) {
state.worlds.clear();
state.maps.clear();
state.followTarget = undefined;
state.panTarget = undefined;
state.currentWorldState.timeOfDay = 0;
state.currentWorldState.raining = false;
state.currentWorldState.thundering = false;
},
//Updates the state of optional components (chat, link button, etc) //Updates the state of optional components (chat, link button, etc)
//Can be called with a LiveAtlasComponentConfig object to replace the whole state //Can be called with a LiveAtlasComponentConfig object to replace the whole state
//or a LiveAtlasPartialComponentConfig object for partial updates to the existing state //or a LiveAtlasPartialComponentConfig object for partial updates to the existing state
@ -246,11 +232,6 @@ export const mutations: MutationTree<State> & Mutations = {
} }
}, },
[MutationTypes.CLEAR_MARKER_SETS](state: State) {
state.markerSets.clear();
state.pendingSetUpdates.clear();
},
[MutationTypes.ADD_WORLD](state: State, world: LiveAtlasWorldDefinition) { [MutationTypes.ADD_WORLD](state: State, world: LiveAtlasWorldDefinition) {
state.worlds.set(world.name, world); state.worlds.set(world.name, world);
}, },
@ -549,16 +530,6 @@ export const mutations: MutationTree<State> & Mutations = {
state.parsedUrl = payload; state.parsedUrl = payload;
}, },
//Clear the current map/world
[MutationTypes.CLEAR_CURRENT_MAP](state: State) {
state.markerSets.clear();
state.pendingSetUpdates.clear();
state.pendingTileUpdates = [];
state.currentWorld = undefined;
state.currentMap = undefined;
},
//Clear any existing parsed url //Clear any existing parsed url
[MutationTypes.CLEAR_PARSED_URL](state: State) { [MutationTypes.CLEAR_PARSED_URL](state: State) {
state.parsedUrl = undefined; state.parsedUrl = undefined;
@ -633,5 +604,43 @@ export const mutations: MutationTree<State> & Mutations = {
[MutationTypes.SET_LOGGED_IN](state: State, payload: boolean): void { [MutationTypes.SET_LOGGED_IN](state: State, payload: boolean): void {
state.loggedIn = payload; state.loggedIn = payload;
},
//Cleanup for switching servers or reloading the configuration
[MutationTypes.RESET](state: State): void {
state.maxPlayers = 0;
state.parsedUrl = undefined;
state.currentWorld = undefined;
state.currentMap = undefined;
state.markerSets.clear();
state.pendingSetUpdates.clear();
state.pendingTileUpdates = [];
state.worlds.clear();
state.maps.clear();
state.currentZoom = 0;
state.currentLocation = {x: 0, y: 0, z: 0};
state.followTarget = undefined;
state.panTarget = undefined;
state.currentWorldState.timeOfDay = 0;
state.currentWorldState.raining = false;
state.currentWorldState.thundering = false;
state.configuration.title = '';
state.components.markers.showLabels= false;
state.components.playerMarkers = undefined;
state.components.coordinatesControl = undefined;
state.components.clockControl = undefined;
state.components.linkControl = false;
state.components.layerControl = false;
state.components.logoControls = [];
state.components.chatSending = undefined;
state.components.chatBox = undefined;
state.components.chatBalloons = false;
state.components.login = false;
} }
} }