]> git.immae.eu Git - github/bastienwirtz/homer.git/blobdiff - src/components/Message.vue
Update AdGuardHome.vue
[github/bastienwirtz/homer.git] / src / components / Message.vue
index d007d3ec222e005c29f8c5c81fcefa10f40ab9c2..00ce158d7d96521930230bad7c6d23c3a1bbd8e4 100644 (file)
@@ -1,7 +1,10 @@
 <template>
   <article v-if="show" class="message" :class="message.style">
-    <div v-if="message.title" class="message-header">
-      <p>{{ message.title }}</p>
+    <div v-if="message.title || message.icon" class="message-header">
+      <p>
+        <i v-if="message.icon" :class="`fa-fw ${message.icon}`"></i>
+        {{ message.title }}
+      </p>
     </div>
     <div
       v-if="message.content"
@@ -19,26 +22,52 @@ export default {
   },
   data: function () {
     return {
-      show: false,
       message: {},
     };
   },
   created: async function () {
     // Look for a new message if an endpoint is provided.
     this.message = Object.assign({}, this.item);
-    if (this.item && this.item.url) {
-      const fetchedMessage = await this.getMessage(this.item.url);
-      // keep the original config value if no value is provided by the endpoint
-      for (const prop of ["title", "style", "content"]) {
-        if (prop in fetchedMessage && fetchedMessage[prop] !== null) {
-          this.message[prop] = fetchedMessage[prop];
-        }
-      }
-    }
-    this.show = this.message.title || this.message.content;
+    await this.getMessage();
+  },
+  computed: {
+    show: function () {
+      return this.message.title || this.message.content;
+    },
+  },
+  watch: {
+    item: function (item) {
+      this.message = Object.assign({}, item);
+    },
   },
   methods: {
-    getMessage: function (url) {
+    getMessage: async function () {
+      if (!this.item) {
+        return;
+      }
+      if (this.item.url) {
+        let fetchedMessage = await this.downloadMessage(this.item.url);
+        console.log("done");
+        if (this.item.mapping) {
+          fetchedMessage = this.mapRemoteMessage(fetchedMessage);
+        }
+
+        // keep the original config value if no value is provided by the endpoint
+        const message = this.message;
+        for (const prop of ["title", "style", "content", "icon"]) {
+          if (prop in fetchedMessage && fetchedMessage[prop] !== null) {
+            message[prop] = fetchedMessage[prop];
+          }
+        }
+        this.message = { ...message }; // Force computed property to re-evaluate
+      }
+
+      if (this.item.refreshInterval) {
+        setTimeout(this.getMessage, this.item.refreshInterval);
+      }
+    },
+
+    downloadMessage: function (url) {
       return fetch(url).then(function (response) {
         if (response.status != 200) {
           return;
@@ -46,6 +75,15 @@ export default {
         return response.json();
       });
     },
+
+    mapRemoteMessage: function (message) {
+      let mapped = {};
+      // map property from message into mapped according to mapping config (only if field has a value):
+      for (const prop in this.item.mapping)
+        if (message[this.item.mapping[prop]])
+          mapped[prop] = message[this.item.mapping[prop]];
+      return mapped;
+    },
   },
 };
 </script>