import 'package:contact/contact/model/capability_contact.dart'; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:forward/forward/capability_forward.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_interactor_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forwarding_interactors_bindings.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/capability_push_notification.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/firebase_bindings.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/firebase_options.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/notification_service.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; abstract class BaseController extends GetxController with MessageDialogActionMixin, PopupContextMenuActionMixin, ViewAsDialogActionMixin { final _appToast = Get.find(); final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); final viewState = Rx>(Right(UIState.idle)); FpsCallback? fpsCallback; void consumeState(Stream> newStateStream) async { newStateStream.listen( (state) => onData(state), onError: (error, stackTrace) { logError('BaseController::consumeState():onError:error: $error'); logError('BaseController::consumeState():onError:stackTrace: $stackTrace'); onError(error); }, onDone: () => onDone() ); } void dispatchState(Either newState) { viewState.value = newState; } void clearState() { viewState.value = Right(UIState.idle); } void onData(Either newState) { viewState.value = newState; } void onError(dynamic error) { String messageError = ''; if (error is MethodLevelErrors) { messageError = error.message ?? error.type.value; } else { if (currentContext != null) { messageError = AppLocalizations.of(currentContext!).unknownError; } } if (messageError.isNotEmpty && currentContext != null && currentOverlayContext != null) { _appToast.showBottomToast( currentOverlayContext!, messageError, leadingIcon: SvgPicture.asset( _imagePaths.icNotConnection, width: 24, height: 24, color: Colors.white, fit: BoxFit.fill), backgroundColor: AppColor.toastErrorBackgroundColor, textColor: Colors.white, textActionColor: Colors.white, maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!)); } } void onDone(); void startFpsMeter() { FpsManager().start(); fpsCallback = (fpsInfo) { log('BaseController::startFpsMeter(): $fpsInfo'); }; if (fpsCallback != null) { FpsManager().addFpsCallback(fpsCallback!); } } void stopFpsMeter() { FpsManager().stop(); if (fpsCallback != null) { FpsManager().removeFpsCallback(fpsCallback!); } } void injectAutoCompleteBindings(Session? session, AccountId? accountId) { try { ContactAutoCompleteBindings().dependencies(); requireCapability(session!, accountId!, [tmailContactCapabilityIdentifier]); TMailAutoCompleteBindings().dependencies(); } catch (e) { logError('BaseController::injectAutoCompleteBindings(): exception: $e'); } } void injectMdnBindings(Session? session, AccountId? accountId) { try { requireCapability(session!, accountId!, [CapabilityIdentifier.jmapMdn]); MdnInteractorBindings().dependencies(); } catch(e) { logError('BaseController::injectVacationBindings(): exception: $e'); } } void injectForwardBindings(Session? session, AccountId? accountId) { try { requireCapability(session!, accountId!, [capabilityForward]); ForwardingInteractorsBindings().dependencies(); } catch(e) { logError('BaseController::injectForwardBindings(): exception: $e'); } } void injectRuleFilterBindings(Session? session, AccountId? accountId) { try { requireCapability(session!, accountId!, [capabilityRuleFilter]); EmailRulesInteractorBindings().dependencies(); } catch(e) { logError('BaseController::injectRuleFilterBindings(): exception: $e'); } } Future injectFirebaseBindings(Session? session, AccountId? accountId) async { try { requireCapability(session!, accountId!, [capabilityPushNotification]); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); FireBaseBindings().dependencies(); } catch(e) { logError('BaseController::injectFirebaseBindings(): exception: $e'); } } }