'use client'; import { useState, useRef } from 'react'; import { Upload, User, X, Loader2 } from 'lucide-react'; interface AgentAvatarUploadProps { agentId: string; currentAvatarUrl?: string | null; displayName?: string; canEdit?: boolean; onUpdated?: () => void; } export function AgentAvatarUpload({ agentId, currentAvatarUrl, displayName = 'Agent', canEdit = false, onUpdated, }: AgentAvatarUploadProps) { const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); const [previewUrl, setPreviewUrl] = useState(currentAvatarUrl || null); const inputRef = useRef(null); const handleUpload = async (file: File) => { setUploading(true); setError(null); try { // Upload file const formData = new FormData(); formData.append('file', file); formData.append('type', 'agent_avatar'); const uploadRes = await fetch('/api/assets/upload', { method: 'POST', body: formData, }); if (!uploadRes.ok) { throw new Error('Failed to upload file'); } const uploadData = await uploadRes.json(); // Convert relative URL to use our API proxy let imageUrl = uploadData.processed_url || uploadData.original_url; if (imageUrl && imageUrl.startsWith('/static/')) { // Proxy through our API route imageUrl = `/api${imageUrl}`; } // Update agent DAIS const updateRes = await fetch(`/api/agents/${agentId}/dais`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ vis: { avatar_url: imageUrl }, }), }); if (!updateRes.ok) { throw new Error('Failed to update avatar'); } setPreviewUrl(imageUrl); onUpdated?.(); } catch (e) { setError(e instanceof Error ? e.message : 'Upload failed'); } finally { setUploading(false); } }; const handleRemove = async () => { setUploading(true); setError(null); try { const updateRes = await fetch(`/api/agents/${agentId}/dais`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ vis: { avatar_url: null }, }), }); if (!updateRes.ok) { throw new Error('Failed to remove avatar'); } setPreviewUrl(null); onUpdated?.(); } catch (e) { setError(e instanceof Error ? e.message : 'Remove failed'); } finally { setUploading(false); } }; const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { handleUpload(file); } }; return (

Avatar

{error && (
{error}
)}
{/* Avatar Preview */}
{previewUrl ? ( <> {/* eslint-disable-next-line @next/next/no-img-element */} {displayName} {canEdit && ( )} ) : (
)} {uploading && (
)}
{/* Upload Controls */} {canEdit && (

Upload a custom avatar for this agent. Recommended size: 256x256px.

)}
); }