Skip to content

Commit 37f8ce3

Browse files
committed
TF-1437 Handle search mailbox in destination picker
1 parent 62286c8 commit 37f8ce3

File tree

7 files changed

+192
-305
lines changed

7 files changed

+192
-305
lines changed

lib/features/destination_picker/presentation/destination_picker_controller.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,10 @@ class DestinationPickerController extends BaseMailboxController {
282282

283283
void searchMailbox(String value) {
284284
searchQuery.value = SearchQuery(value);
285-
_searchMailboxAction(allMailboxes, searchQuery.value);
285+
_searchMailboxAction(
286+
allMailboxes.listPersonalMailboxes,
287+
searchQuery.value
288+
);
286289
}
287290

288291
void _searchMailboxAction(List<PresentationMailbox> allMailboxes, SearchQuery searchQuery) {

lib/features/destination_picker/presentation/destination_picker_view.dart

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
2020
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
2121
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
2222
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart';
23+
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart';
2324
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart';
2425
import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
2526
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
2627
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
2728
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
2829
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
2930
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart';
30-
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart';
3131
import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart';
3232
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart';
3333
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -385,33 +385,22 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
385385
MailboxActions? actions,
386386
MailboxId? mailboxIdSelected
387387
) {
388-
return Obx(() => Container(
389-
margin: const EdgeInsets.only(
390-
bottom: 8,
391-
top: BuildUtils.isWeb ? 8 : 0),
392-
decoration: _responsiveUtils.isDesktop(context)
393-
? BoxDecoration(
394-
borderRadius: BorderRadius.circular(10),
395-
color: Colors.white)
396-
: null,
397-
child: ListView.builder(
398-
key: const Key('list_mailbox_searched'),
399-
itemCount: controller.listMailboxSearched.length,
400-
shrinkWrap: true,
401-
primary: false,
402-
itemBuilder: (context, index) =>
403-
Obx(() => (MailboxSearchTileBuilder(
404-
context,
405-
_imagePaths,
406-
_responsiveUtils,
407-
controller.listMailboxSearched[index],
408-
mailboxActions: actions,
409-
mailboxIdAlreadySelected: mailboxIdSelected,
410-
mailboxDisplayed: MailboxDisplayed.destinationPicker,
411-
mailboxIdDestination: controller.mailboxDestination.value?.id)
412-
..addOnOpenMailboxAction((mailbox) => _pickPresentationMailbox(context, mailbox)))
413-
.build())
414-
)
388+
return Obx(() => ListView.builder(
389+
key: const Key('list_mailbox_searched'),
390+
itemCount: controller.listMailboxSearched.length,
391+
shrinkWrap: true,
392+
primary: false,
393+
padding: const EdgeInsets.symmetric(horizontal: 16),
394+
itemBuilder: (context, index) {
395+
return Obx(() => DestinationPickerSearchMailboxItemBuilder(
396+
_imagePaths,
397+
_responsiveUtils,
398+
controller.listMailboxSearched[index],
399+
mailboxActions: actions,
400+
mailboxIdAlreadySelected: mailboxIdSelected,
401+
onClickOpenMailboxAction: (mailbox) => _pickPresentationMailbox(context, mailbox),
402+
));
403+
}
415404
));
416405
}
417406

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import 'package:core/presentation/extensions/color_extension.dart';
2+
import 'package:core/presentation/resources/image_paths.dart';
3+
import 'package:core/presentation/utils/responsive_utils.dart';
4+
import 'package:core/presentation/utils/style_utils.dart';
5+
import 'package:core/utils/build_utils.dart';
6+
import 'package:flutter/material.dart';
7+
import 'package:flutter_svg/flutter_svg.dart';
8+
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
9+
import 'package:model/mailbox/presentation_mailbox.dart';
10+
import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart';
11+
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
12+
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
13+
import 'package:tmail_ui_user/features/search/mailbox/presentation/utils/search_mailbox_utils.dart';
14+
15+
class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
16+
17+
final PresentationMailbox _presentationMailbox;
18+
final ImagePaths _imagePaths;
19+
final ResponsiveUtils _responsiveUtils;
20+
final MailboxActions? mailboxActions;
21+
final MailboxId? mailboxIdAlreadySelected;
22+
final OnClickOpenMailboxAction? onClickOpenMailboxAction;
23+
24+
const DestinationPickerSearchMailboxItemBuilder(
25+
this._imagePaths,
26+
this._responsiveUtils,
27+
this._presentationMailbox,
28+
{
29+
Key? key,
30+
this.mailboxActions,
31+
this.mailboxIdAlreadySelected,
32+
this.onClickOpenMailboxAction
33+
}
34+
) : super(key: key);
35+
36+
@override
37+
Widget build(BuildContext context) {
38+
return AbsorbPointer(
39+
absorbing: !_presentationMailbox.isActivated,
40+
child: Opacity(
41+
opacity: _presentationMailbox.isActivated ? 1.0 : 0.3,
42+
child: Material(
43+
color: Colors.transparent,
44+
child: InkWell(
45+
onTap: _onTapMailboxAction,
46+
borderRadius: const BorderRadius.all(Radius.circular(8)),
47+
hoverColor: AppColor.colorBgMailboxSelected,
48+
child: Padding(
49+
padding: SearchMailboxUtils.getPaddingItemListView(context, _responsiveUtils),
50+
child: Row(
51+
crossAxisAlignment: _presentationMailbox.mailboxPath?.isNotEmpty == true
52+
|| _presentationMailbox.isTeamMailboxes
53+
? CrossAxisAlignment.start
54+
: CrossAxisAlignment.center,
55+
children: [
56+
_buildMailboxIcon(),
57+
Expanded(child: Padding(
58+
padding: const EdgeInsets.symmetric(horizontal: 8),
59+
child: Column(
60+
crossAxisAlignment: CrossAxisAlignment.start,
61+
children: [
62+
_buildTitleItem(),
63+
_buildSubtitleItem()
64+
]
65+
)
66+
)),
67+
_buildSelectedIcon()
68+
]
69+
),
70+
)
71+
),
72+
)
73+
),
74+
);
75+
}
76+
77+
void _onTapMailboxAction() {
78+
if (onClickOpenMailboxAction != null) {
79+
onClickOpenMailboxAction?.call(_presentationMailbox);
80+
}
81+
}
82+
83+
Widget _buildMailboxIcon() {
84+
return SvgPicture.asset(
85+
_presentationMailbox.getMailboxIcon(_imagePaths),
86+
width: BuildUtils.isWeb ? 20 : 24,
87+
height: BuildUtils.isWeb ? 20 : 24,
88+
fit: BoxFit.fill
89+
);
90+
}
91+
92+
Widget _buildTitleItem() {
93+
return Text(
94+
_presentationMailbox.name?.name ?? '',
95+
maxLines: 1,
96+
overflow: CommonTextStyle.defaultTextOverFlow,
97+
softWrap: CommonTextStyle.defaultSoftWrap,
98+
style: const TextStyle(
99+
fontSize: 15,
100+
color: Colors.black
101+
),
102+
);
103+
}
104+
105+
Widget _buildSubtitleItem() {
106+
if (_presentationMailbox.mailboxPath?.isNotEmpty == true) {
107+
return Text(
108+
_presentationMailbox.mailboxPath ?? '',
109+
maxLines: 1,
110+
overflow: CommonTextStyle.defaultTextOverFlow,
111+
softWrap: CommonTextStyle.defaultSoftWrap,
112+
style: const TextStyle(
113+
fontSize: 11,
114+
color: AppColor.colorMailboxPath,
115+
fontWeight: FontWeight.normal
116+
),
117+
);
118+
} else if (_presentationMailbox.isTeamMailboxes) {
119+
return Text(
120+
_presentationMailbox.emailTeamMailBoxes ?? '',
121+
maxLines: 1,
122+
softWrap: CommonTextStyle.defaultSoftWrap,
123+
overflow: CommonTextStyle.defaultTextOverFlow,
124+
style: const TextStyle(
125+
fontSize: 11,
126+
color: AppColor.colorEmailAddressFull,
127+
fontWeight: FontWeight.normal
128+
)
129+
);
130+
} else {
131+
return const SizedBox.shrink();
132+
}
133+
}
134+
135+
Widget _buildSelectedIcon() {
136+
if (_presentationMailbox.id == mailboxIdAlreadySelected &&
137+
(mailboxActions == MailboxActions.select ||
138+
mailboxActions == MailboxActions.create)) {
139+
return Padding(
140+
padding: const EdgeInsets.only(right: 8),
141+
child: SvgPicture.asset(
142+
_imagePaths.icFilterSelected,
143+
width: 20,
144+
height: 20,
145+
fit: BoxFit.fill
146+
),
147+
);
148+
} else {
149+
return const SizedBox.shrink();
150+
}
151+
}
152+
}

0 commit comments

Comments
 (0)