Improve config loading error handling in frontend by extracting common
logic and enforcing safer exit behavior.
Changes:
1. Extract handleConfigLoadError() function (DRY principle)
- Previously: Identical error handling code duplicated in two places
* Event listener for "configLoadError"
* Bootstrap polling via get_init_error command
- Now: Single reusable function called by both code paths
- Reduces code from 86 lines to 70 lines (-35 duplicates, +30 new)
2. Replace confirm() with forced exit (safer UX)
- Previously: User could click "Cancel" leaving app in broken state
* No tray menu initialized
* No AppState managed (all commands would fail)
* Window open but non-functional
- Now: App automatically exits after showing error message
- Rationale: When config is corrupted, graceful exit is the only safe option
3. Add TypeScript interface for type safety
- Define ConfigLoadErrorPayload interface explicitly
- Improves IDE autocomplete and catches typos at compile time
- Makes payload structure self-documenting
Benefits:
- Cleaner, more maintainable code (single source of truth)
- Safer user experience (no half-initialized state)
- Better type safety and developer experience
- Easier to add i18n support in the future (one string to translate)
This addresses code review feedback items #1 and #2.
This commit introduces fail-fast error handling for config loading failures,
replacing the previous silent fallback to default config which could cause
data loss (e.g., all user providers disappearing).
Key changes:
Backend (Rust):
- Replace AppState::new() with AppState::try_new() to explicitly propagate errors
- Remove Default trait to prevent accidental empty state creation
- Add init_status module as global error cache (OnceLock + RwLock)
- Implement dual-channel error notification:
1. Event emission (low-latency, may race with frontend subscription)
2. Command-based polling (reliable, guaranteed delivery)
- Remove unconditional save on startup to prevent overwriting corrupted config
Frontend (TypeScript):
- Add event listener for "configLoadError" (fast path)
- Add bootstrap-time polling via get_init_error command (reliable path)
- Display detailed error dialog with recovery instructions
- Prompt user to exit for manual repair
Impact:
- First-time users: No change (load() returns Ok(default) when file missing)
- Corrupted config: Application shows error and exits gracefully
- Prevents accidental config overwrite during initialization
Fixes the only critical issue identified in previous code review (silent
fallback causing data loss).
* feat: integrate i18next for internationalization support
- Added i18next and react-i18next dependencies for localization.
- Updated various components to utilize translation functions for user-facing text.
- Enhanced user experience by providing multilingual support across the application.
* feat: improve i18n implementation with better translations and accessibility
- Add proper i18n keys for language switcher tooltips and aria-labels
- Replace hardcoded Chinese console error messages with i18n keys
- Add missing translation keys for new UI elements
- Improve accessibility with proper aria-label attributes
---------
Co-authored-by: Jason <farion1231@gmail.com>
- Format all TypeScript/React code with Prettier
- Format all Rust code with cargo fmt
- Fix bundle identifier from .app to .desktop to avoid macOS conflicts
- Prepare codebase for v3.0.0 Tauri release