"use client"; import type React from "react"; import { type ChangeEvent, useCallback, useEffect, useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { toast } from "@/components/ui/toaster"; import { useUser } from "@clerk/nextjs"; import { UploadCloud } from "lucide-react"; export const UpdateUserImage: React.FC = () => { const { user } = useUser(); const [image, setImage] = useState(user?.imageUrl ?? null); const [dragActive, setDragActive] = useState(false); useEffect(() => { if (user?.imageUrl) { setImage(user.imageUrl); } }, [user?.imageUrl]); const onChangePicture = useCallback( (e: ChangeEvent) => { toast("Uploading image..."); const file = e.target.files?.[0]; if (!file) { toast.error("No image selected"); return; } if (file.size / 1024 / 1024 > 2) { toast.error("File size too big (max 2MB)"); return; } if (file.type !== "image/png" && file.type !== "image/jpeg") { toast.error("File type not supported (.png or .jpg only)"); return; } const reader = new FileReader(); reader.onload = (e) => { setImage(e.target?.result as string); }; reader.readAsDataURL(file); if (!user) { toast.error("Only allowed for orgs"); return; } user .setProfileImage({ file }) .then(() => { toast.success("Image uploaded"); }) .catch(() => { toast.error("Error uploading image"); }); }, [setImage, user], ); return (
{ e.preventDefault(); if (!image) { toast.error("No image selected"); return; } await user?.setProfileImage({ file: image }); await user?.reload(); toast.success("Image uploaded"); }} > Your Avatar Click on the avatar to upload a custom one from your files.
Square image recommended. Accepted file types: .png, .jpg. Max file size: 2MB.