import 'dart:convert'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:together_mobile/database/box_type.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/utils/app_dir.dart'; void initDatabase() async { List encryptionKeyUint8List = await _getEncryptKey(); await Hive.initFlutter(await getBoxPath()); _registerAdapter(); Box chatBoxListBox = await Hive.openBox('chat_list'); final openChats = chatBoxListBox.values.where((element) => element.isOpen); for (var chatBox in openChats) { await Hive.openLazyBox( 'message_${chatBox.contactId}', encryptionCipher: HiveAesCipher(encryptionKeyUint8List), compactionStrategy: (entries, deletedEntries) => entries > 200, ); } } void _registerAdapter() { Hive.registerAdapter(ChatListAdapter()); Hive.registerAdapter(MessageAdapter()); } Future> _getEncryptKey() async { final id = getIt.get().id; const secureStorage = FlutterSecureStorage(); final encryptionKeyString = await secureStorage.read(key: 'encryptKey:$id'); if (encryptionKeyString == null) { final key = Hive.generateSecureKey(); await secureStorage.write( key: 'encryptKey:$id', value: base64Encode(key), ); } String? key = await secureStorage.read(key: 'encryptKey:$id'); final encryptionKeyUint8List = base64Url.decode(key!); return encryptionKeyUint8List; } void openNewMessageBox(String contactId) async { final encryptionKeyUint8List = await _getEncryptKey(); var chatListBox = Hive.box('chat_list'); chatListBox.add(ChatList(contactId, true, false)); await Hive.openLazyBox( 'message_$contactId', encryptionCipher: HiveAesCipher(encryptionKeyUint8List), compactionStrategy: (entries, deletedEntries) => entries > 200, ); }