Kasir: non-blocking auth check + tampilkan login ulang saat session mati

This commit is contained in:
Onie
2026-10-18 12:41:56 +07:00
parent b968e84152
commit da58b3aa56

View File

@@ -217,16 +217,27 @@ class AppState extends ChangeNotifier {
/* ---------- Init & Realtime ---------- */ /* ---------- Init & Realtime ---------- */
Future<void> _init() async { Future<void> _init() async {
try { try {
await _initAuth(); final authOk = await _ensureSessionAndAuth();
await _loadProducts(); if (!authOk) {
await _loadSales(); // Session mati total (refresh token ikut kadaluwarsa). Jangan lanjut:
await loadKasirAccounts(); // _loadProducts() akan timeout 30s + 401, bakal menjebak loading walau
await _loadProfileNames(); // produk sendiri masih ada. Tandai sessionExpired, jalankan polling
await _loadSettings(); // saja (real-time masih bisa update), dan biarkan UI tampil
_subscribe(); // "login ulang".
await _seedAdminIfEmpty(); _sessionExpired = true;
await _offlineQueue.init(); startPolling();
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) { } catch (e) {
error = e.toString(); error = e.toString();
} }
@@ -535,18 +546,22 @@ class AppState extends ChangeNotifier {
} }
} }
/// Coba perbarui session auth yang kedaluwarsa. Return true jika session valid. /// Cek langkah demi langkah sampai session valid atau mati total.
Future<bool> _ensureSession() async { /// Stop segera kalau auth mati, jangan tunggu timeout 30s per request.
try { Future<bool> _ensureSessionAndAuth() async {
final session = _supabase.auth.currentSession; final session = _supabase.auth.currentSession;
if (session == null) return false; if (session != null && !session.isExpired) {
if (!session.isExpired) return true; return true;
final res = await _supabase.auth.refreshSession();
return res.session != null && !res.session!.isExpired;
} catch (e) {
debugPrint('Gagal refresh session: $e');
return false;
} }
// 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<void> _loadSales() async { Future<void> _loadSales() async {