<template>
<transition name="m-message-fade" mode="in-out">
<div class="m-message-wrapper" v-show="show"
:style="{
width: width
}"
:class="wrapperClassName"
>
<message
:class="[type && 'm-message--' + type, className]"
@mouseenter.native="clearTimer"
@mouseleave.native="startTimer"
:content="message"
:closable="showClose"
:is-collapsed="isCollapsed"
:collapsable="collapsable"
:close-handler="close"
:title="title"
:supportHTML="supportHTML"
>
<template slot="icon">
<img v-if="iconImg" :src="iconImg" class="m-message--icon"/>
<icon v-else-if="type" :name="type" class="m-message--icon"/>
</template>
</message>
</div>
</transition>
</template>
<script>
import Message from './message.vue'
import Icon from './icon'
export default {
components: { Icon, Message },
data () {
return {
show: false,
type: 'info',
iconImg: '',
title: '',
message: '',
duration: 3000,
showClose: false,
isCollapsed: false,
collapsable: true,
width: '',
className: '',
wrapperClassName: '',
supportHTML: false,
onClose: null,
timer: null,
closed: false
}
},
watch: {
closed (val) {
if (val) {
this.show = false
this.$el.addEventListener('animationend', this.destroyElement)
}
}
},
methods: {
close () {
this.closed = true
if (typeof this.onClose === 'function') {
this.onClose(this)
}
},
clearTimer () {
clearTimeout(this.timer)
},
startTimer () {
if (this.duration > 0 && this.type !== 'loading') {
this.timer = setTimeout(() => {
if (!this.closed) {
this.close()
}
}, this.duration)
}
},
destroyElement () {
this.$el.removeEventListener('transitionend', this.destroyElement)
this.$destroy(true)
this.$el.parentNode.removeChild(this.$el)
}
},
mounted () {
if (this.type !== 'loading') {
this.startTimer()
if (this.duration <= 0) {
this.showClose = true
}
}
}
}
</script>