123 lines
3.6 KiB
Dart
123 lines
3.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:async';
|
|
import 'package:tugas_akhir_supabase/services/session_manager.dart';
|
|
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
|
|
/// Mixin untuk memeriksa status session di halaman-halaman utama aplikasi
|
|
mixin SessionCheckerMixin<T extends StatefulWidget> on State<T> {
|
|
bool _isCheckingSession = false;
|
|
|
|
/// Initialize session checking
|
|
void initSessionChecking() {
|
|
debugPrint('SessionChecker: Initializing session checking');
|
|
// Check session on init
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
checkSessionStatus();
|
|
});
|
|
}
|
|
|
|
/// Dispose session checking
|
|
void disposeSessionChecking() {
|
|
debugPrint('SessionChecker: Disposing session checking');
|
|
stopPeriodicSessionCheck();
|
|
}
|
|
|
|
/// Update user activity
|
|
Future<void> updateUserActivity() async {
|
|
try {
|
|
await SessionManager.updateLastUserInteraction();
|
|
debugPrint('SessionChecker: User activity updated');
|
|
} catch (e) {
|
|
debugPrint('SessionChecker: Error updating user activity: $e');
|
|
}
|
|
}
|
|
|
|
/// Periksa status session saat halaman dibuka
|
|
Future<void> checkSessionStatus() async {
|
|
if (_isCheckingSession) return;
|
|
_isCheckingSession = true;
|
|
|
|
try {
|
|
// Jangan cek session jika user belum login
|
|
final currentUser = Supabase.instance.client.auth.currentUser;
|
|
if (currentUser == null) {
|
|
debugPrint('SessionChecker: No current user, skipping session check');
|
|
_isCheckingSession = false;
|
|
return;
|
|
}
|
|
|
|
// Only check session if user is actually logged in
|
|
final currentSession = Supabase.instance.client.auth.currentSession;
|
|
if (currentSession == null) {
|
|
debugPrint(
|
|
'SessionChecker: No current session, skipping session check',
|
|
);
|
|
_isCheckingSession = false;
|
|
return;
|
|
}
|
|
|
|
debugPrint(
|
|
'SessionChecker: Checking session for user: ${currentUser.id}',
|
|
);
|
|
|
|
// 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
|
|
},
|
|
);
|
|
|
|
debugPrint('SessionChecker: Session validity result: $isValid');
|
|
|
|
// Update user interaction timestamp
|
|
await SessionManager.updateLastUserInteraction();
|
|
|
|
if (!isValid) {
|
|
debugPrint(
|
|
'SessionChecker: Session invalid, but continuing in permissive mode',
|
|
);
|
|
// In permissive mode, don't force logout
|
|
return;
|
|
}
|
|
|
|
debugPrint('SessionChecker: Session is valid');
|
|
} catch (e) {
|
|
debugPrint('SessionChecker: Error checking session: $e');
|
|
// In permissive mode, don't force logout on error
|
|
} finally {
|
|
_isCheckingSession = false;
|
|
}
|
|
}
|
|
|
|
/// Periksa session secara berkala (DISABLED untuk permissive mode)
|
|
void startPeriodicSessionCheck() {
|
|
debugPrint(
|
|
'SessionChecker: Periodic session check DISABLED for permissive mode',
|
|
);
|
|
// No periodic checks in permissive mode
|
|
}
|
|
|
|
/// Stop periodic session check
|
|
void stopPeriodicSessionCheck() {
|
|
debugPrint('SessionChecker: Stopping periodic session check');
|
|
// Nothing to stop in permissive mode
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Check session on init
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
checkSessionStatus();
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
stopPeriodicSessionCheck();
|
|
super.dispose();
|
|
}
|
|
}
|