Skip to content

Dropdown Group Menu and filter persistance#292

Closed
ericszimmermann wants to merge 15 commits into
zjs81:mainfrom
ericszimmermann:ez_group_dropdown
Closed

Dropdown Group Menu and filter persistance#292
ericszimmermann wants to merge 15 commits into
zjs81:mainfrom
ericszimmermann:ez_group_dropdown

Conversation

@ericszimmermann

Copy link
Copy Markdown
Contributor

Pull Request for changes on Contact screen.

Filter persistance:
In this Pull-Request I want to make changes, that the set Filters will be saved.
With that, pagechanges to/from contacts, channels, map or opening a chat will not reset the filters set.

Dropdown Group Menu, like proposed in Issue #133.

Copilot AI review requested due to automatic review settings March 14, 2026 00:52
@ericszimmermann

Copy link
Copy Markdown
Contributor Author

sadly I still have a problem that the groups are not saved reliably.
Has someone insight why that may be?

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the Contacts and Channels screens to keep user-selected filters/search state across navigation, and changes contact group UX to use a dropdown “drill-in” style menu (per Issue #133).

Changes:

  • Introduces UiViewStateService (global ChangeNotifier) to persist contacts/channels view state (search text, sort/filter, selected group).
  • Reworks Contacts UI to select/manage groups via a dropdown menu (add/edit/delete actions embedded in the dropdown).
  • Updates contact group storage key behavior and adds a legacy-key migration path.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation for macOS builds.
lib/widgets/list_filter_widget.dart Removes “new group” action from the contacts filter menu.
lib/storage/contact_group_store.dart Changes key scoping behavior and legacy migration logic for contact groups.
lib/services/ui_view_state_service.dart Adds global view-state persistence for contacts/channels UI settings.
lib/screens/contacts_screen.dart Implements group dropdown menu + moves filter/search state into UiViewStateService.
lib/screens/channels_screen.dart Moves channel search/sort state into UiViewStateService.
lib/main.dart Registers UiViewStateService in the app’s Provider tree.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread lib/storage/contact_group_store.dart Outdated
Comment on lines 13 to 60
@@ -53,12 +50,13 @@ class ContactGroupStore {
}

Future<void> saveGroups(List<ContactGroup> groups) async {
if (publicKeyHex.isEmpty) {
appLogger.warn('Public key hex is not set. Cannot save contact groups.');
return;
}
final prefs = PrefsManager.instance;
final encoded = jsonEncode(groups.map((group) => group.toJson()).toList());
if (publicKeyHex.isEmpty) {
appLogger.warn(
'Public key hex is not set. Saving contact groups to unscoped key $_keyPrefix.',
);
}
await prefs.setString(keyFor, encoded);
Comment on lines +1 to +13
import 'package:flutter/foundation.dart';

import '../widgets/list_filter_widget.dart';

const contactsAllGroupsValue = '__all__';

class UiViewStateService extends ChangeNotifier {
String _contactsSelectedGroupName = contactsAllGroupsValue;
String _contactsSearchText = '';
bool _contactsSearchExpanded = false;
ContactSortOption _contactsSortOption = ContactSortOption.lastSeen;
bool _contactsShowUnreadOnly = false;
ContactTypeFilter _contactsTypeFilter = ContactTypeFilter.all;
Comment thread lib/screens/contacts_screen.dart Outdated
Comment on lines +509 to +548
final sortedGroupNames = _groups.map((group) => group.name).toSet().toList()
..sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));

return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _searchController,
decoration: InputDecoration(
hintText: hintText,
prefixIcon: const Icon(Icons.search),
suffixIcon: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_searchQuery.isNotEmpty)
IconButton(
icon: const Icon(Icons.clear),
onPressed: () {
_searchController.clear();
setState(() {
_searchQuery = '';
});
},
child: Row(
children: [
Expanded(
child: DropdownButtonFormField<String>(
initialValue: _selectedGroup?.name ?? contactsAllGroupsValue,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.symmetric(
horizontal: 12,
vertical: 10,
),
_buildFilterButton(context, connector),
],
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
),
items: [
DropdownMenuItem<String>(
value: contactsAllGroupsValue,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(context.l10n.listFilter_all),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => _closeDropdownAndRun(
context,
() => _showGroupEditor(context, contacts),
),
child: const Icon(Icons.group_add, size: 20),
),
],
),
),
...sortedGroupNames.map((name) {
final group = _groups.firstWhere((g) => g.name == name);
return DropdownMenuItem<String>(
Comment thread lib/screens/contacts_screen.dart Outdated
Comment on lines +529 to +583
DropdownMenuItem<String>(
value: contactsAllGroupsValue,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(context.l10n.listFilter_all),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => _closeDropdownAndRun(
context,
() => _showGroupEditor(context, contacts),
),
child: const Icon(Icons.group_add, size: 20),
),
],
),
),
...sortedGroupNames.map((name) {
final group = _groups.firstWhere((g) => g.name == name);
return DropdownMenuItem<String>(
value: name,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
name,
overflow: TextOverflow.ellipsis,
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => _closeDropdownAndRun(
context,
() => _showGroupEditor(
context,
contacts,
group: group,
),
),
child: const Icon(Icons.edit, size: 20),
),
const SizedBox(width: 8),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => _closeDropdownAndRun(
context,
() => _confirmDeleteGroup(context, group),
),
child: const Icon(
Icons.delete,
size: 20,
color: Colors.red,
),
),
@ericszimmermann ericszimmermann marked this pull request as ready for review March 14, 2026 13:09
Copilot AI review requested due to automatic review settings March 14, 2026 13:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Contacts (and Channels) UI to (1) preserve filter/sort/search state across navigation and (2) replace the previous group “popup members” flow with a dropdown group selector that drills into a group like a filtered contact list (per Issue #133).

Changes:

  • Introduces UiViewStateService (Provider ChangeNotifier) to hold Contacts/Channels view state (search text, sort, filters, selected group).
  • Refactors Contacts screen to use a group dropdown (create/edit/delete actions inside the menu) and applies selected-group filtering to the contact list.
  • Refactors Channels screen to use shared view state for search and sort, and moves contact filter enums into contact_search.dart.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation plugin for macOS build.
lib/widgets/list_filter_widget.dart Removes locally-defined contact filter enums; now imports shared enums from contact_search.dart.
lib/utils/contact_search.dart Becomes the shared home for ContactSortOption / ContactTypeFilter enums used across screens.
lib/services/ui_view_state_service.dart Adds centralized in-memory UI state for Contacts/Channels to persist across navigation.
lib/screens/contacts_screen.dart Uses UiViewStateService, adds group dropdown drill-in UI, and applies selected-group filtering.
lib/screens/channels_screen.dart Uses UiViewStateService for persisted search/sort state and adds mapping for sort selection.
lib/main.dart Registers UiViewStateService in the app-wide MultiProvider.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread lib/services/ui_view_state_service.dart Outdated
Comment thread lib/screens/channels_screen.dart Outdated
Comment on lines +696 to +705
switch (value) {
case 0:
return ChannelSortOption.manual;
case 2:
return ChannelSortOption.latestMessages;
case 3:
return ChannelSortOption.unread;
case 1:
default:
return ChannelSortOption.name;
Comment thread lib/screens/contacts_screen.dart Outdated
Comment on lines +661 to +667
onPressed: () {
if (viewState
.contactsSearchText
.isNotEmpty) {
_searchController.clear();
viewState.setContactsSearchText('');
return;
Comment on lines +226 to 235
if (viewState.channelsSearchText.isNotEmpty)
IconButton(
icon: const Icon(Icons.clear),
onPressed: () {
_searchController.clear();
setState(() {
_searchQuery = '';
});
context
.read<UiViewStateService>()
.setChannelsSearchText('');
},
),
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 14, 2026 13:20
@ericszimmermann ericszimmermann marked this pull request as draft March 14, 2026 13:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Contacts screen UX by replacing the “popup group members” flow with a dropdown group menu (per Issue #133) and introduces an app-scoped view state service so Contacts/Channels search & filter UI state persists across navigation.

Changes:

  • Added UiViewStateService (ChangeNotifier) to hold Contacts/Channels view state (search text, sort/filter selections, selected group).
  • Refactored Contacts screen to use the shared view state, add a dropdown group selector, and filter contacts by selected group.
  • Refactored Channels screen to use the shared view state for search text and sort selection persistence.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation plugin for macOS build.
lib/widgets/list_filter_widget.dart Moves contact sort/type enums out; removes “new group” action from the filter menu.
lib/utils/contact_search.dart Centralizes ContactSortOption / ContactTypeFilter enums with contact query helpers.
lib/services/ui_view_state_service.dart New global view-state service for persisting Contacts/Channels UI selections.
lib/screens/contacts_screen.dart Implements dropdown group menu + wires Contacts filters/search/sort to UiViewStateService.
lib/screens/channels_screen.dart Wires Channels search/sort to UiViewStateService.
lib/main.dart Provides UiViewStateService at app level via Provider.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +445 to +454
return PopupMenuButton<String>(
position: PopupMenuPosition.under,
constraints: BoxConstraints.tightFor(width: menuWidth),
onSelected: (value) {
viewState.setContactsSelectedGroupName(value);
},
itemBuilder: (context) => [
PopupMenuItem<String>(
value: contactsAllGroupsValue,
child: Row(
@ericszimmermann ericszimmermann marked this pull request as ready for review March 14, 2026 13:30
Copilot AI review requested due to automatic review settings March 14, 2026 13:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the Contacts screen UX to support a drill-in style group dropdown (per Issue #133) and preserves Contacts/Channels filter/search state across navigation by lifting view state into a shared service.

Changes:

  • Add UiViewStateService (provided app-wide) to keep Contacts/Channels search + filter state stable across route changes.
  • Replace the Contacts “group popup” UX with a dropdown group selector that supports create/edit/delete actions.
  • Move ContactSortOption / ContactTypeFilter enums into contact_search.dart for reuse across widgets/services.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation plugin for macOS build.
lib/widgets/list_filter_widget.dart Removes locally-defined contact filter enums and imports shared definitions.
lib/utils/contact_search.dart Adds shared enums for contact sort and type filtering.
lib/services/ui_view_state_service.dart New ChangeNotifier storing Contacts/Channels view state (search, sort, filters, selected group).
lib/screens/contacts_screen.dart Refactors Contacts screen to use UiViewStateService and adds group dropdown UI + group-based filtering.
lib/screens/channels_screen.dart Refactors Channels screen search/sort state to use UiViewStateService.
lib/main.dart Wires UiViewStateService into the app’s MultiProvider.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread lib/screens/contacts_screen.dart
Comment thread lib/screens/contacts_screen.dart Outdated
Comment on lines +441 to +448
final selectedGroupName =
_selectedGroup?.name ?? context.l10n.listFilter_all;
final menuWidth = MediaQuery.sizeOf(context).width - 16;

return PopupMenuButton<String>(
position: PopupMenuPosition.under,
constraints: BoxConstraints.tightFor(width: menuWidth),
onSelected: (value) {
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 14, 2026 13:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Contacts (and Channels) UI to keep user-selected search/sort/filter state when navigating between screens, and replaces the previous “group tiles / popup members” approach with a dropdown-based group selector (per Issue #133).

Changes:

  • Introduces a shared UiViewStateService to retain Contacts/Channels search and filter state across navigation.
  • Reworks Contacts groups UI into a dropdown selector with inline create/edit/delete actions.
  • Wires the new view-state service into app startup and updates Channels/Contacts screens to use it.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation plugin for macOS.
lib/widgets/list_filter_widget.dart Removes “new group” action from the filter menu and sources filter enums from a shared location.
lib/utils/contact_search.dart Centralizes ContactSortOption / ContactTypeFilter enums alongside contact query matching utilities.
lib/services/ui_view_state_service.dart Adds a ChangeNotifier holding Contacts/Channels view state.
lib/screens/contacts_screen.dart Implements group dropdown UI and migrates contact filters/search/sort to UiViewStateService; scopes group load/save by node key.
lib/screens/channels_screen.dart Migrates channel search + sort selection to UiViewStateService.
lib/main.dart Creates and provides UiViewStateService via MultiProvider.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines 89 to 94
Future<void> _saveGroups() async {
_groupStore.setPublicKeyHex = context
.read<MeshCoreConnector>()
.selfPublicKeyHex;
await _groupStore.saveGroups(_groups);
}
Comment on lines +7 to +17
class UiViewStateService extends ChangeNotifier {
String? _contactsSelectedGroupName = contactsAllGroupsValue;
String _contactsSearchText = '';
bool _contactsSearchExpanded = false;
ContactSortOption _contactsSortOption = ContactSortOption.lastSeen;
bool _contactsShowUnreadOnly = false;
ContactTypeFilter _contactsTypeFilter = ContactTypeFilter.all;

String _channelsSearchText = '';
int _channelsSortIndex = 0;

Comment on lines +441 to +447
final selectedGroupName =
_selectedGroup?.name ?? context.l10n.listFilter_all;
final menuWidth = MediaQuery.sizeOf(context).width - 16;

return PopupMenuButton<String?>(
position: PopupMenuPosition.under,
constraints: BoxConstraints.tightFor(width: menuWidth),
Comment on lines +458 to +462
IconButton(
tooltip: context.l10n.contacts_newGroup,
constraints: const BoxConstraints(),
padding: EdgeInsets.zero,
icon: const Icon(Icons.group_add, size: 20),
Comment thread lib/screens/channels_screen.dart Outdated
Comment on lines +698 to +708
switch (value) {
case 0:
return ChannelSortOption.manual;
case 2:
return ChannelSortOption.latestMessages;
case 3:
return ChannelSortOption.unread;
case 1:
default:
return ChannelSortOption.name;
}
Comment on lines 77 to 86
Future<void> _loadGroups() async {
_groupStore.setPublicKeyHex = context
.read<MeshCoreConnector>()
.selfPublicKeyHex;
final groups = await _groupStore.loadGroups();
if (!mounted) return;
setState(() {
_groups = groups;
_ensureValidSelectedGroup();
});
@ericszimmermann

Copy link
Copy Markdown
Contributor Author

Well it worked before I tried to fix all these codex issues...

@ericszimmermann

Copy link
Copy Markdown
Contributor Author

Endstate of Pull Request:

  • simplified handling of Groups through simple dropdown menu
  • Search bar can be expanded and collapsed for cleaner UI
  • save state of view (filtering and sorting)

Best regards Eric

Screenshot_20260314_161247_com_meshcore_meshcore_open_MainActivity

@zjs81

zjs81 commented Mar 14, 2026

Copy link
Copy Markdown
Owner

Code Review Findings

Must Fix

  1. Side effects in build()contacts_screen.dart
    _syncGroupScopeIfNeeded(connector) is called directly inside build(), which schedules a setState via addPostFrameCallback. This is fragile and can cause unexpected rebuilds. Move this logic to didChangeDependencies() or a listener instead.

  2. Search text not cleared on collapse — contacts_screen.dart
    When the search bar is collapsed, setContactsSearchExpanded(false) is called but the search text and _searchController are never cleared. This leaves the contact list filtered with no visible search field — confusing UX. Call setContactsSearchText('') and clear the controller when collapsing.

  3. Channel sort persisted as raw intui_view_state_service.dart
    Channel sort option is stored as a raw integer index. If menu items are ever reordered, persisted values will map to the wrong option. Use enum name persistence like the contact sort option already does.

Should Fix

  1. context.watch inside _buildGroupButton — receives connector as a hidden dependency. Pass it as a parameter instead.

  2. Empty DecoratedBox decorationBoxDecoration(borderRadius: BorderRadius.circular(12)) with no color/border renders nothing. Either add a visible style or remove it.

  3. _contactsSelectedGroupName is String? but uses '__all__' sentinel — the nullable type is misleading since null is never used. Make it non-nullable.

Nice to Have

  • Responsive widths instead of hardcoded 270/104 (may overflow on small screens or large font scales)
  • Clearer error message when group name matches reserved __all__ (currently says "already exists" instead of "reserved")
  • Squash the 13 WIP commits before merge

Copilot AI review requested due to automatic review settings March 14, 2026 22:40

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds persistent UI state for Contacts/Channels and replaces the prior contact-group interaction with a dropdown “drill-in” style menu, addressing Issue #133 and preventing filter resets when navigating away from the screens.

Changes:

  • Introduce UiViewStateService to centralize and persist contact/channel sort + filter state via PrefsManager.
  • Update Contacts screen to use a group dropdown selector and new collapsible search/filter UI.
  • Update Channels screen to read/write sort + search state via UiViewStateService; add a reserved group-name localization.

Reviewed changes

Copilot reviewed 38 out of 38 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
macos/Flutter/GeneratedPluginRegistrant.swift Registers path_provider_foundation plugin on macOS.
lib/widgets/list_filter_widget.dart Moves contact filter enums out; simplifies contacts filter menu (removes “New Group” action).
lib/utils/contact_search.dart Hosts ContactSortOption / ContactTypeFilter enums alongside contact query helpers.
lib/services/ui_view_state_service.dart New persisted UI state holder for contacts/channels filters + sorts.
lib/screens/contacts_screen.dart Implements group dropdown menu + uses shared view state for filters/search.
lib/screens/channels_screen.dart Uses shared view state for search + sort persistence.
lib/main.dart Initializes/provides UiViewStateService app-wide.
lib/l10n/app_en.arb Adds contacts_groupNameReserved string.
lib/l10n/app_de.arb Adds contacts_groupNameReserved string.
lib/l10n/app_es.arb Adds contacts_groupNameReserved string.
lib/l10n/app_fr.arb Adds contacts_groupNameReserved string.
lib/l10n/app_it.arb Adds contacts_groupNameReserved string.
lib/l10n/app_nl.arb Adds contacts_groupNameReserved string.
lib/l10n/app_pl.arb Adds contacts_groupNameReserved string.
lib/l10n/app_pt.arb Adds contacts_groupNameReserved string.
lib/l10n/app_ru.arb Adds contacts_groupNameReserved string.
lib/l10n/app_sk.arb Adds contacts_groupNameReserved string.
lib/l10n/app_sl.arb Adds contacts_groupNameReserved string.
lib/l10n/app_sv.arb Adds contacts_groupNameReserved string.
lib/l10n/app_uk.arb Adds contacts_groupNameReserved string.
lib/l10n/app_zh.arb Adds contacts_groupNameReserved string.
lib/l10n/app_bg.arb Adds contacts_groupNameReserved string.
lib/l10n/app_localizations.dart Adds accessor for contacts_groupNameReserved.
lib/l10n/app_localizations_en.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_de.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_es.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_fr.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_it.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_nl.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_pl.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_pt.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_ru.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_sk.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_sl.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_sv.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_uk.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_zh.dart Implements contacts_groupNameReserved.
lib/l10n/app_localizations_bg.dart Implements contacts_groupNameReserved.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +104 to +123
void setContactsSortOption(ContactSortOption value) {
if (_contactsSortOption == value) return;
_contactsSortOption = value;
notifyListeners();
PrefsManager.instance.setString(_keyContactsSortOption, value.name);
}

void setContactsShowUnreadOnly(bool value) {
if (_contactsShowUnreadOnly == value) return;
_contactsShowUnreadOnly = value;
notifyListeners();
PrefsManager.instance.setBool(_keyContactsShowUnreadOnly, value);
}

void setContactsTypeFilter(ContactTypeFilter value) {
if (_contactsTypeFilter == value) return;
_contactsTypeFilter = value;
notifyListeners();
PrefsManager.instance.setString(_keyContactsTypeFilter, value.name);
}
Comment on lines +1144 to +1152
if (name.toLowerCase() ==
contactsAllGroupsValue.toLowerCase()) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.contacts_groupNameReserved),
),
);
return;
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The last time he said I should not make it nullable! And her he wants null! What should I do?

Comment on lines +827 to +831
if (viewState.contactsSearchText.isEmpty) return true;
return matchesContactQuery(
contact,
viewState.contactsSearchText.toLowerCase(),
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants