import { useEffect, useState } from 'react'; import { Loader2, Check } from 'lucide-react'; import { Button } from './ui/button'; import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; import { Input } from './ui/input'; import { Label } from './ui/label'; import { useSession } from '../lib/auth-client'; import { validatePhoneOrEmail } from '../lib/validators'; export function ProfileSettings() { const { data: session } = useSession(); const [piFirstName, setPiFirstName] = useState(''); const [bldgCode, setBldgCode] = useState(''); const [lab, setLab] = useState(''); const [contact, setContact] = useState(''); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const [saved, setSaved] = useState(false); useEffect(() => { fetch('/api/profile', { credentials: 'include' }) .then(r => (r.ok ? r.json() : null)) .then(data => { if (data) { setPiFirstName(data.pi_first_name || ''); setBldgCode(data.bldg_code || ''); setLab(data.lab || ''); setContact(data.contact || ''); } }) .finally(() => setLoading(false)); }, []); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(''); setSaved(false); if (!piFirstName.trim() || !bldgCode.trim() || !lab.trim()) { setError('PI first name, building code, and lab are required.'); return; } if (contact.trim() && !validatePhoneOrEmail(contact.trim())) { setError('Contact must be a valid phone number or email address.'); return; } setSaving(true); const res = await fetch('/api/profile', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ pi_first_name: piFirstName.trim(), bldg_code: bldgCode.trim(), lab: lab.trim(), contact: contact.trim() || undefined, }), }); setSaving(false); if (res.ok) { setSaved(true); setTimeout(() => setSaved(false), 3000); } else { const data = await res.json().catch(() => ({})); setError(data.error || 'Failed to save profile.'); } } if (loading) { return (
); } return (

Profile settings

Update your account details and lab defaults.

Account

{session?.user.name || '—'}

{session?.user.email || '—'}

Lab defaults
setPiFirstName(e.target.value)} required placeholder="e.g. Smith" />
setBldgCode(e.target.value)} required placeholder="e.g. EER" />
setLab(e.target.value)} required placeholder="e.g. 3.822" />
setContact(e.target.value)} placeholder="Phone (e.g. 555-123-4567) or email" />
{error &&

{error}

} {saved && (

Saved

)}
); }