import React, { useRef } from "react"; import Cropper, { ReactCropperElement } from "react-cropper"; import "cropperjs/dist/cropper.css"; import { Button, Modal } from "flowbite-react"; type CropModalProps = { isOpen: boolean; isActionsDisabled: boolean; selectedImage: any | null; croppedImage: any | null; setCropModalProps: (props: { isOpen: boolean; isActionsDisabled: boolean; selectedImage: any | null; croppedImage: any | null; }) => void; cropParams: { guides?: boolean; width?: number; height?: number; quality?: number; aspectRatio?: number; forceAspect?: boolean; }; }; export const CropModal: React.FC<CropModalProps> = ({ isOpen, setCropModalProps, cropParams, selectedImage, croppedImage, isActionsDisabled, }) => { const cropperRef = useRef<ReactCropperElement>(null); const getCropData = () => { if (typeof cropperRef.current?.cropper !== "undefined") { const croppedImage = cropperRef.current?.cropper .getCroppedCanvas({ width: cropParams.width, height: cropParams.height, maxWidth: cropParams.width, maxHeight: cropParams.height, }) .toDataURL( "image/jpeg", cropParams.quality || false ? cropParams.quality : 100 ); setCropModalProps({ isOpen: true, isActionsDisabled: false, selectedImage: selectedImage, croppedImage: croppedImage, }); } }; return ( <Modal dismissible show={isOpen} onClose={() => { setCropModalProps({ isOpen: false, isActionsDisabled: false, selectedImage: null, croppedImage: null, }); }} size={"7xl"} > <Modal.Header>Обрезать изображение</Modal.Header> <Modal.Body> <Cropper src={selectedImage} style={{ height: 400, width: "100%" }} responsive={true} // Cropper.js options initialAspectRatio={cropParams.aspectRatio || 1 / 1} aspectRatio={ cropParams.forceAspect || false ? cropParams.aspectRatio : undefined } guides={cropParams.guides || false} ref={cropperRef} /> <div className="mt-4"> <h2 className="font-bold text-md">Управление</h2> <p>Тяните за углы что-бы выбрать область</p> <p> Нажмите 2 раза на пустое место, что бы поменять режим выбора области на перемещение и обратно </p> <p>Используйте колёсико мыши что-бы изменить масштаб</p> </div> </Modal.Body> <Modal.Footer> <Button color={"blue"} disabled={isActionsDisabled} onClick={() => { getCropData(); }} > Сохранить </Button> <Button color={"red"} disabled={isActionsDisabled} onClick={() => { setCropModalProps({ isOpen: false, isActionsDisabled: false, selectedImage: null, croppedImage: null, }); }} > Отменить </Button> </Modal.Footer> </Modal> ); };