index.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import Vue from 'vue';
  2. import VueToast from './Toast';
  3. import { isObj, isServer, isInDocument } from '../utils';
  4. const defaultOptions = {
  5. type: 'text',
  6. mask: false,
  7. value: true,
  8. message: '',
  9. className: '',
  10. onClose: null,
  11. duration: 3000,
  12. position: 'middle',
  13. forbidClick: false,
  14. loadingType: 'circular',
  15. getContainer: 'body',
  16. overlayStyle: null
  17. };
  18. const parseOptions = message => (isObj(message) ? message : { message });
  19. let queue = [];
  20. let multiple = false;
  21. let currentOptions = { ...defaultOptions };
  22. function createInstance() {
  23. /* istanbul ignore if */
  24. if (isServer) {
  25. return {};
  26. }
  27. if (!queue.length || multiple || !isInDocument(queue[0].$el)) {
  28. const toast = new (Vue.extend(VueToast))({
  29. el: document.createElement('div')
  30. });
  31. queue.push(toast);
  32. }
  33. return queue[queue.length - 1];
  34. }
  35. // transform toast options to popup props
  36. function transformer(options) {
  37. options.overlay = options.mask;
  38. return options;
  39. }
  40. function Toast(options = {}) {
  41. const toast = createInstance();
  42. // should add z-index if previous toast has not disappeared
  43. if (toast.value) {
  44. toast.updateZIndex();
  45. }
  46. options = {
  47. ...currentOptions,
  48. ...parseOptions(options),
  49. clear() {
  50. toast.value = false;
  51. if (options.onClose) {
  52. options.onClose();
  53. }
  54. if (multiple && !isServer) {
  55. clearTimeout(toast.timer);
  56. queue = queue.filter(item => item !== toast);
  57. const parent = toast.$el.parentNode;
  58. if (parent) {
  59. parent.removeChild(toast.$el);
  60. }
  61. toast.$destroy();
  62. }
  63. }
  64. };
  65. Object.assign(toast, transformer(options));
  66. clearTimeout(toast.timer);
  67. if (options.duration > 0) {
  68. toast.timer = setTimeout(() => {
  69. toast.clear();
  70. }, options.duration);
  71. }
  72. return toast;
  73. }
  74. const createMethod = type => options => Toast({
  75. type, ...parseOptions(options)
  76. });
  77. ['loading', 'success', 'fail'].forEach(method => {
  78. Toast[method] = createMethod(method);
  79. });
  80. Toast.clear = all => {
  81. if (queue.length) {
  82. if (all) {
  83. queue.forEach(toast => {
  84. toast.clear();
  85. });
  86. queue = [];
  87. } else if (!multiple) {
  88. queue[0].clear();
  89. } else {
  90. queue.shift().clear();
  91. }
  92. }
  93. };
  94. Toast.setDefaultOptions = options => {
  95. Object.assign(currentOptions, options);
  96. };
  97. Toast.resetDefaultOptions = () => {
  98. currentOptions = { ...defaultOptions };
  99. };
  100. Toast.allowMultiple = (value = true) => {
  101. multiple = value;
  102. };
  103. Toast.install = () => {
  104. Vue.use(VueToast);
  105. };
  106. Vue.prototype.$toast = Toast;
  107. export default Toast;