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 { final FirebaseChatRepository _chatRepository; ChatBloc({ required FirebaseChatRepository chatRepository, }) : _chatRepository = chatRepository, super(ChatInitial()) { on(_onLoadChatEvent); on(_onSendMessageEvent); } void _onLoadChatEvent(LoadChatEvent event, Emitter emit) async { bool autoCreate = true; try { emit(ChatLoading()); Stream 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 emit) async { try { await _chatRepository.sendMessage(event.serviceId, event.message); } catch (e) { log(e.toString()); emit(ChatFailure()); } } }