chat screen
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user