import { Avatar, Box, Button, Card, Divider, Snackbar, Typography, } from '@mui/joy' import Modal from '@mui/joy/Modal' import ModalDialog from '@mui/joy/ModalDialog' import { useContext, useRef, useState } from 'react' import Cropper from 'react-easy-crop' import { UserContext } from '../../contexts/UserContext' import { resolvePhotoURL } from '../../utils/Helpers' import { getCroppedImg } from '../../utils/imageCropUtils' import { UploadFile } from '../../utils/TokenManager' const ProfileSettings = () => { const { userProfile, setUserProfile } = useContext(UserContext) const [displayName, setDisplayName] = useState(userProfile?.displayName || '') const [photoURL, setPhotoURL] = useState(userProfile?.image || '') const [isUploading, setIsUploading] = useState(false) const [snackbar, setSnackbar] = useState({ open: false, message: '', color: 'success', }) const fileInputRef = useRef() const [crop, setCrop] = useState({ x: 0, y: 0 }) const [zoom, setZoom] = useState(1) const [croppedAreaPixels, setCroppedAreaPixels] = useState(null) const [showCropper, setShowCropper] = useState(false) const [selectedFile, setSelectedFile] = useState(null) const onCropComplete = (croppedArea, croppedAreaPixels) => { setCroppedAreaPixels(croppedAreaPixels) } const handlePhotoChange = e => { const file = e.target.files[0] if (!file) return setSelectedFile(URL.createObjectURL(file)) setShowCropper(true) } const handleCropSave = async () => { setIsUploading(true) try { const croppedBlob = await getCroppedImg( selectedFile, croppedAreaPixels, 320, 320, 'image/jpeg', ) const formData = new FormData() formData.append('file', croppedBlob, 'profile.jpg') const response = await UploadFile('/users/profile_photo', { method: 'POST', body: formData, }) if (!response.ok) throw new Error('Upload failed') const data = await response.json() const url = resolvePhotoURL(data.url || data.sign) setPhotoURL(url) setUserProfile({ ...userProfile, image: url }) setSnackbar({ open: true, message: 'Profile photo updated!', color: 'success', }) } catch (err) { setSnackbar({ open: true, message: 'Failed to upload photo.', color: 'danger', }) } finally { setIsUploading(false) setShowCropper(false) setSelectedFile(null) } } const handleSave = () => { setUserProfile({ ...userProfile, displayName }) setSnackbar({ open: true, message: 'Profile updated!', color: 'success', }) } // Helper to resolve photoURL with baseURL if needed return (