import 'package:drift/drift.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly_database_old.dart' as old; import 'package:twonly/src/services/notifications/pushkeys.notifications.dart'; part 'contacts.dao.g.dart'; @DriftAccessor(tables: [Contacts]) class ContactsDao extends DatabaseAccessor with _$ContactsDaoMixin { // this constructor is required so that the main database can create an instance // of this object. // ignore: matching_super_parameters ContactsDao(super.db); Future insertContact(ContactsCompanion contact) async { try { return await into(contacts).insert(contact); } catch (e) { return 0; } } SingleOrNullSelectable getContactByUserId(int userId) { return select(contacts)..where((t) => t.userId.equals(userId)); } Future> getContactsByUsername(String username) async { return (select(contacts)..where((t) => t.username.equals(username))).get(); } Future deleteContactByUserId(int userId) { return (delete(contacts)..where((t) => t.userId.equals(userId))).go(); } Future updateContact( int userId, ContactsCompanion updatedValues, ) async { await (update(contacts)..where((c) => c.userId.equals(userId))) .write(updatedValues); if (updatedValues.blocked.present || updatedValues.displayName.present || updatedValues.nickName.present) { final contact = await getContactByUserId(userId).getSingleOrNull(); if (contact != null) { await updatePushUser(contact); final group = await twonlyDB.groupsDao.getDirectChat(userId); if (group != null) { await twonlyDB.groupsDao.updateGroup( group.groupId, GroupsCompanion( groupName: Value(getContactDisplayName(contact)), ), ); } } } } Stream> watchNotAcceptedContacts() { return (select(contacts) ..where( (t) => t.accepted.equals(false) & t.blocked.equals(false), )) .watch(); // return (select(contacts)).watch(); } Stream watchContact(int userid) { return (select(contacts)..where((t) => t.userId.equals(userid))) .watchSingleOrNull(); } Future> getAllNotBlockedContacts() { return (select(contacts)..where((t) => t.blocked.equals(false))).get(); } Stream watchContactsBlocked() { final count = contacts.userId.count(); final query = selectOnly(contacts) ..where(contacts.blocked.equals(true)) ..addColumns([count]); return query.map((row) => row.read(count)).watchSingle(); } Stream watchContactsRequested() { final count = contacts.requested.count(distinct: true); final query = selectOnly(contacts) ..where( contacts.requested.equals(true) & contacts.accepted.equals(true).not(), ) ..addColumns([count]); return query.map((row) => row.read(count)).watchSingle(); } Stream> watchAllAcceptedContacts() { return (select(contacts) ..where((t) => t.blocked.equals(false) & t.accepted.equals(true))) .watch(); } Stream> watchAllContacts() { return select(contacts).watch(); } } String getContactDisplayName(Contact user) { var name = user.username; if (user.nickName != null && user.nickName != '') { name = user.nickName!; } else if (user.displayName != null) { name = user.displayName!; } if (user.deleted) { name = applyStrikethrough(name); } if (name.length > 12) { return '${name.substring(0, 12)}...'; } return name; } String getContactDisplayNameOld(old.Contact user) { var name = user.username; if (user.nickName != null && user.nickName != '') { name = user.nickName!; } else if (user.displayName != null) { name = user.displayName!; } if (user.deleted) { name = applyStrikethrough(name); } if (name.length > 12) { return '${name.substring(0, 12)}...'; } return name; } String applyStrikethrough(String text) { return text.split('').map((char) => '$char\u0336').join(); }