chat screen

This commit is contained in:
Felipe
2024-04-16 08:46:06 -05:00
parent 34c60af688
commit 61d517aaea
18 changed files with 931 additions and 22 deletions
+63
View File
@@ -0,0 +1,63 @@
import 'dart:developer';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:chat_repository/chat_repository.dart';
part 'chat_event.dart';
part 'chat_state.dart';
class ChatBloc extends Bloc<ChatEvent, ChatState> {
final FirebaseChatRepository _chatRepository;
ChatBloc({
required FirebaseChatRepository chatRepository,
}) : _chatRepository = chatRepository,
super(ChatInitial()) {
on<LoadChatEvent>(_onLoadChatEvent);
on<SendMessageEvent>(_onSendMessageEvent);
}
void _onLoadChatEvent(LoadChatEvent event, Emitter<ChatState> emit) async {
bool autoCreate = true;
try {
emit(ChatLoading());
Stream<ChatEntity?> chatStream = _chatRepository.getChatById(
event.serviceId,
);
await for (var chat in chatStream) {
if (chat == null) {
if (autoCreate) {
chat = await _chatRepository.createNewChat(
event.serviceId,
event.userId,
event.professionalId,
);
autoCreate = false;
} else {
emit(ChatFailure());
}
} else {
emit(ChatLoaded(chat: chat));
}
}
} catch (e) {
log(e.toString());
emit(ChatFailure());
}
}
void _onSendMessageEvent(
SendMessageEvent event, Emitter<ChatState> emit) async {
try {
await _chatRepository.sendMessage(event.serviceId, event.message);
} catch (e) {
log(e.toString());
emit(ChatFailure());
}
}
}