MIF_E31222656/lib/utils/session_checker_mixin.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
}
}