TF-3950 Apply new style for Folder Visibility on mobile

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-08-07 13:14:12 +07:00
committed by Dat H. Pham
parent efba186e68
commit 1faf710346
3 changed files with 71 additions and 38 deletions
@@ -51,6 +51,7 @@ class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
bottom: 16, bottom: 16,
), ),
isCenter: true, isCenter: true,
textAlign: TextAlign.center,
), ),
Expanded( Expanded(
child: Padding( child: Padding(
@@ -62,11 +62,12 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
padding: EdgeInsetsDirectional.only( padding: EdgeInsetsDirectional.only(
start: 16, start: 16,
end: 16, end: 16,
bottom: 16, bottom: 8,
), ),
isCenter: true, isCenter: true,
textAlign: TextAlign.center,
), ),
_buildLoadingView(), _buildLoadingView(context),
Expanded( Expanded(
child: _buildListMailbox(context), child: _buildListMailbox(context),
), ),
@@ -76,47 +77,69 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
); );
} }
Widget _buildLoadingView() { Widget _buildLoadingView(BuildContext context) {
final isScreenWithShortestSide = controller
.responsiveUtils
.isScreenWithShortestSide(context);
return Obx( return Obx(
() => controller.viewState.value.fold( () => controller.viewState.value.fold(
(failure) => const SizedBox(height: 24), (failure) => isScreenWithShortestSide
(success) => success is LoadingState || success is LoadingBuildTreeMailboxVisibility ? const SizedBox.shrink()
? loadingWidget
: const SizedBox(height: 24), : const SizedBox(height: 24),
(success) => success is LoadingState ||
success is LoadingBuildTreeMailboxVisibility
? loadingWidget
: isScreenWithShortestSide
? const SizedBox.shrink()
: const SizedBox(height: 24),
), ),
); );
} }
Widget _buildListMailbox(BuildContext context) { Widget _buildListMailbox(BuildContext context) {
return SingleChildScrollView( Widget bodyListMailbox = Column(
controller: controller.mailboxListScrollController, crossAxisAlignment: CrossAxisAlignment.start,
key: const PageStorageKey('mailbox_list'), children: [
physics: const ClampingScrollPhysics(), Obx(
child: Column( () => controller.defaultMailboxIsNotEmpty
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Obx(() => controller.defaultMailboxIsNotEmpty
? _buildMailboxCategory( ? _buildMailboxCategory(
context, context,
MailboxCategories.exchange, MailboxCategories.exchange,
controller.defaultRootNode, controller.defaultRootNode,
) )
: const SizedBox.shrink()), : const SizedBox.shrink(),
Obx(() { ),
return MailboxVisibilityFoldersBarWidget( Obx(() {
imagePaths: controller.imagePaths, return MailboxVisibilityFoldersBarWidget(
expandMode: controller.foldersExpandMode.value, imagePaths: controller.imagePaths,
onToggleExpandFolder: controller.toggleExpandFolders, expandMode: controller.foldersExpandMode.value,
); onToggleExpandFolder: controller.toggleExpandFolders,
}), );
Obx(() => AnimatedContainer( }),
duration: const Duration(milliseconds: 400), Obx(
child: controller.foldersExpandMode.value == ExpandMode.EXPAND () => AnimatedContainer(
? buildFolders(context) duration: const Duration(milliseconds: 400),
: const Offstage(), child: controller.foldersExpandMode.value == ExpandMode.EXPAND
)), ? buildFolders(context)
], : const Offstage(),
), ),
),
],
);
if (controller.responsiveUtils.isScreenWithShortestSide(context)) {
bodyListMailbox = Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: bodyListMailbox,
);
}
return SingleChildScrollView(
controller: controller.mailboxListScrollController,
key: const PageStorageKey('mailbox_list'),
physics: const ClampingScrollPhysics(),
child: bodyListMailbox,
); );
} }
@@ -1,5 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
@@ -32,11 +33,13 @@ class MailBoxVisibilityFolderTileBuilder extends StatefulWidget {
class _MailBoxVisibilityFolderTileBuilderState class _MailBoxVisibilityFolderTileBuilderState
extends State<MailBoxVisibilityFolderTileBuilder> { extends State<MailBoxVisibilityFolderTileBuilder> {
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final GlobalKey _key = GlobalKey(); final GlobalKey _key = GlobalKey();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isScreenWithShortestSide = _responsiveUtils.isScreenWithShortestSide(context);
final bodyWidget = Material( final bodyWidget = Material(
key: _key, key: _key,
type: MaterialType.transparency, type: MaterialType.transparency,
@@ -47,8 +50,10 @@ class _MailBoxVisibilityFolderTileBuilderState
), ),
child: Container( child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12), padding: const EdgeInsets.symmetric(horizontal: 12),
width: 315, width: isScreenWithShortestSide ? double.infinity : 315,
height: 40, height: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxHeight
: 40,
child: Row(children: [ child: Row(children: [
if (_isIconDisplayed) if (_isIconDisplayed)
MailboxIconWidget( MailboxIconWidget(
@@ -77,12 +82,16 @@ class _MailBoxVisibilityFolderTileBuilderState
), ),
); );
return Row( if (isScreenWithShortestSide) {
children: [ return bodyWidget;
Flexible(child: bodyWidget), } else {
const Spacer(), return Row(
], children: [
); Flexible(child: bodyWidget),
const Spacer(),
],
);
}
} }
PresentationMailbox get _mailbox => widget.mailboxNode.item; PresentationMailbox get _mailbox => widget.mailboxNode.item;