@gitlab/ui
Version:
GitLab UI Components
126 lines (115 loc) • 4.09 kB
JavaScript
import CloseButton from '../../shared_components/close_button/close_button';
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
const MIN_DURATION = 1000;
const DEFAULT_AUTO_HIDE_DELAY = 5000;
const hasAnimateSupport = typeof Element !== 'undefined' && Boolean(Element.prototype.animate);
var script = {
name: 'GlToast',
components: {
CloseButton
},
props: {
toastId: {
type: String,
required: true
},
message: {
type: String,
required: true
},
action: {
type: Object,
required: false,
default: null
},
autoHideDelay: {
type: Number,
required: false,
default: DEFAULT_AUTO_HIDE_DELAY
}
},
data() {
return {
visible: true
};
},
computed: {
effectiveDelay() {
return Math.max(this.autoHideDelay, MIN_DURATION);
}
},
created() {
this.useCssTransition = hasAnimateSupport;
this.dismissTimer = null;
this.deadline = 0;
this.timeRemaining = this.effectiveDelay;
this.isHiding = false;
},
beforeDestroy() {
clearTimeout(this.dismissTimer);
},
methods: {
startDismissTimer() {
clearTimeout(this.dismissTimer);
this.deadline = Date.now() + this.timeRemaining;
this.dismissTimer = setTimeout(() => this.hide(), this.timeRemaining);
},
onPause() {
if (!this.dismissTimer) return;
clearTimeout(this.dismissTimer);
this.dismissTimer = null;
this.timeRemaining = Math.max(this.deadline - Date.now(), MIN_DURATION);
},
onResume() {
if (!this.timeRemaining || this.dismissTimer) return;
this.startDismissTimer();
},
hide() {
if (this.isHiding) return;
this.isHiding = true;
clearTimeout(this.dismissTimer);
this.dismissTimer = null;
this.visible = false;
},
onAfterLeave() {
this.$emit('hidden', this.toastId);
},
onActionClick(e) {
if (this.action && this.action.onClick) {
this.action.onClick(e, {
id: this.toastId,
hide: () => this.hide()
});
}
}
}
};
/* script */
const __vue_script__ = script;
/* template */
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"b-toast b-toast-append",attrs:{"id":(_vm.toastId + "_toast_outer"),"role":"status","aria-live":"polite","aria-atomic":"true"}},[_c('transition',{attrs:{"enter-active-class":"fade","enter-to-class":"show","leave-class":"show","leave-active-class":"fade","appear":"","appear-active-class":"fade","appear-to-class":"show","css":_vm.useCssTransition},on:{"after-appear":_vm.startDismissTimer,"after-leave":_vm.onAfterLeave}},[(_vm.visible)?_c('div',{staticClass:"toast gl-toast",attrs:{"id":_vm.toastId,"tabindex":"0"},on:{"mouseenter":_vm.onPause,"mouseleave":_vm.onResume}},[_c('div',{staticClass:"toast-body"},[_vm._v(_vm._s(_vm.message))]),_vm._v(" "),_c('header',{staticClass:"toast-header"},[(_vm.action)?_c('a',{staticClass:"gl-toast-action",attrs:{"role":_vm.action.href ? undefined : 'button',"href":_vm.action.href},on:{"click":_vm.onActionClick}},[_vm._v(_vm._s(_vm.action.text))]):_vm._e(),_vm._v(" "),_c('close-button',{staticClass:"gl-toast-close-button",on:{"click":_vm.hide}})],1)]):_vm._e()])],1)};
var __vue_staticRenderFns__ = [];
/* style */
const __vue_inject_styles__ = undefined;
/* scoped */
const __vue_scope_id__ = undefined;
/* module identifier */
const __vue_module_identifier__ = undefined;
/* functional template */
const __vue_is_functional_template__ = false;
/* style inject */
/* style inject SSR */
/* style inject shadow dom */
const __vue_component__ = /*#__PURE__*/__vue_normalize__(
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
__vue_inject_styles__,
__vue_script__,
__vue_scope_id__,
__vue_is_functional_template__,
__vue_module_identifier__,
false,
undefined,
undefined,
undefined
);
export { __vue_component__ as default };