From da58b3aa567c203ee94fa84d7c675941e7b61652 Mon Sep 17 00:00:00 2001 From: Onie Date: Sun, 18 Oct 2026 12:41:56 +0700 Subject: [PATCH] Kasir: non-blocking auth check + tampilkan login ulang saat session mati --- lib/state/app_state.dart | 57 +++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/lib/state/app_state.dart b/lib/state/app_state.dart index 3510d7c..55c4b2d 100644 --- a/lib/state/app_state.dart +++ b/lib/state/app_state.dart @@ -217,16 +217,27 @@ class AppState extends ChangeNotifier { /* ---------- Init & Realtime ---------- */ Future _init() async { try { - await _initAuth(); - await _loadProducts(); - await _loadSales(); - await loadKasirAccounts(); - await _loadProfileNames(); - await _loadSettings(); - _subscribe(); - await _seedAdminIfEmpty(); - await _offlineQueue.init(); - startPolling(); + final authOk = await _ensureSessionAndAuth(); + if (!authOk) { + // Session mati total (refresh token ikut kadaluwarsa). Jangan lanjut: + // _loadProducts() akan timeout 30s + 401, bakal menjebak loading walau + // produk sendiri masih ada. Tandai sessionExpired, jalankan polling + // saja (real-time masih bisa update), dan biarkan UI tampil + // "login ulang". + _sessionExpired = true; + startPolling(); + error = 'Sesi auth belum tersedia, silakan login ulang.'; + } else { + await _loadProducts(); + await _loadSales(); + await loadKasirAccounts(); + await _loadProfileNames(); + await _loadSettings(); + _subscribe(); + await _seedAdminIfEmpty(); + await _offlineQueue.init(); + startPolling(); + } } catch (e) { error = e.toString(); } @@ -535,18 +546,22 @@ class AppState extends ChangeNotifier { } } - /// Coba perbarui session auth yang kedaluwarsa. Return true jika session valid. - Future _ensureSession() async { - try { - final session = _supabase.auth.currentSession; - if (session == null) return false; - if (!session.isExpired) return true; - final res = await _supabase.auth.refreshSession(); - return res.session != null && !res.session!.isExpired; - } catch (e) { - debugPrint('Gagal refresh session: $e'); - return false; + /// Cek langkah demi langkah sampai session valid atau mati total. + /// Stop segera kalau auth mati, jangan tunggu timeout 30s per request. + Future _ensureSessionAndAuth() async { + final session = _supabase.auth.currentSession; + if (session != null && !session.isExpired) { + return true; } + // Session kadaluwarsa: coba refresh token dulu. + try { + final res = await _supabase.auth.refreshSession(); + if (res.session != null && !res.session!.isExpired) { + return true; + } + } catch (_) {} + _sessionExpired = true; + return false; } Future _loadSales() async {