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());
}
}
}
+43
View File
@@ -0,0 +1,43 @@
part of 'chat_bloc.dart';
abstract class ChatEvent extends Equatable {
const ChatEvent();
@override
List<Object> get props => [];
}
class LoadChatEvent extends ChatEvent {
final String serviceId;
final String userId;
final String professionalId;
const LoadChatEvent({
required this.serviceId,
required this.userId,
required this.professionalId,
});
@override
List<Object> get props => [
serviceId,
userId,
professionalId,
];
}
class SendMessageEvent extends ChatEvent {
final String serviceId;
final MessageEntity message;
const SendMessageEvent({
required this.message,
required this.serviceId,
});
@override
List<Object> get props => [
serviceId,
message,
];
}
+23
View File
@@ -0,0 +1,23 @@
part of 'chat_bloc.dart';
class ChatState extends Equatable {
const ChatState();
@override
List<Object> get props => [];
}
class ChatInitial extends ChatState {}
class ChatLoading extends ChatState {}
class ChatLoaded extends ChatState {
final ChatEntity chat;
const ChatLoaded({required this.chat});
@override
List<Object> get props => [chat];
}
class ChatFailure extends ChatState {}