function-call.mjs 3.3 KB

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