Bestie Choice Sheet on home Mulai Curhat CTA. When the user has at least one prior session (bestieHistoryHasItemsProvider hits the chat- sessions history endpoint), the CTA opens a HaloBottomSheet with two cards: 'bestie yang udah kenal' -> /chat/history, 'bestie baru' -> /payment/entry. Empty history -> direct to /payment/entry. Bestie history list visual upgrade: HaloOrb (mitraId seed) + name + last-session date + topic pills + sessions count + ONLINE pill. Backend getCustomerHistory now returns topics, mitra_is_online, sessions_count in a single payload (no per-row presence round-trip). BestieOfflinePopup with two variants (returning | new_) replacing the legacy BestieUnavailableDialog. tanya admin ghost CTA on both variants opens the new TanyaAdminSheet. Stage 5's targeted-wait declined stub + Stage 7's chat-screen 409 stub + searching-screen call site all migrated to the real component. TanyaAdminSheet: HaloBottomSheet with WA + Telegram buttons, deeplinks fetched via supportHandlesProvider (CC-config-driven). url_launcher added to client_app; ios LSApplicationQueriesSchemes covers https/http/whatsapp/tg. Stage 2's OTP-blocked popup hubungi admin SnackBar stub also migrated to TanyaAdminSheet. Dev-only POST /internal/_test/seed-history-session lets Maestro 08 flow seed a history row before exercising the choice sheet. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
85 lines
2.2 KiB
YAML
85 lines
2.2 KiB
YAML
name: client_app
|
|
description: Halo Bestie - Client App
|
|
|
|
publish_to: 'none'
|
|
version: 1.0.0+1
|
|
|
|
environment:
|
|
sdk: '>=3.0.0 <4.0.0'
|
|
|
|
dependencies:
|
|
flutter:
|
|
sdk: flutter
|
|
|
|
# Firebase (Messaging only — Auth dropped in Phase 3.4, self-managed JWT now)
|
|
firebase_core: ^3.12.1
|
|
firebase_messaging: ^15.2.5
|
|
|
|
# Social login (kept — buttons gated server-side via /api/shared/auth-providers
|
|
# until the corresponding OAuth env vars are set on the backend)
|
|
google_sign_in: ^6.2.1
|
|
sign_in_with_apple: ^6.1.0
|
|
|
|
# HTTP & WebSocket
|
|
dio: ^5.4.3
|
|
web_socket_channel: ^3.0.3
|
|
|
|
# State management
|
|
flutter_riverpod: ^2.6.1
|
|
hooks_riverpod: ^2.6.1
|
|
riverpod_annotation: ^2.6.1
|
|
flutter_hooks: ^0.20.5
|
|
|
|
# Storage
|
|
shared_preferences: ^2.2.3 # onboarding flag, non-sensitive
|
|
flutter_secure_storage: ^9.2.2 # refresh token (encrypted)
|
|
|
|
# Navigation
|
|
go_router: ^13.2.1
|
|
flutter_local_notifications: ^21.0.0
|
|
|
|
# QR code rendering — used by the waiting-payment screen as a placeholder
|
|
# (mock mode encodes payment_session_id; real QR will come from Xendit later).
|
|
qr_flutter: ^4.1.0
|
|
|
|
# OS notification permission — used by the post-payment notif gate
|
|
# (Phase 4 Stage 4) and the home banner.
|
|
permission_handler: ^11.3.1
|
|
|
|
# External URL launching — Tanya Admin sheet (Phase 4 Stage 8) opens
|
|
# WhatsApp / Telegram via https deeplinks from CC-config-driven handles.
|
|
url_launcher: ^6.3.0
|
|
|
|
dev_dependencies:
|
|
flutter_test:
|
|
sdk: flutter
|
|
flutter_lints: ^3.0.0
|
|
riverpod_generator: ^2.6.2
|
|
build_runner: ^2.4.13
|
|
custom_lint: ^0.7.0
|
|
riverpod_lint: ^2.6.2
|
|
|
|
flutter:
|
|
uses-material-design: true
|
|
assets:
|
|
- assets/images/
|
|
- assets/images/splash/
|
|
- assets/fonts/
|
|
|
|
fonts:
|
|
- family: BricolageGrotesque
|
|
fonts:
|
|
- asset: assets/fonts/BricolageGrotesque-Variable.ttf
|
|
- family: Poppins
|
|
fonts:
|
|
- asset: assets/fonts/Poppins-Regular.ttf
|
|
- asset: assets/fonts/Poppins-Medium.ttf
|
|
weight: 500
|
|
- asset: assets/fonts/Poppins-SemiBold.ttf
|
|
weight: 600
|
|
- asset: assets/fonts/Poppins-Bold.ttf
|
|
weight: 700
|
|
- family: JetBrainsMono
|
|
fonts:
|
|
- asset: assets/fonts/JetBrainsMono-Variable.ttf
|