function-call.mjs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
  2. import { ref, watch, getCurrentInstance } from "vue";
  3. import { extend, isObject, inBrowser, withInstall } from "../utils/index.mjs";
  4. import { mountComponent, usePopupState } from "../utils/mount-component.mjs";
  5. import VanToast from "./Toast.mjs";
  6. const defaultOptions = {
  7. icon: "",
  8. type: "text",
  9. message: "",
  10. className: "",
  11. overlay: false,
  12. onClose: void 0,
  13. onOpened: void 0,
  14. duration: 2e3,
  15. teleport: "body",
  16. iconSize: void 0,
  17. iconPrefix: void 0,
  18. position: "middle",
  19. transition: "van-fade",
  20. forbidClick: false,
  21. loadingType: void 0,
  22. overlayClass: "",
  23. overlayStyle: void 0,
  24. closeOnClick: false,
  25. closeOnClickOverlay: false
  26. };
  27. let queue = [];
  28. let allowMultiple = false;
  29. let currentOptions = extend({}, defaultOptions);
  30. const defaultOptionsMap = /* @__PURE__ */ new Map();
  31. function parseOptions(message) {
  32. if (isObject(message)) {
  33. return message;
  34. }
  35. return {
  36. message
  37. };
  38. }
  39. function createInstance() {
  40. const {
  41. instance,
  42. unmount
  43. } = mountComponent({
  44. setup() {
  45. const message = ref("");
  46. const {
  47. open,
  48. state,
  49. close,
  50. toggle
  51. } = usePopupState();
  52. const onClosed = () => {
  53. if (allowMultiple) {
  54. queue = queue.filter((item) => item !== instance);
  55. unmount();
  56. }
  57. };
  58. const render = () => {
  59. const attrs = {
  60. onClosed,
  61. "onUpdate:show": toggle
  62. };
  63. return _createVNode(VanToast, _mergeProps(state, attrs), null);
  64. };
  65. watch(message, (val) => {
  66. state.message = val;
  67. });
  68. getCurrentInstance().render = render;
  69. return {
  70. open,
  71. clear: close,
  72. message
  73. };
  74. }
  75. });
  76. return instance;
  77. }
  78. function getInstance() {
  79. if (!queue.length || allowMultiple) {
  80. const instance = createInstance();
  81. queue.push(instance);
  82. }
  83. return queue[queue.length - 1];
  84. }
  85. function Toast(options = {}) {
  86. if (!inBrowser) {
  87. return {};
  88. }
  89. const toast = getInstance();
  90. const parsedOptions = parseOptions(options);
  91. toast.open(extend({}, currentOptions, defaultOptionsMap.get(parsedOptions.type || currentOptions.type), parsedOptions));
  92. return toast;
  93. }
  94. const createMethod = (type) => (options) => Toast(extend({
  95. type
  96. }, parseOptions(options)));
  97. Toast.loading = createMethod("loading");
  98. Toast.success = createMethod("success");
  99. Toast.fail = createMethod("fail");
  100. Toast.clear = (all) => {
  101. var _a;
  102. if (queue.length) {
  103. if (all) {
  104. queue.forEach((toast) => {
  105. toast.clear();
  106. });
  107. queue = [];
  108. } else if (!allowMultiple) {
  109. queue[0].clear();
  110. } else {
  111. (_a = queue.shift()) == null ? void 0 : _a.clear();
  112. }
  113. }
  114. };
  115. function setDefaultOptions(type, options) {
  116. if (typeof type === "string") {
  117. defaultOptionsMap.set(type, options);
  118. } else {
  119. extend(currentOptions, type);
  120. }
  121. }
  122. Toast.setDefaultOptions = setDefaultOptions;
  123. Toast.resetDefaultOptions = (type) => {
  124. if (typeof type === "string") {
  125. defaultOptionsMap.delete(type);
  126. } else {
  127. currentOptions = extend({}, defaultOptions);
  128. defaultOptionsMap.clear();
  129. }
  130. };
  131. Toast.allowMultiple = (value = true) => {
  132. allowMultiple = value;
  133. };
  134. Toast.install = (app) => {
  135. app.use(withInstall(VanToast));
  136. app.config.globalProperties.$toast = Toast;
  137. };
  138. export {
  139. Toast
  140. };