import { useState, useRef, useCallback } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { useDropzone } from 'react-dropzone' import { FaImage, FaVideo, FaMusic, FaCamera, FaUpload, FaDownload, FaPlay, FaPause, FaStop, FaRedo, FaCut, FaPalette, FaMagic, FaTrash, FaCopy, FaSave, FaShare, FaExpand, FaCompress, FaFilter, FaAdjust, FaSun, FaMoon, FaEraser, FaPaintBrush, FaCrop, FaRotate } from 'react-icons/fa' import Webcam from 'react-webcam' import toast from 'react-hot-toast' export default function MediaStudio({ language, theme }) { const [activeTab, setActiveTab] = useState('image') const [selectedFile, setSelectedFile] = useState(null) const [isProcessing, setIsProcessing] = useState(false) const [filters, setFilters] = useState({ brightness: 100, contrast: 100, saturation: 100, blur: 0, hue: 0 }) const [history, setHistory] = useState([]) const [historyIndex, setHistoryIndex] = useState(-1) const [cameraActive, setCameraActive] = useState(false) const [recording, setRecording] = useState(false) const webcamRef = useRef(null) const canvasRef = useRef(null) const tabs = [ { id: 'image', name: language === 'fa' ? 'تصویر' : 'Image', icon: FaImage }, { id: 'video', name: language === 'fa' ? 'ویدیو' : 'Video', icon: FaVideo }, { id: 'audio', name: language === 'fa' ? 'صدا' : 'Audio', icon: FaMusic }, { id: 'camera', name: language === 'fa' ? 'دوربین' : 'Camera', icon: FaCamera } ] const onDrop = useCallback((acceptedFiles) => { const file = acceptedFiles[0] if (file) { const reader = new FileReader() reader.onload = (e) => { setSelectedFile({ name: file.name, type: file.type, url: e.target.result, size: file.size }) saveToHistory(e.target.result) toast.success(language === 'fa' ? 'فایل با موفقیت آپلود شد' : 'File uploaded successfully') } reader.readAsDataURL(file) } }, []) const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'image/*': ['.jpeg', '.jpg', '.png', '.gif', '.webp'], 'video/*': ['.mp4', '.avi', '.mov', '.webm'], 'audio/*': ['.mp3', '.wav', '.ogg', '.m4a'] } }) const saveToHistory = (data) => { const newHistory = history.slice(0, historyIndex + 1) newHistory.push(data) setHistory(newHistory) setHistoryIndex(newHistory.length - 1) } const applyFilter = (filterType, value) => { setFilters(prev => ({ ...prev, [filterType]: value })) // Apply filter to canvas if (selectedFile && canvasRef.current) { const canvas = canvasRef.current const ctx = canvas.getContext('2d') const img = new Image() img.onload = () => { canvas.width = img.width canvas.height = img.height ctx.filter = `brightness(${filters.brightness}%) contrast(${filters.contrast}%) saturate(${filters.saturation}%) blur(${filters.blur}px) hue-rotate(${filters.hue}deg)` ctx.drawImage(img, 0, 0) } img.src = selectedFile.url } } const capturePhoto = () => { if (webcamRef.current) { const imageSrc = webcamRef.current.getScreenshot() setSelectedFile({ name: `capture_${Date.now()}.jpg`, type: 'image/jpeg', url: imageSrc, size: 0 }) saveToHistory(imageSrc) toast.success(language === 'fa' ? 'عکس گرفته شد' : 'Photo captured') } } const startRecording = () => { setRecording(true) toast.success(language === 'fa' ? 'ضبط شروع شد' : 'Recording started') } const stopRecording = () => { setRecording(false) toast.success(language === 'fa' ? 'ضبط متوقف شد' : 'Recording stopped') } const resetFilters = () => { setFilters({ brightness: 100, contrast: 100, saturation: 100, blur: 0, hue: 0 }) } const downloadFile = () => { if (selectedFile) { const a = document.createElement('a') a.href = selectedFile.url a.download = `edited_${selectedFile.name}` a.click() toast.success(language === 'fa' ? 'فایل دانلود شد' : 'File downloaded') } } const undo = () => { if (historyIndex > 0) { setHistoryIndex(historyIndex - 1) setSelectedFile(prev => ({ ...prev, url: history[historyIndex - 1] })) } } const redo = () => { if (historyIndex < history.length - 1) { setHistoryIndex(historyIndex + 1) setSelectedFile(prev => ({ ...prev, url: history[historyIndex + 1] })) } } return (
{/* Tab Navigation */}
{tabs.map(tab => { const Icon = tab.icon return ( ) })}
{/* Main Content */}
{/* Media Preview Area */}
{activeTab === 'camera' ? (
{cameraActive ? (
{recording ? ( ) : ( )}
) : ( )}
) : selectedFile ? (
{selectedFile.type.startsWith('image/') ? ( {selectedFile.name} ) : selectedFile.type.startsWith('video/') ? (
) : (

{isDragActive ? (language === 'fa' ? 'فایل را رها کنید' : 'Drop the file here') : (language === 'fa' ? 'فایل را بکشید یا کلیک کنید' : 'Drag & drop or click to upload') }

)}
{/* Tools Panel */}
{/* File Info */} {selectedFile && (

{language === 'fa' ? 'اطلاعات فایل' : 'File Info'}

{language === 'fa' ? 'نام:' : 'Name:'} {selectedFile.name}

{language === 'fa' ? 'نوع:' : 'Type:'} {selectedFile.type}

{language === 'fa' ? 'حجم:' : 'Size:'} {(selectedFile.size / 1024 / 1024).toFixed(2)} MB

)} {/* Actions */}

{language === 'fa' ? 'عملیات' : 'Actions'}

{/* Filters (for images) */} {selectedFile && selectedFile.type.startsWith('image/') && (

{language === 'fa' ? 'فیلترها' : 'Filters'}

applyFilter('brightness', e.target.value)} className="w-full" />
applyFilter('contrast', e.target.value)} className="w-full" />
applyFilter('saturation', e.target.value)} className="w-full" />
applyFilter('blur', e.target.value)} className="w-full" />