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 _memoryCache = {}; static void clearCache() { _memoryCache.clear(); } // بارگذاری نام‌ها از دیتابیس برای نمایش در لیست چت‌ها (Home Screen) static Future 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> 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 getFullContact(String contactId) async { return await FlutterContacts.getContact(contactId); } // --- متد ۳: همگام‌سازی پس‌زمینه (برای دیتابیس) --- // این متد سنگین است و باید فقط برای مپ کردن نام‌ها در دیتابیس استفاده شود static Future syncWithDevice() async { if (!await FlutterContacts.requestPermission(readonly: true)) return false; try { // دریافت مخاطبین با شماره (سنگین) List contacts = await FlutterContacts.getContacts( withProperties: true, withPhoto: false, ); Map 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); } }