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>
This commit is contained in:
2026-05-26 23:06:46 +08:00
parent d60c048776
commit 1f6d8e09ae
39 changed files with 2634 additions and 370 deletions

View File

@@ -0,0 +1,15 @@
<svg width="80" height="23" viewBox="0 0 80 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3802_18349)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M31.623 17.3487C33.1435 17.4576 34.9152 16.2764 35.5393 15.6021C37.7089 13.2544 37.7613 9.85968 35.577 7.40105C34.7644 6.48586 32.8545 5.47435 31.6461 5.61675H27.2712V17.334L31.6335 17.3487H31.623ZM29.7382 14.8105V8.14031C30.423 8.09539 31.11 8.09539 31.7948 8.14031C32.3336 8.20279 32.8475 8.40174 33.288 8.71832C35.8011 10.4356 34.7539 14.5298 31.7529 14.8042C31.0822 14.8513 30.4092 14.8534 29.7382 14.8105Z" fill="#008CEB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M70.0293 17.3696H72.5236V14.844H77.4723L77.4869 17.3571H79.9812V13.1937C79.9812 11.9372 80.0859 10.3707 79.7717 9.23351C79.4864 8.19245 78.8684 7.2733 78.012 6.61626C77.1555 5.95923 76.1077 5.60037 75.0282 5.59444C73.9488 5.58851 72.8971 5.93582 72.0335 6.58341C71.1698 7.23099 70.5418 8.1433 70.245 9.18115C69.9099 10.3037 70.023 11.9141 70.023 13.1602C70.023 14.5675 70.0084 15.9832 70.023 17.3906L70.0293 17.3696ZM72.5257 12.3037C72.511 11.2565 72.4 10.1361 72.8922 9.32984C73.1082 8.95863 73.4187 8.65127 73.792 8.43902C74.1654 8.22676 74.5883 8.1172 75.0178 8.12147C75.4451 8.12462 75.8642 8.23858 76.2342 8.45223C76.6042 8.66587 76.9125 8.97187 77.1288 9.34031C77.6147 10.178 77.4995 11.2251 77.4869 12.3058L72.5257 12.3037Z" fill="#008CEB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M41.5058 17.3675H43.9916C43.9916 16.8398 43.9246 15.2251 44.0147 14.8419H48.9445L48.9613 17.3654H51.4513C51.4387 15.9665 51.4513 14.5696 51.4513 13.177C51.4513 11.9832 51.5623 10.2743 51.2419 9.21466C50.9548 8.17496 50.3358 7.25754 49.4792 6.60203C48.6227 5.94652 47.5754 5.58882 46.4968 5.58337C45.4182 5.57791 44.3673 5.92501 43.5042 6.57182C42.641 7.21864 42.0128 8.12975 41.7152 9.16649C41.3822 10.2555 41.4953 11.9204 41.4953 13.133C41.4953 14.5319 41.4639 15.9665 41.4953 17.3613L41.5058 17.3675ZM43.9937 12.3037C43.977 11.2565 43.8702 10.1215 44.3623 9.33194C44.5783 8.96169 44.8875 8.65452 45.2592 8.44103C45.6309 8.22754 46.052 8.1152 46.4806 8.1152C46.9093 8.1152 47.3304 8.22754 47.7021 8.44103C48.0738 8.65452 48.383 8.96169 48.599 9.33194C49.0869 10.1696 48.9696 11.2335 48.9613 12.2995L43.9937 12.3037Z" fill="#008CEB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.8262 10.1927L55.7906 11.9372C55.7906 13.4031 55.7194 16.1403 55.7906 17.3319H58.2283C58.2848 16.4942 58.1403 10.5445 58.2932 10.3539C58.2932 9.19791 59.5016 8.12147 60.7204 8.11728C61.354 8.11346 61.964 8.35689 62.4209 8.79581C62.7309 9.07853 63.2063 9.72356 63.1979 10.3749C63.311 10.4398 63.2209 16.6576 63.2565 17.3466H65.6963L65.6775 10.2367C65.7382 9.67958 65.4031 8.81885 65.1874 8.38325C64.7874 7.55326 64.163 6.85185 63.3849 6.35847C62.6067 5.86508 61.706 5.59942 60.7847 5.59157C59.8634 5.58372 58.9583 5.834 58.1719 6.31407C57.3855 6.79413 56.7492 7.4848 56.3351 8.30785C56.1257 8.73717 55.7738 9.62094 55.8262 10.1927Z" fill="#008CEB"/>
<path d="M11.4366 22.8733C17.7529 22.8733 22.8733 17.7529 22.8733 11.4366C22.8733 5.12036 17.7529 0 11.4366 0C5.12036 0 0 5.12036 0 11.4366C0 17.7529 5.12036 22.8733 11.4366 22.8733Z" fill="#008CEB"/>
<path d="M18.1005 11.4848V14.7037C18.1005 14.9131 18.0105 14.9571 17.8346 14.8544C17.5992 14.7132 17.3543 14.5887 17.1016 14.4817C16.3383 14.1776 15.5115 14.0675 14.6953 14.1613C13.8044 14.2768 12.93 14.4961 12.0901 14.8147C11.2524 15.0974 10.4314 15.4031 9.57696 15.6398C8.86925 15.85 8.13275 15.9468 7.39476 15.9267C6.5769 15.895 5.78205 15.6471 5.0911 15.2084C5.00429 15.1561 4.93306 15.0815 4.88481 14.9924C4.83657 14.9033 4.81307 14.8028 4.81675 14.7016C4.81675 12.5934 4.81675 10.4852 4.81675 8.37696C4.81675 8.27435 4.81675 8.15288 4.9089 8.10052C5.00105 8.04817 5.09529 8.13403 5.17487 8.18639C5.92517 8.69371 6.81381 8.95701 7.71937 8.94031C8.36688 8.91375 9.00724 8.79456 9.62094 8.58639C10.4921 8.31623 11.334 7.95812 12.1906 7.65445C12.8573 7.39821 13.541 7.18829 14.2366 7.02618C14.8337 6.88636 15.4532 6.87168 16.0562 6.98305C16.6592 7.09442 17.2326 7.32944 17.7403 7.6733C17.8567 7.74461 17.952 7.84565 18.0164 7.96601C18.0808 8.08636 18.112 8.22171 18.1068 8.35812C18.1068 9.40524 18.1068 10.4524 18.1068 11.4995L18.1005 11.4848Z" fill="#FEFEFE"/>
</g>
<defs>
<clipPath id="clip0_3802_18349">
<rect width="79.9979" height="22.8733" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB