Librechat-Mobile/feature/settings/CLAUDE.md

3.6 KiB

feature:settings

Screen

SettingsScreen -- sealed interface SettingsRoute : NavKey with primary route SettingsTabbed (@Serializable data object). Receives onLogout and onNavigateBack callbacks.

Sections

  • Account: displays user profile from UserApi.getUser()
  • Appearance: theme toggle (System / Light / Dark) via ThemeDataStore
  • Server: shows current server URL from ServerDataStore
  • About: app version info
  • Danger Zone: delete account with confirmation dialog

Theme

  • ThemeMode enum: SYSTEM, LIGHT, DARK
  • Persisted in ThemeDataStore (DataStore)
  • setThemeMode() writes to DataStore; the app's root composable observes themeDataStore.themeMode flow
  • Applied via Compose MaterialTheme with isSystemInDarkTheme() for SYSTEM mode

Logout

  • SettingsViewModel.logout() calls AuthRepository.logout() which clears tokens from EncryptedSharedPreferences
  • Sets isLoggedOut = true in UI state; screen calls onLogout callback to navigate to auth graph

Delete Account

  • SettingsViewModel.deleteAccount() calls UserApi.deleteUser() then AuthRepository.logout()
  • Sets isAccountDeleted = true in UI state; triggers navigation to auth graph

ViewModel Dependencies

  • UserApi -- fetch/delete user profile
  • AuthRepository -- logout (clear tokens)
  • ThemeDataStore -- observe and set theme preference
  • ServerDataStore -- observe current server URL

Future Sections (from spec, not yet implemented)

  • Chat tab (font size, message layout, auto-scroll toggle)
  • Speech tab (STT/TTS engine config)
  • Data tab (import/export, clear chats, shared links management)
  • Balance tab (conditional, token credits display)
  • 2FA setup/disable in Account section

New Settings Sections

  • SettingsScreen now organized into: Account, Appearance, General (Language, Personalization), Chat (Presets), Advanced (Fork Behavior, Commands), Server, About, Danger Zone
  • Each new setting opens a dialog or navigates to a dedicated screen

Settings Sub-screens (via SettingsNavigation)

  • MemoriesScreen — full memory CRUD, enable/disable toggle, own ViewModel (MemoriesViewModel)
  • McpServersScreen — server list with status badges, CRUD, reinitialize, tools sheet (McpViewModel)
  • PresetManagerScreen — list/delete presets (PresetManagerViewModel)
  • CommandsConfigScreen — enable/disable slash commands
  • Routes: Memories, McpServers, PresetManager (all @Serializable data objects extending SettingsRoute)
  • Gotcha: Memories and MCP navigation routes defined in their own files (MemoriesNavigation.kt, McpNavigation.kt) but wired through SettingsNavigation.kt
  • Gotcha: McpServerDialog uses McpServerType enum (SSE, STREAMABLE_HTTP) — must match backend expectations
  • Gotcha: Memory keys are immutable after creation (edit dialog disables key field)

API Keys

  • ApiKeysScreen — list/create/delete API keys, own ViewModel (ApiKeysViewModel)
  • Route: ApiKeys (@Serializable data object extending SettingsRoute), accessible from Settings → Security section
  • ApiKeyCreateDialog is two-phase: name input → show created key value with copy button
  • Gotcha: The key value is only available in the creation response — it cannot be retrieved again from the server. The dialog must show it immediately after creation.

Dialogs

  • LanguageSelectorDialog — 37+ locales with search, single-select radio
  • ForkSettingsDialog — 3 fork modes (TARGET, BRANCHES, ALL)
  • PersonalizationDialog — "About you" + "Response style" text areas with enable toggle