TF-3260 Load & Display App Grid Linagora Ecosystem

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2024-12-09 12:40:57 +07:00
committed by Dat H. Pham
parent 95f05c4715
commit dce74b43e9
48 changed files with 894 additions and 435 deletions
@@ -54,21 +54,28 @@ import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repositor
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/app_grid_datasource.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/session_storage_composer_datasource.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/app_grid_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/hive_spam_report_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/local_app_grid_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/session_storage_composer_datasoure_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_spam_report_manager.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/linagora_ecosystem_api.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/app_grid_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/composer_cache_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/search_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/app_grid_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_report_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_dashboard_configuration_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_grid_linagra_ecosystem_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_mailbox_cached_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart';
@@ -143,7 +150,10 @@ class MailboxDashBoardBindings extends BaseBindings {
@override
void bindingsController() {
Get.put(AppGridDashboardController(Get.find<GetAppDashboardConfigurationInteractor>()));
Get.put(AppGridDashboardController(
Get.find<GetAppDashboardConfigurationInteractor>(),
Get.find<GetAppGridLinagraEcosystemInteractor>(),
));
Get.put(DownloadController());
Get.put(SearchController(
Get.find<QuickSearchEmailInteractor>(),
@@ -202,6 +212,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut<ServerSettingsDataSource>(
() => Get.find<RemoteServerSettingsDataSourceImpl>());
Get.lazyPut<IdentityCreatorDataSource>(() => Get.find<LocalIdentityCreatorDataSourceImpl>());
Get.lazyPut<AppGridDatasource>(() => Get.find<AppGridDatasourceImpl>());
}
@override
@@ -271,6 +282,14 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => LocalIdentityCreatorDataSourceImpl(
Get.find<CacheExceptionThrower>()
));
Get.lazyPut(() => AppGridDatasourceImpl(
Get.find<LinagoraEcosystemApi>(),
Get.find<RemoteExceptionThrower>(),
));
Get.lazyPut(() => LocalAppGridDatasourceImpl(
Get.find<AppConfigLoader>(),
Get.find<CacheExceptionThrower>(),
));
}
@override
@@ -299,8 +318,8 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => EmptySpamFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => GetAppDashboardConfigurationInteractor(
Get.find<AppConfigLoader>()));
Get.lazyPut(() => GetAppDashboardConfigurationInteractor(Get.find<AppGridRepository>()));
Get.lazyPut(() => GetAppGridLinagraEcosystemInteractor(Get.find<AppGridRepository>()));
Get.lazyPut(() => GetEmailByIdInteractor(
Get.find<ThreadRepository>(),
Get.find<EmailRepository>()));
@@ -343,6 +362,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
Get.lazyPut<ServerSettingsRepository>(() => Get.find<ServerSettingsRepositoryImpl>());
Get.lazyPut<IdentityCreatorRepository>(() => Get.find<IdentityCreatorRepositoryImpl>());
Get.lazyPut<AppGridRepository>(() => Get.find<AppGridRepositoryImpl>());
}
@override
@@ -391,5 +411,9 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => IdentityCreatorRepositoryImpl(
Get.find<IdentityCreatorDataSource>()
));
Get.lazyPut(() => AppGridRepositoryImpl({
DataSourceType.network: Get.find<AppGridDatasource>(),
DataSourceType.local: Get.find<LocalAppGridDatasourceImpl>()
},));
}
}
@@ -1,38 +1,48 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart';
import 'package:get/get_rx/get_rx.dart';
import 'package:model/mailbox/expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_applications.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_app_dashboard_configuration_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_app_grid_linagora_ecosystem_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_dashboard_configuration_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_grid_linagra_ecosystem_interactor.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
class AppGridDashboardController {
final isAppGridDashboardOverlayOpen = false.obs;
final appDashboardExpandMode = ExpandMode.COLLAPSE.obs;
final linagoraApplications = Rxn<LinagoraApplications>();
class AppGridDashboardController extends BaseController {
final listLinagoraApp = RxList<AppLinagoraEcosystem>();
final GetAppDashboardConfigurationInteractor _getAppDashboardConfigurationInteractor;
final GetAppGridLinagraEcosystemInteractor _getAppGridLinagraEcosystemInteractor;
AppGridDashboardController(this._getAppDashboardConfigurationInteractor);
AppGridDashboardController(
this._getAppDashboardConfigurationInteractor,
this._getAppGridLinagraEcosystemInteractor,
);
void toggleAppGridDashboard() {
isAppGridDashboardOverlayOpen.toggle();
final newExpandMode = appDashboardExpandMode.value == ExpandMode.EXPAND
? ExpandMode.COLLAPSE
: ExpandMode.EXPAND;
appDashboardExpandMode.value = newExpandMode;
@override
void handleSuccessViewState(Success success) {
if (success is GetAppDashboardConfigurationSuccess) {
syncLinagoraApps(success.listLinagoraApp);
} else if (success is GetAppGridLinagraEcosystemSuccess) {
syncLinagoraApps(success.listAppLinagoraEcosystem);
} else {
super.handleSuccessViewState(success);
}
}
Stream<Either<Failure, Success>> showDashboardAction() {
return _getAppDashboardConfigurationInteractor.execute(AppConfig.appDashboardConfigurationPath);
void loadAppDashboardConfiguration() {
consumeState(_getAppDashboardConfigurationInteractor.execute(
AppConfig.appDashboardConfigurationPath,
));
}
void handleShowAppDashboard(LinagoraApplications linagoraApps) {
log('AppGridDashboardController::handleShowAppDashboard(): $linagoraApps');
isAppGridDashboardOverlayOpen.value = true;
appDashboardExpandMode.value = ExpandMode.EXPAND;
linagoraApplications.value = linagoraApps;
void loadAppGridLinagraEcosystem(String baseUrl) {
consumeState(_getAppGridLinagraEcosystemInteractor.execute(baseUrl));
}
void syncLinagoraApps(List<AppLinagoraEcosystem> linagoraApps) {
log('AppGridDashboardController::setListLinagoraApp:linagoraApps = $linagoraApps');
listLinagoraApp.value = linagoraApps;
}
}
@@ -91,7 +91,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentat
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_app_dashboard_configuration_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_composer_cache_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart';
@@ -329,6 +328,7 @@ class MailboxDashBoardController extends ReloadableController
_registerPendingCurrentEmailIdInNotification();
}
_handleArguments();
_loadAppGrid();
super.onReady();
}
@@ -407,8 +407,6 @@ class MailboxDashBoardController extends ReloadableController
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess ||
success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
_deleteMultipleEmailsPermanentlySuccess(success);
} else if (success is GetAppDashboardConfigurationSuccess) {
appGridDashboardController.handleShowAppDashboard(success.linagoraApplications);
} else if(success is GetEmailByIdSuccess) {
openEmailDetailedView(success.email);
} else if (success is StoreSendingEmailSuccess) {
@@ -1590,8 +1588,8 @@ class MailboxDashBoardController extends ReloadableController
}
void emptyTrashFolderAction({
Function? onCancelSelectionEmail,
MailboxId? trashFolderId,
Function? onCancelSelectionEmail,
MailboxId? trashFolderId,
int totalEmails = 0,
}) {
onCancelSelectionEmail?.call();
@@ -1601,8 +1599,8 @@ class MailboxDashBoardController extends ReloadableController
final totalEmailsInTrash = totalEmails == 0 ? trashMailbox?.countTotalEmails : totalEmails;
if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) {
consumeState(_emptyTrashFolderInteractor.execute(
sessionCurrent!,
accountId.value!,
sessionCurrent!,
accountId.value!,
trashMailboxId,
totalEmailsInTrash ?? 0,
_progressStateController
@@ -2186,16 +2184,6 @@ class MailboxDashBoardController extends ReloadableController
dispatchAction(EmptyTrashAction());
}
void showAppDashboardAction() async {
log('MailboxDashBoardController::showAppDashboardAction(): begin');
final apps = appGridDashboardController.linagoraApplications.value;
if (apps != null) {
consumeState(Stream.value(Right(GetAppDashboardConfigurationSuccess(apps))));
return;
}
consumeState(appGridDashboardController.showDashboardAction());
}
bool isAbleMarkAllAsRead(){
return !searchController.isSearchEmailRunning && selectedMailbox.value != null && selectedMailbox.value!.isDrafts;
}
@@ -2605,7 +2593,7 @@ class MailboxDashBoardController extends ReloadableController
}
void emptySpamFolderAction({
Function? onCancelSelectionEmail,
Function? onCancelSelectionEmail,
MailboxId? spamFolderId,
int totalEmails = 0
}) {
@@ -3220,6 +3208,16 @@ class MailboxDashBoardController extends ReloadableController
jmap.State? get currentEmailState => _currentEmailState;
void _loadAppGrid() {
if (PlatformInfo.isWeb && AppConfig.appGridDashboardAvailable) {
appGridDashboardController.loadAppDashboardConfiguration();
} else if (PlatformInfo.isMobile) {
appGridDashboardController.loadAppGridLinagraEcosystem(
dynamicUrlInterceptors.jmapUrl ?? '',
);
}
}
@override
void onClose() {
if (PlatformInfo.isWeb) {
@@ -73,7 +73,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
contactSupportCapability: controller.sessionCurrent?.getContactSupportCapability(accountId),
searchForm: SearchInputFormWidget(),
appGridController: controller.appGridDashboardController,
onShowAppDashboardAction: controller.showAppDashboardAction,
onTapApplicationLogoAction: controller.redirectToInboxAction,
onTapAvatarAction: (position) => controller.handleClickAvatarAction(context, position),
onTapContactSupportAction: (contactSupport) =>
@@ -2,60 +2,74 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class AppGridDashboardIcon extends StatelessWidget {
class AppGridDashboardIcon extends StatefulWidget {
final ImagePaths imagePaths;
final AppGridDashboardController appGridController;
final VoidCallback? onShowAppDashboardAction;
final List<AppLinagoraEcosystem> linagoraApps;
const AppGridDashboardIcon({
super.key,
required this.imagePaths,
required this.appGridController,
this.onShowAppDashboardAction,
required this.linagoraApps,
});
@override
State<AppGridDashboardIcon> createState() => _AppGridDashboardIconState();
}
class _AppGridDashboardIconState extends State<AppGridDashboardIcon> {
final ValueNotifier<bool> _isExpandedNotifier = ValueNotifier<bool>(false);
@override
void dispose() {
_isExpandedNotifier.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Obx(() {
final isAppGridOpen = appGridController.isAppGridDashboardOverlayOpen.value;
return PortalTarget(
visible: isAppGridOpen,
portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: appGridController.toggleAppGridDashboard
),
child: PortalTarget(
anchor: Aligned(
follower: AppUtils.isDirectionRTL(context)
? Alignment.topLeft
: Alignment.topRight,
target: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight
return ValueListenableBuilder(
valueListenable: _isExpandedNotifier,
builder: (context, isExpanded, child) {
return PortalTarget(
visible: isExpanded,
portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _toggleAppGridDashboard,
),
portalFollower: Obx(() {
final listApps = appGridController.linagoraApplications.value;
if (listApps?.apps.isNotEmpty == true) {
return AppDashboardOverlay(listApps!);
}
return const SizedBox.shrink();
}),
visible: isAppGridOpen,
child: TMailButtonWidget.fromIcon(
icon: imagePaths.icAppDashboard,
backgroundColor: Colors.transparent,
iconSize: 30,
padding: const EdgeInsets.all(6),
onTapActionCallback: onShowAppDashboardAction,
child: PortalTarget(
anchor: Aligned(
follower: AppUtils.isDirectionRTL(context)
? Alignment.topLeft
: Alignment.topRight,
target: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight,
),
portalFollower: AppDashboardOverlay(
listLinagoraApp: widget.linagoraApps,
imagePaths: widget.imagePaths,
),
visible: isExpanded,
child: TMailButtonWidget.fromIcon(
icon: widget.imagePaths.icAppDashboard,
backgroundColor: Colors.transparent,
iconSize: 30,
padding: const EdgeInsets.all(6),
onTapActionCallback: _toggleAppGridDashboard,
),
),
)
);
});
);
},
);
}
void _toggleAppGridDashboard() {
_isExpandedNotifier.value = !_isExpandedNotifier.value;
}
}
@@ -1,64 +1,47 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/image/image_loader_mixin.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/launcher_application_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/link_browser_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class AppGridDashboardItem extends StatelessWidget {
final LinagoraApp app;
class AppGridDashboardItem extends StatelessWidget
with LauncherApplicationMixin, ImageLoaderMixin {
AppGridDashboardItem(this.app, {Key? key}) : super(key: key);
final AppLinagoraEcosystem app;
final ImagePaths imagePaths;
final ImagePaths _imagePaths = Get.find<ImagePaths>();
const AppGridDashboardItem({
Key? key,
required this.app,
required this.imagePaths,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return LinkBrowserWidget(
uri: app.appUri,
uri: app.appRedirectLink!,
child: Material(
color: Colors.transparent,
child: InkWell(
onTap: () => AppUtils.launchLink(app.appUri.toString()),
onTap: () => launchApplication(uri: app.appRedirectLink),
borderRadius: const BorderRadius.all(Radius.circular(16)),
hoverColor: AppColor.colorBgMailboxSelected,
child: Container(
width: AppGridDashboardStyle.hoverIconSize,
padding: const EdgeInsets.symmetric(vertical: 8),
child: Column(children: [
if (app.iconName?.isNotEmpty == true)
app.iconName!.endsWith("svg")
? SvgPicture.asset(
_imagePaths.getConfigurationImagePath(app.iconName!),
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill)
: Image.asset(
_imagePaths.getConfigurationImagePath(app.iconName!),
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill)
else if (app.publicIconUri != null)
Image.network(
app.publicIconUri.toString(),
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill,
errorBuilder: (_, error, stackTrace) {
return Container(
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
color: AppColor.textFieldHintColor,
);
}
if (app.getIconPath(imagePaths) != null)
buildImage(
imagePath: app.getIconPath(imagePaths)!,
imageSize: AppGridDashboardStyle.iconSize,
),
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
app.appName,
app.appName ?? '',
maxLines: 1,
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
@@ -1,12 +1,18 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_applications.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart';
class AppDashboardOverlay extends StatelessWidget {
final LinagoraApplications _linagoraApplications;
final List<AppLinagoraEcosystem> listLinagoraApp;
final ImagePaths imagePaths;
const AppDashboardOverlay(this._linagoraApplications, {Key? key}) : super(key: key);
const AppDashboardOverlay({
Key? key,
required this.listLinagoraApp,
required this.imagePaths,
}) : super(key: key);
@override
Widget build(BuildContext context) {
@@ -20,17 +26,17 @@ class AppDashboardOverlay extends StatelessWidget {
boxShadow: AppGridDashboardStyle.cardShadow
),
padding: AppGridDashboardStyle.padding,
child: Wrap(children: _linagoraApplications.apps
.map((app) => AppGridDashboardItem(app))
child: Wrap(children: listLinagoraApp
.map((app) => AppGridDashboardItem(app: app, imagePaths: imagePaths))
.toList()),
),
);
}
double get _widthAppGrid {
if (_linagoraApplications.apps.length >= 3) {
if (listLinagoraApp.length >= 3) {
return AppGridDashboardStyle.hoverIconSize * 3 + AppGridDashboardStyle.padding.horizontal;
} else if (_linagoraApplications.apps.length == 2) {
} else if (listLinagoraApp.length == 2) {
return AppGridDashboardStyle.hoverIconSize * 2 + AppGridDashboardStyle.padding.horizontal;
} else {
return AppGridDashboardStyle.hoverIconSize + AppGridDashboardStyle.padding.horizontal;
@@ -1,60 +1,43 @@
import 'dart:io';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/text/slogan_builder.dart';
import 'package:core/utils/platform_info.dart';
import 'package:external_app_launcher/external_app_launcher.dart';
import 'package:flutter/material.dart';
import 'package:get/get_core/get_core.dart';
import 'package:get/get_instance/get_instance.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart';
import 'package:url_launcher/url_launcher.dart' as launcher;
import 'package:tmail_ui_user/features/base/mixin/launcher_application_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
class AppListDashboardItem extends StatelessWidget {
class AppListDashboardItem extends StatelessWidget with LauncherApplicationMixin {
final LinagoraApp app;
final AppLinagoraEcosystem app;
final ImagePaths imagePaths;
const AppListDashboardItem(this.app, {Key? key}) : super(key: key);
const AppListDashboardItem({
super.key,
required this.app,
required this.imagePaths,
});
@override
Widget build(BuildContext context) {
final imagePaths = Get.find<ImagePaths>();
return SloganBuilder(
sizeLogo: 32,
paddingText: const EdgeInsetsDirectional.only(start: 12),
text: app.appName,
textAlign: TextAlign.center,
textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorNameEmail),
logo: app.iconName?.isNotEmpty == true
? imagePaths.getConfigurationImagePath(app.iconName!)
: null,
publicLogoUri: app.publicIconUri,
onTapCallback: () => _openApp(context, app),
logo: app.getIconPath(imagePaths),
onTapCallback: _handleOpenApp,
padding: const EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 20),
hoverColor: AppColor.colorBgMailboxSelected
);
}
void _openApp(BuildContext context, LinagoraApp app) async {
if (PlatformInfo.isWeb) {
if (await launcher.canLaunchUrl(app.appUri)) {
await launcher.launchUrl(app.appUri);
}
} else if (Platform.isAndroid && app.androidPackageId?.isNotEmpty == true) {
await LaunchApp.openApp(androidPackageName: app.androidPackageId);
} else if (Platform.isIOS && app.iosUrlScheme?.isNotEmpty == true) {
await LaunchApp.openApp(
iosUrlScheme: '${app.iosUrlScheme}://',
appStoreLink: app.iosAppStoreLink
);
} else {
if (await launcher.canLaunchUrl(app.appUri)) {
await launcher.launchUrl(
app.appUri,
mode: launcher.LaunchMode.externalApplication
);
}
}
Future<void> _handleOpenApp() async {
await launchApplication(
androidPackageId: app.androidPackageId,
iosScheme: app.iosUrlScheme,
iosStoreLink: app.iosAppStoreLink,
uri: app.appRedirectLink,
);
}
}
@@ -4,6 +4,7 @@ import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:model/support/contact_support_capability.dart';
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/application_logo_with_text_widget.dart';
@@ -11,7 +12,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/navigation_bar_style.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_icon.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
class NavigationBarWidget extends StatelessWidget {
@@ -21,7 +21,6 @@ class NavigationBarWidget extends StatelessWidget {
final Widget? searchForm;
final AppGridDashboardController? appGridController;
final VoidCallback? onTapApplicationLogoAction;
final VoidCallback? onShowAppDashboardAction;
final OnTapAvatarActionWithPositionClick? onTapAvatarAction;
final OnTapContactSupportAction? onTapContactSupportAction;
@@ -32,7 +31,6 @@ class NavigationBarWidget extends StatelessWidget {
this.contactSupportCapability,
this.searchForm,
this.appGridController,
this.onShowAppDashboardAction,
this.onTapApplicationLogoAction,
this.onTapAvatarAction,
this.onTapContactSupportAction,
@@ -74,15 +72,17 @@ class NavigationBarWidget extends StatelessWidget {
tooltipMessage: AppLocalizations.of(context).getHelpOrReportABug,
onTapActionCallback: () => onTapContactSupportAction?.call(contactSupportCapability!),
),
if (AppConfig.appGridDashboardAvailable && appGridController != null)
Padding(
padding: const EdgeInsetsDirectional.only(end: 16),
child: AppGridDashboardIcon(
imagePaths: imagePaths,
appGridController: appGridController!,
onShowAppDashboardAction: onShowAppDashboardAction,
),
),
if (appGridController != null)
Obx(() {
if (appGridController!.listLinagoraApp.isNotEmpty) {
return AppGridDashboardIcon(
imagePaths: imagePaths,
linagoraApps: appGridController!.listLinagoraApp,
);
}
return const SizedBox.shrink();
}),
const SizedBox(width: 16),
(AvatarBuilder()
..text(avatarUserName)
..backgroundColor(Colors.white)
@@ -114,15 +114,17 @@ class NavigationBarWidget extends StatelessWidget {
tooltipMessage: AppLocalizations.of(context).getHelpOrReportABug,
onTapActionCallback: () => onTapContactSupportAction?.call(contactSupportCapability!),
),
if (AppConfig.appGridDashboardAvailable && appGridController != null)
Padding(
padding: const EdgeInsetsDirectional.only(end: 16),
child: AppGridDashboardIcon(
imagePaths: imagePaths,
appGridController: appGridController!,
onShowAppDashboardAction: onShowAppDashboardAction,
),
),
if (appGridController != null)
Obx(() {
if (appGridController!.listLinagoraApp.isNotEmpty) {
return AppGridDashboardIcon(
imagePaths: imagePaths,
linagoraApps: appGridController!.listLinagoraApp,
);
}
return const SizedBox.shrink();
}),
const SizedBox(width: 16),
(AvatarBuilder()
..text(avatarUserName)
..backgroundColor(Colors.white)