Files
prosappco/lib/blocs/chat_bloc/chat_bloc.dart
T
2024-04-16 08:46:06 -05:00

64 lines
1.5 KiB
Dart

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());
}
}
}