import { ref, provide, defineComponent, inject, Ref, reactive } from 'vue'; import Preview from './Preview'; export interface GroupConsumerProps { previewPrefixCls?: string; } export interface GroupConsumerValue extends GroupConsumerProps { isPreviewGroup?: Ref; previewUrls: Record; setPreviewUrls: (previewUrls: Record) => void; current: Ref; setCurrent: (current: number) => void; setShowPreview: (isShowPreview: boolean) => void; setMousePosition: (mousePosition: null | { x: number; y: number }) => void; registerImage: (id: number, url: string) => () => void; } const previewGroupContext = Symbol('previewGroupContext'); export const context = { provide: (val: GroupConsumerValue) => { provide(previewGroupContext, val); }, inject: () => { return inject(previewGroupContext, { isPreviewGroup: ref(false), previewUrls: reactive({}), setPreviewUrls: () => {}, current: ref(null), setCurrent: () => {}, setShowPreview: () => {}, setMousePosition: () => {}, registerImage: null, }); }, }; const Group = defineComponent({ name: 'PreviewGroup', inheritAttrs: false, props: { previewPrefixCls: String }, setup(props, { slots }) { const previewUrls = reactive>({}); const current = ref(); const isShowPreview = ref(false); const mousePosition = ref<{ x: number; y: number }>(null); const setPreviewUrls = (val: Record) => { Object.assign(previewUrls, val); }; const setCurrent = (val: number) => { current.value = val; }; const setMousePosition = (val: null | { x: number; y: number }) => { mousePosition.value = val; }; const setShowPreview = (val: boolean) => { isShowPreview.value = val; }; const registerImage = (id: number, url: string) => { previewUrls[id] = url; return () => { delete previewUrls[id]; }; }; const onPreviewClose = (e: any) => { e?.stopPropagation(); isShowPreview.value = false; mousePosition.value = null; }; context.provide({ isPreviewGroup: ref(true), previewUrls, setPreviewUrls, current, setCurrent, setShowPreview, setMousePosition, registerImage, }); return () => { return ( <> {slots.default && slots.default()} ); }; }, }); export default Group;