import React, { useState, useEffect, ChangeEvent, FormEvent } from 'react'; interface ProfileSettingsProps { currentUser: { id: number; email: string }; } interface Profile { id: number; email: string; appearance: 'light' | 'dark'; language: string; timezone: string; avatar_image: string | null; } const ProfileSettings: React.FC = ({ currentUser }) => { const [profile, setProfile] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [formData, setFormData] = useState({ appearance: 'light', language: 'en', timezone: 'UTC', avatar_image: '', }); useEffect(() => { const fetchProfile = async () => { try { const response = await fetch('/api/profile', { headers: { Accept: 'application/json' }, }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Failed to fetch profile.'); } const data: Profile = await response.json(); setProfile(data); setFormData({ appearance: data.appearance, language: data.language, timezone: data.timezone, avatar_image: data.avatar_image || '', }); } catch (err) { setError((err as Error).message); } finally { setLoading(false); } }; fetchProfile(); }, []); const handleChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleAvatarChange = (e: ChangeEvent) => { if (e.target.files && e.target.files[0]) { const reader = new FileReader(); reader.onloadend = () => { setFormData((prev) => ({ ...prev, avatar_image: reader.result as string })); }; reader.readAsDataURL(e.target.files[0]); } }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(null); setSuccess(null); try { const response = await fetch('/api/profile', { method: 'PATCH', credentials: 'include', headers: { 'Content-Type': 'application/json', Accept: 'application/json', }, body: JSON.stringify(formData), }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Failed to update profile.'); } const updatedProfile: Profile = await response.json(); setProfile(updatedProfile); setSuccess('Profile updated successfully.'); } catch (err) { setError((err as Error).message); } }; if (loading) { return (
Loading profile settings...
); } if (error) { return (
{error}
); } return (

Profile Settings

{success &&
{success}
} {error &&
{error}
}
{/* Appearance Selection */}
{/* Language Selection */}
{/* Timezone Selection */}
{/* Avatar Image Upload */}
{formData.avatar_image && ( Avatar Preview )}
{/* Save Button */}
); }; export default ProfileSettings;