|
@@ -1,49 +1,44 @@
|
|
|
<template>
|
|
|
- <div v-if="news !== null">
|
|
|
- <modal title="News" class="what-is-news-modal">
|
|
|
- <template #body>
|
|
|
- <div
|
|
|
- class="section news-item"
|
|
|
- v-html="sanitize(marked(news.markdown))"
|
|
|
- ></div>
|
|
|
- </template>
|
|
|
- <template #footer>
|
|
|
- <span v-if="news.createdBy">
|
|
|
- By
|
|
|
- <user-id-to-username
|
|
|
- :user-id="news.createdBy"
|
|
|
- :alt="news.createdBy"
|
|
|
- :link="true" /></span
|
|
|
- > <span :title="new Date(news.createdAt)">
|
|
|
- {{
|
|
|
- formatDistance(news.createdAt, new Date(), {
|
|
|
- addSuffix: true
|
|
|
- })
|
|
|
- }}
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </modal>
|
|
|
- </div>
|
|
|
- <div v-else></div>
|
|
|
+ <modal title="News" class="what-is-news-modal">
|
|
|
+ <template #body>
|
|
|
+ <div
|
|
|
+ class="section news-item"
|
|
|
+ v-html="sanitize(marked(news.markdown))"
|
|
|
+ ></div>
|
|
|
+ </template>
|
|
|
+ <template #footer>
|
|
|
+ <span v-if="news.createdBy">
|
|
|
+ By
|
|
|
+ <user-id-to-username
|
|
|
+ :user-id="news.createdBy"
|
|
|
+ :alt="news.createdBy"
|
|
|
+ :link="true" /></span
|
|
|
+ > <span :title="new Date(news.createdAt)">
|
|
|
+ {{
|
|
|
+ formatDistance(news.createdAt, new Date(), {
|
|
|
+ addSuffix: true
|
|
|
+ })
|
|
|
+ }}
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </modal>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import { formatDistance } from "date-fns";
|
|
|
import { marked } from "marked";
|
|
|
import { sanitize } from "dompurify";
|
|
|
-import { mapGetters, mapActions } from "vuex";
|
|
|
-import ws from "@/ws";
|
|
|
+import { mapActions } from "vuex";
|
|
|
+
|
|
|
+import { mapModalState } from "@/vuex_helpers";
|
|
|
|
|
|
export default {
|
|
|
- data() {
|
|
|
- return {
|
|
|
- isModalActive: false,
|
|
|
- news: null
|
|
|
- };
|
|
|
+ props: {
|
|
|
+ modalUuid: { type: String, default: "" }
|
|
|
},
|
|
|
computed: {
|
|
|
- ...mapGetters({
|
|
|
- socket: "websockets/getSocket"
|
|
|
+ ...mapModalState("modals/whatIsNew/MODAL_UUID", {
|
|
|
+ news: state => state.news
|
|
|
})
|
|
|
},
|
|
|
mounted() {
|
|
@@ -57,43 +52,12 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
- ws.onConnect(this.init);
|
|
|
+ },
|
|
|
+ beforeUnmount() {
|
|
|
+ // Delete the VueX module that was created for this modal, after all other cleanup tasks are performed
|
|
|
+ this.$store.unregisterModule(["modals", "whatIsNew", this.modalUuid]);
|
|
|
},
|
|
|
methods: {
|
|
|
- init() {
|
|
|
- const newUser = !localStorage.getItem("firstVisited");
|
|
|
- this.socket.dispatch("news.newest", newUser, res => {
|
|
|
- if (res.status !== "success") return;
|
|
|
-
|
|
|
- const { news } = res.data;
|
|
|
-
|
|
|
- this.news = news;
|
|
|
- if (this.news) {
|
|
|
- if (newUser) {
|
|
|
- this.openModal("whatIsNew");
|
|
|
- } else if (localStorage.getItem("whatIsNew")) {
|
|
|
- if (
|
|
|
- parseInt(localStorage.getItem("whatIsNew")) <
|
|
|
- news.createdAt
|
|
|
- ) {
|
|
|
- this.openModal("whatIsNew");
|
|
|
- localStorage.setItem("whatIsNew", news.createdAt);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (
|
|
|
- parseInt(localStorage.getItem("firstVisited")) <
|
|
|
- news.createdAt
|
|
|
- )
|
|
|
- this.openModal("whatIsNew");
|
|
|
- localStorage.setItem("whatIsNew", news.createdAt);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!localStorage.getItem("firstVisited"))
|
|
|
- localStorage.setItem("firstVisited", Date.now());
|
|
|
- });
|
|
|
- },
|
|
|
marked,
|
|
|
sanitize,
|
|
|
formatDistance,
|