import { useCallback, useEffect, useState } from 'react' import Cropper, { type Area } from 'react-easy-crop' import { ImagePlus, X } from 'lucide-react' import { getCroppedImage } from '../utils/cropImage' import styles from './ImageCropper.module.css' type ImageCropperProps = { value: string | null onChange: (value: string | null) => void aspect?: number uploadLabel?: string hint?: string changeLabel?: string } export function ImageCropper({ value, onChange, aspect = 1, uploadLabel = 'آپلود تصویر اصلی', hint = 'برای برش مربعی ۱:۱ کلیک کنید', changeLabel = 'تغییر تصویر', }: ImageCropperProps) { const [imageSrc, setImageSrc] = useState(null) const [crop, setCrop] = useState({ x: 0, y: 0 }) const [zoom, setZoom] = useState(1) const [croppedArea, setCroppedArea] = useState(null) useEffect(() => { setCrop({ x: 0, y: 0 }) setZoom(1) setCroppedArea(null) }, [aspect]) const onCropComplete = useCallback((_: Area, pixels: Area) => { setCroppedArea(pixels) }, []) function handleFile(e: React.ChangeEvent) { const file = e.target.files?.[0] if (!file) return const reader = new FileReader() reader.onload = () => { setImageSrc(reader.result as string) setCrop({ x: 0, y: 0 }) setZoom(1) setCroppedArea(null) } reader.readAsDataURL(file) e.target.value = '' } async function applyCrop() { if (!imageSrc || !croppedArea) return const cropped = await getCroppedImage(imageSrc, croppedArea, 'jpeg') onChange(cropped) setImageSrc(null) setZoom(1) setCrop({ x: 0, y: 0 }) } function cancelCrop() { setImageSrc(null) setZoom(1) setCrop({ x: 0, y: 0 }) } return (
{value && !imageSrc && (
پیش‌نمایش تصویر
)} {!value && !imageSrc && ( )} {imageSrc && (
)} {value && !imageSrc && ( )}
) }