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:
parent
50c7018441
commit
dc0a03daa8
29
src/App.vue
29
src/App.vue
@ -49,10 +49,18 @@ export default defineComponent({
|
||||
configurationHash = computed(() => store.state.configurationHash),
|
||||
chatBoxEnabled = computed(() => store.state.components.chatBox),
|
||||
chatVisible = computed(() => store.state.ui.visibleElements.has('chat')),
|
||||
configAttempts = ref(0),
|
||||
loggedIn = computed(() => store.state.loggedIn),
|
||||
|
||||
loading = ref(false),
|
||||
loadingAttempts = ref(0),
|
||||
|
||||
loadConfiguration = async () => {
|
||||
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.START_UPDATES, undefined);
|
||||
|
||||
@ -65,7 +73,7 @@ export default defineComponent({
|
||||
(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
|
||||
if(e instanceof DOMException && e.name === 'AbortError') {
|
||||
return;
|
||||
@ -73,8 +81,10 @@ export default defineComponent({
|
||||
|
||||
const error = `Failed to load server configuration for '${store.state.currentServer!.id}'`;
|
||||
console.error(`${error}:`, e);
|
||||
showSplashError(`${error}\n${e}`, false, ++configAttempts.value);
|
||||
showSplashError(`${error}\n${e}`, false, ++loadingAttempts.value);
|
||||
setTimeout(() => loadConfiguration(), 1000);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
},
|
||||
|
||||
@ -141,28 +151,15 @@ export default defineComponent({
|
||||
watch(title, (title) => document.title = title);
|
||||
watch(currentUrl, (url) => window.history.replaceState({}, '', url));
|
||||
watch(currentServer, (newServer?: LiveAtlasServerDefinition) => {
|
||||
showSplash();
|
||||
|
||||
if(!newServer) {
|
||||
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);
|
||||
loadConfiguration();
|
||||
}, {deep: true});
|
||||
watch(configurationHash, async (newHash, oldHash) => {
|
||||
if(newHash && oldHash) {
|
||||
showSplash();
|
||||
store.commit(MutationTypes.CLEAR_PARSED_URL, undefined);
|
||||
await store.dispatch(ActionTypes.STOP_UPDATES, undefined);
|
||||
await loadConfiguration();
|
||||
}
|
||||
});
|
||||
|
@ -148,10 +148,6 @@ export const actions: ActionTree<State, State> & Actions = {
|
||||
},
|
||||
|
||||
async [ActionTypes.STOP_UPDATES]({state}) {
|
||||
if(!state.currentWorld) {
|
||||
return Promise.reject("No current world");
|
||||
}
|
||||
|
||||
state.currentMapProvider!.stopUpdates();
|
||||
},
|
||||
|
||||
|
@ -22,10 +22,8 @@ export enum MutationTypes {
|
||||
CLEAR_SERVER_CONFIGURATION_HASH = 'clearServerConfigurationHash',
|
||||
SET_SERVER_MESSAGES = 'setServerMessages',
|
||||
SET_WORLDS = 'setWorlds',
|
||||
CLEAR_WORLDS = 'clearWorlds',
|
||||
SET_COMPONENTS = 'setComponents',
|
||||
SET_MARKER_SETS = 'setMarkerSets',
|
||||
CLEAR_MARKER_SETS = 'clearMarkerSets',
|
||||
ADD_WORLD = 'addWorld',
|
||||
SET_WORLD_STATE = 'setWorldState',
|
||||
ADD_MARKER_SET_UPDATES = 'addMarkerSetUpdates',
|
||||
@ -47,7 +45,6 @@ export enum MutationTypes {
|
||||
SET_CURRENT_ZOOM = 'setCurrentZoom',
|
||||
SET_PARSED_URL = 'setParsedUrl',
|
||||
CLEAR_PARSED_URL = 'clearParsedUrl',
|
||||
CLEAR_CURRENT_MAP = 'clearCurrentMap',
|
||||
|
||||
SET_FOLLOW_TARGET = 'setFollowTarget',
|
||||
SET_PAN_TARGET = 'setPanTarget',
|
||||
@ -63,4 +60,5 @@ export enum MutationTypes {
|
||||
SET_SIDEBAR_SECTION_COLLAPSED_STATE = 'setSidebarSectionCollapsedState',
|
||||
|
||||
SET_LOGGED_IN = 'setLoggedIn',
|
||||
RESET = 'reset'
|
||||
}
|
||||
|
@ -56,10 +56,8 @@ export type Mutations<S = State> = {
|
||||
[MutationTypes.CLEAR_SERVER_CONFIGURATION_HASH](state: S): void
|
||||
[MutationTypes.SET_SERVER_MESSAGES](state: S, messages: LiveAtlasServerMessageConfig): 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_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.SET_WORLD_STATE](state: S, worldState: LiveAtlasWorldState): 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_PARSED_URL](state: S, payload: LiveAtlasParsedUrl): 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_PAN_TARGET](state: S, payload: LiveAtlasPlayer): 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_LOGGED_IN](state: S, payload: boolean): void
|
||||
[MutationTypes.RESET](state: S): void
|
||||
}
|
||||
|
||||
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)
|
||||
//Can be called with a LiveAtlasComponentConfig object to replace the whole 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) {
|
||||
state.worlds.set(world.name, world);
|
||||
},
|
||||
@ -549,16 +530,6 @@ export const mutations: MutationTree<State> & Mutations = {
|
||||
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
|
||||
[MutationTypes.CLEAR_PARSED_URL](state: State) {
|
||||
state.parsedUrl = undefined;
|
||||
@ -633,5 +604,43 @@ export const mutations: MutationTree<State> & Mutations = {
|
||||
|
||||
[MutationTypes.SET_LOGGED_IN](state: State, payload: boolean): void {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user