import '../../../../../api/errors/error_mapper.dart'; import '../../../../../api/marianumcloud/talk/chat/getChatResponse.dart'; import '../../../infrastructure/loadableState/loading_error.dart'; import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc.dart'; import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc_event.dart'; import '../repository/chat_repository.dart'; import 'chat_event.dart'; import 'chat_state.dart'; class ChatBloc extends LoadableHydratedBloc { DateTime _lastTokenSet = DateTime.fromMillisecondsSinceEpoch(0); @override ChatRepository repository() => ChatRepository(); @override ChatState fromNothing() => const ChatState(); @override ChatState fromStorage(Map json) => ChatState.fromJson(json); @override Map? toStorage(ChatState state) => state.toJson(); @override Future gatherData() async { final token = innerState?.currentToken ?? ''; if (token.isEmpty) { add(DataGathered((s) => s)); return; } await _loadChat(token); } void setToken(String token) { if (token == (innerState?.currentToken ?? '')) { refresh(); return; } add(Emit((s) => s.copyWith(currentToken: token, chatResponse: null))); add(RefetchStarted()); _loadChat(token); } void setReferenceMessageId(int? messageId) { add(Emit((s) => s.copyWith(referenceMessageId: messageId))); } void refresh() { final token = innerState?.currentToken ?? ''; if (token.isEmpty) return; add(RefetchStarted()); _loadChat(token); } Future _loadChat(String token) async { final requestStart = DateTime.now(); _lastTokenSet = requestStart; Object? capturedError; GetChatResponse? response; try { response = await repo.data.getChat( token: token, onError: (e) => capturedError = e, ); } catch (e) { capturedError = e; } if (_lastTokenSet.isAfter(requestStart)) return; if ((innerState?.currentToken ?? '') != token) return; if (response != null) { add(DataGathered((s) => s.copyWith(chatResponse: response))); } if (capturedError != null) { add(Error(LoadingError( message: errorToUserMessage(capturedError), technicalDetails: errorToTechnicalDetails(capturedError), allowRetry: errorAllowsRetry(capturedError), ))); } } }