feat: complete Simple Mode contextual routing and navigation state synchronization

This commit is contained in:
dwindown
2026-03-15 07:24:13 +07:00
parent faadc1865d
commit 25728583b3
21 changed files with 1095 additions and 320 deletions

142
handoff.md Normal file
View File

@@ -0,0 +1,142 @@
# Jamshalat Diary — Handoff Document
> Last updated: 2026-03-15
---
## Current State
The app is a Flutter-based Islamic daily companion with two operating modes:
- **Mode Lengkap** — Full features with 5 tabs: Beranda, Jadwal, Ibadah, Laporan, Alat
- **Mode Simple** — Streamlined with 5 tabs: Beranda, Jadwal, Tilawah, Murattal, Zikir
### Routing Architecture
Routes are defined in [router.dart](file:///Users/dwindown/CascadeProjects/jamshalat-diary/lib/app/router.dart). Key design:
- **Dual route paths** — Quran, Murattal, and Dzikir each exist as:
- Top-level routes (`/quran`, `/dzikir`) for Simple Mode bottom bar tabs
- Nested routes (`/tools/quran`, `/tools/dzikir`) for Full Mode Alat sub-screens
- **`parentNavigatorKey: _rootNavigatorKey`** — Used on routes that should **hide** the bottom nav bar (settings, qibla, murattal playback, all `/tools/*` sub-screens)
- **`isSimpleModeTab` flag** — Passed to screen widgets to control back button visibility
- **`ValueListenableBuilder`** — Wraps [_ScaffoldWithNav](file:///Users/dwindown/CascadeProjects/jamshalat-diary/lib/app/router.dart#174-259) and [AppBottomNavBar](file:///Users/dwindown/CascadeProjects/jamshalat-diary/lib/core/widgets/bottom_nav_bar.dart#10-108) to reactively update tabs when mode is toggled
### ⚠️ Critical: Hive Key Convention
Settings are stored under the Hive key **`'default'`**, NOT `HiveBoxes.settings`. This was a bug that was fixed across 7 files. Always use:
```dart
box.get('default')?.simpleMode ?? false;
```
### Completed Features (Steps 113)
| Step | Feature |
|---|---|
| 1 | myQuran Sholat API integration + Hive caching |
| 2 | EQuran.id API for Quran list, reading, audio, Ayat Hari Ini |
| 3 | Full Bahasa Indonesia localization |
| 4 | Ibadah Harian revamp (ShalatLog, TilawahLog, DzikirLog, PuasaLog) |
| 5 | UX/UI polish (Rawatib info, Kiblat compass, AppBar consistency) |
| 6 | Gamification point system |
| 7 | Tilawah active session tracker with cross-surah diff |
| 8 | Quran bookmarks (Last Read + Favorit Ayat) |
| 9 | Per-ayat audio playback |
| 10 | Full surah Murattal player with Qari selector |
| 11 | Murattal playlist navigation + auto-play next |
| 12 | Mode Hafalan (loop ayat range) |
| 13 | Murattal screen enhancements |
| — | Simple Mode / Full Mode dynamic routing |
| — | Lucide Icons migration |
| — | Live search debouncer |
| — | Bottom nav bar dynamic tabs |
---
## New API: muslim.backoffice.biz.id
Base URL: `https://muslim.backoffice.biz.id`
### A. Replacement — Migrate Data Sources
Replace current EQuran.id and local JSON with the user's own API for better control and reliability.
| Current Source | New Endpoint | Notes |
|---|---|---|
| EQuran.id Surah list | `GET /v1/quran/surah` | Includes `audio_url` (Mishari Alafasy) |
| EQuran.id Ayat per surah | `GET /v1/quran/ayah/surah?id={surahId}` | Arab, latin, translation, per-ayat audio, juz, page, hizb |
| Local dzikir JSON | `GET /v1/dzikir?type={pagi\|sore\|solat}` | Adds Dzikir Sesudah Sholat |
| EQuran.id random ayat | `GET /v1/quran/ayah/specific?surahId=X&ayahId=Y` | For Ayat Hari Ini |
### B. Enrichment — Enhance Existing Screens
| Feature | Endpoint | Where |
|---|---|---|
| Tafsir Kemenag | `GET /v1/quran/tafsir` | New tab on Quran Reading screen |
| Kata Per Kata (word-by-word) | `GET /v1/quran/word/ayah?surahId=X&ayahId=Y` | Toggle in Quran Reading screen |
| Browse by Juz | `GET /v1/quran/juz` | Option in Tilawah screen |
| Browse by Page (Mushaf) | `GET /v1/quran/ayah/page?id={pageId}` | Option in Tilawah screen |
| Asbabun Nuzul | `GET /v1/quran/asbab` | Inline on verses that have `asbab` reference |
| Asmaul Husna | `GET /v1/quran/asma` | Mini-feature in Alat/Beranda |
| Quran Theme index | `GET /v1/quran/theme` | Browse by Topic in Tilawah |
| Quran Search by meaning | `GET /v1/quran/ayah/find?query={word}` | Search bar in Tilawah screen |
### C. New Screens
Each new screen should be:
- Added to the **Alat** screen grid in Full Mode
- Listed in the **Beranda** Quick Actions in Simple Mode
- Routed under `/tools/{feature}` (Full Mode, hides bottom bar) and optionally as a top-level route for Simple Mode
| Screen | Endpoint | Description |
|---|---|---|
| **Kumpulan Doa** | `GET /v1/doa` | Categorized prayers (quran, hadits, harian, ibadah, haji, etc.) with search via `/v1/doa/find?query=X` |
| **Hadits Arba'in** | `GET /v1/hadits` | 42 Hadits with Arabic + Indonesian, searchable via `/v1/hadits/find?query=X` |
---
## Implementation Priority
### Phase 1: API Service Layer
- [ ] Create `muslim_api_service.dart` in `lib/data/services/`
- [ ] Base URL: `https://muslim.backoffice.biz.id`
- [ ] Implement HTTP client with error handling + caching pattern (similar to `equran_service.dart`)
### Phase 2: Replacement (migrate data sources)
- [ ] Migrate Surah listing to `/v1/quran/surah`
- [ ] Migrate Ayat reading to `/v1/quran/ayah/surah?id=X`
- [ ] Migrate Murattal audio URLs to new API `audio_url` field
- [ ] Migrate Dzikir data from local JSON to `/v1/dzikir?type=X`
- [ ] Add Dzikir Sesudah Sholat category
### Phase 3: Enrichment
- [ ] Quran Tafsir tab on reading screen
- [ ] Kata Per Kata toggle on reading screen
- [ ] Juz browser in Tilawah
- [ ] Quran search by meaning
- [ ] Asbabun Nuzul inline display
- [ ] Asmaul Husna mini-feature
### Phase 4: New Screens
- [ ] Kumpulan Doa screen + route + Alat grid entry + Beranda quick action
- [ ] Hadits Arba'in screen + route + Alat grid entry + Beranda quick action
---
## Key Files Reference
| File | Purpose |
|---|---|
| `lib/app/router.dart` | All navigation routes, dual-path routing, bottom nav logic |
| `lib/core/widgets/bottom_nav_bar.dart` | Dynamic bottom nav tabs (ValueListenableBuilder) |
| `lib/features/dashboard/presentation/dashboard_screen.dart` | Beranda with Quick Actions |
| `lib/features/tools/presentation/tools_screen.dart` | Alat grid |
| `lib/features/settings/presentation/settings_screen.dart` | Mode toggle (saves to Hive key `'default'`) |
| `lib/data/local/hive_boxes.dart` | Hive initialization + seed defaults |
| `lib/data/local/models/app_settings.dart` | Settings model with `simpleMode` field |
| `lib/data/services/equran_service.dart` | Current Quran API client (to be replaced) |
| `lib/features/quran/presentation/quran_screen.dart` | Tilawah screen |
| `lib/features/quran/presentation/quran_reading_screen.dart` | Quran reading |
| `lib/features/quran/presentation/quran_murattal_screen.dart` | Murattal player |
| `lib/features/dzikir/presentation/dzikir_screen.dart` | Dzikir counter |