Houshan-Basa/lib/ui/screens/chat/bloc/messages_bloc.dart

128 lines
3.9 KiB
Dart

import 'package:bloc/bloc.dart';
import 'package:dio/dio.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
import 'package:hoshan/data/model/ai/messages_model.dart';
import 'package:hoshan/data/repository/chatbot_repository.dart';
part 'messages_event.dart';
part 'messages_state.dart';
class MessagesBloc extends Bloc<MessagesEvent, MessagesState> {
MessagesBloc() : super(MessagesInitial()) {
on<MessagesEvent>((event, emit) async {
if (event is GetallMessages) {
emit(MessagesLoading());
try {
final response =
await ChatbotRepository.getMessages(id: event.chatId);
final updatedList = List<Messages>.from(response.messages!);
for (var i = 0; i < updatedList.length; i++) {
try {
updatedList[i].query = updatedList[i]
.content
?.firstWhere(
(element) => element.type == 'text',
)
.text;
if (updatedList[i].fromBot! && i > 0) {
if (!updatedList[i - 1].fromBot!) {
updatedList[i].query = updatedList[i - 1]
.content
?.firstWhere(
(element) => element.type == 'text',
)
.text;
}
}
} catch (e) {
if (kDebugMode) {
print('Query Error is: $e');
}
}
}
if (updatedList.isEmpty) {
emit(MessagesEmpty());
} else {
emit(MessagesSuccess(
isGetAll: true,
messages: updatedList)); // Copy the current state
}
} on DioException catch (e) {
emit(MessagesFail());
if (kDebugMode) {
print("Dio Error is : $e");
}
}
}
if (event is AddMessage) {
final updatedList = List<Messages>.from(state.messages);
updatedList.add(event.message);
emit(MessagesSuccess(messages: updatedList)); // Copy the current state
}
if (event is RemoveInError) {
final updatedList = List<Messages>.from(state.messages);
updatedList.removeLast();
updatedList.removeLast();
emit(MessagesSuccess(messages: updatedList)); // Copy the current state
}
if (event is ChangeMessage) {
final updatedList = List<Messages>.from(state.messages);
final index = updatedList.indexOf(event.oldMessage);
updatedList[index] = event.newMessage;
emit(MessagesSuccess(messages: updatedList)); // Copy the current state
}
if (event is DeleteMessage) {
try {
if (event.chatId != null) {
await ChatbotRepository.deleteMessage(
chatId: event.chatId!, messageId: event.message.id!);
}
final updatedList = List<Messages>.from(state.messages);
updatedList.remove(event.message);
if (updatedList.isEmpty) {
emit(MessagesEmpty());
} else {
emit(MessagesSuccess(messages: updatedList));
}
} catch (e) {
if (kDebugMode) {
print("Dio Error is : $e");
}
}
}
if (event is DeleteMessageWithId) {
try {
final updatedList = List<Messages>.from(state.messages);
updatedList.removeWhere(
(element) {
return element.id == event.messageId;
},
);
if (updatedList.isEmpty) {
emit(MessagesEmpty());
} else {
emit(MessagesSuccess(messages: updatedList));
}
} catch (e) {
if (kDebugMode) {
print("Dio Error is : $e");
}
}
}
if (event is ResetMessages) {
emit(MessagesInitial());
}
});
}
}