64 lines
1.5 KiB
Dart
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());
|
|
}
|
|
}
|
|
}
|