Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 2 additions & 11 deletions lib/features/base/mixin/ai_scribe_mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,9 @@ mixin AiScribeMixin {
session: session,
accountId: accountId,
);
final scribeEndpoint = aiCapability?.scribeEndpoint;

if (scribeEndpoint == null || scribeEndpoint.isEmpty) return;

// Validate endpoint format
if (Uri.tryParse(scribeEndpoint)?.hasAbsolutePath != true) {
logError(
'AiScribeMixin::injectAIScribeBindings(): Invalid endpoint format: $scribeEndpoint');
return;
if (aiCapability?.isScribeEndpointAvailable == true) {
AIScribeBindings(aiCapability!.scribeEndpoint!).dependencies();
}

AIScribeBindings(scribeEndpoint).dependencies();
} catch (e) {
logError('AiScribeMixin::injectAIScribeBindings(): $e');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ extension HandleAiScribeInComposerExtension on ComposerController {
session: mailboxDashBoardController.sessionCurrent,
accountId: mailboxDashBoardController.accountId.value,
);
return aiCapability?.isScribeEndpointAvailable == true;
final isScribeEndpointAvailable =
aiCapability?.isScribeEndpointAvailable == true;

final isAIScribeConfigEnabled =
mailboxDashBoardController.cachedAIScribeConfig.value.isEnabled;

return isAIScribeConfigEnabled && isScribeEndpointAvailable;
}

Future<String> _getTextOnlyContentInEditor() async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/html_transformer/html_transform.dart';
import 'package:core/utils/config/app_config_loader.dart';
import 'package:core/utils/file_utils.dart';
import 'package:core/utils/platform_info.dart';
import 'package:core/utils/preview_eml_file_utils.dart';
import 'package:core/utils/print_utils.dart';
import 'package:get/get.dart';
Expand Down Expand Up @@ -114,6 +115,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_ai_scribe_config_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/bindings/setting_interactor_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
Expand Down Expand Up @@ -417,6 +419,11 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<ManageAccountRepository>(),
),
);
if (!PlatformInfo.isMobile) {
Get.lazyPut(
() => GetAIScribeConfigInteractor(Get.find<ManageAccountRepository>()),
);
}
}

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dow
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/ai_scribe/setup_cached_ai_scribe_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/cleanup_recent_search_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart';
Expand Down Expand Up @@ -148,11 +149,14 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_ai_scribe_config_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_ai_scribe_config_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.dart';
Expand Down Expand Up @@ -273,6 +277,7 @@ class MailboxDashBoardController extends ReloadableController
SaveLanguageInteractor? saveLanguageInteractor;
GetTextFormattingMenuStateInteractor? getTextFormattingMenuStateInteractor;
SaveTextFormattingMenuStateInteractor? saveTextFormattingMenuStateInteractor;
GetAIScribeConfigInteractor? getAIScribeConfigInteractor;

final scaffoldKey = GlobalKey<ScaffoldState>();
final selectedMailbox = Rxn<PresentationMailbox>();
Expand Down Expand Up @@ -304,6 +309,7 @@ class MailboxDashBoardController extends ReloadableController
final isPopupMenuOpened = RxBool(false);
final octetsQuota = Rxn<Quota>();
final isTextFormattingMenuOpened = RxBool(false);
final cachedAIScribeConfig = Rx<AIScribeConfig>(AIScribeConfig.initial());

Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
Map<MailboxId, PresentationMailbox> mapMailboxById = {};
Expand Down Expand Up @@ -399,6 +405,7 @@ class MailboxDashBoardController extends ReloadableController
}
_handleArguments();
_loadAppGrid();
loadAIScribeConfig();
super.onReady();
}

Expand Down Expand Up @@ -524,6 +531,8 @@ class MailboxDashBoardController extends ReloadableController
setUpDefaultEmailSortOrder(success.emailSortOrderType);
} else if (success is GetTextFormattingMenuStateSuccess) {
updateTextFormattingMenuState(success.isDisplayed);
} else if (success is GetAIScribeConfigSuccess) {
handleLoadAIScribeConfigSuccess(success.aiScribeConfig);
} else {
super.handleSuccessViewState(success);
}
Expand Down Expand Up @@ -571,6 +580,8 @@ class MailboxDashBoardController extends ReloadableController
backToHomeScreen();
} else if (failure is GetTextFormattingMenuStateFailure) {
updateTextFormattingMenuState(false);
} else if (failure is GetAIScribeConfigFailure) {
handleLoadAIScribeConfigFailure();
} else {
super.handleFailureViewState(failure);
}
Expand Down Expand Up @@ -2047,6 +2058,7 @@ class MailboxDashBoardController extends ReloadableController
notifyThreadDetailSettingUpdated();
getServerSetting();
spamReportController.getSpamReportStateAction();
loadAIScribeConfig();
}

Future<List<PresentationEmail>> quickSearchEmails(String query) async {
Expand Down Expand Up @@ -2123,6 +2135,7 @@ class MailboxDashBoardController extends ReloadableController
notifyThreadDetailSettingUpdated();
getServerSetting();
spamReportController.getSpamReportStateAction();
loadAIScribeConfig();
}

void _handleUpdateVacationSuccess(UpdateVacationSuccess success) {
Expand Down Expand Up @@ -2451,7 +2464,7 @@ class MailboxDashBoardController extends ReloadableController
void updateEmailList(List<PresentationEmail> newEmailList) {
emailsInCurrentMailbox.value = newEmailList;
}

void openMailboxAction(PresentationMailbox presentationMailbox) {
dispatchMailboxUIAction(OpenMailboxAction(presentationMailbox));
}
Expand Down Expand Up @@ -3217,7 +3230,7 @@ class MailboxDashBoardController extends ReloadableController
leadingSVGIcon: imagePaths.icRecoverDeletedMessages,
leadingSVGIconColor: Colors.white,
backgroundColor: AppColor.primaryColor,
textColor: Colors.white,
textColor: Colors.white,
);
}
}
Expand All @@ -3229,7 +3242,7 @@ class MailboxDashBoardController extends ReloadableController
if (currentAccountId != null && currentSession != null) {
final arguments = EmailRecoveryArguments(currentAccountId, currentSession);

final result = PlatformInfo.isWeb
final result = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(
routeName: AppRoutes.emailRecovery,
arguments: arguments,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import 'package:core/utils/platform_info.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_ai_scribe_config_interactor.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';

extension SetupCachedAiScribeExtension on MailboxDashBoardController {
void loadAIScribeConfig() {
if (PlatformInfo.isMobile) {
cachedAIScribeConfig.value = AIScribeConfig(isEnabled: false);
return;
}

getAIScribeConfigInteractor = getBinding<GetAIScribeConfigInteractor>();

if (getAIScribeConfigInteractor != null) {
consumeState(getAIScribeConfigInteractor!.execute());
} else {
handleLoadAIScribeConfigFailure();
}
}

void handleLoadAIScribeConfigSuccess(AIScribeConfig aiScribeConfig) {
cachedAIScribeConfig.value = aiScribeConfig;
}

void handleLoadAIScribeConfigFailure() {
cachedAIScribeConfig.value = AIScribeConfig.initial();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:ui';

import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';

Expand All @@ -9,4 +10,6 @@ abstract class ManageAccountDataSource {
Future<PreferencesSetting> toggleLocalSettingsState(PreferencesConfig preferencesConfig);

Future<PreferencesSetting> getLocalSettings();

Future<AIScribeConfig> getAiScribeConfigLocalSettings();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:ui';
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart';
Expand Down Expand Up @@ -44,6 +45,10 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
await _preferencesSettingManager.updateTextFormattingMenu(
isDisplayed: preferencesConfig.isDisplayed,
);
} else if (preferencesConfig is AIScribeConfig) {
await _preferencesSettingManager.updateAIScribe(
preferencesConfig.isEnabled,
);
} else {
await _preferencesSettingManager.savePreferences(
preferencesConfig,
Expand All @@ -59,4 +64,11 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
return await _preferencesSettingManager.loadPreferences();
}).catchError(_exceptionThrower.throwException);
}

@override
Future<AIScribeConfig> getAiScribeConfigLocalSettings() {
return Future.sync(() async {
return await _preferencesSettingManager.getAIScribeConfig();
}).catchError(_exceptionThrower.throwException);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/default_preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/empty_preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
Expand All @@ -17,6 +18,8 @@ class PreferencesSettingManager {
'${_preferencesSettingKey}_SPAM_REPORT';
static const String _preferencesSettingTextFormattingMenuKey =
'${_preferencesSettingKey}_TEXT_FORMATTING_MENU';
static const String _preferencesSettingAIScribeKey =
'${_preferencesSettingKey}_AI_SCRIBE';

const PreferencesSettingManager(this._sharedPreferences);

Expand All @@ -41,6 +44,8 @@ class PreferencesSettingManager {
return SpamReportConfig.fromJson(jsonDecoded);
case _preferencesSettingTextFormattingMenuKey:
return TextFormattingMenuConfig.fromJson(jsonDecoded);
case _preferencesSettingAIScribeKey:
return AIScribeConfig.fromJson(jsonDecoded);
default:
return DefaultPreferencesConfig.fromJson(jsonDecoded);
}
Expand Down Expand Up @@ -71,6 +76,11 @@ class PreferencesSettingManager {
_preferencesSettingTextFormattingMenuKey,
jsonEncode(config.toJson()),
);
} else if (config is AIScribeConfig) {
await _sharedPreferences.setString(
_preferencesSettingAIScribeKey,
jsonEncode(config.toJson()),
);
} else {
await _sharedPreferences.setString(
_preferencesSettingKey,
Expand Down Expand Up @@ -138,4 +148,22 @@ class PreferencesSettingManager {
final updatedConfig = currentConfig.copyWith(isDisplayed: isDisplayed);
await savePreferences(updatedConfig);
}

Future<AIScribeConfig> getAIScribeConfig() async {
await _sharedPreferences.reload();

final jsonString = _sharedPreferences.getString(
_preferencesSettingAIScribeKey,
);

return jsonString == null
? AIScribeConfig.initial()
: AIScribeConfig.fromJson(jsonDecode(jsonString));
}

Future<void> updateAIScribe(bool isEnabled) async {
final currentConfig = await getAIScribeConfig();
final updatedConfig = currentConfig.copyWith(isEnabled: isEnabled);
await savePreferences(updatedConfig);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:ui';

import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_setting.dart';
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
Expand All @@ -25,4 +26,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
Future<PreferencesSetting> getLocalSettings() {
return dataSource.getLocalSettings();
}

@override
Future<AIScribeConfig> getAiScribeConfigLocalSettings() {
return dataSource.getAiScribeConfigLocalSettings();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';

part 'ai_scribe_config.g.dart';

@JsonSerializable()
class AIScribeConfig extends PreferencesConfig {
final bool isEnabled;

AIScribeConfig({
this.isEnabled = true,
});

factory AIScribeConfig.initial() => AIScribeConfig();

factory AIScribeConfig.fromJson(Map<String, dynamic> json) =>
_$AIScribeConfigFromJson(json);

@override
Map<String, dynamic> toJson() => _$AIScribeConfigToJson(this);

@override
List<Object> get props => [isEnabled];
}

extension AIScribeConfigExtension on AIScribeConfig {
AIScribeConfig copyWith({
bool? isEnabled,
}) {
return AIScribeConfig(
isEnabled: isEnabled ?? this.isEnabled,
);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/preferences_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/spam_report_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/text_formatting_menu_config.dart';
Expand All @@ -15,6 +16,7 @@ class PreferencesSetting with EquatableMixin {
ThreadDetailConfig.initial(),
SpamReportConfig.initial(),
TextFormattingMenuConfig.initial(),
AIScribeConfig.initial(),
]);
}

Expand Down Expand Up @@ -48,6 +50,16 @@ class PreferencesSetting with EquatableMixin {
}
}

AIScribeConfig get aiScribeConfig {
final aiConfig =
configs.firstWhereOrNull((config) => config is AIScribeConfig);
if (aiConfig != null) {
return aiConfig as AIScribeConfig;
} else {
return AIScribeConfig.initial();
}
}

@override
List<Object?> get props => [configs];
}
Loading
Loading