feat(#433): achievements tab — full dashboard parity (#450)

* feat(#433): achievements 1:1 parity with dashboard

- Expanded model: AchievementsResponse now carries header stats
  (unlockedCount, discoveredCount, secretCount, totalCount, isStale,
  scanMeta/ScanStatus) and per-achievement fields (unlockedAt, secret, criteria)
- Added API endpoints: scan-status, rescan, reset-state, recent-unlocks
- Created AchievementIcon emoji mapper for all Lucide icon names
- Rewrote ViewModel with full state: scan tracking, recent unlocks,
  category/state filtering, rescan/reset actions with loading states
- Rewrote Screen: header stats row, scan status chip, stale indicator,
  category + state filter chips, recent unlocks section, expandable
  criteria, icon emoji, unlocked glow border, overflow menu with
  rescan/reset, reset confirmation dialog
- Added 30 string resources for all new UI elements

* fix: resolve CI compilation errors in achievements module

- Replace progress_pct references with correct Kotlin field progressPct (Achievement model uses @SerializedName for snake_case, Kotlin field is camelCase)

- Add missing onStart/onError parameters to safeLaunchLoad calls in loadScanStatus() and loadRecentUnlocks()

* fix: remove top padding on achievements tab content

* fix: remove redundant paddingValues on achievement LazyColumn

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-07-02 23:48:44 +03:00
1 parent 2bceac7ab3
commit f887146056
6 files changed
+941 -108

No files matched your search

+25
View File
@@ -391,6 +391,31 @@
<string name="achievements_empty_title">No achievements yet</string>
<string name="achievements_empty_desc">Complete tasks to unlock achievements.</string>
<string name="achievements_label_progress">Progress: %1$d / %2$d</string>
<string name="achievements_search_hint">Search achievements…</string>
<string name="achievements_stat_unlocked">Unlocked</string>
<string name="achievements_stat_discovered">Discovered</string>
<string name="achievements_stat_secret">Secret</string>
<string name="achievements_stat_total">Total</string>
<string name="achievements_scan_idle">Idle</string>
<string name="achievements_scan_running">Scanning…</string>
<string name="achievements_scan_scanning">Rescanning…</string>
<string name="achievements_scan_error">Error</string>
<string name="achievements_scan_count">%1$d scans</string>
<string name="achievements_stale">Cached</string>
<string name="achievements_filter_all">All</string>
<string name="achievements_state_unlocked">Unlocked</string>
<string name="achievements_state_discovered">Discovered</string>
<string name="achievements_state_secret">Secret</string>
<string name="achievements_recent_title">Recent Unlocks</string>
<string name="achievements_count_label">%1$d of %2$d achievements</string>
<string name="achievements_criteria_show">Show criteria</string>
<string name="achievements_criteria_hide">Hide criteria</string>
<string name="achievements_unlocked_at">Unlocked %1$s</string>
<string name="achievements_menu_desc">Achievements menu</string>
<string name="achievements_action_rescan">Rescan all sessions</string>
<string name="achievements_action_reset">Reset all achievement data</string>
<string name="achievements_reset_title">Reset achievements?</string>
<string name="achievements_reset_desc">This will wipe all unlock and discovery data. Achievements will be re-scanned from scratch on the next scan. This cannot be undone.</string>
<!-- Keys Screen -->
<string name="keys_empty_title">No environment keys reported</string>