Kasir: non-blocking auth check + tampilkan login ulang saat session mati
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user