Files
halobestie-clone/client_app/pubspec.yaml
Ramadhan Sjamsani 2c95fd040d Phase 5.x payment revamp + Xendit Stage-8 prep
- Backend wraps idn-finlogos npm at /assets/payment-icons/<slug>.svg with
  1y immutable cache. Mobile drops bundled SVGs (only placeholder remains)
  and fetches via flutter_cache_manager. payment_methods.icon is now a
  CSV of slugs; catalog emits icon_urls[]. CARDS tile renders Visa + MC +
  JCB side by side.
- Per-method min/max amount bounds (BIGINT, nullable). Picker greys out
  out-of-range tiles with subtitle; backend gates with INVALID_PAYMENT_AMOUNT
  (422). Defense in depth against stale-catalog clients.
- Xendit channel codes corrected from authoritative docs
  (BCA_VA -> BCA_VIRTUAL_ACCOUNT, CREDIT_CARD -> CARDS, ovo -> ovo-new,
  shopeepay -> shopee-pay, ...). 18 methods x 5 groups seeded with
  Xendit-published per-channel min/max.
- Re-runnable seed (ON CONFLICT DO NOTHING on payment_code + new unique
  index on group name). Operator CC edits never clobbered across re-runs.
  One-shot reset + inspect scripts under backend/.dev/.
- Customer redirect HTML pages at /payment/return/{success,failure},
  brand-styled with "Buka HaloBestie" CTA firing halobestie:// deeplink.
  URL scheme registered on Android (intent-filter w/ BROWSABLE on
  MainActivity) and iOS (CFBundleURLTypes). Waiting-payment poller still
  owns confirmation; deeplink just brings the activity to foreground.
- Control center payment-catalog page: min/max inputs + columns. Other
  CC pages restyled with new theme tokens (separate work, bundled here).

169/169 backend tests pass. See requirement/phase5-payment-revamp-2026-05-27.md
for the full revamp doc. Stage 8 (E2E) still pending: webhook URL routing
decision + two client_app follow-ups (legacy /chat/request removal,
extension Custom Tab).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:33:51 +08:00

116 lines
3.5 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
# Payment method icons (Phase 5.x catalog). Source-of-truth is the backend
# `/assets/payment-icons/<slug>.svg` endpoint, which wraps the `idn-finlogos`
# npm package. Mobile only bundles `placeholder.svg` as the first-launch /
# offline fallback; everything else is fetched on demand and persisted via
# `flutter_cache_manager` for far-future reuse.
flutter_svg: ^2.0.10+1
flutter_cache_manager: ^3.3.1
# 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
# Generates launcher icons for Android + iOS from a single source PNG.
# Config block below; run `dart run flutter_launcher_icons` to regenerate.
flutter_launcher_icons: ^0.13.1
# In-repo lint rules — lives at the repo root so client_app + mitra_app
# share the same set. Adds `no_ref_in_dispose` and any future repo-wide
# guardrails. See halo_lints/lib/halo_lints.dart.
halo_lints:
path: ../halo_lints
# Launcher-icon config. Background color mirrors HaloTokens.brandLogoBg
# (#FF699F) from lib/core/theme/halo_tokens.dart — the documented bg for
# monochrome/white logos. If the source logo ever becomes full-color,
# switch both values to `#FFFFFF` (HaloTokens.surface).
flutter_launcher_icons:
android: true
ios: true
image_path: "assets/icons/logo.png"
remove_alpha_ios: true
background_color_ios: "#FF699F"
min_sdk_android: 24
adaptive_icon_background: "#FF699F"
adaptive_icon_foreground: "assets/icons/logo.png"
flutter:
uses-material-design: true
assets:
- assets/images/
- assets/icons/
- assets/payment_icons/
- 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