ImagePreview.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. var __create = Object.create;
  2. var __defProp = Object.defineProperty;
  3. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  4. var __getOwnPropNames = Object.getOwnPropertyNames;
  5. var __getProtoOf = Object.getPrototypeOf;
  6. var __hasOwnProp = Object.prototype.hasOwnProperty;
  7. var __export = (target, all) => {
  8. for (var name2 in all)
  9. __defProp(target, name2, { get: all[name2], enumerable: true });
  10. };
  11. var __copyProps = (to, from, except, desc) => {
  12. if (from && typeof from === "object" || typeof from === "function") {
  13. for (let key of __getOwnPropNames(from))
  14. if (!__hasOwnProp.call(to, key) && key !== except)
  15. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  16. }
  17. return to;
  18. };
  19. var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  20. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  21. mod
  22. ));
  23. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  24. var stdin_exports = {};
  25. __export(stdin_exports, {
  26. default: () => stdin_default
  27. });
  28. module.exports = __toCommonJS(stdin_exports);
  29. var import_vue = require("vue");
  30. var import_vue2 = require("vue");
  31. var import_utils = require("../utils");
  32. var import_use = require("@vant/use");
  33. var import_use_expose = require("../composables/use-expose");
  34. var import_icon = require("../icon");
  35. var import_swipe = require("../swipe");
  36. var import_popup = require("../popup");
  37. var import_ImagePreviewItem = __toESM(require("./ImagePreviewItem"));
  38. const [name, bem] = (0, import_utils.createNamespace)("image-preview");
  39. const popupProps = ["show", "transition", "overlayStyle", "closeOnPopstate"];
  40. const imagePreviewProps = {
  41. show: Boolean,
  42. loop: import_utils.truthProp,
  43. images: (0, import_utils.makeArrayProp)(),
  44. minZoom: (0, import_utils.makeNumericProp)(1 / 3),
  45. maxZoom: (0, import_utils.makeNumericProp)(3),
  46. overlay: import_utils.truthProp,
  47. closeable: Boolean,
  48. showIndex: import_utils.truthProp,
  49. className: import_utils.unknownProp,
  50. closeIcon: (0, import_utils.makeStringProp)("clear"),
  51. transition: String,
  52. beforeClose: Function,
  53. overlayClass: import_utils.unknownProp,
  54. overlayStyle: Object,
  55. swipeDuration: (0, import_utils.makeNumericProp)(300),
  56. startPosition: (0, import_utils.makeNumericProp)(0),
  57. showIndicators: Boolean,
  58. closeOnPopstate: import_utils.truthProp,
  59. closeIconPosition: (0, import_utils.makeStringProp)("top-right")
  60. };
  61. var stdin_default = (0, import_vue2.defineComponent)({
  62. name,
  63. props: imagePreviewProps,
  64. emits: ["scale", "close", "closed", "change", "update:show"],
  65. setup(props, {
  66. emit,
  67. slots
  68. }) {
  69. const swipeRef = (0, import_vue2.ref)();
  70. const state = (0, import_vue2.reactive)({
  71. active: 0,
  72. rootWidth: 0,
  73. rootHeight: 0
  74. });
  75. const resize = () => {
  76. if (swipeRef.value) {
  77. const rect = (0, import_use.useRect)(swipeRef.value.$el);
  78. state.rootWidth = rect.width;
  79. state.rootHeight = rect.height;
  80. swipeRef.value.resize();
  81. }
  82. };
  83. const emitScale = (args) => emit("scale", args);
  84. const updateShow = (show) => emit("update:show", show);
  85. const emitClose = () => {
  86. (0, import_utils.callInterceptor)(props.beforeClose, {
  87. args: [state.active],
  88. done: () => updateShow(false)
  89. });
  90. };
  91. const setActive = (active) => {
  92. if (active !== state.active) {
  93. state.active = active;
  94. emit("change", active);
  95. }
  96. };
  97. const renderIndex = () => {
  98. if (props.showIndex) {
  99. return (0, import_vue.createVNode)("div", {
  100. "class": bem("index")
  101. }, [slots.index ? slots.index({
  102. index: state.active
  103. }) : `${state.active + 1} / ${props.images.length}`]);
  104. }
  105. };
  106. const renderCover = () => {
  107. if (slots.cover) {
  108. return (0, import_vue.createVNode)("div", {
  109. "class": bem("cover")
  110. }, [slots.cover()]);
  111. }
  112. };
  113. const renderImages = () => (0, import_vue.createVNode)(import_swipe.Swipe, {
  114. "ref": swipeRef,
  115. "lazyRender": true,
  116. "loop": props.loop,
  117. "class": bem("swipe"),
  118. "duration": props.swipeDuration,
  119. "initialSwipe": props.startPosition,
  120. "showIndicators": props.showIndicators,
  121. "indicatorColor": "white",
  122. "onChange": setActive
  123. }, {
  124. default: () => [props.images.map((image) => (0, import_vue.createVNode)(import_ImagePreviewItem.default, {
  125. "src": image,
  126. "show": props.show,
  127. "active": state.active,
  128. "maxZoom": props.maxZoom,
  129. "minZoom": props.minZoom,
  130. "rootWidth": state.rootWidth,
  131. "rootHeight": state.rootHeight,
  132. "onScale": emitScale,
  133. "onClose": emitClose
  134. }, {
  135. image: slots.image
  136. }))]
  137. });
  138. const renderClose = () => {
  139. if (props.closeable) {
  140. return (0, import_vue.createVNode)(import_icon.Icon, {
  141. "role": "button",
  142. "name": props.closeIcon,
  143. "class": [bem("close-icon", props.closeIconPosition), import_utils.HAPTICS_FEEDBACK],
  144. "onClick": emitClose
  145. }, null);
  146. }
  147. };
  148. const onClosed = () => emit("closed");
  149. const swipeTo = (index, options) => {
  150. var _a;
  151. return (_a = swipeRef.value) == null ? void 0 : _a.swipeTo(index, options);
  152. };
  153. (0, import_use_expose.useExpose)({
  154. swipeTo
  155. });
  156. (0, import_vue2.onMounted)(resize);
  157. (0, import_vue2.watch)([import_utils.windowWidth, import_utils.windowHeight], resize);
  158. (0, import_vue2.watch)(() => props.startPosition, (value) => setActive(+value));
  159. (0, import_vue2.watch)(() => props.show, (value) => {
  160. const {
  161. images,
  162. startPosition
  163. } = props;
  164. if (value) {
  165. setActive(+startPosition);
  166. (0, import_vue2.nextTick)(() => {
  167. resize();
  168. swipeTo(+startPosition, {
  169. immediate: true
  170. });
  171. });
  172. } else {
  173. emit("close", {
  174. index: state.active,
  175. url: images[state.active]
  176. });
  177. }
  178. });
  179. return () => (0, import_vue.createVNode)(import_popup.Popup, (0, import_vue.mergeProps)({
  180. "class": [bem(), props.className],
  181. "overlayClass": [bem("overlay"), props.overlayClass],
  182. "onClosed": onClosed,
  183. "onUpdate:show": updateShow
  184. }, (0, import_utils.pick)(props, popupProps)), {
  185. default: () => [renderClose(), renderImages(), renderIndex(), renderCover()]
  186. });
  187. }
  188. });