Fix cannot open email on tablet/ipad device

This commit is contained in:
dab246
2025-09-17 10:44:34 +07:00
committed by Dat H. Pham
parent e6c3ebf0d7
commit a499d5d50f
4 changed files with 119 additions and 155 deletions
@@ -5,7 +5,6 @@ import 'package:get/get.dart';
class ResponsiveUtils {
static const double defaultSizeLeftMenuMobile = 375;
static const double defaultSizeDrawer = 320;
static const double defaultSizeMenu = 256;
static const double mobileLeftMenuSize = 339;
@@ -1,9 +1,66 @@
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_drawer_changed_extension.dart';
abstract class BaseMailboxDashBoardView extends GetWidget<MailboxDashBoardController>
with AppLoaderMixin {
abstract class BaseMailboxDashBoardView
extends GetWidget<MailboxDashBoardController> with AppLoaderMixin {
BaseMailboxDashBoardView({Key? key}) : super(key: key);
}
Widget buildScaffoldHaveDrawer({required Widget body}) {
return Scaffold(
key: controller.scaffoldKey,
drawer: ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
mobile: SizedBox(
width: ResponsiveUtils.mobileLeftMenuSize,
child: MailboxView(),
),
tabletLarge: SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: MailboxView(),
),
desktop: const SizedBox.shrink(),
),
onDrawerChanged:
PlatformInfo.isWeb ? controller.handleDrawerChanged : null,
body: body,
);
}
Widget buildTwoPaneLayout({
required Widget left,
required Widget right,
}) {
return buildScaffoldHaveDrawer(
body: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: left,
),
const VerticalDivider(width: 1),
Expanded(child: right),
],
),
);
}
Widget buildResponsiveWithDrawer({
required Widget left,
required Widget right,
required Widget mobile,
}) {
return ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
tablet: buildTwoPaneLayout(left: left, right: right),
mobile: mobile,
);
}
}
@@ -1,12 +1,9 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:focus_detector_v2/focus_detector_v2.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart';
@@ -15,111 +12,65 @@ import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_view.dart';
class MailboxDashBoardView extends BaseMailboxDashBoardView {
MailboxDashBoardView({Key? key}) : super(key: key);
Widget _loadingIndicator() {
return const Center(
child: SizedBox(
width: 30,
height: 30,
child: CupertinoActivityIndicator(
color: AppColor.colorLoading,
),
),
);
}
@override
Widget build(BuildContext context) {
final bodyLandscapeTablet = Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: _buildScaffoldHaveDrawer(body: ThreadView())),
const VerticalDivider(width: 12),
const Expanded(child: EmailView()),
],
);
return FocusDetector(
onForegroundGained: controller.handleOnForegroundGained,
child: Scaffold(
drawerEnableOpenDragGesture: controller.responsiveUtils.hasLeftMenuDrawerActive(context),
drawerEnableOpenDragGesture:
controller.responsiveUtils.hasLeftMenuDrawerActive(context),
body: Obx(() {
var bodyView = controller.searchController.isSearchEmailRunning
? const EmailView()
: bodyLandscapeTablet;
switch(controller.dashboardRoute.value) {
switch (controller.dashboardRoute.value) {
case DashboardRoutes.thread:
return ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
desktop: bodyView,
tabletLarge: bodyView,
landscapeTablet: bodyView,
mobile: _buildScaffoldHaveDrawer(body: ThreadView()));
return buildResponsiveWithDrawer(
left: ThreadView(),
right: const EmailView(),
mobile: buildScaffoldHaveDrawer(body: ThreadView()),
);
case DashboardRoutes.emailDetailed:
return ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
desktop: bodyView,
tabletLarge: bodyView,
landscapeTablet: bodyView,
mobile: const EmailView());
return controller.searchController.isSearchEmailRunning
? const EmailView()
: buildResponsiveWithDrawer(
left: ThreadView(),
right: const EmailView(),
mobile: const EmailView(),
);
case DashboardRoutes.threadDetailed:
return ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
desktop: bodyView,
tabletLarge: bodyView,
landscapeTablet: bodyView,
mobile: const ThreadDetailView());
return controller.searchController.isSearchEmailRunning
? const ThreadDetailView()
: buildResponsiveWithDrawer(
left: ThreadView(),
right: const ThreadDetailView(),
mobile: const ThreadDetailView(),
);
case DashboardRoutes.searchEmail:
return SafeArea(child: SearchEmailView());
case DashboardRoutes.sendingQueue:
bodyView = Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: _buildScaffoldHaveDrawer(body: const SendingQueueView())),
const VerticalDivider(width: 12),
const Expanded(child: EmailView()),
],
);
return ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
desktop: bodyView,
tabletLarge: bodyView,
landscapeTablet: bodyView,
mobile: _buildScaffoldHaveDrawer(body: const SendingQueueView()));
return buildScaffoldHaveDrawer(body: const SendingQueueView());
case DashboardRoutes.waiting:
return const Center(
child: SizedBox(
width: 30,
height: 30,
child: CupertinoActivityIndicator(color: AppColor.colorLoading)));
return _loadingIndicator();
}
}),
),
);
}
_buildScaffoldHaveDrawer({required Widget body}) {
return Scaffold(
key: controller.scaffoldKey,
body: body,
drawer: ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
mobile: SizedBox(
width: ResponsiveUtils.mobileLeftMenuSize,
child: MailboxView()
),
tablet: SizedBox(
width: ResponsiveUtils.defaultSizeDrawer,
child: MailboxView()
),
landscapeTablet: SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: MailboxView()
),
tabletLarge: SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: MailboxView()
),
desktop: SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: MailboxView()
)
),
);
}
}
}
@@ -19,7 +19,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view_web.dar
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_drawer_changed_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_open_context_menu_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
@@ -295,56 +294,31 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
),
),
tabletLarge: Obx(() {
switch(controller.dashboardRoute.value) {
switch (controller.dashboardRoute.value) {
case DashboardRoutes.searchEmail:
return SearchEmailView();
case DashboardRoutes.emailDetailed:
case DashboardRoutes.threadDetailed:
return controller.searchController.isSearchEmailRunning
? const ThreadDetailView()
: buildResponsiveWithDrawer(
left: ThreadView(),
right: const ThreadDetailView(),
mobile: const ThreadDetailView(),
);
default:
return controller.searchController.isSearchEmailRunning
? const EmailView()
: _buildScaffoldHaveDrawer(
body: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()),
const VerticalDivider(width: 1),
const Expanded(child: EmailView()),
],
),
);
case DashboardRoutes.threadDetailed:
return _buildScaffoldHaveDrawer(
body: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()),
const VerticalDivider(width: 1),
const Expanded(child: ThreadDetailView()),
],
),
);
default:
return _buildScaffoldHaveDrawer(
body: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()),
const VerticalDivider(width: 1),
const Expanded(child: EmailView()),
],
),
);
: buildResponsiveWithDrawer(
left: ThreadView(),
right: const EmailView(),
mobile: const EmailView(),
);
}
}),
mobile: Obx(() {
switch(controller.dashboardRoute.value) {
case DashboardRoutes.thread:
return _buildScaffoldHaveDrawer(body: ThreadView());
return buildScaffoldHaveDrawer(body: ThreadView());
case DashboardRoutes.threadDetailed:
return const ThreadDetailView();
case DashboardRoutes.emailDetailed:
@@ -352,7 +326,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
case DashboardRoutes.searchEmail:
return SearchEmailView();
default:
return _buildScaffoldHaveDrawer(body: ThreadView());
return buildScaffoldHaveDrawer(body: ThreadView());
}
}),
),
@@ -391,23 +365,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
);
}
Widget _buildScaffoldHaveDrawer({required Widget body}) {
return Scaffold(
key: controller.scaffoldKey,
drawer: ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
mobile: SizedBox(
width: ResponsiveUtils.mobileLeftMenuSize,
child: MailboxView(),
),
tabletLarge: SizedBox(width: ResponsiveUtils.defaultSizeLeftMenuMobile, child: MailboxView()),
desktop: const SizedBox.shrink()
),
onDrawerChanged: controller.handleDrawerChanged,
body: body,
);
}
Widget _buildThreadViewForWebDesktop(BuildContext context) {
return Container(
margin: const EdgeInsetsDirectional.only(end: 16, bottom: 16),