Saba-dart/lib/utils/contact_helper.dart
2026-04-13 23:41:27 +03:30

89 lines
3.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}