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) return; _loadChat(token); } void setToken(String token) { if (token == (innerState?.currentToken ?? '')) { refresh(); return; } add(Emit((s) => s.copyWith(currentToken: token, chatResponse: null))); _loadChat(token); } void setReferenceMessageId(int? messageId) { add(Emit((s) => s.copyWith(referenceMessageId: messageId))); } void refresh() { final token = innerState?.currentToken ?? ''; if (token.isNotEmpty) _loadChat(token); } void _loadChat(String token) { final requestStart = DateTime.now(); _lastTokenSet = requestStart; repo.data.getChat( token: token, onUpdate: (data) { if (_lastTokenSet.isAfter(requestStart)) return; if ((innerState?.currentToken ?? '') != token) return; add(DataGathered((s) => s.copyWith(chatResponse: data))); }, ); } }