X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fcomponents%2FMessage.vue;h=00ce158d7d96521930230bad7c6d23c3a1bbd8e4;hb=077be43473ebdb241c6a70e4d06795ca80a591fb;hp=fcb0fbba9bb79adf4770dfa8c094a53152a9a3d4;hpb=b9c5fcf085bed9c6100283133531b36bfbb06cf0;p=github%2Fbastienwirtz%2Fhomer.git diff --git a/src/components/Message.vue b/src/components/Message.vue index fcb0fbb..00ce158 100644 --- a/src/components/Message.vue +++ b/src/components/Message.vue @@ -1,9 +1,16 @@ @@ -13,22 +20,54 @@ export default { props: { item: Object, }, - created: function () { + data: function () { + return { + message: {}, + }; + }, + created: async function () { // Look for a new message if an endpoint is provided. - let that = this; - if (this.item && this.item.url) { - this.getMessage(this.item.url).then(function (message) { + this.message = Object.assign({}, this.item); + await this.getMessage(); + }, + computed: { + show: function () { + return this.message.title || this.message.content; + }, + }, + watch: { + item: function (item) { + this.message = Object.assign({}, item); + }, + }, + methods: { + 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 - for (const prop of ["title", "style", "content"]) { - if (prop in message && message[prop] !== null) { - that.item[prop] = message[prop]; + const message = this.message; + for (const prop of ["title", "style", "content", "icon"]) { + if (prop in fetchedMessage && fetchedMessage[prop] !== null) { + message[prop] = fetchedMessage[prop]; } } - }); - } - }, - methods: { - getMessage: function (url) { + 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; @@ -36,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; + }, }, };