'use client' import { useActionState, useRef, useState } from 'react' import Image from 'next/image' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { updateProfileAction } from '@/actions/profile' interface ProfileEditorProps { email: string | null bio: string | null bioDetail: string | null hasAvatar: boolean avatarVersion: number } const ALLOWED = ['image/jpeg', 'image/png', 'image/webp'] const MAX_BYTES = 12 * 1024 * 1024 export function ProfileEditor({ email, bio, bioDetail, hasAvatar, avatarVersion }: ProfileEditorProps) { const [state, formAction, isPending] = useActionState(updateProfileAction, null) const [avatarSrc, setAvatarSrc] = useState( hasAvatar ? `/api/profile/avatar?v=${avatarVersion}` : null ) const [uploadError, setUploadError] = useState(null) const [uploading, setUploading] = useState(false) const fileRef = useRef(null) async function handleFile(e: React.ChangeEvent) { const file = e.target.files?.[0] if (!file) return setUploadError(null) if (!ALLOWED.includes(file.type)) { setUploadError('Alleen JPEG, PNG en WebP zijn toegestaan') return } if (file.size > MAX_BYTES) { setUploadError('Bestand is groter dan 12 MB') return } const reader = new FileReader() reader.onload = (ev) => setAvatarSrc(ev.target?.result as string) reader.readAsDataURL(file) setUploading(true) try { const fd = new FormData() fd.append('avatar', file) const res = await fetch('/api/profile/avatar', { method: 'POST', body: fd }) const data = await res.json() if (!res.ok) { setUploadError(data.error ?? 'Upload mislukt') setAvatarSrc(hasAvatar ? `/api/profile/avatar?v=${avatarVersion}` : null) } } finally { setUploading(false) if (fileRef.current) fileRef.current.value = '' } } return (

JPEG, PNG of WebP — max 12 MB

{uploadError &&

{uploadError}

}

Optioneel — wordt getoond in je accountmenu

Max. 160 tekens