Tab Community, tombol Bayar di navbar, logo placeholder, fix crash PIN

- Bottom navbar: Home, Pesanan, Bayar (tombol tengah ke kode bayar),
  Community, Profil; menu EnakCommunity di beranda pindah ke tab
- Image placeholder: logo Enaklo diperbesar, ilustrasi gelas dihapus
- Fix assertion Navigator saat PIN gagal karena error non-PIN: flushbar
  kini tampil lewat onFailure setelah sheet PIN tertutup (bayar, tukar,
  transfer)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
efrilm
2026-10-01 02:05:49 +07:00
co-authored by Claude Opus 5.5
parent f5e3075205
commit bc751246d8
11 changed files with 151 additions and 144 deletions
@@ -14,14 +14,21 @@ typedef PinSubmitCallback = Future<WalletFailure?> Function(String pin);
enum _PinSheetResult { success, failed, forgotPin, pinNotSet }
/// Meminta PIN lalu menjalankan [onSubmit]. Error PIN (§6.5) ditangani di dalam
/// sheet; failure lain menutup sheet dan ditampilkan oleh halaman pemanggil.
/// sheet; failure lain menutup sheet lalu diteruskan ke [onFailure].
/// Mengembalikan `true` bila [onSubmit] sukses.
///
/// Tampilkan failure lewat [onFailure], jangan dari listener bloc: flushbar juga
/// berupa route, jadi bila muncul selagi sheet masih terbuka, pop milik sheet
/// justru menutup flushbar dan Navigator gagal assertion.
Future<bool> showPinSheet(
BuildContext context, {
required String title,
String? subtitle,
required PinSubmitCallback onSubmit,
ValueChanged<WalletFailure>? onFailure,
}) async {
WalletFailure? lastFailure;
final result = await showModalBottomSheet<_PinSheetResult>(
context: context,
isScrollControlled: true,
@@ -30,8 +37,11 @@ Future<bool> showPinSheet(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
),
builder: (_) =>
_PinSheet(title: title, subtitle: subtitle, onSubmit: onSubmit),
builder: (_) => _PinSheet(
title: title,
subtitle: subtitle,
onSubmit: (pin) async => lastFailure = await onSubmit(pin),
),
);
if (!context.mounted) return false;
@@ -46,6 +56,8 @@ Future<bool> showPinSheet(
context.router.push(PinSetupRoute(purpose: PinOtpPurpose.setup));
return false;
case _PinSheetResult.failed:
if (lastFailure != null) onFailure?.call(lastFailure!);
return false;
case null:
return false;
}