From 2c00fe6c66830c0fafcfbb3283a156d3e0b25684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=8C=E4=BA=9A=E7=9A=84=E8=A5=BF=E7=BA=A2=E6=9F=BF?= <97817985+nova1751@users.noreply.github.com> Date: Sat, 4 May 2024 12:51:23 +0800 Subject: [PATCH] feat: add imgInfo param for render function (#336) * feat: add imgInfo param for render function * Update src/Image.tsx Co-authored-by: afc163 * chore: update param name --------- Co-authored-by: afc163 --- .gitignore | 1 + docs/examples/toolbarRender.tsx | 16 ++++++++++++++++ src/Image.tsx | 11 ++++++++++- src/Operations.tsx | 4 ++++ src/Preview.tsx | 18 ++++++++++++++++-- 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 512f9835..ad90caa6 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ lib coverage yarn.lock package-lock.json +pnpm-lock.yaml es/ .storybook .doc diff --git a/docs/examples/toolbarRender.tsx b/docs/examples/toolbarRender.tsx index 13e3c238..26e8b107 100644 --- a/docs/examples/toolbarRender.tsx +++ b/docs/examples/toolbarRender.tsx @@ -41,6 +41,22 @@ export default function ToolbarRender() { }, }} /> + + test{JSON.stringify(image)}; + }, + toolbarRender(_, { image }) { + return
{JSON.stringify(image)}
; + }, + }} + /> ); } diff --git a/src/Image.tsx b/src/Image.tsx index a774df34..797c0e25 100644 --- a/src/Image.tsx +++ b/src/Image.tsx @@ -15,6 +15,13 @@ import type { PreviewProps, ToolbarRenderInfoType } from './Preview'; import Preview from './Preview'; import PreviewGroup from './PreviewGroup'; +export interface ImgInfo { + url: string; + alt: string; + width: string | number; + height: string | number; +} + export interface ImagePreviewType extends Omit< IDialogPropTypes, @@ -33,7 +40,7 @@ export interface ImagePreviewType movable?: boolean; imageRender?: ( originalNode: React.ReactElement, - info: { transform: TransformType }, + info: { transform: TransformType; image: ImgInfo }, ) => React.ReactNode; onTransform?: PreviewProps['onTransform']; toolbarRender?: ( @@ -233,6 +240,8 @@ const ImageInternal: CompoundedComponent = props => { mousePosition={mousePosition} src={src} alt={alt} + width={width} + height={height} fallback={fallback} getContainer={getPreviewContainer} icons={icons} diff --git a/src/Operations.tsx b/src/Operations.tsx index 0f88e087..32cec8d0 100644 --- a/src/Operations.tsx +++ b/src/Operations.tsx @@ -7,6 +7,7 @@ import { useContext } from 'react'; import { PreviewGroupContext } from './context'; import type { TransformType } from './hooks/useImageTransform'; import type { PreviewProps, ToolbarRenderInfoType } from './Preview'; +import type { ImgInfo } from './Image'; interface OperationsProps extends Pick< @@ -42,6 +43,7 @@ interface OperationsProps info: ToolbarRenderInfoType | Omit, ) => React.ReactNode; zIndex?: number; + image?: ImgInfo; } const Operations: React.FC = props => { @@ -73,6 +75,7 @@ const Operations: React.FC = props => { onFlipY, toolbarRender, zIndex, + image, } = props; const groupContext = useContext(PreviewGroupContext); const { rotateLeft, rotateRight, zoomIn, zoomOut, close, left, right, flipX, flipY } = icons; @@ -209,6 +212,7 @@ const Operations: React.FC = props => { }, transform, ...(groupContext ? { current, total: count } : {}), + image, }) : toolbarNode} diff --git a/src/Preview.tsx b/src/Preview.tsx index b1001ce4..db0b990c 100644 --- a/src/Preview.tsx +++ b/src/Preview.tsx @@ -12,6 +12,7 @@ import useTouchEvent from './hooks/useTouchEvent'; import useStatus from './hooks/useStatus'; import Operations from './Operations'; import { BASE_SCALE_RATIO } from './previewConfig'; +import type { ImgInfo } from './Image'; export type ToolbarRenderInfoType = { icons: { @@ -33,12 +34,15 @@ export type ToolbarRenderInfoType = { transform: TransformType; current: number; total: number; + image: ImgInfo; }; export interface PreviewProps extends Omit { imgCommonProps?: React.ImgHTMLAttributes; src?: string; alt?: string; + width?: number | string; + height?: number | string; fallback?: string; movable?: boolean; rootClassName?: string; @@ -62,7 +66,7 @@ export interface PreviewProps extends Omit { maxScale?: number; imageRender?: ( originalNode: React.ReactElement, - info: { transform: TransformType; current?: number }, + info: { transform: TransformType; current?: number; image?: ImgInfo }, ) => React.ReactNode; onClose?: () => void; onTransform?: (info: { transform: TransformType; action: TransformAction }) => void; @@ -101,6 +105,8 @@ const Preview: React.FC = props => { prefixCls, src, alt, + width, + height, fallback, movable = true, onClose, @@ -273,6 +279,13 @@ const Preview: React.FC = props => { /> ); + const image = { + url: src, + alt, + width, + height, + }; + return ( <> = props => { >
{imageRender - ? imageRender(imgNode, { transform, ...(groupContext ? { current } : {}) }) + ? imageRender(imgNode, { transform, image, ...(groupContext ? { current } : {}) }) : imgNode}
@@ -325,6 +338,7 @@ const Preview: React.FC = props => { onFlipY={onFlipY} onClose={onClose} zIndex={restProps.zIndex !== undefined ? restProps.zIndex + 1 : undefined} + image={image} /> );