Phase 4 §4: payment-before-pair for returning users + Maestro suite
Stages 5.1, 5.3, 5.4 of the returning-user flow rework. All three §4 entry paths now require payment BEFORE pairing, matching the updated mermaid spec. * Spec (requirement/flow_customer.mermaid.md §4): payment block converges three call-sites (bestie-yang-udah-kenal-online, bestie-baru, offline-popup → cari bestie lain). PairRoute dispatches lama → targeted pair, baru/cari-lain → §3 blast. §3 retains its post-payment-shared contract. * Stage 5.1 (client_app): PaymentDraft carries targetedMitraId + topicSensitivity. bestie_history_list seeds the draft + pushes /payment/entry (was legacy /payment). searching_screen branches on draft.targetedMitraId for blast-vs-targeted dispatch. payment_entry uses resetExceptTarget(); bestie_choice_sheet + home _onCurhatBestieBaruPressed call explicit reset() before push so the keepAlive draft can't leak stale targeting into a blast. * Stage 5.3 (client_app): new BestieOfflineVariant.prePayReturning. Bestie-history-list _BestieRow splits tappable from dim so offline rows render dimmed but route taps into the popup. CTA "cari bestie lain" resets the draft + pushes /payment/entry. * Stage 5.4 (client_app): deleted legacy /payment route, payment_screen.dart, payment_notifier.dart(+.g.dart). router cleaned. * Tests (requirement/phase4-customer-flow.md + client_app/.maestro/): six Maestro flows TS-01..TS-06 covering every §4 branching point, all passing end-to-end. Shared onboarding prelude under .maestro/subflows/. New helper scripts: accept_latest_pending, force_mitra_offline, force_other_mitra_online, reset_all_mitras_online, mitra_accept_latest_internal. New backend _test endpoints to match. /reset-phone now cascade-deletes customer_transactions (FK was blocking). /force-pairing-timeout branches targeted (RETURNING_CHAT_TIMEOUT via expireTargetedPairingRequest, now exported) vs blast (PAIRING_FAILED). seed_history_session also outputs MITRA_NAME_RE (regex-escaped) for reliable selectors against display names containing regex specials. * mitra_app: dispose-during-deactivate guardrail for back-press on the mitra chat screen after the customer's goodbye message. Pending real emulator repro verification (carried over from 2026-05-15). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -248,22 +248,50 @@ flowchart TD
|
||||
flowchart TD
|
||||
CTA["'curhat sama bestie baru' 🟢"] --> Choice["Bestie Choice Sheet<br/>(BestieChoiceSheet) 🟢"]
|
||||
Choice -->|"bestie yang udah kenal"| HistList["Bestie History List<br/>(BestieHistoryList) 🟢"]
|
||||
Choice -->|"bestie baru"| BlastFlow["→ S7 Soft-prompt + Blast<br/>(see diagram 3)"]
|
||||
Choice -->|"bestie baru"| PickMethod
|
||||
|
||||
HistList --> PickBestie["pick bestie"]
|
||||
PickBestie --> CheckOnline{"bestie online?"}
|
||||
CheckOnline -->|"no"| OfflinePopup["Bestie Offline Popup<br/>(returning variant) 🟢"]
|
||||
OfflinePopup -->|"cari bestie lain"| BlastFlow
|
||||
OfflinePopup -->|"cari bestie lain"| PickMethod
|
||||
OfflinePopup -->|"tanya admin"| AdminSheet["Sheet · tanya admin<br/>(WA / Telegram) 🟢"]
|
||||
CheckOnline -->|"yes"| Targeted["Request targeted pair<br/>'Menunggu bestie tertentu' 🟢<br/>(20s countdown overlay)"]
|
||||
CheckOnline -->|"yes"| PickMethod["Pilih cara curhat<br/>(chat / voice call) 🟡"]
|
||||
PickMethod --> PickDuration["Pemilihan harga<br/>(5 durations, full screen) 🟡"]
|
||||
PickDuration --> PayMethod["Cara bayar (QRIS-first) 🟡"]
|
||||
PayMethod --> Pay["Xendit checkout<br/>(QRIS / e-wallet) 🟡"]
|
||||
Pay --> WaitPay["Waiting Payment<br/>(20-min QRIS clock) 🟡"]
|
||||
WaitPay --> PayStat{"payment status"}
|
||||
PayStat -->|"timeout 20 min"| PayExpired["Pembayaran expired 🟡<br/>→ retry"]
|
||||
PayExpired --> Pay
|
||||
PayStat -->|"paid"| PairRoute{"specific bestie?<br/>(branch user came from)"}
|
||||
PairRoute -->|"yes · lama"| Targeted["Request targeted pair<br/>'Menunggu bestie tertentu' 🟢<br/>(20s countdown overlay)"]
|
||||
PairRoute -->|"no · baru / cari lain"| BlastFlow["→ S7 Soft-prompt + Blast<br/>(see diagram 3)"]
|
||||
Targeted --> TargetedRes{"mitra answers?"}
|
||||
TargetedRes -->|"accept"| S10["→ S10 Chat Room"]
|
||||
TargetedRes -->|"reject / timeout"| OfflinePopup
|
||||
|
||||
classDef missing fill:#ffe5e5,stroke:#c44979
|
||||
classDef partial fill:#fff4d6,stroke:#c69b3f
|
||||
class PickMethod,PickDuration,PayMethod,Pay,WaitPay,PayExpired partial
|
||||
```
|
||||
|
||||
> **Payment block added 2026-05-18:** the `PickMethod → … → WaitPay` chain
|
||||
> mirrors §2's payment block — the **screens already exist** (reused from
|
||||
> §2), but the *routing for the returning branches* through them is not yet
|
||||
> wired in `client_app`. Three call-sites converge at `PickMethod`:
|
||||
> 1. `Choice → "bestie yang udah kenal" → PickBestie → CheckOnline (yes)` — pay, then targeted pair
|
||||
> 2. `Choice → "bestie baru"` — pay, then blast (handoff to §3)
|
||||
> 3. `OfflinePopup → "cari bestie lain"` — pay, then blast (handoff to §3)
|
||||
>
|
||||
> After `PayStat → "paid"`, the `PairRoute` decision dispatches by the
|
||||
> branch the user came from: targeted pair (case 1) or blast/§3 (cases
|
||||
> 2 & 3). Today the lama branch (case 1) goes from `PickBestie` straight
|
||||
> into a tier-pick + auto-confirm shortcut that skips QRIS; the baru
|
||||
> branch (case 2) hops straight into §3 without paying — both tracked as
|
||||
> the Stage-5 returning-user payment migration. The 🟡 marks reflect
|
||||
> "screen exists, branch wiring missing", not new screens to build.
|
||||
> Mitra-side targeted accept/reject UX is unchanged.
|
||||
|
||||
---
|
||||
|
||||
## 5. Chat Room (S10) — countdown UX
|
||||
|
||||
Reference in New Issue
Block a user