moxxy/lib/ui/bloc/devices_bloc.dart

95 lines
3.0 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/shared/commands.dart';
import 'package:moxxyv2/shared/events.dart';
import 'package:moxxyv2/shared/models/omemo_device.dart';
import 'package:moxxyv2/ui/bloc/navigation_bloc.dart';
import 'package:moxxyv2/ui/constants.dart';
import 'package:moxxyv2/ui/helpers.dart';
part 'devices_bloc.freezed.dart';
part 'devices_event.dart';
part 'devices_state.dart';
class DevicesBloc extends Bloc<DevicesEvent, DevicesState> {
DevicesBloc() : super(DevicesState()) {
on<DevicesRequestedEvent>(_onRequested);
on<DeviceEnabledSetEvent>(_onDeviceEnabledSet);
on<SessionsRecreatedEvent>(_onSessionsRecreated);
on<DeviceVerifiedEvent>(_onDeviceVerified);
}
Future<void> _onRequested(DevicesRequestedEvent event, Emitter<DevicesState> emit) async {
emit(state.copyWith(working: true, jid: event.jid));
GetIt.I.get<NavigationBloc>().add(
PushedNamedEvent(
const NavigationDestination(devicesRoute),
),
);
// ignore: cast_nullable_to_non_nullable
final result = await MoxplatformPlugin.handler.getDataSender().sendData(
GetConversationOmemoFingerprintsCommand(
jid: event.jid,
),
) as GetConversationOmemoFingerprintsResult;
emit(
state.copyWith(
working: false,
devices: result.fingerprints,
),
);
}
Future<void> _onDeviceEnabledSet(DeviceEnabledSetEvent event, Emitter<DevicesState> emit) async {
// ignore: cast_nullable_to_non_nullable
final result = await MoxplatformPlugin.handler.getDataSender().sendData(
SetOmemoDeviceEnabledCommand(
jid: state.jid,
deviceId: event.deviceId,
enabled: event.enabled,
),
) as GetConversationOmemoFingerprintsResult;
emit(state.copyWith(devices: result.fingerprints));
}
Future<void> _onSessionsRecreated(SessionsRecreatedEvent event, Emitter<DevicesState> emit) async {
// ignore: cast_nullable_to_non_nullable
await MoxplatformPlugin.handler.getDataSender().sendData(
RecreateSessionsCommand(jid: state.jid),
awaitable: false,
);
emit(state.copyWith(devices: <OmemoDevice>[]));
GetIt.I.get<NavigationBloc>().add(PoppedRouteEvent());
}
Future<void> _onDeviceVerified(DeviceVerifiedEvent event, Emitter<DevicesState> emit) async {
final result = isVerificationUriValid(
state.devices,
event.uri,
state.jid,
event.deviceId,
);
if (result == -1) return;
final devices = List<OmemoDevice>.from(state.devices);
devices[result] = devices[result].copyWith(
verified: true,
);
emit(state.copyWith(devices: devices));
await MoxplatformPlugin.handler.getDataSender().sendData(
MarkOmemoDeviceAsVerifiedCommand(
jid: state.jid,
deviceId: event.deviceId,
),
awaitable: false,
);
}
}