moxxy/lib/ui/bloc/groupchat/startgroupchat_bloc.dart
Ikjot Singh Dhody 3641be4f56 feat(all): Join room functionality complete.
Signed-off-by: Ikjot Singh Dhody <ikjotsd@gmail.com>
2023-07-08 00:43:01 +05:30

122 lines
3.3 KiB
Dart

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:get_it/get_it.dart';
import 'package:moxplatform/moxplatform.dart';
import 'package:moxxyv2/i18n/strings.g.dart';
import 'package:moxxyv2/shared/commands.dart';
import 'package:moxxyv2/shared/error_types.dart';
import 'package:moxxyv2/shared/events.dart';
import 'package:moxxyv2/shared/helpers.dart';
import 'package:moxxyv2/ui/bloc/conversation_bloc.dart';
import 'package:moxxyv2/ui/bloc/conversations_bloc.dart';
part 'startgroupchat_bloc.freezed.dart';
part 'startgroupchat_event.dart';
part 'startgroupchat_state.dart';
class StartGroupchatBloc
extends Bloc<StartGroupchatEvent, StartGroupchatState> {
StartGroupchatBloc() : super(StartGroupchatState()) {
on<JidChangedEvent>(_onJidChanged);
on<PageResetEvent>(_onPageReset);
on<JoinGroupchatEvent>(_onJoinGroupchat);
on<NickChangedEvent>(_onNickChanged);
}
Future<void> _onJidChanged(
JidChangedEvent event,
Emitter<StartGroupchatState> emit,
) async {
emit(
state.copyWith(
jid: event.jid,
),
);
}
Future<void> _onNickChanged(
NickChangedEvent event,
Emitter<StartGroupchatState> emit,
) async {
emit(
state.copyWith(
nick: event.nick,
),
);
}
Future<void> _onPageReset(
PageResetEvent event,
Emitter<StartGroupchatState> emit,
) async {
emit(
state.copyWith(
jidError: null,
jid: '',
nick: '',
nickError: null,
isWorking: false,
),
);
}
Future<void> _onJoinGroupchat(
JoinGroupchatEvent event,
Emitter<StartGroupchatState> emit,
) async {
final validation = validateJidString(state.jid);
if (validation != null) {
emit(state.copyWith(jidError: validation));
return;
} else if (state.nick.isEmpty) {
emit(state.copyWith(nickError: 'Nickname cannot be null!'));
return;
}
emit(
state.copyWith(
isWorking: true,
jidError: null,
),
);
// ignore: cast_nullable_to_non_nullable
final result = await MoxplatformPlugin.handler.getDataSender().sendData(
JoinGroupchatCommand(jid: state.jid, nick: state.nick),
);
if (result is ErrorEvent) {
final error = result.errorId == ErrorType.remoteServerNotFound.value ||
result.errorId == ErrorType.remoteServerTimeout.value
? t.errors.newChat.remoteServerError
: t.errors.newChat.unknown;
emit(
state.copyWith(
jidError: error,
isWorking: false,
),
);
return;
}
await _onPageReset(PageResetEvent(), emit);
final joinEvent = result! as JoinGroupchatResultEvent;
if (joinEvent.conversation != null) {
GetIt.I.get<ConversationsBloc>().add(
ConversationsAddedEvent(joinEvent.conversation!),
);
}
assert(
joinEvent.conversation != null,
'RequestedConversationEvent must contain a not null conversation',
);
GetIt.I.get<ConversationBloc>().add(
RequestedConversationEvent(
joinEvent.conversation!.jid,
joinEvent.conversation!.title,
joinEvent.conversation!.avatarPath,
removeUntilConversations: true,
),
);
}
}