175 lines
6.9 KiB
Dart
175 lines
6.9 KiB
Dart
import 'package:contact/contact/model/capability_contact.dart';
|
|
import 'package:core/presentation/extensions/color_extension.dart';
|
|
import 'package:core/presentation/resources/image_paths.dart';
|
|
import 'package:core/presentation/state/failure.dart';
|
|
import 'package:core/presentation/state/success.dart';
|
|
import 'package:core/presentation/utils/app_toast.dart';
|
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
|
import 'package:core/utils/app_logger.dart';
|
|
import 'package:core/utils/fps_manager.dart';
|
|
import 'package:dartz/dartz.dart';
|
|
import 'package:fcm/model/firebase_capability.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/exceptions/fcm_exception.dart';
|
|
import 'package:tmail_ui_user/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart';
|
|
import 'package:tmail_ui_user/features/push_notification/presentation/config/fcm_configuration.dart';
|
|
import 'package:tmail_ui_user/features/push_notification/presentation/controller/fcm_controller.dart';
|
|
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.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';
|
|
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
|
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
|
|
|
abstract class BaseController extends GetxController
|
|
with MessageDialogActionMixin,
|
|
PopupContextMenuActionMixin,
|
|
ViewAsDialogActionMixin {
|
|
|
|
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
|
FpsCallback? fpsCallback;
|
|
|
|
void consumeState(Stream<Either<Failure, Success>> 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<Failure, Success> newState) {
|
|
viewState.value = newState;
|
|
}
|
|
|
|
void clearState() {
|
|
viewState.value = Right(UIState.idle);
|
|
}
|
|
|
|
void onData(Either<Failure, Success> newState) {
|
|
viewState.value = newState;
|
|
}
|
|
|
|
void onError(dynamic error) {
|
|
final _appToast = Get.find<AppToast>();
|
|
final _imagePaths = Get.find<ImagePaths>();
|
|
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
|
|
|
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::injectMdnBindings(): 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<void> injectFCMBindings(Session? session, AccountId? accountId) async {
|
|
try {
|
|
requireCapability(session!, accountId!, [FirebaseCapability.fcmIdentifier]);
|
|
if(AppConfig.fcmAvailable) {
|
|
AppUtils.loadFcmConfigFile();
|
|
FcmConfiguration.initialize();
|
|
await LocalNotificationManager.instance.setUp();
|
|
FcmInteractorBindings().dependencies();
|
|
FcmController.instance.initialize(accountId: accountId);
|
|
} else {
|
|
throw NotSupportFCMException();
|
|
}
|
|
} catch(e) {
|
|
logError('BaseController::injectFirebaseBindings(): exception: $e');
|
|
}
|
|
}
|
|
} |