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 ViewStubList implements StopLoading { ViewStubList({ this.force = false }); final bool force; } class ViewStub implements PersistUI, PersistPrefs { ViewStub({ @required this.stubId, this.force = false, }); final String stubId; final bool force; } class EditStub implements PersistUI, PersistPrefs { EditStub( {@required this.stub, this.completer, this.cancelCompleter, this.force = false}); final StubEntity stub; final Completer completer; final Completer cancelCompleter; final bool force; } class UpdateStub implements PersistUI { UpdateStub(this.stub); final StubEntity stub; } class LoadStub { LoadStub({this.completer, this.stubId}); final Completer completer; final String stubId; } class LoadStubActivity { LoadStubActivity({this.completer, this.stubId}); final Completer completer; final String stubId; } class LoadStubs { LoadStubs({this.completer}); final Completer completer; } class LoadStubRequest implements StartLoading {} class LoadStubFailure implements StopLoading { LoadStubFailure(this.error); final dynamic error; @override String toString() { return 'LoadStubFailure{error: $error}'; } } class LoadStubSuccess implements StopLoading, PersistData { LoadStubSuccess(this.stub); final StubEntity stub; @override String toString() { return 'LoadStubSuccess{stub: $stub}'; } } class LoadStubsRequest implements StartLoading {} class LoadStubsFailure implements StopLoading { LoadStubsFailure(this.error); final dynamic error; @override String toString() { return 'LoadStubsFailure{error: $error}'; } } class LoadStubsSuccess implements StopLoading { LoadStubsSuccess(this.stubs); final BuiltList stubs; @override String toString() { return 'LoadStubsSuccess{stubs: $stubs}'; } } class SaveStubRequest implements StartSaving { SaveStubRequest({this.completer, this.stub}); final Completer completer; final StubEntity stub; } class SaveStubSuccess implements StopSaving, PersistData, PersistUI { SaveStubSuccess(this.stub); final StubEntity stub; } class AddStubSuccess implements StopSaving, PersistData, PersistUI { AddStubSuccess(this.stub); final StubEntity stub; } class SaveStubFailure implements StopSaving { SaveStubFailure (this.error); final Object error; } class ArchiveStubsRequest implements StartSaving { ArchiveStubsRequest(this.completer, this.stubIds); final Completer completer; final List stubIds; } class ArchiveStubsSuccess implements StopSaving, PersistData { ArchiveStubsSuccess(this.stubs); final List stubs; } class ArchiveStubsFailure implements StopSaving { ArchiveStubsFailure(this.stubs); final List stubs; } class DeleteStubsRequest implements StartSaving { DeleteStubsRequest(this.completer, this.stubIds); final Completer completer; final List stubIds; } class DeleteStubsSuccess implements StopSaving, PersistData { DeleteStubsSuccess(this.stubs); final List stubs; } class DeleteStubsFailure implements StopSaving { DeleteStubsFailure(this.stubs); final List stubs; } class RestoreStubsRequest implements StartSaving { RestoreStubsRequest(this.completer, this.stubIds); final Completer completer; final List stubIds; } class RestoreStubsSuccess implements StopSaving, PersistData { RestoreStubsSuccess(this.stubs); final List stubs; } class RestoreStubsFailure implements StopSaving { RestoreStubsFailure(this.stubs); final List stubs; } class FilterStubs implements PersistUI { FilterStubs(this.filter); final String filter; } class SortStubs implements PersistUI, PersistPrefs { SortStubs(this.field); final String field; } class FilterStubsByState implements PersistUI { FilterStubsByState(this.state); final EntityState state; } class FilterStubsByCustom1 implements PersistUI { FilterStubsByCustom1(this.value); final String value; } class FilterStubsByCustom2 implements PersistUI { FilterStubsByCustom2(this.value); final String value; } class FilterStubsByCustom3 implements PersistUI { FilterStubsByCustom3(this.value); final String value; } class FilterStubsByCustom4 implements PersistUI { FilterStubsByCustom4(this.value); final String value; } class StartStubMultiselect { StartStubMultiselect(); } class AddToStubMultiselect { AddToStubMultiselect({@required this.entity}); final BaseEntity entity; } class RemoveFromStubMultiselect { RemoveFromStubMultiselect({@required this.entity}); final BaseEntity entity; } class ClearStubMultiselect { ClearStubMultiselect(); } class UpdateStubTab implements PersistUI { UpdateStubTab({this.tabIndex}); final int tabIndex; } void handleStubAction( BuildContext context, List stubs, EntityAction action) { if (stubs.isEmpty) { return; } final store = StoreProvider.of(context); final state = store.state; final localization = AppLocalization.of(context); final stub = stubs.first as StubEntity; final stubIds = stubs.map((stub) => stub.id).toList(); switch (action) { case EntityAction.edit: editEntity(context: context, entity: stub); break; case EntityAction.view: store.dispatch(UpdateUserPreferences(isPreviewEnabled: true)); viewEntity(entity: stub); break; case EntityAction.restore: store.dispatch(RestoreStubsRequest( snackBarCompleter(context, localization.restoredStub), stubIds)); break; case EntityAction.archive: store.dispatch(ArchiveStubsRequest( snackBarCompleter(context, localization.archivedStub), stubIds)); break; case EntityAction.delete: store.dispatch(DeleteStubsRequest( snackBarCompleter(context, localization.deletedStub), stubIds)); break; case EntityAction.toggleMultiselect: if (!store.state.stubListState.isInMultiselect()) { store.dispatch(StartStubMultiselect()); } if (stubs.isEmpty) { break; } for (final stub in stubs) { if (!store.state.stubListState.isSelected(stub.id)) { store.dispatch( AddToStubMultiselect(entity: stub)); } else { store.dispatch( RemoveFromStubMultiselect(entity: stub)); } } break; case EntityAction.more: showEntityActionsDialog( entities: [stub], ); break; default: print('## ERROR: unhandled action $action in stub_actions'); break; } }