import { useState, useEffect, useCallback } from 'react' import { useNavigate } from 'react-router-dom' import { useAuth } from '../contexts/AuthContext' import AddressLookup from '../components/AddressLookup' import { MapPinIcon, UserCircleIcon, CheckCircleIcon, ExclamationCircleIcon, XMarkIcon, } from '@heroicons/react/24/outline' export default function Settings() { const { user, refreshUser } = useAuth() const navigate = useNavigate() const [useAddressLookup, setUseAddressLookup] = useState(false) const [locationData, setLocationData] = useState({ state: user?.state || '', county: user?.county || '', city: user?.city || '', school_board: user?.school_board || '', }) const [isSaving, setIsSaving] = useState(false) const [saveStatus, setSaveStatus] = useState<'success' | 'error' | null>(null) const [errors, setErrors] = useState>({}) const API_URL = '/api' // Vite proxy handles dev routing // Close the drawer: return to the page the user came from, or home as fallback. const handleClose = useCallback(() => { if (window.history.length > 1) { navigate(-1) } else { navigate('/') } }, [navigate]) // Update form when user data changes useEffect(() => { if (user) { setLocationData({ state: user.state || '', county: user.county || '', city: user.city || '', school_board: user.school_board || '', }) } }, [user]) // Close on Escape useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') handleClose() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [handleClose]) const handleAddressFound = (location: any) => { setLocationData({ state: location.state, county: location.county, city: location.city, school_board: locationData.school_board, // Keep existing school board }) setUseAddressLookup(false) // Switch back to manual mode after lookup } const handleChange = (field: string, value: string) => { setLocationData(prev => ({ ...prev, [field]: value })) // Clear error for this field if (errors[field]) { setErrors(prev => { const newErrors = { ...prev } delete newErrors[field] return newErrors }) } // Clear save status setSaveStatus(null) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // Validate required fields const newErrors: Record = {} if (!locationData.state.trim()) newErrors.state = 'State is required' if (!locationData.county.trim()) newErrors.county = 'County is required' if (!locationData.city.trim()) newErrors.city = 'City is required' if (Object.keys(newErrors).length > 0) { setErrors(newErrors) return } setIsSaving(true) setSaveStatus(null) try { const token = localStorage.getItem('auth_token') const response = await fetch(`${API_URL}/auth/profile`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, }, body: JSON.stringify(locationData), }) if (response.ok) { setSaveStatus('success') // Refresh user data in context, then close the drawer. await refreshUser() setTimeout(handleClose, 900) } else { setSaveStatus('error') } } catch (error) { console.error('Failed to update location:', error) setSaveStatus('error') } finally { setIsSaving(false) } } return ( <> {/* Backdrop */}