import 'dart:async'; import 'package:built_collection/built_collection.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; class ViewSubscriptionList implements PersistUI, StopLoading { ViewSubscriptionList({ this.force = false, }); final bool force; } class ViewSubscription implements PersistUI, PersistPrefs { ViewSubscription({ @required this.subscriptionId, this.force = false, }); final String subscriptionId; final bool force; } class EditSubscription implements PersistUI, PersistPrefs { EditSubscription( {@required this.subscription, this.completer, this.cancelCompleter, this.force = false}); final SubscriptionEntity subscription; final Completer completer; final Completer cancelCompleter; final bool force; } class UpdateSubscription implements PersistUI { UpdateSubscription(this.subscription); final SubscriptionEntity subscription; } class LoadSubscription { LoadSubscription({this.completer, this.subscriptionId}); final Completer completer; final String subscriptionId; } class LoadSubscriptionActivity { LoadSubscriptionActivity({this.completer, this.subscriptionId}); final Completer completer; final String subscriptionId; } class LoadSubscriptions { LoadSubscriptions({this.completer}); final Completer completer; } class LoadSubscriptionRequest implements StartLoading {} class LoadSubscriptionFailure implements StopLoading { LoadSubscriptionFailure(this.error); final dynamic error; @override String toString() { return 'LoadSubscriptionFailure{error: $error}'; } } class LoadSubscriptionSuccess implements StopLoading, PersistData { LoadSubscriptionSuccess(this.subscription); final SubscriptionEntity subscription; @override String toString() { return 'LoadSubscriptionSuccess{subscription: $subscription}'; } } class LoadSubscriptionsRequest implements StartLoading {} class LoadSubscriptionsFailure implements StopLoading { LoadSubscriptionsFailure(this.error); final dynamic error; @override String toString() { return 'LoadSubscriptionsFailure{error: $error}'; } } class LoadSubscriptionsSuccess implements StopLoading { LoadSubscriptionsSuccess(this.subscriptions); final BuiltList subscriptions; @override String toString() { return 'LoadSubscriptionsSuccess{subscriptions: $subscriptions}'; } } class SaveSubscriptionRequest implements StartSaving { SaveSubscriptionRequest({this.completer, this.subscription}); final Completer completer; final SubscriptionEntity subscription; } class SaveSubscriptionSuccess implements StopSaving, PersistData, PersistUI { SaveSubscriptionSuccess(this.subscription); final SubscriptionEntity subscription; } class AddSubscriptionSuccess implements StopSaving, PersistData, PersistUI { AddSubscriptionSuccess(this.subscription); final SubscriptionEntity subscription; } class SaveSubscriptionFailure implements StopSaving { SaveSubscriptionFailure(this.error); final Object error; } class ArchiveSubscriptionsRequest implements StartSaving { ArchiveSubscriptionsRequest(this.completer, this.subscriptionIds); final Completer completer; final List subscriptionIds; } class ArchiveSubscriptionsSuccess implements StopSaving, PersistData { ArchiveSubscriptionsSuccess(this.subscriptions); final List subscriptions; } class ArchiveSubscriptionsFailure implements StopSaving { ArchiveSubscriptionsFailure(this.subscriptions); final List subscriptions; } class DeleteSubscriptionsRequest implements StartSaving { DeleteSubscriptionsRequest(this.completer, this.subscriptionIds); final Completer completer; final List subscriptionIds; } class DeleteSubscriptionsSuccess implements StopSaving, PersistData { DeleteSubscriptionsSuccess(this.subscriptions); final List subscriptions; } class DeleteSubscriptionsFailure implements StopSaving { DeleteSubscriptionsFailure(this.subscriptions); final List subscriptions; } class RestoreSubscriptionsRequest implements StartSaving { RestoreSubscriptionsRequest(this.completer, this.subscriptionIds); final Completer completer; final List subscriptionIds; } class RestoreSubscriptionsSuccess implements StopSaving, PersistData { RestoreSubscriptionsSuccess(this.subscriptions); final List subscriptions; } class RestoreSubscriptionsFailure implements StopSaving { RestoreSubscriptionsFailure(this.subscriptions); final List subscriptions; } class FilterSubscriptions implements PersistUI { FilterSubscriptions(this.filter); final String filter; } class SortSubscriptions implements PersistUI { SortSubscriptions(this.field); final String field; } class FilterSubscriptionsByState implements PersistUI { FilterSubscriptionsByState(this.state); final EntityState state; } class FilterSubscriptionsByCustom1 implements PersistUI { FilterSubscriptionsByCustom1(this.value); final String value; } class FilterSubscriptionsByCustom2 implements PersistUI { FilterSubscriptionsByCustom2(this.value); final String value; } class FilterSubscriptionsByCustom3 implements PersistUI { FilterSubscriptionsByCustom3(this.value); final String value; } class FilterSubscriptionsByCustom4 implements PersistUI { FilterSubscriptionsByCustom4(this.value); final String value; } class StartSubscriptionMultiselect { StartSubscriptionMultiselect(); } class AddToSubscriptionMultiselect { AddToSubscriptionMultiselect({@required this.entity}); final BaseEntity entity; } class RemoveFromSubscriptionMultiselect { RemoveFromSubscriptionMultiselect({@required this.entity}); final BaseEntity entity; } class ClearSubscriptionMultiselect { ClearSubscriptionMultiselect(); } class UpdateSubscriptionTab implements PersistUI { UpdateSubscriptionTab({this.tabIndex}); final int tabIndex; } void handleSubscriptionAction( BuildContext context, List subscriptions, EntityAction action) { if (subscriptions.isEmpty) { return; } final store = StoreProvider.of(context); final localization = AppLocalization.of(context); final subscription = subscriptions.first as SubscriptionEntity; final subscriptionIds = subscriptions.map((subscription) => subscription.id).toList(); switch (action) { case EntityAction.edit: editEntity(context: context, entity: subscription); break; case EntityAction.restore: store.dispatch(RestoreSubscriptionsRequest( snackBarCompleter(context, localization.restoredSubscription), subscriptionIds)); break; case EntityAction.archive: store.dispatch(ArchiveSubscriptionsRequest( snackBarCompleter(context, localization.archivedSubscription), subscriptionIds)); break; case EntityAction.delete: store.dispatch(DeleteSubscriptionsRequest( snackBarCompleter(context, localization.deletedSubscription), subscriptionIds)); break; case EntityAction.toggleMultiselect: if (!store.state.subscriptionListState.isInMultiselect()) { store.dispatch(StartSubscriptionMultiselect()); } if (subscriptions.isEmpty) { break; } for (final subscription in subscriptions) { if (!store.state.subscriptionListState.isSelected(subscription.id)) { store.dispatch(AddToSubscriptionMultiselect(entity: subscription)); } else { store.dispatch( RemoveFromSubscriptionMultiselect(entity: subscription)); } } break; case EntityAction.more: showEntityActionsDialog( entities: [subscription], ); break; default: print('## ERROR: unhandled action $action in subscription_actions'); break; } }