"use client"; import { useState, useRef } from "react"; import { Button } from "@/components/ui/button"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { updateAvatar } from "@/actions/settings"; import { Camera, Loader2 } from "lucide-react"; interface AvatarUploadProps { currentAvatar?: string | null; name: string; } export function AvatarUpload({ currentAvatar, name }: AvatarUploadProps) { const [loading, setLoading] = useState(false); const [preview, setPreview] = useState(currentAvatar || null); const [error, setError] = useState(null); const fileInputRef = useRef(null); async function handleFileChange(e: React.ChangeEvent) { const file = e.target.files?.[0]; if (!file) return; if (!file.type.startsWith("image/")) { setError("Please select an image file"); return; } if (file.size > 5 * 1024 * 1024) { setError("Image must be less than 5MB"); return; } const reader = new FileReader(); reader.onload = (e) => { setPreview(e.target?.result as string); }; reader.readAsDataURL(file); setLoading(true); setError(null); try { const formData = new FormData(); formData.append("avatar", file); const result = await updateAvatar(formData); setPreview(result.avatarUrl); } catch (err) { setError(err instanceof Error ? err.message : "Failed to upload avatar"); setPreview(currentAvatar || null); } finally { setLoading(false); } } return (
{name.charAt(0).toUpperCase()} {loading && (
)}

JPG, PNG or GIF. Max 5MB.

{error &&

{error}

}
); }