Forked from
vjrj / ginkgo
500 commits behind the upstream repository.
contacts_cache.dart 8.14 KiB
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import '../data/models/contact.dart';
import '../g1/api.dart';
import '../g1/g1_helper.dart';
import 'logger.dart';
class ContactsCache {
factory ContactsCache() {
_instance ??= ContactsCache._internal();
return _instance!;
}
ContactsCache._internal();
Box<dynamic>? box;
Future<void> init([bool test = false]) async {
if (test) {
box = MemoryFallbackBox<Map<String, dynamic>>();
return;
}
try {
if (kIsWeb) {
box = await Hive.openBox(_boxName);
} else {
final Directory appDocDir = await getApplicationDocumentsDirectory();
final String appDocPath = appDocDir.path;
box = await Hive.openBox(_boxName, path: appDocPath);
}
// We clear the box on every startup to avoid issues with old data
} catch (e) {
logger('Error opening Hive: $e');
}
box ??= MemoryFallbackBox<Map<String, dynamic>>();
}
Future<void> addContacts(List<Contact> contacts) async {
for (final Contact contact in contacts) {
await addContact(contact);
}
}
Future<void> dispose() async {
await box?.close();
}
Future<void> clear() async {
await box?.clear();
}
static ContactsCache? _instance;
final Map<String, List<Completer<Contact>>> _pendingRequests =
<String, List<Completer<Contact>>>{};
final String _boxName = 'contacts_cache';
Contact? getCachedContact(String pubKey,
[bool debug = false, bool withoutAvatar = false]) {
return withoutAvatar
? _retrieveContact(pubKey)?.cloneWithoutAvatar()
: _retrieveContact(pubKey);