import React, { useState, useEffect, useRef } from 'react'; import { User, UserSettings } from '../../types'; import { CameraIcon, TrashIcon, UserIcon } from '../icons/Icons'; interface AccountModalProps { isOpen: boolean; onClose: () => void; user: User; settings: UserSettings; onUpdateUser: (user: User) => Promise; onUpdateSettings: (settings: UserSettings) => Promise; onDeleteAllData: () => Promise; } const AccountModal: React.FC = ({ isOpen, onClose, user, settings, onUpdateUser, onUpdateSettings, onDeleteAllData, }) => { const [username, setUsername] = useState(user.username); const [successMessage, setSuccessMessage] = useState(''); const [isSaving, setIsSaving] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const modalRef = useRef(null); const closeButtonRef = useRef(null); const fileInputRef = useRef(null); useEffect(() => { if (isOpen) { setUsername(user.username); setSuccessMessage(''); setTimeout(() => closeButtonRef.current?.focus(), 100); } }, [isOpen, user.username]); const handleUsernameSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (username.trim() && username !== user.username) { setIsSaving(true); try { await onUpdateUser({ ...user, username: username.trim() }); setSuccessMessage('Username updated successfully!'); setTimeout(() => setSuccessMessage(''), 3000); } catch { alert('Failed to update username.'); } finally { setIsSaving(false); } } }; const handleToggleNotifications = ( e: React.ChangeEvent ) => { onUpdateSettings({ ...settings, notificationsEnabled: e.target.checked }); }; const handleAvatarChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onloadend = async () => { setIsSaving(true); try { await onUpdateUser({ ...user, avatar: reader.result as string }); } finally { setIsSaving(false); } }; reader.readAsDataURL(file); } }; const handleRemoveAvatar = async () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { avatar, ...userWithoutAvatar } = user; setIsSaving(true); try { await onUpdateUser(userWithoutAvatar); } finally { setIsSaving(false); } }; const handleDelete = async () => { setIsDeleting(true); try { await onDeleteAllData(); } catch { alert('Failed to delete data.'); } finally { setIsDeleting(false); } }; if (!isOpen) return null; return (

Account Settings

Profile

{user.avatar ? ( User avatar ) : ( )}
{user.avatar && ( )}
setUsername(e.target.value)} className='flex-1 block w-full min-w-0 rounded-none rounded-l-md px-3 py-2 border border-slate-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm bg-white dark:bg-slate-700 dark:border-slate-600 dark:placeholder-slate-400 dark:text-white' />
{successMessage && (

{successMessage}

)}

Preferences

Enable Notifications

Danger Zone

Delete All Data

Permanently delete all your medications and history.

); }; const Spinner = () => ( ); export default AccountModal;