Files
halobestie-clone/client_app/assets/payment_icons/ovo.svg
Ramadhan Sjamsani 1f6d8e09ae Phase 5.x payment catalog + customer-app splash/register polish
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>
2026-05-26 23:06:46 +08:00

11 lines
2.5 KiB
XML

<svg width="64" height="65" viewBox="0 0 64 65" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3802_16524)">
<path d="M31.9574 64.9375C25.7648 64.9375 20.2539 63.574 15.4248 60.8469C10.5957 58.0631 6.81758 54.2282 4.09055 49.3423C1.36352 44.3995 0 38.8034 0 32.554C0 26.3045 1.36352 20.7084 4.09055 15.7657C6.87439 10.8229 10.6809 6.95962 15.51 4.17577C20.3959 1.39192 25.9352 0 32.1278 0C38.2637 0 43.7461 1.39192 48.5752 4.17577C53.4612 6.9028 57.2392 10.7377 59.9095 15.6804C62.6365 20.6232 64 26.2477 64 32.554C64 38.8034 62.6365 44.3995 59.9095 49.3423C57.1824 54.2282 53.3759 58.0631 48.49 60.8469C43.6609 63.574 38.15 64.9375 31.9574 64.9375ZM31.9574 59.9095C37.241 59.9095 41.8997 58.7732 45.9334 56.5007C49.9672 54.2282 53.0919 51.0182 55.3076 46.8709C57.5801 42.7235 58.7164 37.9512 58.7164 32.554C58.7164 27.1567 57.6085 22.3844 55.3928 18.237C53.1771 14.0329 50.0524 10.7945 46.0186 8.52198C41.9849 6.19264 37.3546 5.02797 32.1278 5.02797C26.901 5.02797 22.2423 6.19264 18.1518 8.52198C14.0613 10.7945 10.8797 14.0329 8.60719 18.237C6.39148 22.3844 5.28362 27.1567 5.28362 32.554C5.28362 37.9512 6.39148 42.7235 8.60719 46.8709C10.8229 51.0182 13.9476 54.2282 17.9814 56.5007C22.0151 58.7732 26.6738 59.9095 31.9574 59.9095ZM31.9574 57.5234C27.1851 57.5234 22.9525 56.5007 19.2597 54.4554C15.5668 52.3534 12.6977 49.4275 10.6525 45.6778C8.664 41.8713 7.66977 37.4967 7.66977 32.554C7.66977 27.6112 8.69241 23.2366 10.7377 19.4301C12.783 15.6236 15.6236 12.6693 19.2597 10.5673C22.9525 8.46517 27.1851 7.41412 31.9574 7.41412C36.7297 7.41412 40.9623 8.46517 44.6551 10.5673C48.348 12.6693 51.217 15.652 53.2623 19.5153C55.3076 23.3218 56.3302 27.668 56.3302 32.554C56.3302 37.4399 55.3076 41.7861 53.2623 45.5926C51.217 49.3423 48.348 52.2681 44.6551 54.3702C40.9623 56.4723 36.7297 57.5234 31.9574 57.5234ZM31.9574 52.4954C35.7071 52.4954 39.0306 51.6716 41.9281 50.024C44.8256 48.3196 47.0697 45.9619 48.6605 42.9508C50.2512 39.8829 51.0466 36.4173 51.0466 32.554C51.0466 28.6338 50.2228 25.1682 48.5752 22.1571C46.9845 19.0892 44.7404 16.7031 41.8429 14.9987C38.9454 13.2943 35.6502 12.4421 31.9574 12.4421C28.2645 12.4421 24.9694 13.2943 22.0719 14.9987C19.1744 16.7031 16.9303 19.0892 15.3395 22.1571C13.7488 25.1682 12.9534 28.6338 12.9534 32.554C12.9534 36.4173 13.7488 39.8829 15.3395 42.9508C16.9303 45.9619 19.1744 48.3196 22.0719 50.024C24.9694 51.6716 28.2645 52.4954 31.9574 52.4954Z" fill="#5827D4"/>
</g>
<defs>
<clipPath id="clip0_3802_16524">
<rect width="64" height="64.9375" fill="white"/>
</clipPath>
</defs>
</svg>