194 lines
5.8 KiB
JavaScript
194 lines
5.8 KiB
JavaScript
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name2 in all)
|
|
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var stdin_exports = {};
|
|
__export(stdin_exports, {
|
|
default: () => stdin_default,
|
|
imageProps: () => imageProps
|
|
});
|
|
module.exports = __toCommonJS(stdin_exports);
|
|
var import_vue = require("vue");
|
|
var import_utils = require("../utils");
|
|
var import_icon = require("../icon");
|
|
const [name, bem] = (0, import_utils.createNamespace)("image");
|
|
const imageProps = {
|
|
src: String,
|
|
alt: String,
|
|
fit: String,
|
|
position: String,
|
|
round: Boolean,
|
|
block: Boolean,
|
|
width: import_utils.numericProp,
|
|
height: import_utils.numericProp,
|
|
radius: import_utils.numericProp,
|
|
lazyLoad: Boolean,
|
|
iconSize: import_utils.numericProp,
|
|
showError: import_utils.truthProp,
|
|
errorIcon: (0, import_utils.makeStringProp)("photo-fail"),
|
|
iconPrefix: String,
|
|
showLoading: import_utils.truthProp,
|
|
loadingIcon: (0, import_utils.makeStringProp)("photo"),
|
|
crossorigin: String,
|
|
referrerpolicy: String
|
|
};
|
|
var stdin_default = (0, import_vue.defineComponent)({
|
|
name,
|
|
props: imageProps,
|
|
emits: ["load", "error"],
|
|
setup(props, {
|
|
emit,
|
|
slots
|
|
}) {
|
|
const error = (0, import_vue.ref)(false);
|
|
const loading = (0, import_vue.ref)(true);
|
|
const imageRef = (0, import_vue.ref)();
|
|
const {
|
|
$Lazyload
|
|
} = (0, import_vue.getCurrentInstance)().proxy;
|
|
const style = (0, import_vue.computed)(() => {
|
|
const style2 = {
|
|
width: (0, import_utils.addUnit)(props.width),
|
|
height: (0, import_utils.addUnit)(props.height)
|
|
};
|
|
if ((0, import_utils.isDef)(props.radius)) {
|
|
style2.overflow = "hidden";
|
|
style2.borderRadius = (0, import_utils.addUnit)(props.radius);
|
|
}
|
|
return style2;
|
|
});
|
|
(0, import_vue.watch)(() => props.src, () => {
|
|
error.value = false;
|
|
loading.value = true;
|
|
});
|
|
const onLoad = (event) => {
|
|
if (loading.value) {
|
|
loading.value = false;
|
|
emit("load", event);
|
|
}
|
|
};
|
|
const triggerLoad = () => {
|
|
const loadEvent = new Event("load");
|
|
Object.defineProperty(loadEvent, "target", {
|
|
value: imageRef.value,
|
|
enumerable: true
|
|
});
|
|
onLoad(loadEvent);
|
|
};
|
|
const onError = (event) => {
|
|
error.value = true;
|
|
loading.value = false;
|
|
emit("error", event);
|
|
};
|
|
const renderIcon = (name2, className, slot) => {
|
|
if (slot) {
|
|
return slot();
|
|
}
|
|
return (0, import_vue.createVNode)(import_icon.Icon, {
|
|
"name": name2,
|
|
"size": props.iconSize,
|
|
"class": className,
|
|
"classPrefix": props.iconPrefix
|
|
}, null);
|
|
};
|
|
const renderPlaceholder = () => {
|
|
if (loading.value && props.showLoading) {
|
|
return (0, import_vue.createVNode)("div", {
|
|
"class": bem("loading")
|
|
}, [renderIcon(props.loadingIcon, bem("loading-icon"), slots.loading)]);
|
|
}
|
|
if (error.value && props.showError) {
|
|
return (0, import_vue.createVNode)("div", {
|
|
"class": bem("error")
|
|
}, [renderIcon(props.errorIcon, bem("error-icon"), slots.error)]);
|
|
}
|
|
};
|
|
const renderImage = () => {
|
|
if (error.value || !props.src) {
|
|
return;
|
|
}
|
|
const attrs = {
|
|
alt: props.alt,
|
|
class: bem("img"),
|
|
style: {
|
|
objectFit: props.fit,
|
|
objectPosition: props.position
|
|
},
|
|
crossorigin: props.crossorigin,
|
|
referrerpolicy: props.referrerpolicy
|
|
};
|
|
if (props.lazyLoad) {
|
|
return (0, import_vue.withDirectives)((0, import_vue.createVNode)("img", (0, import_vue.mergeProps)({
|
|
"ref": imageRef
|
|
}, attrs), null), [[(0, import_vue.resolveDirective)("lazy"), props.src]]);
|
|
}
|
|
return (0, import_vue.createVNode)("img", (0, import_vue.mergeProps)({
|
|
"ref": imageRef,
|
|
"src": props.src,
|
|
"onLoad": onLoad,
|
|
"onError": onError
|
|
}, attrs), null);
|
|
};
|
|
const onLazyLoaded = ({
|
|
el
|
|
}) => {
|
|
const check = () => {
|
|
if (el === imageRef.value && loading.value) {
|
|
triggerLoad();
|
|
}
|
|
};
|
|
if (imageRef.value) {
|
|
check();
|
|
} else {
|
|
(0, import_vue.nextTick)(check);
|
|
}
|
|
};
|
|
const onLazyLoadError = ({
|
|
el
|
|
}) => {
|
|
if (el === imageRef.value && !error.value) {
|
|
onError();
|
|
}
|
|
};
|
|
if ($Lazyload && import_utils.inBrowser) {
|
|
$Lazyload.$on("loaded", onLazyLoaded);
|
|
$Lazyload.$on("error", onLazyLoadError);
|
|
(0, import_vue.onBeforeUnmount)(() => {
|
|
$Lazyload.$off("loaded", onLazyLoaded);
|
|
$Lazyload.$off("error", onLazyLoadError);
|
|
});
|
|
}
|
|
(0, import_vue.onMounted)(() => {
|
|
(0, import_vue.nextTick)(() => {
|
|
var _a;
|
|
if (((_a = imageRef.value) == null ? void 0 : _a.complete) && !props.lazyLoad) {
|
|
triggerLoad();
|
|
}
|
|
});
|
|
});
|
|
return () => {
|
|
var _a;
|
|
return (0, import_vue.createVNode)("div", {
|
|
"class": bem({
|
|
round: props.round,
|
|
block: props.block
|
|
}),
|
|
"style": style.value
|
|
}, [renderImage(), renderPlaceholder(), (_a = slots.default) == null ? void 0 : _a.call(slots)]);
|
|
};
|
|
}
|
|
});
|