diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index dae80a8d9..e885d5814 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -268,6 +268,12 @@ class ComposerController extends BaseController String get ownEmailAddress => mailboxDashBoardController.ownEmailAddress.value; + @override + Session? get session => mailboxDashBoardController.sessionCurrent; + + @override + AccountId? get accountId => mailboxDashBoardController.accountId.value; + late Worker uploadInlineImageWorker; late bool _isEmailBodyLoaded; diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index cd5f0185f..ab52b7193 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -34,7 +34,6 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_c import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/from_composer_drop_down_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/view_entire_message_with_message_clipped_widget.dart'; -import 'package:scribe/scribe.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class ComposerView extends GetWidget { @@ -470,8 +469,8 @@ class ComposerView extends GetWidget { sendMessageAction: () => controller.handleClickSendButton(context), requestReadReceiptAction: () => controller.toggleRequestReadReceipt(context), toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context), - onOpenAIScribe: AIConfig.isAiEnabled ? () => controller.showAIScribeMenuForFullText(context) : null, - aiScribeButtonKey: AIConfig.isAiEnabled ? controller.aiScribeButtonKey : null, + onOpenAIScribe: controller.isAIScribeAvailable ? () => controller.showAIScribeMenuForFullText(context) : null, + aiScribeButtonKey: controller.isAIScribeAvailable ? controller.aiScribeButtonKey : null, )), ] ) @@ -556,7 +555,7 @@ class ComposerView extends GetWidget { } Widget _buildAIScribeSelectionButton(BuildContext context) { - if (!AIConfig.isAiEnabled) { + if (!controller.isAIScribeAvailable) { return const SizedBox.shrink(); } diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index 2759a1e84..ed2465279 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -30,7 +30,6 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/list_recipi import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/from_composer_mobile_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart'; -import 'package:scribe/scribe.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/attachment_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/attachment_drop_zone_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart'; @@ -560,8 +559,8 @@ class ComposerView extends GetWidget { toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context), saveAsTemplateAction: () => controller.handleClickSaveAsTemplateButton(context), onOpenInsertLink: controller.openInsertLink, - onOpenAIScribe: AIConfig.isAiEnabled ? () => controller.showAIScribeMenuForFullText(context) : null, - aiScribeButtonKey: AIConfig.isAiEnabled ? controller.aiScribeButtonKey : null, + onOpenAIScribe: controller.isAIScribeAvailable ? () => controller.showAIScribeMenuForFullText(context) : null, + aiScribeButtonKey: controller.isAIScribeAvailable ? controller.aiScribeButtonKey : null, )), ], ), @@ -836,8 +835,8 @@ class ComposerView extends GetWidget { toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context), saveAsTemplateAction: () => controller.handleClickSaveAsTemplateButton(context), onOpenInsertLink: controller.openInsertLink, - onOpenAIScribe: AIConfig.isAiEnabled ? () => controller.showAIScribeMenuForFullText(context) : null, - aiScribeButtonKey: AIConfig.isAiEnabled ? controller.aiScribeButtonKey : null, + onOpenAIScribe: controller.isAIScribeAvailable ? () => controller.showAIScribeMenuForFullText(context) : null, + aiScribeButtonKey: controller.isAIScribeAvailable ? controller.aiScribeButtonKey : null, )), ], ), @@ -958,7 +957,7 @@ class ComposerView extends GetWidget { } Widget _buildAIScribeSelectionButton(BuildContext context) { - if (!AIConfig.isAiEnabled) { + if (!controller.isAIScribeAvailable) { return const SizedBox.shrink(); } diff --git a/lib/features/composer/presentation/mixin/ai_scribe_in_composer_mixin.dart b/lib/features/composer/presentation/mixin/ai_scribe_in_composer_mixin.dart index ea345299d..cfc06412b 100644 --- a/lib/features/composer/presentation/mixin/ai_scribe_in_composer_mixin.dart +++ b/lib/features/composer/presentation/mixin/ai_scribe_in_composer_mixin.dart @@ -2,11 +2,14 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:scribe/scribe.dart'; import 'package:scribe/scribe/ai/presentation/widgets/ai_scribe.dart'; import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/mixins/text_selection_mixin.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; mixin AIScribeInComposerMixin { final editorTextSelection = Rxn(); @@ -16,6 +19,20 @@ mixin AIScribeInComposerMixin { RichTextMobileTabletController? get richTextMobileTabletController; ImagePaths get imagePaths; GenerateAITextInteractor get generateAITextInteractor; + Session? get session; + AccountId? get accountId; + + bool get isAIScribeAvailable { + if (!AIConfig.isAiEnabled) return false; + + final currentSession = session; + final currentAccountId = accountId; + + if (currentSession == null || currentAccountId == null) return false; + + final aiCapability = currentSession.getAICapability(currentAccountId); + return aiCapability != null; + } Future getTextOnlyContentInEditor();