This commit is contained in:
2026-05-25 17:08:18 +08:00
parent df501f6151
commit f1259b71b5
9178 changed files with 1626125 additions and 0 deletions
@@ -0,0 +1,7 @@
import React from 'react';
import type { PreviewConfig } from '..';
import type { GroupPreviewConfig } from '../PreviewGroup';
declare const useMergedPreviewConfig: <T extends PreviewConfig | GroupPreviewConfig>(previewConfig: T, contextPreviewConfig: T, prefixCls: string, mergedRootClassName: string, getContextPopupContainer: PreviewConfig["getContainer"], icons: PreviewConfig["icons"], defaultCover?: React.ReactNode) => T & {
blurClassName?: string;
};
export default useMergedPreviewConfig;
@@ -0,0 +1,37 @@
import React from 'react';
import { clsx } from 'clsx';
import { useMergedMask, useZIndex } from '../../_util/hooks';
import { getTransitionName } from '../../_util/motion';
const useMergedPreviewConfig = (previewConfig, contextPreviewConfig, prefixCls, mergedRootClassName, getContextPopupContainer, icons, defaultCover) => {
const [zIndex] = useZIndex('ImagePreview', previewConfig?.zIndex);
const [mergedPreviewMask, blurClassName] = useMergedMask(previewConfig?.mask, contextPreviewConfig?.mask, `${prefixCls}-preview`);
return React.useMemo(() => {
if (!previewConfig) {
return previewConfig;
}
const {
cover,
getContainer,
closeIcon,
rootClassName: previewRootClassName
} = previewConfig;
const {
closeIcon: contextCloseIcon
} = contextPreviewConfig ?? {};
return {
motionName: getTransitionName(`${prefixCls}-preview`, 'fade'),
...previewConfig,
...(defaultCover ? {
cover: cover ?? defaultCover
} : {}),
icons,
getContainer: getContainer ?? getContextPopupContainer,
zIndex,
closeIcon: closeIcon ?? contextCloseIcon,
rootClassName: clsx(mergedRootClassName, previewRootClassName),
mask: mergedPreviewMask,
blurClassName: blurClassName.mask
};
}, [previewConfig, contextPreviewConfig, prefixCls, mergedRootClassName, getContextPopupContainer, defaultCover, icons, zIndex, mergedPreviewMask, blurClassName]);
};
export default useMergedPreviewConfig;
@@ -0,0 +1,3 @@
import type { PreviewConfig } from '..';
import type { GroupPreviewConfig } from '../PreviewGroup';
export default function usePreviewConfig<T extends PreviewConfig | GroupPreviewConfig>(preview?: boolean | T): [previewConfig: T, rootClassName: string, maskClassName: string];
+77
View File
@@ -0,0 +1,77 @@
import { isValidElement, useMemo } from 'react';
import { isPlainObject } from '../../_util/is';
import { devUseWarning } from '../../_util/warning';
function normalizeMask(mask) {
if (/*#__PURE__*/isValidElement(mask)) {
return [mask, undefined];
}
if (typeof mask === 'boolean' || isPlainObject(mask)) {
return [undefined, mask];
}
return [undefined, undefined];
}
export default function usePreviewConfig(preview) {
// Get origin preview config
const rawPreviewConfig = useMemo(() => {
if (typeof preview === 'boolean') {
return preview ? {} : null;
}
return isPlainObject(preview) ? preview : {};
}, [preview]);
const splittedPreviewConfig = useMemo(() => {
if (!rawPreviewConfig) {
return [rawPreviewConfig, '', ''];
}
const {
open,
onOpenChange,
cover,
actionsRender,
visible,
onVisibleChange,
rootClassName,
maskClassName,
mask,
forceRender: _forceRender,
destroyOnClose: _destroyOnClose,
toolbarRender,
...restPreviewConfig
} = rawPreviewConfig;
let onInternalOpenChange;
if (onOpenChange) {
onInternalOpenChange = onOpenChange;
} else if (onVisibleChange) {
onInternalOpenChange = (nextOpen, info) => {
const {
current
} = info || {};
if (current !== undefined) {
onVisibleChange(nextOpen, !nextOpen, current);
} else {
onVisibleChange(nextOpen, !nextOpen);
}
};
}
const [coverElement, maskConfig] = normalizeMask(mask);
return [{
...restPreviewConfig,
open: open ?? visible,
onOpenChange: onInternalOpenChange,
cover: cover ?? coverElement,
mask: maskConfig,
actionsRender: actionsRender ?? toolbarRender
}, rootClassName, maskClassName];
}, [rawPreviewConfig]);
if (process.env.NODE_ENV !== 'production') {
const warning = devUseWarning('Image');
if (rawPreviewConfig) {
[['visible', 'open'], ['onVisibleChange', 'onOpenChange'], ['maskClassName', 'classNames.cover'], ['rootClassName', 'classNames.root'], ['toolbarRender', 'actionsRender']].forEach(([deprecatedName, newName]) => {
warning.deprecated(!(deprecatedName in rawPreviewConfig), deprecatedName, newName);
});
process.env.NODE_ENV !== "production" ? warning(! /*#__PURE__*/isValidElement(rawPreviewConfig.mask), 'deprecated', '`mask` used as ReactNode is deprecated. Please use `cover` instead.') : void 0;
process.env.NODE_ENV !== "production" ? warning(!('forceRender' in rawPreviewConfig), 'breaking', '`forceRender` is no longer supported.') : void 0;
process.env.NODE_ENV !== "production" ? warning(!('destroyOnClose' in rawPreviewConfig), 'breaking', '`destroyOnClose` is no longer supported.') : void 0;
}
}
return splittedPreviewConfig;
}