import { useState, useEffect } from 'react'; import { Box, Typography, Button, useColorScheme, Autocomplete, TextField, CircularProgress, } from '@mui/material'; import { CardContainer } from '@/components/CardContainer'; import { useTranslation } from 'react-i18next'; import { ThemeToggleButton } from '@/components/ThemToggle'; import { PageWrapper } from '../components/PageWrapper'; import { Icon } from '@rkheftan/harmony-ui'; import { Sun1, Moon, Calendar1 } from 'iconsax-react'; import { useApi } from '@/hooks/useApi'; import { fetchProfile, saveSettings } from '../api/settingsApi'; type ThemeMode = 'light' | 'dark'; type CalendarType = 'christian' | 'solar' | 'lunar'; interface SettingsState { language: string; calendar: CalendarType; theme: ThemeMode; } const languageOptions = [ { code: 'en', label: 'English', apiValue: 1 }, { code: 'fa', label: 'فارسی', apiValue: 2 }, ]; const calendarOptions: { key: CalendarType; apiValue: number }[] = [ { key: 'christian', apiValue: 1 }, { key: 'solar', apiValue: 2 }, { key: 'lunar', apiValue: 3 }, ]; const themeApiMap: Record = { light: 1, dark: 2 }; export function SettingPage() { const { t, i18n } = useTranslation(['setting']); const { mode, setMode } = useColorScheme(); const [savedSettings, setSavedSettings] = useState({ language: i18n.language, calendar: 'solar', theme: mode === 'light' || mode === 'dark' ? mode : 'light', }); const [draftSettings, setDraftSettings] = useState(savedSettings); const [isEditing, setIsEditing] = useState(false); const { data: profileData, loading: isFetching, error: fetchError, } = useApi(fetchProfile); const { data: saveData, loading: isSaving, error: saveError, execute: executeSaveSettings, } = useApi(saveSettings); useEffect(() => { if (profileData?.success && profileData.userSettings) { const { theme, calendarType, language } = profileData.userSettings; const themeReverseMap: { [key: number]: ThemeMode | undefined } = { 1: 'light', 2: 'dark', }; const newSettings: SettingsState = { theme: themeReverseMap[theme] || 'light', calendar: calendarOptions.find((c) => c.apiValue === calendarType)?.key || 'solar', language: languageOptions.find((l) => l.apiValue === language)?.code || 'en', }; setSavedSettings(newSettings); setDraftSettings(newSettings); setMode(newSettings.theme); i18n.changeLanguage(newSettings.language); } }, [profileData, setMode, i18n]); useEffect(() => { if (saveData?.success) { setMode(draftSettings.theme); setSavedSettings(draftSettings); i18n.changeLanguage(draftSettings.language); setIsEditing(false); } }, [saveData, draftSettings, setMode, i18n]); useEffect(() => { if (isEditing) { const resolvedMode = mode === 'light' || mode === 'dark' ? mode : 'light'; setDraftSettings({ ...savedSettings, theme: resolvedMode }); } }, [isEditing, savedSettings, mode]); const handleCancel = () => { setIsEditing(false); setDraftSettings(savedSettings); setMode(savedSettings.theme); }; const handleEditToggle = () => { if (isEditing) { const languageObj = languageOptions.find( (o) => o.code === draftSettings.language, ); const calendarObj = calendarOptions.find( (c) => c.key === draftSettings.calendar, ); if (languageObj && calendarObj) { executeSaveSettings({ theme: themeApiMap[draftSettings.theme], calendarType: calendarObj.apiValue, language: languageObj.apiValue, }); } } else { setIsEditing(true); } }; const getErrorMessage = (error: unknown): string | null => { if (!error) return null; if (error instanceof Error) return error.message; return String(error); }; return ( {isEditing && ( )} } > {isFetching ? ( ) : fetchError ? ( {getErrorMessage(fetchError)} ) : ( {getErrorMessage(saveError) && ( {getErrorMessage(saveError)} )} {t('settings.theme')} {isEditing ? ( { setDraftSettings((prev) => ({ ...prev, theme: newTheme, })); }} /> ) : ( {t(`settings.${savedSettings.theme}`)} )} {t('settings.language')} {isEditing ? ( o.label} value={languageOptions.find( (o) => o.code === draftSettings.language, )} onChange={(_, v) => v && setDraftSettings((prev) => ({ ...prev, language: v.code, })) } renderInput={(p) => } size="small" fullWidth disableClearable /> ) : ( { languageOptions.find( (o) => o.code === savedSettings.language, )?.label } )} {t('settings.calendar')} {isEditing ? ( c.key)} getOptionLabel={(key) => t(`settings.${key}`)} value={draftSettings.calendar} onChange={(_, v) => v && setDraftSettings((prev) => ({ ...prev, calendar: v })) } renderInput={(params) => } size="small" fullWidth disableClearable /> ) : ( {t(`settings.${savedSettings.calendar}`)} )} )} ); }