See #262: light messaging area and helpers for the front-end

This commit is contained in:
Eliot Berriot 2018-06-07 12:59:22 +02:00
parent 4c81de9226
commit 3634c00ee6
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
6 changed files with 167 additions and 2 deletions

View file

@ -0,0 +1,83 @@
<template>
<div class="service-messages">
<message v-for="message in displayedMessages" :key="String(message.date)" :class="['large', getLevel(message)]">
<p>{{ message.content }}</p>
</message>
</div>
</template>
<script>
import _ from 'lodash'
import {mapState} from 'vuex'
export default {
data () {
return {
date: new Date(),
interval: null
}
},
created () {
this.setupInterval()
},
destroyed () {
if (this.interval) {
clearInterval(this.interval)
}
},
computed: {
...mapState({
messages: state => state.ui.messages,
displayDuration: state => state.ui.messageDisplayDuration
}),
displayedMessages () {
let now = this.date
let interval = this.displayDuration
let toDisplay = this.messages.filter(m => {
return now - m.date <= interval
})
return _.reverse(toDisplay).slice(0, 5)
}
},
methods: {
setupInterval () {
if (this.interval) {
return
}
let self = this
this.interval = setInterval(() => {
if (self.displayedMessages.length === 0) {
clearInterval(self.interval)
this.interval = null
}
self.date = new Date()
}, 1000)
},
getLevel (message) {
return message.level || 'blue'
}
},
watch: {
messages: {
handler (v) {
if (v.length > 0 && !this.interval) {
this.setupInterval()
}
},
deep: true
}
}
}
</script>
<style>
.service-messages {
z-index: 9999;
margin-left: 1em;
min-width: 20em;
max-width: 40em;
}
.service-messages .message:last-child {
margin-bottom: 0;
}
</style>