Refactor contact search functionality to use DiscoveryContact model and simplify query matching

This commit is contained in:
Winston Lowe
2026-02-28 19:14:22 -08:00
parent 75610695c2
commit 92d8e7cd0b
2 changed files with 18 additions and 27 deletions
+2 -27
View File
@@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:meshcore_open/models/contact.dart'; import 'package:meshcore_open/models/contact.dart';
@@ -212,17 +213,7 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
) { ) {
var filtered = contacts.where((contact) { var filtered = contacts.where((contact) {
if (searchQuery.isEmpty) return true; if (searchQuery.isEmpty) return true;
return matchesContactQuery( return matchesDiscoveryContactQuery(contact, searchQuery);
Contact(
publicKey: contact.publicKey,
name: contact.name,
type: contact.type,
pathLength: contact.pathLength,
path: contact.path,
lastSeen: contact.lastSeen,
),
searchQuery,
);
}).toList(); }).toList();
// Filter out own node from the list // Filter out own node from the list
@@ -237,22 +228,6 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
filtered = filtered.where(_matchesTypeFilter).toList(); filtered = filtered.where(_matchesTypeFilter).toList();
} }
if (showUnreadOnly) {
filtered = filtered.where((contact) {
return connector.getUnreadCountForContact(
Contact(
publicKey: contact.publicKey,
name: contact.name,
type: contact.type,
pathLength: contact.pathLength,
path: contact.path,
lastSeen: contact.lastSeen,
),
) >
0;
}).toList();
}
switch (sortOption) { switch (sortOption) {
case ContactSortOption.lastSeen: case ContactSortOption.lastSeen:
filtered.sort( filtered.sort(
+16
View File
@@ -1,3 +1,5 @@
import 'package:meshcore_open/models/discovery_contact.dart';
import '../models/contact.dart'; import '../models/contact.dart';
bool matchesContactQuery(Contact contact, String query) { bool matchesContactQuery(Contact contact, String query) {
@@ -14,6 +16,20 @@ bool matchesContactQuery(Contact contact, String query) {
return contact.publicKeyHex.toLowerCase().startsWith(hexPrefix); return contact.publicKeyHex.toLowerCase().startsWith(hexPrefix);
} }
bool matchesDiscoveryContactQuery(DiscoveryContact contact, String query) {
final normalizedQuery = query.trim().toLowerCase();
if (normalizedQuery.isEmpty) return true;
if (contact.name.toLowerCase().contains(normalizedQuery)) {
return true;
}
final hexPrefix = _extractHexPrefix(normalizedQuery);
if (hexPrefix == null) return false;
return contact.publicKeyHex.toLowerCase().startsWith(hexPrefix);
}
String? _extractHexPrefix(String query) { String? _extractHexPrefix(String query) {
var cleaned = query; var cleaned = query;
if (cleaned.startsWith('0x')) { if (cleaned.startsWith('0x')) {