LiveAtlas/src/App.vue

131 lines
3.7 KiB
Vue
Raw Normal View History

2020-12-16 16:54:41 +00:00
<!--
- Copyright 2020 James Lyne
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-->
2020-11-20 18:43:30 +00:00
<template>
2020-12-01 23:20:38 +00:00
<Map></Map>
2020-11-23 12:13:28 +00:00
<Sidebar></Sidebar>
2021-01-06 16:02:36 +00:00
<ChatBox v-if="chatBoxEnabled" v-show="chatBoxEnabled && chatVisible"></ChatBox>
2020-11-20 18:43:30 +00:00
</template>
2020-11-20 21:47:56 +00:00
<script lang="ts">
2020-12-31 13:05:54 +00:00
import {computed, defineComponent, onBeforeUnmount, onMounted, onUnmounted, ref, watch} from 'vue';
2020-12-01 23:20:38 +00:00
import Map from './components/Map.vue';
2020-11-23 12:13:28 +00:00
import Sidebar from './components/Sidebar.vue';
2021-01-06 16:02:36 +00:00
import ChatBox from './components/ChatBox.vue';
2020-11-23 16:16:26 +00:00
import {useStore} from "./store";
import {ActionTypes} from "@/store/action-types";
2021-01-26 20:37:29 +00:00
import {parseUrl} from '@/util';
import {MutationTypes} from "@/store/mutation-types";
2020-11-23 12:13:28 +00:00
export default defineComponent({
name: 'App',
2020-11-23 12:13:28 +00:00
components: {
2020-12-01 23:20:38 +00:00
Map,
2020-11-23 12:13:28 +00:00
Sidebar,
2021-01-06 16:02:36 +00:00
ChatBox
2020-11-23 12:13:28 +00:00
},
setup() {
const store = useStore(),
2020-11-23 12:13:28 +00:00
updateInterval = computed(() => store.state.configuration.updateInterval),
title = computed(() => store.state.configuration.title),
currentUrl = computed(() => store.getters.url),
2021-01-06 16:02:36 +00:00
chatBoxEnabled = computed(() => store.state.components.chatBox),
2020-12-31 13:05:54 +00:00
chatVisible = computed(() => store.state.ui.visibleElements.has('chat')),
2020-11-23 12:13:28 +00:00
updatesEnabled = ref(false),
updateTimeout = ref(0),
2020-12-16 22:40:44 +00:00
configAttempts = ref(0),
loadConfiguration = () => {
store.dispatch(ActionTypes.LOAD_CONFIGURATION, undefined).then(() => {
startUpdates();
window.hideSplash();
2020-12-16 22:40:44 +00:00
}).catch(e => {
console.error('Failed to load server configuration: ', e);
window.showSplashError(++configAttempts.value);
setTimeout(() => loadConfiguration(), 1000);
});
},
startUpdates = () => {
updatesEnabled.value = true;
update();
},
update = () => {
//TODO: Error notification for repeated failures?
store.dispatch(ActionTypes.GET_UPDATE, undefined).finally(() => {
if(updatesEnabled.value) {
updateTimeout.value = setTimeout(() => update(), updateInterval.value);
}
});
},
stopUpdates = () => {
updatesEnabled.value = false;
if (updateTimeout.value) {
clearTimeout(updateTimeout.value);
2020-11-23 12:13:28 +00:00
}
updateTimeout.value = 0;
},
2021-01-26 20:37:29 +00:00
handleUrl = () => {
const parsedUrl = parseUrl();
if(parsedUrl) {
2020-12-21 18:46:01 +00:00
//Remove legacy url if one was parsed
if(parsedUrl.legacy) {
const url = new URL(window.location.href);
url.searchParams.delete('worldname');
url.searchParams.delete('mapname');
url.searchParams.delete('x');
url.searchParams.delete('y');
url.searchParams.delete('z');
url.searchParams.delete('zoom');
history.replaceState({}, '', url.toString());
}
store.commit(MutationTypes.SET_PARSED_URL, parsedUrl);
}
2020-12-31 13:05:54 +00:00
},
onResize = () => {
store.commit(MutationTypes.SET_SMALL_SCREEN, window.innerWidth < 480 || window.innerHeight < 500);
};
2020-11-23 12:13:28 +00:00
watch(title, (title) => document.title = title);
watch(currentUrl, (url) => window.history.replaceState({}, '', url));
2020-11-23 12:13:28 +00:00
onMounted(() => loadConfiguration());
onBeforeUnmount(() => stopUpdates());
2021-01-26 20:37:29 +00:00
handleUrl();
2020-12-31 13:05:54 +00:00
onResize();
onMounted(() => window.addEventListener('resize', onResize));
onUnmounted(() => window.addEventListener('resize', onResize));
2020-12-17 14:50:12 +00:00
return {
2021-01-06 16:02:36 +00:00
chatBoxEnabled,
2020-12-31 13:05:54 +00:00
chatVisible,
2020-12-17 14:50:12 +00:00
}
},
2020-11-23 12:13:28 +00:00
});
2020-11-20 18:43:30 +00:00
</script>