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/ui/bloc/navigation_bloc.dart'; import 'package:moxxyv2/ui/constants.dart'; part 'blocklist_bloc.freezed.dart'; part 'blocklist_event.dart'; part 'blocklist_state.dart'; class BlocklistBloc extends Bloc { BlocklistBloc() : super(BlocklistState()) { on(_onBlocklistRequested); on(_onJidUnblocked); on(_onUnblockedAll); on(_onBlocklistPushed); } Future _onBlocklistRequested( BlocklistRequestedEvent event, Emitter emit, ) async { final mustDoWork = state.blocklist.isEmpty; if (mustDoWork) { emit( state.copyWith( isWorking: true, ), ); } GetIt.I.get().add( PushedNamedEvent( const NavigationDestination(blocklistRoute), ), ); if (state.blocklist.isEmpty) { // ignore: cast_nullable_to_non_nullable final result = await MoxplatformPlugin.handler.getDataSender().sendData( GetBlocklistCommand(), ) as GetBlocklistResultEvent; emit( state.copyWith( blocklist: result.entries, isWorking: false, ), ); } } Future _onJidUnblocked( UnblockedJidEvent event, Emitter emit, ) async { await MoxplatformPlugin.handler.getDataSender().sendData( UnblockJidCommand( jid: event.jid, ), ); final blocklist = state.blocklist.where((String i) => i != event.jid).toList(); emit(state.copyWith(blocklist: blocklist)); } Future _onUnblockedAll( UnblockedAllEvent event, Emitter emit, ) async { await MoxplatformPlugin.handler.getDataSender().sendData( UnblockAllCommand(), ); emit( state.copyWith(blocklist: []), ); } Future _onBlocklistPushed( BlocklistPushedEvent event, Emitter emit, ) async { final blocklist = state.blocklist..addAll(event.added); emit( state.copyWith( blocklist: blocklist.where((String i) => !event.removed.contains(i)).toList(), ), ); } }