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