81 lines
2.4 KiB
Vue
81 lines
2.4 KiB
Vue
import type { App, ExtractPropTypes, ImgHTMLAttributes, Plugin } from 'vue';
|
|
import { defineComponent, computed } from 'vue';
|
|
import ImageInternal from '../vc-image';
|
|
import { imageProps } from '../vc-image/src/Image';
|
|
import defaultLocale from '../locale/en_US';
|
|
import useConfigInject from '../_util/hooks/useConfigInject';
|
|
import PreviewGroup, { icons } from './PreviewGroup';
|
|
import EyeOutlined from '@ant-design/icons-vue/EyeOutlined';
|
|
import { getTransitionName } from '../_util/transition';
|
|
|
|
export type ImageProps = Partial<
|
|
ExtractPropTypes<ReturnType<typeof imageProps>> &
|
|
Omit<ImgHTMLAttributes, 'placeholder' | 'onClick'>
|
|
>;
|
|
const Image = defineComponent<ImageProps>({
|
|
name: 'AImage',
|
|
inheritAttrs: false,
|
|
props: imageProps() as any,
|
|
setup(props, { slots, attrs }) {
|
|
const { prefixCls, rootPrefixCls, configProvider } = useConfigInject('image', props);
|
|
|
|
const mergedPreview = computed(() => {
|
|
const { preview } = props;
|
|
|
|
if (preview === false) {
|
|
return preview;
|
|
}
|
|
const _preview = typeof preview === 'object' ? preview : {};
|
|
|
|
return {
|
|
icons,
|
|
..._preview,
|
|
transitionName: getTransitionName(rootPrefixCls.value, 'zoom', _preview.transitionName),
|
|
maskTransitionName: getTransitionName(
|
|
rootPrefixCls.value,
|
|
'fade',
|
|
_preview.maskTransitionName,
|
|
),
|
|
};
|
|
});
|
|
|
|
return () => {
|
|
const imageLocale = configProvider.locale?.Image || defaultLocale.Image;
|
|
const defaultPreviewMask = () => (
|
|
<div class={`${prefixCls.value}-mask-info`}>
|
|
<EyeOutlined />
|
|
{imageLocale?.preview}
|
|
</div>
|
|
);
|
|
const { previewMask = slots.previewMask || defaultPreviewMask } = props;
|
|
return (
|
|
<ImageInternal
|
|
{...{ ...attrs, ...props, prefixCls: prefixCls.value }}
|
|
preview={mergedPreview.value}
|
|
v-slots={{
|
|
...slots,
|
|
previewMask: typeof previewMask === 'function' ? previewMask : null,
|
|
}}
|
|
></ImageInternal>
|
|
);
|
|
};
|
|
},
|
|
});
|
|
|
|
export { imageProps };
|
|
|
|
Image.PreviewGroup = PreviewGroup;
|
|
|
|
Image.install = function (app: App) {
|
|
app.component(Image.name, Image);
|
|
app.component(Image.PreviewGroup.name, Image.PreviewGroup);
|
|
return app;
|
|
};
|
|
|
|
export { PreviewGroup as ImagePreviewGroup };
|
|
|
|
export default Image as typeof Image &
|
|
Plugin & {
|
|
readonly PreviewGroup: typeof PreviewGroup;
|
|
};
|