Skip to content
Snippets Groups Projects
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);