'use client' import { useCallback, useEffect, useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/primitives/dialog' import { updateUsername, checkUsernameAvailability } from '../lib/auth/actions' interface UsernameOnboardingDialogProps { open: boolean onComplete: () => void } export function UsernameOnboardingDialog({ open, onComplete }: UsernameOnboardingDialogProps) { const [username, setUsername] = useState('') const [isSaving, setIsSaving] = useState(false) const [error, setError] = useState(null) const [availability, setAvailability] = useState<'idle' | 'checking' | 'available' | 'taken'>( 'idle', ) const validate = (value: string): string | null => { if (value.length < 3) return 'Must be at least 3 characters' if (value.length > 30) return 'Must be at most 30 characters' if (!/^[a-zA-Z0-9_-]+$/.test(value)) return 'Only letters, numbers, hyphens, and underscores' return null } const checkAvailability = useCallback(async (value: string) => { const validationError = validate(value) if (validationError) { setAvailability('idle') return } setAvailability('checking') const result = await checkUsernameAvailability(value) setAvailability(result.available ? 'available' : 'taken') }, []) useEffect(() => { if (!username.trim()) { setAvailability('idle') return } const timer = setTimeout(() => checkAvailability(username.trim()), 300) return () => clearTimeout(timer) }, [username, checkAvailability]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() const trimmed = username.trim() const validationError = validate(trimmed) if (validationError) { setError(validationError) return } setError(null) setIsSaving(true) const result = await updateUsername(trimmed) if (result.success) { onComplete() } else { setError(result.error ?? 'Failed to set username') } setIsSaving(false) } const validationError = username.trim() ? validate(username.trim()) : null const canSubmit = !isSaving && !validationError && availability === 'available' return ( {}}> Choose your username

Pick a public username for the community hub. This will be visible on projects you share.

@ { setUsername(e.target.value) setError(null) }} placeholder="your-username" className="w-full rounded-md border border-input bg-background pl-7 pr-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50" disabled={isSaving} autoFocus minLength={3} maxLength={30} />
{/* Status indicators */} {username.trim() && !validationError && (
{availability === 'checking' && ( Checking availability... )} {availability === 'available' && ( Username is available )} {availability === 'taken' && ( Username is already taken )}
)} {validationError && (

{validationError}

)} {!username.trim() && (

3-30 characters. Letters, numbers, hyphens, and underscores only.

)}
{error && (
{error}
)}
) }