import React, { useEffect, useRef, useState } from "react"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { Label } from "./ui/label"; import { Textarea } from "./ui/textarea"; import { Dialog, DialogContent, DialogTitle } from "./ui/dialog"; import type { User as UserType } from "../App"; import { toast } from "sonner"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select"; interface ProfileEditorProps { user: UserType; onSave: (user: UserType) => void; onClose: () => void; } export function ProfileEditor({ user, onSave, onClose }: ProfileEditorProps) { const [name, setName] = useState(user.name ?? ""); const [email, setEmail] = useState(user.email ?? ""); const [studentId, setStudentId] = useState(user.studentId ?? ""); const [department, setDepartment] = useState(user.department ?? ""); const [yearLevel, setYearLevel] = useState(user.yearLevel ?? ""); const [major, setMajor] = useState(user.major ?? ""); // ✅ bio is editable here (user can override Clare-generated bio) const [bio, setBio] = useState(user.bio ?? ""); const [learningStyle, setLearningStyle] = useState(user.learningStyle ?? "visual"); const [learningPace, setLearningPace] = useState(user.learningPace ?? "moderate"); const [photoPreview, setPhotoPreview] = useState(user.avatarUrl ?? null); const fileInputRef = useRef(null); // ✅ Keep fields in sync if user changes while dialog is open useEffect(() => { setName(user.name ?? ""); setEmail(user.email ?? ""); setStudentId(user.studentId ?? ""); setDepartment(user.department ?? ""); setYearLevel(user.yearLevel ?? ""); setMajor(user.major ?? ""); setBio(user.bio ?? ""); setLearningStyle(user.learningStyle ?? "visual"); setLearningPace(user.learningPace ?? "moderate"); setPhotoPreview(user.avatarUrl ?? null); }, [ user.name, user.email, user.studentId, user.department, user.yearLevel, user.major, user.bio, user.learningStyle, user.learningPace, user.avatarUrl, ]); const handleSave = () => { if (!name.trim() || !email.trim()) { toast.error("Please fill in all required fields"); return; } const next: UserType = { ...user, name: name.trim(), email: email.trim(), studentId: studentId.trim() || undefined, department: department.trim() || undefined, yearLevel: yearLevel || undefined, major: major.trim() || undefined, // ✅ allow user edit bio: (bio ?? "").slice(0, 200), learningStyle: learningStyle || undefined, learningPace: learningPace || undefined, avatarUrl: photoPreview || undefined, }; onSave(next); toast.success("Profile updated successfully!"); onClose(); }; const handlePhotoSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; if (!file.type.startsWith("image/")) { toast.error("Please select an image file"); return; } if (file.size > 2 * 1024 * 1024) { toast.error("File size must be less than 2MB"); return; } const reader = new FileReader(); reader.onload = (ev) => { setPhotoPreview(ev.target?.result as string); toast.success("Photo updated successfully!"); }; reader.readAsDataURL(file); }; const handleChangePhotoClick = () => fileInputRef.current?.click(); return ( { if (!open) onClose(); }} >
{/* Header */}
Edit Profile
{/* Content */}
{/* Profile Picture */}
{photoPreview ? ( Profile ) : ( (name?.charAt(0) || "U").toUpperCase() )}

JPG, PNG or GIF. Max size 2MB

{/* Basic Information */}

Basic Information

setName(e.target.value)} placeholder="Enter your full name" />
setEmail(e.target.value)} placeholder="Enter your email" />
setStudentId(e.target.value)} placeholder="Enter your student ID" />
setDepartment(e.target.value)} placeholder="Enter your department" />
{/* Academic Background */}

Academic Background

setMajor(e.target.value)} placeholder="Enter your major" />
{/* Bio (Editable) */}