diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 654dcc7..b3176a3 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -23,6 +23,7 @@
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 6637b38..ee5c26e 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -70,6 +70,8 @@
Доступ к галерее нужен, чтобы отправлять фото и видео в чатах.
NSPhotoLibraryAddUsageDescription
Доступ к галерее нужен, чтобы сохранять полученные фото и видео.
+ NSContactsUsageDescription
+ Доступ к контактам нужен, чтобы показывать имена собеседников так, как они записаны в вашей телефонной книге.
CFBundleURLTypes
diff --git a/lib/backend/modules/contacts.dart b/lib/backend/modules/contacts.dart
index 33fc381..f3e05f4 100644
--- a/lib/backend/modules/contacts.dart
+++ b/lib/backend/modules/contacts.dart
@@ -60,8 +60,14 @@ class PhoneLookupResult {
final int id;
final String? name;
final String? avatarUrl;
+ final int phone;
- const PhoneLookupResult({required this.id, this.name, this.avatarUrl});
+ const PhoneLookupResult({
+ required this.id,
+ this.name,
+ this.avatarUrl,
+ this.phone = 0,
+ });
}
class ContactPhotos {
@@ -88,6 +94,14 @@ class ContactsModule {
final id = contact['id'];
if (id is! int) return null;
+ primeContactCache(contact);
+
+ final payloadPhone = contact['phone'];
+ final resolvedPhone = payloadPhone is int && payloadPhone > 0
+ ? payloadPhone
+ : int.tryParse(normalized.substring(1)) ?? 0;
+ ContactCache.putPhone(id, resolvedPhone);
+
String? name;
final names = contact['names'];
if (names is List) {
@@ -105,6 +119,7 @@ class ContactsModule {
id: id,
name: name,
avatarUrl: contact['baseUrl'] as String?,
+ phone: resolvedPhone,
);
}
@@ -154,7 +169,7 @@ class ContactsModule {
row['phone'] = phone;
}
await AppDatabase.saveContacts([row]);
- if (contact != null) _primeContactCache(contact);
+ if (contact != null) primeContactCache(contact);
revision.value++;
return CachedContact.fromDbRow(row);
}
@@ -171,7 +186,7 @@ class ContactsModule {
final contact = raw.cast();
final row = _parseContact(contact, accountId);
if (row != null) rows.add(row);
- _primeContactCache(contact);
+ primeContactCache(contact);
}
if (rows.isNotEmpty) {
@@ -200,16 +215,19 @@ class ContactsModule {
for (final raw in contacts.whereType