import { useState, useEffect, FormEvent } from 'react'; import { useGetSettings, useUpdateSettings } from '../generated/anthoLumeAPIV1'; import type { Device, SettingsResponse } from '../generated/model'; import { UserIcon, PasswordIcon, ClockIcon } from '../icons'; import { Button } from '../components/Button'; import { useToasts } from '../components/ToastContext'; import { getErrorMessage } from '../utils/errors'; import { useTheme } from '../theme/ThemeProvider'; import type { ThemeMode } from '../utils/localSettings'; const themeModes: Array<{ value: ThemeMode; label: string; description: string }> = [ { value: 'light', label: 'Light', description: 'Always use the light palette.' }, { value: 'dark', label: 'Dark', description: 'Always use the dark palette.' }, { value: 'system', label: 'System', description: 'Follow your device preference.' }, ]; export default function SettingsPage() { const { data, isLoading } = useGetSettings(); const updateSettings = useUpdateSettings(); const settingsData = data?.status === 200 ? (data.data as SettingsResponse) : null; const { showInfo, showError } = useToasts(); const { themeMode, resolvedThemeMode, setThemeMode } = useTheme(); const [password, setPassword] = useState(''); const [newPassword, setNewPassword] = useState(''); const [timezone, setTimezone] = useState('UTC'); useEffect(() => { if (settingsData?.timezone && settingsData.timezone.trim() !== '') { setTimezone(settingsData.timezone); } }, [settingsData]); const handlePasswordSubmit = async (e: FormEvent) => { e.preventDefault(); if (!password || !newPassword) { showError('Please enter both current and new password'); return; } try { const response = await updateSettings.mutateAsync({ data: { password, new_password: newPassword, }, }); if (response.status >= 200 && response.status < 300) { showInfo('Password updated successfully'); setPassword(''); setNewPassword(''); return; } showError('Failed to update password: ' + getErrorMessage(response.data)); } catch (error) { showError('Failed to update password: ' + getErrorMessage(error)); } }; const handleTimezoneSubmit = async (e: FormEvent) => { e.preventDefault(); try { const response = await updateSettings.mutateAsync({ data: { timezone, }, }); if (response.status >= 200 && response.status < 300) { showInfo('Timezone updated successfully'); return; } showError('Failed to update timezone: ' + getErrorMessage(response.data)); } catch (error) { showError('Failed to update timezone: ' + getErrorMessage(error)); } }; if (isLoading) { return (
{themeModes.map(mode => (
))}
); } return (

{settingsData?.user.username || 'N/A'}

Change Password

setPassword(e.target.value)} className="w-full flex-1 appearance-none rounded-none border border-border bg-surface px-4 py-2 text-base text-content shadow-xs placeholder:text-content-subtle focus:border-transparent focus:outline-hidden focus:ring-2 focus:ring-primary-600" placeholder="Password" />
setNewPassword(e.target.value)} className="w-full flex-1 appearance-none rounded-none border border-border bg-surface px-4 py-2 text-base text-content shadow-xs placeholder:text-content-subtle focus:border-transparent focus:outline-hidden focus:ring-2 focus:ring-primary-600" placeholder="New Password" />

Appearance

Active mode: {resolvedThemeMode}

{themeModes.map(mode => { const isSelected = themeMode === mode.value; return ( ); })}

Change Timezone

Devices

{!settingsData?.devices || settingsData.devices.length === 0 ? ( ) : ( settingsData.devices.map((device: Device) => ( )) )}
Name Last Sync Created
No Results

{device.device_name || 'Unknown'}

{device.last_synced ? new Date(device.last_synced).toLocaleString() : 'N/A'}

{device.created_at ? new Date(device.created_at).toLocaleString() : 'N/A'}

); }