mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-05 19:41:42 +08:00
109 lines
2.3 KiB
TypeScript
109 lines
2.3 KiB
TypeScript
import { App, CSSProperties, TeleportProps } from 'vue';
|
|
import {
|
|
extend,
|
|
inBrowser,
|
|
withInstall,
|
|
Interceptor,
|
|
ComponentInstance,
|
|
} from '../utils';
|
|
import { mountComponent, usePopupState } from '../utils/mount-component';
|
|
import { PopupCloseIconPosition } from '../popup';
|
|
import VanImagePreview from './ImagePreview';
|
|
|
|
let instance: ComponentInstance;
|
|
|
|
export type ImagePreviewOptions = {
|
|
loop?: boolean;
|
|
images: string[];
|
|
maxZoom?: number;
|
|
minZoom?: number;
|
|
teleport?: TeleportProps['to'];
|
|
className?: unknown;
|
|
showIndex?: boolean;
|
|
closeable?: boolean;
|
|
closeIcon?: string;
|
|
transition?: string;
|
|
beforeClose?: Interceptor;
|
|
overlayStyle?: CSSProperties;
|
|
swipeDuration?: number;
|
|
startPosition?: number;
|
|
showIndicators?: boolean;
|
|
closeOnPopstate?: boolean;
|
|
closeIconPosition?: PopupCloseIconPosition;
|
|
onClose?(): void;
|
|
onScale?(args: { scale: number; index: number }): void;
|
|
onChange?(index: number): void;
|
|
};
|
|
|
|
const defaultConfig: ImagePreviewOptions = {
|
|
loop: true,
|
|
images: [],
|
|
maxZoom: 3,
|
|
minZoom: 1 / 3,
|
|
onScale: undefined,
|
|
onClose: undefined,
|
|
onChange: undefined,
|
|
teleport: 'body',
|
|
className: '',
|
|
showIndex: true,
|
|
closeable: false,
|
|
closeIcon: 'clear',
|
|
transition: undefined,
|
|
beforeClose: undefined,
|
|
overlayStyle: undefined,
|
|
startPosition: 0,
|
|
swipeDuration: 300,
|
|
showIndicators: false,
|
|
closeOnPopstate: true,
|
|
closeIconPosition: 'top-right',
|
|
};
|
|
|
|
function initInstance() {
|
|
({ instance } = mountComponent({
|
|
setup() {
|
|
const { state, toggle } = usePopupState();
|
|
const onClosed = () => {
|
|
(state as any).images = [];
|
|
};
|
|
|
|
return () => (
|
|
<VanImagePreview
|
|
{...state}
|
|
{...{
|
|
onClosed,
|
|
'onUpdate:show': toggle,
|
|
}}
|
|
/>
|
|
);
|
|
},
|
|
}));
|
|
}
|
|
|
|
const ImagePreview = (
|
|
images: string[] | ImagePreviewOptions,
|
|
startPosition = 0
|
|
) => {
|
|
/* istanbul ignore if */
|
|
if (!inBrowser) {
|
|
return;
|
|
}
|
|
|
|
if (!instance) {
|
|
initInstance();
|
|
}
|
|
|
|
const options = Array.isArray(images) ? { images, startPosition } : images;
|
|
|
|
instance.open(extend({}, defaultConfig, options));
|
|
|
|
return instance;
|
|
};
|
|
|
|
ImagePreview.Component = withInstall<typeof VanImagePreview>(VanImagePreview);
|
|
|
|
ImagePreview.install = (app: App) => {
|
|
app.use(withInstall<typeof VanImagePreview>(VanImagePreview));
|
|
};
|
|
|
|
export { ImagePreview };
|