import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/contracts/auth.dart'; import 'di_providers.dart'; import 'server_provider.dart'; class SessionNotifier extends AsyncNotifier { @override Future build() async { final usecase = await ref.watch(listSessionsUseCaseProvider.future); return usecase.execute(); } Future refresh() async { state = await AsyncValue.guard(() async { final usecase = await ref.read(listSessionsUseCaseProvider.future); return usecase.execute(); }); } Future login({ required String serverId, required String username, required String password, }) async { final usecase = await ref.read(authByNameUseCaseProvider.future); await usecase.execute( AuthByNameReq(serverId: serverId, username: username, password: password), ); await refresh(); ref.invalidate(serverListProvider); } Future logout({String? serverId}) async { final usecase = await ref.read(logoutUseCaseProvider.future); await usecase.execute(serverId); await refresh(); } Future switchSession(String serverId) async { final usecase = await ref.read(switchSessionUseCaseProvider.future); await usecase.execute(serverId); await refresh(); } } final sessionProvider = AsyncNotifierProvider( SessionNotifier.new, ); final activeSessionProvider = Provider((ref) { final state = ref.watch(sessionProvider); return state.maybeWhen( data: (data) { if (data.activeServerId == null) return null; for (final s in data.sessions) { if (s.isActive) return s; } return null; }, orElse: () => null, ); });