diff --git a/assets/images/ic_tag.svg b/assets/images/ic_tag.svg new file mode 100644 index 000000000..2f129a8bf --- /dev/null +++ b/assets/images/ic_tag.svg @@ -0,0 +1,5 @@ + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 4608b9ace..ef8b9ea2c 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -275,6 +275,7 @@ class ImagePaths { String get icAiMoreDetail => _getImagePath('ic_ai_more_detail.svg'); String get icAiMoreProfessional => _getImagePath('ic_ai_more_professional.svg'); String get icAiMorePolite => _getImagePath('ic_ai_more_polite.svg'); + String get icTag => _getImagePath('ic_tag.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/lib/features/mailbox/presentation/base_mailbox_view.dart b/lib/features/mailbox/presentation/base_mailbox_view.dart index 1a2182629..ebe974995 100644 --- a/lib/features/mailbox/presentation/base_mailbox_view.dart +++ b/lib/features/mailbox/presentation/base_mailbox_view.dart @@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_catego import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folders_bar_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_list_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/labels_bar_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_app_bar.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_category_widget.dart'; @@ -338,6 +339,7 @@ abstract class BaseMailboxView extends GetWidget : const Offstage(), )), buildLabelsBar(context, isDesktop), + buildLabelsList(context, isDesktop), ]), ); } @@ -345,11 +347,11 @@ abstract class BaseMailboxView extends GetWidget Widget buildLabelsBar(BuildContext context, bool isDesktop) { return Obx(() { if (controller.mailboxDashBoardController.isLabelCapabilitySupported) { - final labelController = controller - .mailboxDashBoardController - .labelController; + final labelController = + controller.mailboxDashBoardController.labelController; final labelListExpandMode = labelController.labelListExpandMode.value; + final countLabels = labelController.labels.length; return LabelsBarWidget( imagePaths: controller.imagePaths, @@ -360,6 +362,7 @@ abstract class BaseMailboxView extends GetWidget : const EdgeInsetsDirectional.only(start: 24, end: 12), labelStyle: isDesktop ? null : ThemeUtils.textStyleInter500(), expandMode: labelListExpandMode, + countLabels: countLabels, onToggleLabelListState: labelController.toggleLabelListState, ); } else { @@ -367,4 +370,29 @@ abstract class BaseMailboxView extends GetWidget } }); } + + Widget buildLabelsList(BuildContext context, bool isDesktop) { + return Obx(() { + if (controller.mailboxDashBoardController.isLabelCapabilitySupported) { + final labelController = + controller.mailboxDashBoardController.labelController; + + final labelListExpandMode = labelController.labelListExpandMode.value; + final labels = labelController.labels; + + return AnimatedContainer( + duration: const Duration(milliseconds: 400), + child: labelListExpandMode == ExpandMode.EXPAND && labels.isNotEmpty + ? LabelListView( + labels: labels, + imagePaths: controller.imagePaths, + isDesktop: isDesktop, + ) + : const Offstage(), + ); + } else { + return const SizedBox.shrink(); + } + }); + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/labels/label_icon_widget.dart b/lib/features/mailbox/presentation/widgets/labels/label_icon_widget.dart new file mode 100644 index 000000000..55f7eee7e --- /dev/null +++ b/lib/features/mailbox/presentation/widgets/labels/label_icon_widget.dart @@ -0,0 +1,36 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart'; + +class LabelIconWidget extends StatelessWidget { + final String icon; + final double iconSize; + final EdgeInsetsGeometry padding; + final Color? color; + + const LabelIconWidget({ + super.key, + required this.icon, + this.iconSize = MailboxIconWidgetStyles.iconSize, + this.padding = const EdgeInsetsDirectional.only( + end: MailboxItemWidgetStyles.labelIconSpace, + ), + this.color, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: padding, + child: SvgPicture.asset( + icon, + width: iconSize, + height: iconSize, + colorFilter: color?.asFilter(), + fit: BoxFit.fill, + ), + ); + } +} diff --git a/lib/features/mailbox/presentation/widgets/labels/label_list_item.dart b/lib/features/mailbox/presentation/widgets/labels/label_list_item.dart new file mode 100644 index 000000000..5c27bb05a --- /dev/null +++ b/lib/features/mailbox/presentation/widgets/labels/label_list_item.dart @@ -0,0 +1,70 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:labels/extensions/label_extension.dart'; +import 'package:labels/model/label.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_icon_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_name_widget.dart'; + +class LabelListItem extends StatelessWidget { + final Label label; + final ImagePaths imagePaths; + final bool isDesktop; + + const LabelListItem({ + super.key, + required this.label, + required this.imagePaths, + this.isDesktop = false, + }); + + @override + Widget build(BuildContext context) { + final borderRadius = BorderRadius.all( + Radius.circular( + isDesktop + ? MailboxItemWidgetStyles.mobileBorderRadius + : MailboxItemWidgetStyles.borderRadius, + ), + ); + + return Material( + type: MaterialType.transparency, + child: InkWell( + onTap: () {}, + borderRadius: borderRadius, + child: Container( + decoration: BoxDecoration(borderRadius: borderRadius), + padding: EdgeInsetsDirectional.symmetric( + horizontal: isDesktop + ? MailboxItemWidgetStyles.mobileItemPadding + : MailboxItemWidgetStyles.itemPadding, + ), + height: isDesktop + ? MailboxItemWidgetStyles.mobileHeight + : MailboxItemWidgetStyles.height, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LabelIconWidget( + icon: imagePaths.icTag, + color: label.backgroundColor, + padding: EdgeInsetsDirectional.only( + end: isDesktop + ? MailboxItemWidgetStyles.labelIconSpace + : MailboxItemWidgetStyles.mobileLabelIconSpace, + ), + ), + Expanded( + child: LabelNameWidget( + name: label.safeDisplayName, + isDesktop: isDesktop, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/features/mailbox/presentation/widgets/labels/label_list_view.dart b/lib/features/mailbox/presentation/widgets/labels/label_list_view.dart new file mode 100644 index 000000000..c1d0785a8 --- /dev/null +++ b/lib/features/mailbox/presentation/widgets/labels/label_list_view.dart @@ -0,0 +1,44 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:labels/model/label.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_list_item.dart'; + +class LabelListView extends StatelessWidget { + final List