From 442ef7a18ee8c2b4de64ddd491f4e671105bb2da Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Thu, 1 Jan 2026 07:02:47 +0000 Subject: [PATCH] UploadAvatar component --- .../frontend/src/components/upload-avatar.tsx | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/frontend/src/components/upload-avatar.tsx diff --git a/packages/frontend/src/components/upload-avatar.tsx b/packages/frontend/src/components/upload-avatar.tsx new file mode 100644 index 0000000..a8467be --- /dev/null +++ b/packages/frontend/src/components/upload-avatar.tsx @@ -0,0 +1,62 @@ +import { useRef, useState } from "react"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import { user } from "@/lib/server"; + +export function UploadAvatar({ + avatarURL, + onAvatarUploaded, + label, +}: { + avatarURL?: string | null; + onAvatarUploaded: (avatarURL: string) => void; + label?: string; +}) { + const [uploading, setUploading] = useState(false); + const [error, setError] = useState(null); + const fileInputRef = useRef(null); + + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + setUploading(true); + setError(null); + + await user.uploadAvatar({ + file, + onSuccess: (url) => { + onAvatarUploaded(url); + setUploading(false); + }, + onError: (msg) => { + setError(msg); + setUploading(false); + }, + }); + }; + + return ( +
+ {avatarURL && ( + Avatar + )} + + + {error && } +
+ ); +}