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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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 {}
|
||||
Reference in New Issue
Block a user