TF-3479 Add hide button for composer

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-03-03 16:01:01 +07:00
committed by Dat H. Pham
parent 5f461c07ff
commit 7f1fee0211
11 changed files with 79 additions and 16 deletions
@@ -1609,10 +1609,10 @@ class ComposerController extends BaseController
}
void displayScreenTypeComposerAction(ScreenDisplayMode displayMode) async {
if (screenDisplayMode.value == ScreenDisplayMode.minimize) {
if (screenDisplayMode.value.isNotContentVisible()) {
_isEmailBodyLoaded = false;
}
if (richTextWebController != null && screenDisplayMode.value != ScreenDisplayMode.minimize) {
if (richTextWebController != null && !screenDisplayMode.value.isNotContentVisible()) {
final textCurrent = await richTextWebController!.editorController.getText();
richTextWebController!.editorController.setText(textCurrent);
}
@@ -641,6 +641,7 @@ class ComposerView extends GetWidget<ComposerController> {
},
composerManager: controller.mailboxDashBoardController.composerManager,
responsiveUtils: controller.responsiveUtils,
imagePaths: controller.imagePaths,
displayMode: controller.screenDisplayMode.value,
emailSubject: controller.subjectEmail.value ?? '',
onCloseViewAction: () => controller.handleClickCloseComposer(context),
@@ -189,6 +189,11 @@ class ComposerManager extends GetxController {
}) {
if (composerIdsQueue.isEmpty) return;
if (newDisplayMode.isNotContentVisible()) {
composers.refresh();
return;
}
var (availableScreenWidth, totalOpenedComposersWidth, composerControllers) =
_getSizeToArrangeComposer(screenWidth: screenWidth);
@@ -245,6 +250,10 @@ class ComposerManager extends GetxController {
: null;
}
bool get isAllHiddenComposer {
return composerIdsQueue.every((id) => getComposerView(id).controller.isHiddenScreen);
}
List<String> get hiddenComposerIds {
return composerIdsQueue
.where((id) => getComposerView(id).controller.isHiddenScreen)
@@ -4,4 +4,6 @@ enum ScreenDisplayMode {
minimize,
normal,
hidden;
bool isNotContentVisible() => this == minimize || this == hidden;
}
@@ -9,7 +9,7 @@ class ComposerStyle {
static const double keyboardToolBarHeight = 200;
static const double popupMenuRadius = 8;
static const double suggestionItemHeight = 60;
static const double normalWidth = 725;
static const double normalWidth = 600;
static const double normalHeight = 525;
static const double minimizeWidth = 400;
static const double minimizeHeight = 52;
@@ -35,7 +35,27 @@ class ComposerOverlayView extends StatelessWidget {
if (fullScreenComposerView != null) return fullScreenComposerView;
if (composerIdsQueue.length == 1) {
return _composerManager.getComposerView(composerIdsQueue.first);
final composerView = _composerManager.getComposerView(composerIdsQueue.first);
if (composerView.controller.isHiddenScreen) {
return Align(
alignment: AlignmentDirectional.bottomEnd,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Padding(
padding: const EdgeInsetsDirectional.all(ComposerStyle.padding),
child: ExpandComposerButton(
countComposerHidden: 1,
onRemoveHiddenComposerItem: (controller) =>
controller.handleClickCloseComposer(context),
onShowComposerAction: _composerManager.showComposerIfHidden,
),
),
),
);
} else {
return composerView;
}
}
final countComposerHidden = _composerManager.countComposerHidden;
@@ -1,3 +1,4 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
@@ -9,6 +10,7 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/web/minimiz
class DesktopResponsiveContainerView extends StatelessWidget {
final ResponsiveUtils responsiveUtils;
final ImagePaths imagePaths;
final ComposerManager composerManager;
final ScreenDisplayMode displayMode;
final String emailSubject;
@@ -21,6 +23,7 @@ class DesktopResponsiveContainerView extends StatelessWidget {
required this.childBuilder,
required this.composerManager,
required this.responsiveUtils,
required this.imagePaths,
required this.displayMode,
required this.emailSubject,
required this.onCloseViewAction,
@@ -32,6 +35,7 @@ class DesktopResponsiveContainerView extends StatelessWidget {
if (displayMode == ScreenDisplayMode.minimize) {
final composerWidget = PointerInterceptor(
child: MinimizeComposerWidget(
imagePaths: imagePaths,
emailSubject: emailSubject,
onCloseViewAction: onCloseViewAction,
onChangeDisplayModeAction: onChangeDisplayModeAction,
@@ -35,6 +35,16 @@ class DesktopAppBarComposerWidget extends StatelessWidget {
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
if (onChangeDisplayModeAction != null)
... [
TMailButtonWidget.fromIcon(
icon: imagePaths.icDoubleArrowDown,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).hide,
iconSize: AppBarComposerWidgetStyle.iconSize,
iconColor: AppBarComposerWidgetStyle.iconColor,
padding: AppBarComposerWidgetStyle.iconPadding,
onTapActionCallback: () => onChangeDisplayModeAction!(ScreenDisplayMode.hidden),
),
const SizedBox(width: AppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: imagePaths.icMinimize,
backgroundColor: Colors.transparent,
@@ -89,6 +89,8 @@ class _ExpandComposerButtonState extends State<ExpandComposerButton> {
),
);
final isAllHiddenComposer = _composerManager.isAllHiddenComposer;
return PortalTarget(
visible: _visible,
portalFollower: GestureDetector(
@@ -96,10 +98,16 @@ class _ExpandComposerButtonState extends State<ExpandComposerButton> {
onTap: () => setState(() => _visible = false),
),
child: PortalTarget(
anchor: const Aligned(
follower: Alignment.bottomLeft,
target: Alignment.topLeft,
offset: Offset(0.0, 0.0),
anchor: Aligned(
follower: isAllHiddenComposer
? Alignment.bottomRight
: Alignment.bottomLeft,
target: isAllHiddenComposer
? Alignment.topRight
: Alignment.topLeft,
offset: isAllHiddenComposer
? const Offset(16.0, 0.0)
: const Offset(0.0, 0.0),
),
portalFollower: HiddenComposerListViewOverlay(
composerManager: _composerManager,
@@ -1,7 +1,6 @@
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:get/get.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/minimize_composer_widget_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/title_composer_widget.dart';
@@ -11,14 +10,14 @@ typedef OnChangeDisplayModeAction = Function(ScreenDisplayMode mode);
class MinimizeComposerWidget extends StatelessWidget {
final ImagePaths imagePaths;
final OnChangeDisplayModeAction onChangeDisplayModeAction;
final VoidCallback onCloseViewAction;
final String emailSubject;
final _imagePaths = Get.find<ImagePaths>();
MinimizeComposerWidget({
const MinimizeComposerWidget({
super.key,
required this.imagePaths,
required this.emailSubject,
required this.onChangeDisplayModeAction,
required this.onCloseViewAction,
@@ -40,7 +39,7 @@ class MinimizeComposerWidget extends StatelessWidget {
child: Row(
children: [
TMailButtonWidget.fromIcon(
icon: _imagePaths.icCancel,
icon: imagePaths.icCancel,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).saveAndClose,
iconSize: MinimizeComposerWidgetStyle.iconSize,
@@ -50,7 +49,7 @@ class MinimizeComposerWidget extends StatelessWidget {
),
const SizedBox(width: MinimizeComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icFullScreen,
icon: imagePaths.icFullScreen,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).fullscreen,
iconSize: MinimizeComposerWidgetStyle.iconSize,
@@ -60,7 +59,7 @@ class MinimizeComposerWidget extends StatelessWidget {
),
const SizedBox(width: MinimizeComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icChevronUp,
icon: imagePaths.icChevronUp,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).show,
iconSize: MinimizeComposerWidgetStyle.iconSize,
@@ -69,6 +68,16 @@ class MinimizeComposerWidget extends StatelessWidget {
onTapActionCallback: () => onChangeDisplayModeAction(ScreenDisplayMode.normal)
),
const SizedBox(width: MinimizeComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: imagePaths.icDoubleArrowDown,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).hide,
iconSize: MinimizeComposerWidgetStyle.iconSize,
iconColor: MinimizeComposerWidgetStyle.iconColor,
padding: MinimizeComposerWidgetStyle.iconPadding,
onTapActionCallback: () => onChangeDisplayModeAction(ScreenDisplayMode.hidden),
),
const SizedBox(width: MinimizeComposerWidgetStyle.space),
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
]
)
@@ -826,7 +826,7 @@ class MailboxDashBoardController extends ReloadableController
}
void hideMailboxMenuWhenScreenSizeChange(BuildContext context) {
if (isDrawerOpen && responsiveUtils.isWebDesktop(context)) {
if (responsiveUtils.isWebDesktop(context) && isDrawerOpen) {
WidgetsBinding.instance.addPostFrameCallback((_) {
closeMailboxMenuDrawer();
});