diff --git a/client/web/src/components/ImagePicker.tsx b/client/web/src/components/ImagePicker.tsx index 8a7f0296..bb42dec2 100644 --- a/client/web/src/components/ImagePicker.tsx +++ b/client/web/src/components/ImagePicker.tsx @@ -10,6 +10,7 @@ interface ImagePickerProps extends PropsWithChildren { className?: string; imageUrl?: string; // 初始image url, 仅children为空时生效 aspect?: number; + maxSize?: number; onChange?: (blobUrl: string) => void; disabled?: boolean; // 禁用选择 } @@ -43,6 +44,7 @@ export const ImagePicker: React.FC = React.memo((props) => { { closeModal(key); updateAvatar(croppedImageBlobUrl); diff --git a/client/web/src/components/ImageUploader.tsx b/client/web/src/components/ImageUploader.tsx index a0c2effc..21390afe 100644 --- a/client/web/src/components/ImageUploader.tsx +++ b/client/web/src/components/ImageUploader.tsx @@ -7,6 +7,7 @@ import { ImagePicker } from './ImagePicker'; interface ImageUploaderProps extends PropsWithChildren { circle?: boolean; aspect?: number; + maxSize?: number; className?: string; onUploadSuccess: (fileInfo: UploadFileResult) => void; } @@ -39,6 +40,7 @@ export const ImageUploader: React.FC = React.memo( 'rounded-full': props.circle, })} aspect={aspect} + maxSize={props.maxSize} disabled={loading} onChange={handlePickImage} > @@ -58,7 +60,14 @@ ImageUploader.displayName = 'ImageUploader'; export const AvatarUploader: React.FC = React.memo( (props) => { - return ; + return ( + + ); } ); AvatarUploader.displayName = 'AvatarUploader'; diff --git a/client/web/src/components/modals/ImageCropper.tsx b/client/web/src/components/modals/ImageCropper.tsx index d7c83df0..a6630127 100644 --- a/client/web/src/components/modals/ImageCropper.tsx +++ b/client/web/src/components/modals/ImageCropper.tsx @@ -11,9 +11,11 @@ import { ModalWrapper } from '../Modal'; export const ImageCropperModal: React.FC<{ imageUrl: string; aspect?: number; + maxSize?: number; onConfirm: (croppedImageBlobUrl: string) => void; }> = React.memo((props) => { const aspect = props.aspect ?? 1; + const maxSize = props.maxSize ?? Infinity; const [crop, setCrop] = useState({ x: 0, y: 0 }); const [zoom, setZoom] = useState(1); const [area, setArea] = useState({ width: 0, height: 0, x: 0, y: 0 }); @@ -21,7 +23,10 @@ export const ImageCropperModal: React.FC<{ const handleConfirm = async () => { const blobUrl = await getCroppedImg( await createImage(props.imageUrl), - area + area, + 0, + 'newFile.jpeg', + maxSize ); props.onConfirm(blobUrl); };