Files
b0esche_cloud/b0esche_cloud/lib/blocs/session/session_bloc.dart
2025-12-18 00:02:50 +01:00

54 lines
1.5 KiB
Dart

import 'dart:async';
import 'package:bloc/bloc.dart';
import 'session_event.dart';
import 'session_state.dart';
class SessionBloc extends Bloc<SessionEvent, SessionState> {
Timer? _expiryTimer;
SessionBloc() : super(SessionInitial()) {
on<SessionStarted>(_onSessionStarted);
on<SessionExpired>(_onSessionExpired);
on<SessionRefreshed>(_onSessionRefreshed);
on<SessionEnded>(_onSessionEnded);
}
void _onSessionStarted(SessionStarted event, Emitter<SessionState> emit) {
final expiresAt = DateTime.now().add(
const Duration(minutes: 15),
); // Match Go
emit(SessionActive(token: event.token, expiresAt: expiresAt));
_startExpiryTimer(expiresAt);
}
void _onSessionExpired(SessionExpired event, Emitter<SessionState> emit) {
_expiryTimer?.cancel();
emit(SessionExpiredState());
}
void _onSessionRefreshed(SessionRefreshed event, Emitter<SessionState> emit) {
final expiresAt = DateTime.now().add(const Duration(minutes: 15));
emit(SessionActive(token: event.newToken, expiresAt: expiresAt));
_startExpiryTimer(expiresAt);
}
void _onSessionEnded(SessionEnded event, Emitter<SessionState> emit) {
_expiryTimer?.cancel();
emit(SessionInitial());
}
void _startExpiryTimer(DateTime expiresAt) {
_expiryTimer?.cancel();
final duration = expiresAt.difference(DateTime.now());
_expiryTimer = Timer(duration, () {
add(SessionExpired());
});
}
@override
Future<void> close() {
_expiryTimer?.cancel();
return super.close();
}
}