60 lines
1.7 KiB
Dart
60 lines
1.7 KiB
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<ChatEvent, ChatState, ChatRepository> {
|
|
DateTime _lastTokenSet = DateTime.fromMillisecondsSinceEpoch(0);
|
|
|
|
@override
|
|
ChatRepository repository() => ChatRepository();
|
|
|
|
@override
|
|
ChatState fromNothing() => const ChatState();
|
|
|
|
@override
|
|
ChatState fromStorage(Map<String, dynamic> json) => ChatState.fromJson(json);
|
|
|
|
@override
|
|
Map<String, dynamic>? toStorage(ChatState state) => state.toJson();
|
|
|
|
@override
|
|
Future<void> 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)));
|
|
},
|
|
);
|
|
}
|
|
}
|