73 lines
2.2 KiB
Dart
73 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:async';
|
|
import 'package:tugas_akhir_supabase/services/session_manager.dart';
|
|
|
|
/// Mixin untuk memeriksa status session di halaman-halaman utama aplikasi
|
|
mixin SessionCheckerMixin<T extends StatefulWidget> on State<T> {
|
|
bool _isCheckingSession = false;
|
|
|
|
/// Periksa status session saat halaman dibuka
|
|
Future<void> checkSessionStatus() async {
|
|
if (_isCheckingSession) return;
|
|
_isCheckingSession = true;
|
|
|
|
try {
|
|
// Tambahkan timeout untuk mencegah blocking
|
|
final isValid = await SessionManager.isSessionValid().timeout(
|
|
const Duration(seconds: 3),
|
|
onTimeout: () {
|
|
debugPrint('SessionChecker: Session check timed out');
|
|
return true; // Assume valid on timeout
|
|
},
|
|
);
|
|
|
|
if (!isValid && mounted) {
|
|
// Session tidak valid, update timestamp untuk mencegah pemanggilan berulang
|
|
await SessionManager.updateLastActiveTime().timeout(
|
|
const Duration(seconds: 2),
|
|
onTimeout: () {
|
|
debugPrint('SessionChecker: Update activity timed out');
|
|
return;
|
|
},
|
|
);
|
|
}
|
|
} catch (e) {
|
|
debugPrint('SessionChecker: Error checking session - $e');
|
|
} finally {
|
|
_isCheckingSession = false;
|
|
}
|
|
}
|
|
|
|
/// Perbarui timestamp aktivitas pengguna
|
|
Future<void> updateUserActivity() async {
|
|
try {
|
|
// Tambahkan timeout untuk mencegah blocking
|
|
await SessionManager.updateLastActiveTime().timeout(
|
|
const Duration(seconds: 2),
|
|
onTimeout: () {
|
|
debugPrint('SessionChecker: Update activity timed out');
|
|
return;
|
|
},
|
|
);
|
|
} catch (e) {
|
|
debugPrint('SessionChecker: Error updating activity - $e');
|
|
}
|
|
}
|
|
|
|
/// Panggil di initState untuk memeriksa session
|
|
void initSessionChecking() {
|
|
// Periksa session setelah widget dibangun dengan delay
|
|
// untuk mencegah terlalu banyak operasi di startup
|
|
Future.delayed(Duration(milliseconds: 500), () {
|
|
if (mounted) {
|
|
checkSessionStatus();
|
|
}
|
|
});
|
|
}
|
|
|
|
/// Panggil di dispose untuk membersihkan resource
|
|
void disposeSessionChecking() {
|
|
// Tidak ada resource yang perlu dibersihkan
|
|
}
|
|
}
|