Payment catalog (Phase 5.x — see requirement/phase5-payment-catalog-plan.md):
- New tables payment_method_groups + payment_methods with seed (3 groups,
10 methods; GoPay seeded inactive pending Xendit channel confirmation).
- payment-catalog.service.js with two-layer cache (60s in-process + 1h
Valkey) and config:invalidate pub/sub fanout. Mutator API + casing-
tolerant findActiveMethodByCode for downstream validation.
- App-facing GET /api/client/payment-methods returns pre-grouped JSON,
active-only, empty groups dropped server-side.
- POST /api/client/payment-requests now validates `method` against the
catalog (INVALID_PAYMENT_METHOD 422) and stamps
product_metadata.preferred_payment_code (upper-cased).
- Control-center /internal/payment-{groups,methods}{,/:id,/reorder}
endpoints (full CRUD + idempotent reorder). New Payment Catalog page
wired into the CC nav.
- Customer app renders the catalog as collapsible groups (first expanded)
via paymentCatalogProvider; QRIS-only hardcoded fallback on 5xx so
checkout never hard-fails. Replaces the hardcoded _PayMethod enum.
- 10 brand SVGs (~63KB) bundled in client_app/assets/payment_icons/ from
github.com/hafidznoor/idn-finlogos. Xendit's per-channel media-asset
pages were planned but found decommissioned during implementation —
switched to idn-finlogos with the standard "channels-we-accept"
trademark posture. See assets/payment_icons/README.md for the workflow
to add new methods.
- 16 vitest cases covering the service + cache; full backend suite green
(162/162).
Customer-app splash + register polish:
- Splash rewritten per figma S1: warm vertical gradient, two ImageFiltered
radial orbs, 96×96 rounded-square logo tile, "HaloBestie" + "kamu gak
harus ngerasain ini sendirian." Self-driving navigation via context.go
after a 2.5s post-frame timer (native Android splash burns ~1-1.5s
before Flutter paints — 1s timer yielded near-zero visible duration).
Router early-returns null for isSplash so it never moves us off /splash
on its own.
- 3-page onboarding carousel removed: user clarified the new splash
REPLACES that carousel. Dropped /onboarding route, OnboardingScreen,
onboardingDoneProvider + gating, dead splash_{1,2,3}.png + the
splash_chat_hebat.png Flutter asset. Phase 4 /onboarding/* subroutes
untouched; Android-native launch_background drawable left alone.
- Register screen (login-by-phone) polished: circular pink back button +
72×72 logo badge (same brandLogoBg pink as splash, Transform.scale 1.4
to fill the tile). Step-dots indicator removed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
115 lines
3.5 KiB
YAML
115 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) — bundled SVGs under
|
|
# assets/payment_icons/, copied from github.com/hafidznoor/idn-finlogos.
|
|
# Xendit's per-channel media-asset pages were planned but found
|
|
# decommissioned during implementation. See
|
|
# `requirement/phase5-payment-catalog-plan.md` §7 for the sourcing decision.
|
|
flutter_svg: ^2.0.10+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
|