|
@@ -1,321 +1,308 @@
|
|
|
-<template>
|
|
|
- <div class="upper-container">
|
|
|
- <banned v-if="banned" />
|
|
|
- <div v-else class="upper-container">
|
|
|
- <router-view
|
|
|
- :key="$route.fullPath"
|
|
|
- class="main-container"
|
|
|
- :class="{ 'main-container-modal-active': aModalIsOpen2 }"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <falling-snow v-if="christmas" />
|
|
|
- <modal-manager />
|
|
|
- <long-jobs />
|
|
|
- </div>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script>
|
|
|
-import { mapState, mapActions, mapGetters } from "vuex";
|
|
|
+<script setup lang="ts">
|
|
|
+import { useStore } from "vuex";
|
|
|
+import { useRoute, useRouter } from "vue-router";
|
|
|
+import { defineAsyncComponent, ref, computed, watch, onMounted } from "vue";
|
|
|
import Toast from "toasters";
|
|
|
-import { defineAsyncComponent } from "vue";
|
|
|
-
|
|
|
-import ws from "./ws";
|
|
|
-import aw from "./aw";
|
|
|
-import keyboardShortcuts from "./keyboardShortcuts";
|
|
|
-
|
|
|
-export default {
|
|
|
- components: {
|
|
|
- ModalManager: defineAsyncComponent(() =>
|
|
|
- import("@/components/ModalManager.vue")
|
|
|
- ),
|
|
|
- LongJobs: defineAsyncComponent(() =>
|
|
|
- import("@/components/LongJobs.vue")
|
|
|
- ),
|
|
|
- Banned: defineAsyncComponent(() => import("@/pages/Banned.vue")),
|
|
|
- FallingSnow: defineAsyncComponent(() =>
|
|
|
- import("@/components/FallingSnow.vue")
|
|
|
- )
|
|
|
- },
|
|
|
- replace: false,
|
|
|
- data() {
|
|
|
- return {
|
|
|
- apiDomain: "",
|
|
|
- socketConnected: true,
|
|
|
- keyIsDown: false,
|
|
|
- scrollPosition: { y: 0, x: 0 },
|
|
|
- aModalIsOpen2: false,
|
|
|
- broadcastChannel: null,
|
|
|
- christmas: false
|
|
|
- };
|
|
|
- },
|
|
|
- computed: {
|
|
|
- ...mapState({
|
|
|
- loggedIn: state => state.user.auth.loggedIn,
|
|
|
- role: state => state.user.auth.role,
|
|
|
- username: state => state.user.auth.username,
|
|
|
- userId: state => state.user.auth.userId,
|
|
|
- banned: state => state.user.auth.banned,
|
|
|
- modals: state => state.modalVisibility.modals,
|
|
|
- activeModals: state => state.modalVisibility.activeModals,
|
|
|
- nightmode: state => state.user.preferences.nightmode,
|
|
|
- activityWatch: state => state.user.preferences.activityWatch
|
|
|
- }),
|
|
|
- ...mapGetters({
|
|
|
- socket: "websockets/getSocket"
|
|
|
- }),
|
|
|
- aModalIsOpen() {
|
|
|
- return Object.keys(this.activeModals).length > 0;
|
|
|
- }
|
|
|
- },
|
|
|
- watch: {
|
|
|
- socketConnected(connected) {
|
|
|
- if (!connected) this.disconnectedMessage.show();
|
|
|
- else this.disconnectedMessage.hide();
|
|
|
- },
|
|
|
- nightmode(nightmode) {
|
|
|
- if (nightmode) this.enableNightmode();
|
|
|
- else this.disableNightmode();
|
|
|
- },
|
|
|
- activityWatch(activityWatch) {
|
|
|
- if (activityWatch) aw.enable();
|
|
|
- else aw.disable();
|
|
|
- },
|
|
|
- aModalIsOpen(aModalIsOpen) {
|
|
|
- if (aModalIsOpen) {
|
|
|
- this.scrollPosition = {
|
|
|
- x: window.scrollX,
|
|
|
- y: window.scrollY
|
|
|
- };
|
|
|
- this.aModalIsOpen2 = true;
|
|
|
- } else {
|
|
|
- this.aModalIsOpen2 = false;
|
|
|
- setTimeout(() => {
|
|
|
- window.scrollTo(
|
|
|
- this.scrollPosition.x,
|
|
|
- this.scrollPosition.y
|
|
|
- );
|
|
|
- }, 10);
|
|
|
+
|
|
|
+import ws from "@/ws";
|
|
|
+import aw from "@/aw";
|
|
|
+import keyboardShortcuts from "@/keyboardShortcuts";
|
|
|
+
|
|
|
+const ModalManager = defineAsyncComponent(
|
|
|
+ () => import("@/components/ModalManager.vue")
|
|
|
+);
|
|
|
+const LongJobs = defineAsyncComponent(
|
|
|
+ () => import("@/components/LongJobs.vue")
|
|
|
+);
|
|
|
+const BannedPage = defineAsyncComponent(() => import("@/pages/Banned.vue"));
|
|
|
+const FallingSnow = defineAsyncComponent(
|
|
|
+ () => import("@/components/FallingSnow.vue")
|
|
|
+);
|
|
|
+
|
|
|
+const store = useStore();
|
|
|
+const route = useRoute();
|
|
|
+const router = useRouter();
|
|
|
+
|
|
|
+const loggedIn = computed(() => store.state.user.auth.loggedIn);
|
|
|
+const banned = computed(() => store.state.user.auth.banned);
|
|
|
+const modals = computed(() => store.state.modalVisibility.modals);
|
|
|
+const activeModals = computed(() => store.state.modalVisibility.activeModals);
|
|
|
+const nightmode = computed(() => store.state.user.preferences.nightmode);
|
|
|
+const activityWatch = computed(
|
|
|
+ () => store.state.user.preferences.activityWatch
|
|
|
+);
|
|
|
+const { socket } = store.state.websockets;
|
|
|
+
|
|
|
+const apiDomain = ref("");
|
|
|
+const socketConnected = ref(true);
|
|
|
+const keyIsDown = ref(false);
|
|
|
+const scrollPosition = ref({ y: 0, x: 0 });
|
|
|
+const aModalIsOpen2 = ref(false);
|
|
|
+const broadcastChannel = ref();
|
|
|
+const christmas = ref(false);
|
|
|
+const disconnectedMessage = ref();
|
|
|
+
|
|
|
+const aModalIsOpen = computed(() => Object.keys(activeModals.value).length > 0);
|
|
|
+
|
|
|
+const openModal = payload =>
|
|
|
+ store.dispatch("modalVisibility/openModal", payload);
|
|
|
+const closeCurrentModal = () =>
|
|
|
+ store.dispatch("modalVisibility/closeCurrentModal");
|
|
|
+const changeNightmode = payload =>
|
|
|
+ store.dispatch("user/preferences/changeNightmode", payload);
|
|
|
+const changeAutoSkipDisliked = payload =>
|
|
|
+ store.dispatch("user/preferences/changeAutoSkipDisliked", payload);
|
|
|
+const changeActivityLogPublic = payload =>
|
|
|
+ store.dispatch("user/preferences/changeActivityLogPublic", payload);
|
|
|
+const changeAnonymousSongRequests = payload =>
|
|
|
+ store.dispatch("user/preferences/changeAnonymousSongRequests", payload);
|
|
|
+const changeActivityWatch = payload =>
|
|
|
+ store.dispatch("user/preferences/changeActivityWatch", payload);
|
|
|
+
|
|
|
+const toggleNightMode = () => {
|
|
|
+ localStorage.setItem("nightmode", !nightmode.value);
|
|
|
+
|
|
|
+ if (loggedIn.value) {
|
|
|
+ socket.dispatch(
|
|
|
+ "users.updatePreferences",
|
|
|
+ { nightmode: !nightmode.value },
|
|
|
+ res => {
|
|
|
+ if (res.status !== "success") new Toast(res.message);
|
|
|
}
|
|
|
- }
|
|
|
- },
|
|
|
- async mounted() {
|
|
|
- window
|
|
|
- .matchMedia("(prefers-color-scheme: dark)")
|
|
|
- .addEventListener("change", e => {
|
|
|
- if (e.matches === !this.nightmode) this.toggleNightMode();
|
|
|
- });
|
|
|
-
|
|
|
- if (!this.loggedIn) {
|
|
|
- lofig.get("cookie.SIDname").then(sid => {
|
|
|
- this.broadcastChannel = new BroadcastChannel(
|
|
|
- `${sid}.user_login`
|
|
|
- );
|
|
|
- this.broadcastChannel.onmessage = data => {
|
|
|
- if (data) {
|
|
|
- this.broadcastChannel.close();
|
|
|
- window.location.reload();
|
|
|
- }
|
|
|
- };
|
|
|
- });
|
|
|
- }
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
- document.onkeydown = ev => {
|
|
|
- const event = ev || window.event;
|
|
|
- const { keyCode } = event;
|
|
|
- const shift = event.shiftKey;
|
|
|
- const ctrl = event.ctrlKey;
|
|
|
- const alt = event.altKey;
|
|
|
+ changeNightmode(!nightmode.value);
|
|
|
+};
|
|
|
|
|
|
- const identifier = `${keyCode}.${shift}.${ctrl}`;
|
|
|
+const enableNightmode = () => {
|
|
|
+ document.getElementsByTagName("html")[0].classList.add("night-mode");
|
|
|
+};
|
|
|
|
|
|
- if (this.keyIsDown === identifier) return;
|
|
|
- this.keyIsDown = identifier;
|
|
|
+const disableNightmode = () => {
|
|
|
+ document.getElementsByTagName("html")[0].classList.remove("night-mode");
|
|
|
+};
|
|
|
|
|
|
- keyboardShortcuts.handleKeyDown(event, keyCode, shift, ctrl, alt);
|
|
|
- };
|
|
|
+const enableChristmasMode = () => {
|
|
|
+ document.getElementsByTagName("html")[0].classList.add("christmas-mode");
|
|
|
+};
|
|
|
|
|
|
- document.onkeyup = () => {
|
|
|
- this.keyIsDown = "";
|
|
|
+watch(socketConnected, connected => {
|
|
|
+ if (!connected) disconnectedMessage.value.show();
|
|
|
+ else disconnectedMessage.value.hide();
|
|
|
+});
|
|
|
+watch(nightmode.value, enabled => {
|
|
|
+ if (enabled) enableNightmode();
|
|
|
+ else disableNightmode();
|
|
|
+});
|
|
|
+watch(activityWatch.value, enabled => {
|
|
|
+ if (enabled) aw.enable();
|
|
|
+ else aw.disable();
|
|
|
+});
|
|
|
+watch(aModalIsOpen, isOpen => {
|
|
|
+ if (isOpen) {
|
|
|
+ scrollPosition.value = {
|
|
|
+ x: window.scrollX,
|
|
|
+ y: window.scrollY
|
|
|
};
|
|
|
-
|
|
|
- // ctrl + alt + n
|
|
|
- keyboardShortcuts.registerShortcut("nightmode", {
|
|
|
- keyCode: 78,
|
|
|
- ctrl: true,
|
|
|
- alt: true,
|
|
|
- handler: () => this.toggleNightMode()
|
|
|
+ aModalIsOpen2.value = true;
|
|
|
+ } else {
|
|
|
+ aModalIsOpen2.value = false;
|
|
|
+ setTimeout(() => {
|
|
|
+ window.scrollTo(scrollPosition.value.x, scrollPosition.value.y);
|
|
|
+ }, 10);
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ window
|
|
|
+ .matchMedia("(prefers-color-scheme: dark)")
|
|
|
+ .addEventListener("change", e => {
|
|
|
+ if (e.matches === !nightmode.value) toggleNightMode();
|
|
|
});
|
|
|
|
|
|
- keyboardShortcuts.registerShortcut("closeModal", {
|
|
|
- keyCode: 27,
|
|
|
- shift: false,
|
|
|
- ctrl: false,
|
|
|
- handler: () => {
|
|
|
- if (
|
|
|
- Object.keys(this.activeModals).length !== 0 &&
|
|
|
- this.modals[
|
|
|
- this.activeModals[this.activeModals.length - 1]
|
|
|
- ] !== "editSong" &&
|
|
|
- this.modals[
|
|
|
- this.activeModals[this.activeModals.length - 1]
|
|
|
- ] !== "editSongs"
|
|
|
- )
|
|
|
- this.closeCurrentModal();
|
|
|
- }
|
|
|
+ if (!loggedIn.value) {
|
|
|
+ lofig.get("cookie.SIDname").then(sid => {
|
|
|
+ broadcastChannel.value = new BroadcastChannel(`${sid}.user_login`);
|
|
|
+ broadcastChannel.value.onmessage = data => {
|
|
|
+ if (data) {
|
|
|
+ broadcastChannel.value.close();
|
|
|
+ window.location.reload();
|
|
|
+ }
|
|
|
+ };
|
|
|
});
|
|
|
+ }
|
|
|
|
|
|
- this.disconnectedMessage = new Toast({
|
|
|
- content: "Could not connect to the server.",
|
|
|
- persistent: true,
|
|
|
- interactable: false
|
|
|
- });
|
|
|
+ document.onkeydown = ev => {
|
|
|
+ const event = ev || window.event;
|
|
|
+ const { keyCode } = event;
|
|
|
+ const shift = event.shiftKey;
|
|
|
+ const ctrl = event.ctrlKey;
|
|
|
+ const alt = event.altKey;
|
|
|
+
|
|
|
+ const identifier = `${keyCode}.${shift}.${ctrl}`;
|
|
|
+
|
|
|
+ if (keyIsDown.value === identifier) return;
|
|
|
+ keyIsDown.value = identifier;
|
|
|
+
|
|
|
+ keyboardShortcuts.handleKeyDown(event, keyCode, shift, ctrl, alt);
|
|
|
+ };
|
|
|
+
|
|
|
+ document.onkeyup = () => {
|
|
|
+ keyIsDown.value = "";
|
|
|
+ };
|
|
|
+
|
|
|
+ // ctrl + alt + n
|
|
|
+ keyboardShortcuts.registerShortcut("nightmode", {
|
|
|
+ keyCode: 78,
|
|
|
+ ctrl: true,
|
|
|
+ alt: true,
|
|
|
+ handler: () => toggleNightMode()
|
|
|
+ });
|
|
|
+
|
|
|
+ keyboardShortcuts.registerShortcut("closeModal", {
|
|
|
+ keyCode: 27,
|
|
|
+ shift: false,
|
|
|
+ ctrl: false,
|
|
|
+ handler: () => {
|
|
|
+ if (
|
|
|
+ Object.keys(activeModals.value).length !== 0 &&
|
|
|
+ modals.value[
|
|
|
+ activeModals.value[activeModals.value.length - 1]
|
|
|
+ ] !== "editSong" &&
|
|
|
+ modals.value[
|
|
|
+ activeModals.value[activeModals.value.length - 1]
|
|
|
+ ] !== "editSongs"
|
|
|
+ )
|
|
|
+ closeCurrentModal();
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- this.disconnectedMessage.hide();
|
|
|
+ disconnectedMessage.value = new Toast({
|
|
|
+ content: "Could not connect to the server.",
|
|
|
+ persistent: true,
|
|
|
+ interactable: false
|
|
|
+ });
|
|
|
|
|
|
- ws.onConnect(() => {
|
|
|
- this.socketConnected = true;
|
|
|
+ disconnectedMessage.value.hide();
|
|
|
|
|
|
- this.socket.dispatch("users.getPreferences", res => {
|
|
|
- if (res.status === "success") {
|
|
|
- const { preferences } = res.data;
|
|
|
+ ws.onConnect(() => {
|
|
|
+ socketConnected.value = true;
|
|
|
|
|
|
- this.changeAutoSkipDisliked(preferences.autoSkipDisliked);
|
|
|
- this.changeNightmode(preferences.nightmode);
|
|
|
- this.changeActivityLogPublic(preferences.activityLogPublic);
|
|
|
- this.changeAnonymousSongRequests(
|
|
|
- preferences.anonymousSongRequests
|
|
|
- );
|
|
|
- this.changeActivityWatch(preferences.activityWatch);
|
|
|
+ socket.dispatch("users.getPreferences", res => {
|
|
|
+ if (res.status === "success") {
|
|
|
+ const { preferences } = res.data;
|
|
|
|
|
|
- if (this.nightmode) this.enableNightmode();
|
|
|
- else this.disableNightmode();
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- this.socket.on("keep.event:user.session.deleted", () =>
|
|
|
- window.location.reload()
|
|
|
- );
|
|
|
-
|
|
|
- const newUser = !localStorage.getItem("firstVisited");
|
|
|
- this.socket.dispatch("news.newest", newUser, res => {
|
|
|
- if (res.status !== "success") return;
|
|
|
-
|
|
|
- const { news } = res.data;
|
|
|
-
|
|
|
- if (news) {
|
|
|
- if (newUser) {
|
|
|
- this.openModal({ modal: "whatIsNew", data: { news } });
|
|
|
- } else if (localStorage.getItem("whatIsNew")) {
|
|
|
- if (
|
|
|
- parseInt(localStorage.getItem("whatIsNew")) <
|
|
|
- news.createdAt
|
|
|
- ) {
|
|
|
- this.openModal({
|
|
|
- modal: "whatIsNew",
|
|
|
- data: { news }
|
|
|
- });
|
|
|
- localStorage.setItem("whatIsNew", news.createdAt);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (
|
|
|
- parseInt(localStorage.getItem("firstVisited")) <
|
|
|
- news.createdAt
|
|
|
- )
|
|
|
- this.openModal({
|
|
|
- modal: "whatIsNew",
|
|
|
- data: { news }
|
|
|
- });
|
|
|
+ changeAutoSkipDisliked(preferences.autoSkipDisliked);
|
|
|
+ changeNightmode(preferences.nightmode);
|
|
|
+ changeActivityLogPublic(preferences.activityLogPublic);
|
|
|
+ changeAnonymousSongRequests(preferences.anonymousSongRequests);
|
|
|
+ changeActivityWatch(preferences.activityWatch);
|
|
|
+
|
|
|
+ if (nightmode.value) enableNightmode();
|
|
|
+ else disableNightmode();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ socket.on("keep.event:user.session.deleted", () =>
|
|
|
+ window.location.reload()
|
|
|
+ );
|
|
|
+
|
|
|
+ const newUser = !localStorage.getItem("firstVisited");
|
|
|
+ socket.dispatch("news.newest", newUser, res => {
|
|
|
+ if (res.status !== "success") return;
|
|
|
+
|
|
|
+ const { news } = res.data;
|
|
|
+
|
|
|
+ if (news) {
|
|
|
+ if (newUser) {
|
|
|
+ openModal({ modal: "whatIsNew", data: { news } });
|
|
|
+ } else if (localStorage.getItem("whatIsNew")) {
|
|
|
+ if (
|
|
|
+ parseInt(localStorage.getItem("whatIsNew")) <
|
|
|
+ news.createdAt
|
|
|
+ ) {
|
|
|
+ openModal({
|
|
|
+ modal: "whatIsNew",
|
|
|
+ data: { news }
|
|
|
+ });
|
|
|
localStorage.setItem("whatIsNew", news.createdAt);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ if (
|
|
|
+ parseInt(localStorage.getItem("firstVisited")) <
|
|
|
+ news.createdAt
|
|
|
+ )
|
|
|
+ openModal({
|
|
|
+ modal: "whatIsNew",
|
|
|
+ data: { news }
|
|
|
+ });
|
|
|
+ localStorage.setItem("whatIsNew", news.createdAt);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (!localStorage.getItem("firstVisited"))
|
|
|
- localStorage.setItem("firstVisited", Date.now());
|
|
|
- });
|
|
|
- });
|
|
|
-
|
|
|
- ws.onDisconnect(true, () => {
|
|
|
- this.socketConnected = false;
|
|
|
+ if (!localStorage.getItem("firstVisited"))
|
|
|
+ localStorage.setItem("firstVisited", Date.now());
|
|
|
});
|
|
|
+ });
|
|
|
|
|
|
- this.apiDomain = await lofig.get("backend.apiDomain");
|
|
|
-
|
|
|
- this.$router.isReady().then(() => {
|
|
|
- if (this.$route.query.err) {
|
|
|
- let { err } = this.$route.query;
|
|
|
- err = err.replace(/</g, "<").replace(/>/g, ">");
|
|
|
- this.$router.push({ query: {} });
|
|
|
- new Toast({ content: err, timeout: 20000 });
|
|
|
- }
|
|
|
+ ws.onDisconnect(true, () => {
|
|
|
+ socketConnected.value = false;
|
|
|
+ });
|
|
|
|
|
|
- if (this.$route.query.msg) {
|
|
|
- let { msg } = this.$route.query;
|
|
|
- msg = msg.replace(/</g, "<").replace(/>/g, ">");
|
|
|
- this.$router.push({ query: {} });
|
|
|
- new Toast({ content: msg, timeout: 20000 });
|
|
|
- }
|
|
|
+ apiDomain.value = await lofig.get("backend.apiDomain");
|
|
|
|
|
|
- if (localStorage.getItem("github_redirect")) {
|
|
|
- this.$router.push(localStorage.getItem("github_redirect"));
|
|
|
- localStorage.removeItem("github_redirect");
|
|
|
- }
|
|
|
- });
|
|
|
+ router.isReady().then(() => {
|
|
|
+ if (route.query.err) {
|
|
|
+ let { err } = route.query;
|
|
|
+ err = err.replace(/</g, "<").replace(/>/g, ">");
|
|
|
+ router.push({ query: {} });
|
|
|
+ new Toast({ content: err, timeout: 20000 });
|
|
|
+ }
|
|
|
|
|
|
- if (localStorage.getItem("nightmode") === "true") {
|
|
|
- this.changeNightmode(true);
|
|
|
- this.enableNightmode();
|
|
|
+ if (route.query.msg) {
|
|
|
+ let { msg } = route.query;
|
|
|
+ msg = msg.replace(/</g, "<").replace(/>/g, ">");
|
|
|
+ router.push({ query: {} });
|
|
|
+ new Toast({ content: msg, timeout: 20000 });
|
|
|
}
|
|
|
|
|
|
- lofig.get("siteSettings.christmas").then(christmas => {
|
|
|
- if (christmas) {
|
|
|
- this.christmas = true;
|
|
|
- this.enableChristmasMode();
|
|
|
- }
|
|
|
- });
|
|
|
- },
|
|
|
- methods: {
|
|
|
- toggleNightMode() {
|
|
|
- localStorage.setItem("nightmode", !this.nightmode);
|
|
|
-
|
|
|
- if (this.loggedIn) {
|
|
|
- this.socket.dispatch(
|
|
|
- "users.updatePreferences",
|
|
|
- { nightmode: !this.nightmode },
|
|
|
- res => {
|
|
|
- if (res.status !== "success") new Toast(res.message);
|
|
|
- }
|
|
|
- );
|
|
|
- }
|
|
|
+ if (localStorage.getItem("github_redirect")) {
|
|
|
+ router.push(localStorage.getItem("github_redirect"));
|
|
|
+ localStorage.removeItem("github_redirect");
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- this.changeNightmode(!this.nightmode);
|
|
|
- },
|
|
|
- enableNightmode: () => {
|
|
|
- document
|
|
|
- .getElementsByTagName("html")[0]
|
|
|
- .classList.add("night-mode");
|
|
|
- },
|
|
|
- disableNightmode: () => {
|
|
|
- document
|
|
|
- .getElementsByTagName("html")[0]
|
|
|
- .classList.remove("night-mode");
|
|
|
- },
|
|
|
- enableChristmasMode: () => {
|
|
|
- document
|
|
|
- .getElementsByTagName("html")[0]
|
|
|
- .classList.add("christmas-mode");
|
|
|
- },
|
|
|
- ...mapActions("modalVisibility", ["closeCurrentModal", "openModal"]),
|
|
|
- ...mapActions("user/preferences", [
|
|
|
- "changeNightmode",
|
|
|
- "changeAutoSkipDisliked",
|
|
|
- "changeActivityLogPublic",
|
|
|
- "changeAnonymousSongRequests",
|
|
|
- "changeActivityWatch"
|
|
|
- ])
|
|
|
+ if (localStorage.getItem("nightmode") === "true") {
|
|
|
+ changeNightmode(true);
|
|
|
+ enableNightmode();
|
|
|
}
|
|
|
-};
|
|
|
+
|
|
|
+ lofig.get("siteSettings.christmas").then(enabled => {
|
|
|
+ if (enabled) {
|
|
|
+ christmas.value = true;
|
|
|
+ enableChristmasMode();
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|
|
|
</script>
|
|
|
|
|
|
+<template>
|
|
|
+ <div class="upper-container">
|
|
|
+ <banned-page v-if="banned" />
|
|
|
+ <div v-else class="upper-container">
|
|
|
+ <router-view
|
|
|
+ :key="$route.fullPath"
|
|
|
+ class="main-container"
|
|
|
+ :class="{ 'main-container-modal-active': aModalIsOpen2 }"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <falling-snow v-if="christmas" />
|
|
|
+ <modal-manager />
|
|
|
+ <long-jobs />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
<style lang="less">
|
|
|
@import "normalize.css/normalize.css";
|
|
|
@import "tippy.js/dist/tippy.css";
|