89 lines
3.1 KiB
Dart
89 lines
3.1 KiB
Dart
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter_contacts/flutter_contacts.dart';
|
||
import 'database_helper.dart';
|
||
import 'phone_helper.dart';
|
||
|
||
class ContactHelper {
|
||
static final Map<String, String> _memoryCache = {};
|
||
|
||
static void clearCache() {
|
||
_memoryCache.clear();
|
||
}
|
||
|
||
// بارگذاری نامها از دیتابیس برای نمایش در لیست چتها (Home Screen)
|
||
static Future<void> loadFromLocalCache() async {
|
||
try {
|
||
final cachedData = await DatabaseHelper.instance.getCachedContacts();
|
||
if (cachedData.isNotEmpty) {
|
||
_memoryCache.addAll(cachedData);
|
||
}
|
||
} catch (e) {
|
||
debugPrint("Cache load error: $e");
|
||
}
|
||
}
|
||
|
||
// --- متد ۱: دریافت لیست سبک (فقط نام و ID) - بسیار سریع ---
|
||
// این متد برای لیست جستجو استفاده میشود
|
||
static Future<List<Contact>> getContactsLight() async {
|
||
if (!await FlutterContacts.requestPermission(readonly: true)) return [];
|
||
|
||
// withProperties: false یعنی فقط ID و Name را بده (بدون عکس، بدون شماره)
|
||
// این کار حجم انتقال داده را تا ۹۰٪ کاهش میدهد و "Slow Binder" را رفع میکند
|
||
return await FlutterContacts.getContacts(
|
||
withProperties: false, withPhoto: false, sorted: true);
|
||
}
|
||
|
||
// --- متد ۲: دریافت اطلاعات کامل یک نفر (وقتی رویش کلیک شد) ---
|
||
static Future<Contact?> getFullContact(String contactId) async {
|
||
return await FlutterContacts.getContact(contactId);
|
||
}
|
||
|
||
// --- متد ۳: همگامسازی پسزمینه (برای دیتابیس) ---
|
||
// این متد سنگین است و باید فقط برای مپ کردن نامها در دیتابیس استفاده شود
|
||
static Future<bool> syncWithDevice() async {
|
||
if (!await FlutterContacts.requestPermission(readonly: true)) return false;
|
||
|
||
try {
|
||
// دریافت مخاطبین با شماره (سنگین)
|
||
List<Contact> contacts = await FlutterContacts.getContacts(
|
||
withProperties: true,
|
||
withPhoto: false,
|
||
);
|
||
|
||
Map<String, String> newMap = {};
|
||
|
||
for (var contact in contacts) {
|
||
if (contact.phones.isNotEmpty) {
|
||
for (var phone in contact.phones) {
|
||
String cleanPhone = normalizePhone(phone.number);
|
||
if (cleanPhone.isNotEmpty) {
|
||
newMap[cleanPhone] = contact.displayName;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
_memoryCache.addAll(newMap);
|
||
await DatabaseHelper.instance.cacheContacts(newMap);
|
||
return true;
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
static String getName(String phone) {
|
||
String cleanPhone = normalizePhone(phone);
|
||
return _memoryCache[cleanPhone] ?? phone;
|
||
}
|
||
|
||
static String normalizePhone(String phone) {
|
||
return PhoneHelper.normalizePhone(phone);
|
||
}
|
||
|
||
static bool isRawNumber(String input) {
|
||
if (input.isEmpty) return false;
|
||
// اگر فقط شامل اعداد، علامت مثبت یا خط فاصله باشد، احتمالا شماره خام است
|
||
return RegExp(r'^[0-9+\-\s]+$').hasMatch(input);
|
||
}
|
||
}
|