This commit is contained in:
otsmr 2025-05-11 20:37:22 +02:00
parent 5309f0a738
commit eedf6e0646
21 changed files with 3511 additions and 69 deletions

File diff suppressed because one or more lines are too long

View file

@ -19,6 +19,7 @@ import 'dart:async';
// this callback is called by the apiProvider // this callback is called by the apiProvider
Function(bool) globalCallbackConnectionState = (a) {}; Function(bool) globalCallbackConnectionState = (a) {};
bool globalIsAppInBackground = true; bool globalIsAppInBackground = true;
int globalBestFriendUserId = -1;
// these two callbacks are called on updated to the corresponding database // these two callbacks are called on updated to the corresponding database
@ -50,7 +51,18 @@ class _AppState extends State<App> with WidgetsBindingObserver {
Future setUserPlan() async { Future setUserPlan() async {
final user = await getUser(); final user = await getUser();
globalBestFriendUserId = -1;
if (user != null && context.mounted) { if (user != null && context.mounted) {
if (user.myBestFriendContactId != null) {
final contact = await twonlyDatabase.contactsDao
.getContactByUserId(user.myBestFriendContactId!)
.getSingleOrNull();
if (contact != null) {
if (contact.alsoBestFriend) {
globalBestFriendUserId = user.myBestFriendContactId ?? 0;
}
}
}
context.read<CustomChangeProvider>().updatePlan(user.subscriptionPlan); context.read<CustomChangeProvider>().updatePlan(user.subscriptionPlan);
} }
} }

View file

@ -16,6 +16,7 @@ class Contacts extends Table {
BoolColumn get verified => boolean().withDefault(Constant(false))(); BoolColumn get verified => boolean().withDefault(Constant(false))();
BoolColumn get archived => boolean().withDefault(Constant(false))(); BoolColumn get archived => boolean().withDefault(Constant(false))();
BoolColumn get pinned => boolean().withDefault(Constant(false))(); BoolColumn get pinned => boolean().withDefault(Constant(false))();
BoolColumn get alsoBestFriend => boolean().withDefault(Constant(false))();
IntColumn get deleteMessagesAfterXMinutes => IntColumn get deleteMessagesAfterXMinutes =>
integer().withDefault(Constant(60 * 24))(); integer().withDefault(Constant(60 * 24))();
@ -27,6 +28,7 @@ class Contacts extends Table {
DateTimeColumn get lastMessageSend => dateTime().nullable()(); DateTimeColumn get lastMessageSend => dateTime().nullable()();
DateTimeColumn get lastMessageReceived => dateTime().nullable()(); DateTimeColumn get lastMessageReceived => dateTime().nullable()();
DateTimeColumn get lastFlameCounterChange => dateTime().nullable()(); DateTimeColumn get lastFlameCounterChange => dateTime().nullable()();
DateTimeColumn get lastFlameSync => dateTime().nullable()();
DateTimeColumn get lastMessageExchange => DateTimeColumn get lastMessageExchange =>
dateTime().withDefault(currentDateAndTime)(); dateTime().withDefault(currentDateAndTime)();

View file

@ -10,6 +10,7 @@ enum MessageKind {
profileChange, profileChange,
rejectRequest, rejectRequest,
acceptRequest, acceptRequest,
flameSync,
opened, opened,
ack, ack,
pushKey pushKey

View file

@ -43,7 +43,7 @@ class TwonlyDatabase extends _$TwonlyDatabase {
TwonlyDatabase.forTesting(DatabaseConnection super.connection); TwonlyDatabase.forTesting(DatabaseConnection super.connection);
@override @override
int get schemaVersion => 7; int get schemaVersion => 8;
static QueryExecutor _openConnection() { static QueryExecutor _openConnection() {
return driftDatabase( return driftDatabase(
@ -80,6 +80,10 @@ class TwonlyDatabase extends _$TwonlyDatabase {
from6To7: (m, schema) async { from6To7: (m, schema) async {
m.addColumn(schema.contacts, schema.contacts.pinned); m.addColumn(schema.contacts, schema.contacts.pinned);
}, },
from7To8: (m, schema) async {
m.addColumn(schema.contacts, schema.contacts.alsoBestFriend);
m.addColumn(schema.contacts, schema.contacts.lastFlameSync);
},
), ),
); );
} }

View file

@ -106,6 +106,16 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
defaultConstraints: defaultConstraints:
GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'), GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'),
defaultValue: Constant(false)); defaultValue: Constant(false));
static const VerificationMeta _alsoBestFriendMeta =
const VerificationMeta('alsoBestFriend');
@override
late final GeneratedColumn<bool> alsoBestFriend = GeneratedColumn<bool>(
'also_best_friend', aliasedName, false,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("also_best_friend" IN (0, 1))'),
defaultValue: Constant(false));
static const VerificationMeta _deleteMessagesAfterXMinutesMeta = static const VerificationMeta _deleteMessagesAfterXMinutesMeta =
const VerificationMeta('deleteMessagesAfterXMinutes'); const VerificationMeta('deleteMessagesAfterXMinutes');
@override @override
@ -149,6 +159,12 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
late final GeneratedColumn<DateTime> lastFlameCounterChange = late final GeneratedColumn<DateTime> lastFlameCounterChange =
GeneratedColumn<DateTime>('last_flame_counter_change', aliasedName, true, GeneratedColumn<DateTime>('last_flame_counter_change', aliasedName, true,
type: DriftSqlType.dateTime, requiredDuringInsert: false); type: DriftSqlType.dateTime, requiredDuringInsert: false);
static const VerificationMeta _lastFlameSyncMeta =
const VerificationMeta('lastFlameSync');
@override
late final GeneratedColumn<DateTime> lastFlameSync =
GeneratedColumn<DateTime>('last_flame_sync', aliasedName, true,
type: DriftSqlType.dateTime, requiredDuringInsert: false);
static const VerificationMeta _lastMessageExchangeMeta = static const VerificationMeta _lastMessageExchangeMeta =
const VerificationMeta('lastMessageExchange'); const VerificationMeta('lastMessageExchange');
@override @override
@ -179,12 +195,14 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
verified, verified,
archived, archived,
pinned, pinned,
alsoBestFriend,
deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes,
createdAt, createdAt,
totalMediaCounter, totalMediaCounter,
lastMessageSend, lastMessageSend,
lastMessageReceived, lastMessageReceived,
lastFlameCounterChange, lastFlameCounterChange,
lastFlameSync,
lastMessageExchange, lastMessageExchange,
flameCounter flameCounter
]; ];
@ -252,6 +270,12 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
context.handle(_pinnedMeta, context.handle(_pinnedMeta,
pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta)); pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta));
} }
if (data.containsKey('also_best_friend')) {
context.handle(
_alsoBestFriendMeta,
alsoBestFriend.isAcceptableOrUnknown(
data['also_best_friend']!, _alsoBestFriendMeta));
}
if (data.containsKey('delete_messages_after_x_minutes')) { if (data.containsKey('delete_messages_after_x_minutes')) {
context.handle( context.handle(
_deleteMessagesAfterXMinutesMeta, _deleteMessagesAfterXMinutesMeta,
@ -287,6 +311,12 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
lastFlameCounterChange.isAcceptableOrUnknown( lastFlameCounterChange.isAcceptableOrUnknown(
data['last_flame_counter_change']!, _lastFlameCounterChangeMeta)); data['last_flame_counter_change']!, _lastFlameCounterChangeMeta));
} }
if (data.containsKey('last_flame_sync')) {
context.handle(
_lastFlameSyncMeta,
lastFlameSync.isAcceptableOrUnknown(
data['last_flame_sync']!, _lastFlameSyncMeta));
}
if (data.containsKey('last_message_exchange')) { if (data.containsKey('last_message_exchange')) {
context.handle( context.handle(
_lastMessageExchangeMeta, _lastMessageExchangeMeta,
@ -332,6 +362,8 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
.read(DriftSqlType.bool, data['${effectivePrefix}archived'])!, .read(DriftSqlType.bool, data['${effectivePrefix}archived'])!,
pinned: attachedDatabase.typeMapping pinned: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!, .read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!,
alsoBestFriend: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}also_best_friend'])!,
deleteMessagesAfterXMinutes: attachedDatabase.typeMapping.read( deleteMessagesAfterXMinutes: attachedDatabase.typeMapping.read(
DriftSqlType.int, DriftSqlType.int,
data['${effectivePrefix}delete_messages_after_x_minutes'])!, data['${effectivePrefix}delete_messages_after_x_minutes'])!,
@ -347,6 +379,8 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
lastFlameCounterChange: attachedDatabase.typeMapping.read( lastFlameCounterChange: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime, DriftSqlType.dateTime,
data['${effectivePrefix}last_flame_counter_change']), data['${effectivePrefix}last_flame_counter_change']),
lastFlameSync: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime, data['${effectivePrefix}last_flame_sync']),
lastMessageExchange: attachedDatabase.typeMapping.read( lastMessageExchange: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime, DriftSqlType.dateTime,
data['${effectivePrefix}last_message_exchange'])!, data['${effectivePrefix}last_message_exchange'])!,
@ -374,12 +408,14 @@ class Contact extends DataClass implements Insertable<Contact> {
final bool verified; final bool verified;
final bool archived; final bool archived;
final bool pinned; final bool pinned;
final bool alsoBestFriend;
final int deleteMessagesAfterXMinutes; final int deleteMessagesAfterXMinutes;
final DateTime createdAt; final DateTime createdAt;
final int totalMediaCounter; final int totalMediaCounter;
final DateTime? lastMessageSend; final DateTime? lastMessageSend;
final DateTime? lastMessageReceived; final DateTime? lastMessageReceived;
final DateTime? lastFlameCounterChange; final DateTime? lastFlameCounterChange;
final DateTime? lastFlameSync;
final DateTime lastMessageExchange; final DateTime lastMessageExchange;
final int flameCounter; final int flameCounter;
const Contact( const Contact(
@ -395,12 +431,14 @@ class Contact extends DataClass implements Insertable<Contact> {
required this.verified, required this.verified,
required this.archived, required this.archived,
required this.pinned, required this.pinned,
required this.alsoBestFriend,
required this.deleteMessagesAfterXMinutes, required this.deleteMessagesAfterXMinutes,
required this.createdAt, required this.createdAt,
required this.totalMediaCounter, required this.totalMediaCounter,
this.lastMessageSend, this.lastMessageSend,
this.lastMessageReceived, this.lastMessageReceived,
this.lastFlameCounterChange, this.lastFlameCounterChange,
this.lastFlameSync,
required this.lastMessageExchange, required this.lastMessageExchange,
required this.flameCounter}); required this.flameCounter});
@override @override
@ -424,6 +462,7 @@ class Contact extends DataClass implements Insertable<Contact> {
map['verified'] = Variable<bool>(verified); map['verified'] = Variable<bool>(verified);
map['archived'] = Variable<bool>(archived); map['archived'] = Variable<bool>(archived);
map['pinned'] = Variable<bool>(pinned); map['pinned'] = Variable<bool>(pinned);
map['also_best_friend'] = Variable<bool>(alsoBestFriend);
map['delete_messages_after_x_minutes'] = map['delete_messages_after_x_minutes'] =
Variable<int>(deleteMessagesAfterXMinutes); Variable<int>(deleteMessagesAfterXMinutes);
map['created_at'] = Variable<DateTime>(createdAt); map['created_at'] = Variable<DateTime>(createdAt);
@ -438,6 +477,9 @@ class Contact extends DataClass implements Insertable<Contact> {
map['last_flame_counter_change'] = map['last_flame_counter_change'] =
Variable<DateTime>(lastFlameCounterChange); Variable<DateTime>(lastFlameCounterChange);
} }
if (!nullToAbsent || lastFlameSync != null) {
map['last_flame_sync'] = Variable<DateTime>(lastFlameSync);
}
map['last_message_exchange'] = Variable<DateTime>(lastMessageExchange); map['last_message_exchange'] = Variable<DateTime>(lastMessageExchange);
map['flame_counter'] = Variable<int>(flameCounter); map['flame_counter'] = Variable<int>(flameCounter);
return map; return map;
@ -463,6 +505,7 @@ class Contact extends DataClass implements Insertable<Contact> {
verified: Value(verified), verified: Value(verified),
archived: Value(archived), archived: Value(archived),
pinned: Value(pinned), pinned: Value(pinned),
alsoBestFriend: Value(alsoBestFriend),
deleteMessagesAfterXMinutes: Value(deleteMessagesAfterXMinutes), deleteMessagesAfterXMinutes: Value(deleteMessagesAfterXMinutes),
createdAt: Value(createdAt), createdAt: Value(createdAt),
totalMediaCounter: Value(totalMediaCounter), totalMediaCounter: Value(totalMediaCounter),
@ -475,6 +518,9 @@ class Contact extends DataClass implements Insertable<Contact> {
lastFlameCounterChange: lastFlameCounterChange == null && nullToAbsent lastFlameCounterChange: lastFlameCounterChange == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(lastFlameCounterChange), : Value(lastFlameCounterChange),
lastFlameSync: lastFlameSync == null && nullToAbsent
? const Value.absent()
: Value(lastFlameSync),
lastMessageExchange: Value(lastMessageExchange), lastMessageExchange: Value(lastMessageExchange),
flameCounter: Value(flameCounter), flameCounter: Value(flameCounter),
); );
@ -496,6 +542,7 @@ class Contact extends DataClass implements Insertable<Contact> {
verified: serializer.fromJson<bool>(json['verified']), verified: serializer.fromJson<bool>(json['verified']),
archived: serializer.fromJson<bool>(json['archived']), archived: serializer.fromJson<bool>(json['archived']),
pinned: serializer.fromJson<bool>(json['pinned']), pinned: serializer.fromJson<bool>(json['pinned']),
alsoBestFriend: serializer.fromJson<bool>(json['alsoBestFriend']),
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
serializer.fromJson<int>(json['deleteMessagesAfterXMinutes']), serializer.fromJson<int>(json['deleteMessagesAfterXMinutes']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']), createdAt: serializer.fromJson<DateTime>(json['createdAt']),
@ -505,6 +552,7 @@ class Contact extends DataClass implements Insertable<Contact> {
serializer.fromJson<DateTime?>(json['lastMessageReceived']), serializer.fromJson<DateTime?>(json['lastMessageReceived']),
lastFlameCounterChange: lastFlameCounterChange:
serializer.fromJson<DateTime?>(json['lastFlameCounterChange']), serializer.fromJson<DateTime?>(json['lastFlameCounterChange']),
lastFlameSync: serializer.fromJson<DateTime?>(json['lastFlameSync']),
lastMessageExchange: lastMessageExchange:
serializer.fromJson<DateTime>(json['lastMessageExchange']), serializer.fromJson<DateTime>(json['lastMessageExchange']),
flameCounter: serializer.fromJson<int>(json['flameCounter']), flameCounter: serializer.fromJson<int>(json['flameCounter']),
@ -526,6 +574,7 @@ class Contact extends DataClass implements Insertable<Contact> {
'verified': serializer.toJson<bool>(verified), 'verified': serializer.toJson<bool>(verified),
'archived': serializer.toJson<bool>(archived), 'archived': serializer.toJson<bool>(archived),
'pinned': serializer.toJson<bool>(pinned), 'pinned': serializer.toJson<bool>(pinned),
'alsoBestFriend': serializer.toJson<bool>(alsoBestFriend),
'deleteMessagesAfterXMinutes': 'deleteMessagesAfterXMinutes':
serializer.toJson<int>(deleteMessagesAfterXMinutes), serializer.toJson<int>(deleteMessagesAfterXMinutes),
'createdAt': serializer.toJson<DateTime>(createdAt), 'createdAt': serializer.toJson<DateTime>(createdAt),
@ -534,6 +583,7 @@ class Contact extends DataClass implements Insertable<Contact> {
'lastMessageReceived': serializer.toJson<DateTime?>(lastMessageReceived), 'lastMessageReceived': serializer.toJson<DateTime?>(lastMessageReceived),
'lastFlameCounterChange': 'lastFlameCounterChange':
serializer.toJson<DateTime?>(lastFlameCounterChange), serializer.toJson<DateTime?>(lastFlameCounterChange),
'lastFlameSync': serializer.toJson<DateTime?>(lastFlameSync),
'lastMessageExchange': serializer.toJson<DateTime>(lastMessageExchange), 'lastMessageExchange': serializer.toJson<DateTime>(lastMessageExchange),
'flameCounter': serializer.toJson<int>(flameCounter), 'flameCounter': serializer.toJson<int>(flameCounter),
}; };
@ -552,12 +602,14 @@ class Contact extends DataClass implements Insertable<Contact> {
bool? verified, bool? verified,
bool? archived, bool? archived,
bool? pinned, bool? pinned,
bool? alsoBestFriend,
int? deleteMessagesAfterXMinutes, int? deleteMessagesAfterXMinutes,
DateTime? createdAt, DateTime? createdAt,
int? totalMediaCounter, int? totalMediaCounter,
Value<DateTime?> lastMessageSend = const Value.absent(), Value<DateTime?> lastMessageSend = const Value.absent(),
Value<DateTime?> lastMessageReceived = const Value.absent(), Value<DateTime?> lastMessageReceived = const Value.absent(),
Value<DateTime?> lastFlameCounterChange = const Value.absent(), Value<DateTime?> lastFlameCounterChange = const Value.absent(),
Value<DateTime?> lastFlameSync = const Value.absent(),
DateTime? lastMessageExchange, DateTime? lastMessageExchange,
int? flameCounter}) => int? flameCounter}) =>
Contact( Contact(
@ -573,6 +625,7 @@ class Contact extends DataClass implements Insertable<Contact> {
verified: verified ?? this.verified, verified: verified ?? this.verified,
archived: archived ?? this.archived, archived: archived ?? this.archived,
pinned: pinned ?? this.pinned, pinned: pinned ?? this.pinned,
alsoBestFriend: alsoBestFriend ?? this.alsoBestFriend,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
@ -586,6 +639,8 @@ class Contact extends DataClass implements Insertable<Contact> {
lastFlameCounterChange: lastFlameCounterChange.present lastFlameCounterChange: lastFlameCounterChange.present
? lastFlameCounterChange.value ? lastFlameCounterChange.value
: this.lastFlameCounterChange, : this.lastFlameCounterChange,
lastFlameSync:
lastFlameSync.present ? lastFlameSync.value : this.lastFlameSync,
lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange,
flameCounter: flameCounter ?? this.flameCounter, flameCounter: flameCounter ?? this.flameCounter,
); );
@ -606,6 +661,9 @@ class Contact extends DataClass implements Insertable<Contact> {
verified: data.verified.present ? data.verified.value : this.verified, verified: data.verified.present ? data.verified.value : this.verified,
archived: data.archived.present ? data.archived.value : this.archived, archived: data.archived.present ? data.archived.value : this.archived,
pinned: data.pinned.present ? data.pinned.value : this.pinned, pinned: data.pinned.present ? data.pinned.value : this.pinned,
alsoBestFriend: data.alsoBestFriend.present
? data.alsoBestFriend.value
: this.alsoBestFriend,
deleteMessagesAfterXMinutes: data.deleteMessagesAfterXMinutes.present deleteMessagesAfterXMinutes: data.deleteMessagesAfterXMinutes.present
? data.deleteMessagesAfterXMinutes.value ? data.deleteMessagesAfterXMinutes.value
: this.deleteMessagesAfterXMinutes, : this.deleteMessagesAfterXMinutes,
@ -622,6 +680,9 @@ class Contact extends DataClass implements Insertable<Contact> {
lastFlameCounterChange: data.lastFlameCounterChange.present lastFlameCounterChange: data.lastFlameCounterChange.present
? data.lastFlameCounterChange.value ? data.lastFlameCounterChange.value
: this.lastFlameCounterChange, : this.lastFlameCounterChange,
lastFlameSync: data.lastFlameSync.present
? data.lastFlameSync.value
: this.lastFlameSync,
lastMessageExchange: data.lastMessageExchange.present lastMessageExchange: data.lastMessageExchange.present
? data.lastMessageExchange.value ? data.lastMessageExchange.value
: this.lastMessageExchange, : this.lastMessageExchange,
@ -646,12 +707,14 @@ class Contact extends DataClass implements Insertable<Contact> {
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('archived: $archived, ') ..write('archived: $archived, ')
..write('pinned: $pinned, ') ..write('pinned: $pinned, ')
..write('alsoBestFriend: $alsoBestFriend, ')
..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ')
..write('createdAt: $createdAt, ') ..write('createdAt: $createdAt, ')
..write('totalMediaCounter: $totalMediaCounter, ') ..write('totalMediaCounter: $totalMediaCounter, ')
..write('lastMessageSend: $lastMessageSend, ') ..write('lastMessageSend: $lastMessageSend, ')
..write('lastMessageReceived: $lastMessageReceived, ') ..write('lastMessageReceived: $lastMessageReceived, ')
..write('lastFlameCounterChange: $lastFlameCounterChange, ') ..write('lastFlameCounterChange: $lastFlameCounterChange, ')
..write('lastFlameSync: $lastFlameSync, ')
..write('lastMessageExchange: $lastMessageExchange, ') ..write('lastMessageExchange: $lastMessageExchange, ')
..write('flameCounter: $flameCounter') ..write('flameCounter: $flameCounter')
..write(')')) ..write(')'))
@ -659,7 +722,7 @@ class Contact extends DataClass implements Insertable<Contact> {
} }
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hashAll([
userId, userId,
username, username,
displayName, displayName,
@ -672,14 +735,17 @@ class Contact extends DataClass implements Insertable<Contact> {
verified, verified,
archived, archived,
pinned, pinned,
alsoBestFriend,
deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes,
createdAt, createdAt,
totalMediaCounter, totalMediaCounter,
lastMessageSend, lastMessageSend,
lastMessageReceived, lastMessageReceived,
lastFlameCounterChange, lastFlameCounterChange,
lastFlameSync,
lastMessageExchange, lastMessageExchange,
flameCounter); flameCounter
]);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
@ -696,6 +762,7 @@ class Contact extends DataClass implements Insertable<Contact> {
other.verified == this.verified && other.verified == this.verified &&
other.archived == this.archived && other.archived == this.archived &&
other.pinned == this.pinned && other.pinned == this.pinned &&
other.alsoBestFriend == this.alsoBestFriend &&
other.deleteMessagesAfterXMinutes == other.deleteMessagesAfterXMinutes ==
this.deleteMessagesAfterXMinutes && this.deleteMessagesAfterXMinutes &&
other.createdAt == this.createdAt && other.createdAt == this.createdAt &&
@ -703,6 +770,7 @@ class Contact extends DataClass implements Insertable<Contact> {
other.lastMessageSend == this.lastMessageSend && other.lastMessageSend == this.lastMessageSend &&
other.lastMessageReceived == this.lastMessageReceived && other.lastMessageReceived == this.lastMessageReceived &&
other.lastFlameCounterChange == this.lastFlameCounterChange && other.lastFlameCounterChange == this.lastFlameCounterChange &&
other.lastFlameSync == this.lastFlameSync &&
other.lastMessageExchange == this.lastMessageExchange && other.lastMessageExchange == this.lastMessageExchange &&
other.flameCounter == this.flameCounter); other.flameCounter == this.flameCounter);
} }
@ -720,12 +788,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
final Value<bool> verified; final Value<bool> verified;
final Value<bool> archived; final Value<bool> archived;
final Value<bool> pinned; final Value<bool> pinned;
final Value<bool> alsoBestFriend;
final Value<int> deleteMessagesAfterXMinutes; final Value<int> deleteMessagesAfterXMinutes;
final Value<DateTime> createdAt; final Value<DateTime> createdAt;
final Value<int> totalMediaCounter; final Value<int> totalMediaCounter;
final Value<DateTime?> lastMessageSend; final Value<DateTime?> lastMessageSend;
final Value<DateTime?> lastMessageReceived; final Value<DateTime?> lastMessageReceived;
final Value<DateTime?> lastFlameCounterChange; final Value<DateTime?> lastFlameCounterChange;
final Value<DateTime?> lastFlameSync;
final Value<DateTime> lastMessageExchange; final Value<DateTime> lastMessageExchange;
final Value<int> flameCounter; final Value<int> flameCounter;
const ContactsCompanion({ const ContactsCompanion({
@ -741,12 +811,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.archived = const Value.absent(), this.archived = const Value.absent(),
this.pinned = const Value.absent(), this.pinned = const Value.absent(),
this.alsoBestFriend = const Value.absent(),
this.deleteMessagesAfterXMinutes = const Value.absent(), this.deleteMessagesAfterXMinutes = const Value.absent(),
this.createdAt = const Value.absent(), this.createdAt = const Value.absent(),
this.totalMediaCounter = const Value.absent(), this.totalMediaCounter = const Value.absent(),
this.lastMessageSend = const Value.absent(), this.lastMessageSend = const Value.absent(),
this.lastMessageReceived = const Value.absent(), this.lastMessageReceived = const Value.absent(),
this.lastFlameCounterChange = const Value.absent(), this.lastFlameCounterChange = const Value.absent(),
this.lastFlameSync = const Value.absent(),
this.lastMessageExchange = const Value.absent(), this.lastMessageExchange = const Value.absent(),
this.flameCounter = const Value.absent(), this.flameCounter = const Value.absent(),
}); });
@ -763,12 +835,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.archived = const Value.absent(), this.archived = const Value.absent(),
this.pinned = const Value.absent(), this.pinned = const Value.absent(),
this.alsoBestFriend = const Value.absent(),
this.deleteMessagesAfterXMinutes = const Value.absent(), this.deleteMessagesAfterXMinutes = const Value.absent(),
this.createdAt = const Value.absent(), this.createdAt = const Value.absent(),
this.totalMediaCounter = const Value.absent(), this.totalMediaCounter = const Value.absent(),
this.lastMessageSend = const Value.absent(), this.lastMessageSend = const Value.absent(),
this.lastMessageReceived = const Value.absent(), this.lastMessageReceived = const Value.absent(),
this.lastFlameCounterChange = const Value.absent(), this.lastFlameCounterChange = const Value.absent(),
this.lastFlameSync = const Value.absent(),
this.lastMessageExchange = const Value.absent(), this.lastMessageExchange = const Value.absent(),
this.flameCounter = const Value.absent(), this.flameCounter = const Value.absent(),
}) : username = Value(username); }) : username = Value(username);
@ -785,12 +859,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
Expression<bool>? verified, Expression<bool>? verified,
Expression<bool>? archived, Expression<bool>? archived,
Expression<bool>? pinned, Expression<bool>? pinned,
Expression<bool>? alsoBestFriend,
Expression<int>? deleteMessagesAfterXMinutes, Expression<int>? deleteMessagesAfterXMinutes,
Expression<DateTime>? createdAt, Expression<DateTime>? createdAt,
Expression<int>? totalMediaCounter, Expression<int>? totalMediaCounter,
Expression<DateTime>? lastMessageSend, Expression<DateTime>? lastMessageSend,
Expression<DateTime>? lastMessageReceived, Expression<DateTime>? lastMessageReceived,
Expression<DateTime>? lastFlameCounterChange, Expression<DateTime>? lastFlameCounterChange,
Expression<DateTime>? lastFlameSync,
Expression<DateTime>? lastMessageExchange, Expression<DateTime>? lastMessageExchange,
Expression<int>? flameCounter, Expression<int>? flameCounter,
}) { }) {
@ -807,6 +883,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
if (verified != null) 'verified': verified, if (verified != null) 'verified': verified,
if (archived != null) 'archived': archived, if (archived != null) 'archived': archived,
if (pinned != null) 'pinned': pinned, if (pinned != null) 'pinned': pinned,
if (alsoBestFriend != null) 'also_best_friend': alsoBestFriend,
if (deleteMessagesAfterXMinutes != null) if (deleteMessagesAfterXMinutes != null)
'delete_messages_after_x_minutes': deleteMessagesAfterXMinutes, 'delete_messages_after_x_minutes': deleteMessagesAfterXMinutes,
if (createdAt != null) 'created_at': createdAt, if (createdAt != null) 'created_at': createdAt,
@ -816,6 +893,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
'last_message_received': lastMessageReceived, 'last_message_received': lastMessageReceived,
if (lastFlameCounterChange != null) if (lastFlameCounterChange != null)
'last_flame_counter_change': lastFlameCounterChange, 'last_flame_counter_change': lastFlameCounterChange,
if (lastFlameSync != null) 'last_flame_sync': lastFlameSync,
if (lastMessageExchange != null) if (lastMessageExchange != null)
'last_message_exchange': lastMessageExchange, 'last_message_exchange': lastMessageExchange,
if (flameCounter != null) 'flame_counter': flameCounter, if (flameCounter != null) 'flame_counter': flameCounter,
@ -835,12 +913,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
Value<bool>? verified, Value<bool>? verified,
Value<bool>? archived, Value<bool>? archived,
Value<bool>? pinned, Value<bool>? pinned,
Value<bool>? alsoBestFriend,
Value<int>? deleteMessagesAfterXMinutes, Value<int>? deleteMessagesAfterXMinutes,
Value<DateTime>? createdAt, Value<DateTime>? createdAt,
Value<int>? totalMediaCounter, Value<int>? totalMediaCounter,
Value<DateTime?>? lastMessageSend, Value<DateTime?>? lastMessageSend,
Value<DateTime?>? lastMessageReceived, Value<DateTime?>? lastMessageReceived,
Value<DateTime?>? lastFlameCounterChange, Value<DateTime?>? lastFlameCounterChange,
Value<DateTime?>? lastFlameSync,
Value<DateTime>? lastMessageExchange, Value<DateTime>? lastMessageExchange,
Value<int>? flameCounter}) { Value<int>? flameCounter}) {
return ContactsCompanion( return ContactsCompanion(
@ -856,6 +936,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
verified: verified ?? this.verified, verified: verified ?? this.verified,
archived: archived ?? this.archived, archived: archived ?? this.archived,
pinned: pinned ?? this.pinned, pinned: pinned ?? this.pinned,
alsoBestFriend: alsoBestFriend ?? this.alsoBestFriend,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
@ -864,6 +945,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
lastMessageReceived: lastMessageReceived ?? this.lastMessageReceived, lastMessageReceived: lastMessageReceived ?? this.lastMessageReceived,
lastFlameCounterChange: lastFlameCounterChange:
lastFlameCounterChange ?? this.lastFlameCounterChange, lastFlameCounterChange ?? this.lastFlameCounterChange,
lastFlameSync: lastFlameSync ?? this.lastFlameSync,
lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange,
flameCounter: flameCounter ?? this.flameCounter, flameCounter: flameCounter ?? this.flameCounter,
); );
@ -908,6 +990,9 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
if (pinned.present) { if (pinned.present) {
map['pinned'] = Variable<bool>(pinned.value); map['pinned'] = Variable<bool>(pinned.value);
} }
if (alsoBestFriend.present) {
map['also_best_friend'] = Variable<bool>(alsoBestFriend.value);
}
if (deleteMessagesAfterXMinutes.present) { if (deleteMessagesAfterXMinutes.present) {
map['delete_messages_after_x_minutes'] = map['delete_messages_after_x_minutes'] =
Variable<int>(deleteMessagesAfterXMinutes.value); Variable<int>(deleteMessagesAfterXMinutes.value);
@ -929,6 +1014,9 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
map['last_flame_counter_change'] = map['last_flame_counter_change'] =
Variable<DateTime>(lastFlameCounterChange.value); Variable<DateTime>(lastFlameCounterChange.value);
} }
if (lastFlameSync.present) {
map['last_flame_sync'] = Variable<DateTime>(lastFlameSync.value);
}
if (lastMessageExchange.present) { if (lastMessageExchange.present) {
map['last_message_exchange'] = map['last_message_exchange'] =
Variable<DateTime>(lastMessageExchange.value); Variable<DateTime>(lastMessageExchange.value);
@ -954,12 +1042,14 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('archived: $archived, ') ..write('archived: $archived, ')
..write('pinned: $pinned, ') ..write('pinned: $pinned, ')
..write('alsoBestFriend: $alsoBestFriend, ')
..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ')
..write('createdAt: $createdAt, ') ..write('createdAt: $createdAt, ')
..write('totalMediaCounter: $totalMediaCounter, ') ..write('totalMediaCounter: $totalMediaCounter, ')
..write('lastMessageSend: $lastMessageSend, ') ..write('lastMessageSend: $lastMessageSend, ')
..write('lastMessageReceived: $lastMessageReceived, ') ..write('lastMessageReceived: $lastMessageReceived, ')
..write('lastFlameCounterChange: $lastFlameCounterChange, ') ..write('lastFlameCounterChange: $lastFlameCounterChange, ')
..write('lastFlameSync: $lastFlameSync, ')
..write('lastMessageExchange: $lastMessageExchange, ') ..write('lastMessageExchange: $lastMessageExchange, ')
..write('flameCounter: $flameCounter') ..write('flameCounter: $flameCounter')
..write(')')) ..write(')'))
@ -3485,12 +3575,14 @@ typedef $$ContactsTableCreateCompanionBuilder = ContactsCompanion Function({
Value<bool> verified, Value<bool> verified,
Value<bool> archived, Value<bool> archived,
Value<bool> pinned, Value<bool> pinned,
Value<bool> alsoBestFriend,
Value<int> deleteMessagesAfterXMinutes, Value<int> deleteMessagesAfterXMinutes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<int> totalMediaCounter, Value<int> totalMediaCounter,
Value<DateTime?> lastMessageSend, Value<DateTime?> lastMessageSend,
Value<DateTime?> lastMessageReceived, Value<DateTime?> lastMessageReceived,
Value<DateTime?> lastFlameCounterChange, Value<DateTime?> lastFlameCounterChange,
Value<DateTime?> lastFlameSync,
Value<DateTime> lastMessageExchange, Value<DateTime> lastMessageExchange,
Value<int> flameCounter, Value<int> flameCounter,
}); });
@ -3507,12 +3599,14 @@ typedef $$ContactsTableUpdateCompanionBuilder = ContactsCompanion Function({
Value<bool> verified, Value<bool> verified,
Value<bool> archived, Value<bool> archived,
Value<bool> pinned, Value<bool> pinned,
Value<bool> alsoBestFriend,
Value<int> deleteMessagesAfterXMinutes, Value<int> deleteMessagesAfterXMinutes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<int> totalMediaCounter, Value<int> totalMediaCounter,
Value<DateTime?> lastMessageSend, Value<DateTime?> lastMessageSend,
Value<DateTime?> lastMessageReceived, Value<DateTime?> lastMessageReceived,
Value<DateTime?> lastFlameCounterChange, Value<DateTime?> lastFlameCounterChange,
Value<DateTime?> lastFlameSync,
Value<DateTime> lastMessageExchange, Value<DateTime> lastMessageExchange,
Value<int> flameCounter, Value<int> flameCounter,
}); });
@ -3583,6 +3677,10 @@ class $$ContactsTableFilterComposer
ColumnFilters<bool> get pinned => $composableBuilder( ColumnFilters<bool> get pinned => $composableBuilder(
column: $table.pinned, builder: (column) => ColumnFilters(column)); column: $table.pinned, builder: (column) => ColumnFilters(column));
ColumnFilters<bool> get alsoBestFriend => $composableBuilder(
column: $table.alsoBestFriend,
builder: (column) => ColumnFilters(column));
ColumnFilters<int> get deleteMessagesAfterXMinutes => $composableBuilder( ColumnFilters<int> get deleteMessagesAfterXMinutes => $composableBuilder(
column: $table.deleteMessagesAfterXMinutes, column: $table.deleteMessagesAfterXMinutes,
builder: (column) => ColumnFilters(column)); builder: (column) => ColumnFilters(column));
@ -3606,6 +3704,9 @@ class $$ContactsTableFilterComposer
column: $table.lastFlameCounterChange, column: $table.lastFlameCounterChange,
builder: (column) => ColumnFilters(column)); builder: (column) => ColumnFilters(column));
ColumnFilters<DateTime> get lastFlameSync => $composableBuilder(
column: $table.lastFlameSync, builder: (column) => ColumnFilters(column));
ColumnFilters<DateTime> get lastMessageExchange => $composableBuilder( ColumnFilters<DateTime> get lastMessageExchange => $composableBuilder(
column: $table.lastMessageExchange, column: $table.lastMessageExchange,
builder: (column) => ColumnFilters(column)); builder: (column) => ColumnFilters(column));
@ -3681,6 +3782,10 @@ class $$ContactsTableOrderingComposer
ColumnOrderings<bool> get pinned => $composableBuilder( ColumnOrderings<bool> get pinned => $composableBuilder(
column: $table.pinned, builder: (column) => ColumnOrderings(column)); column: $table.pinned, builder: (column) => ColumnOrderings(column));
ColumnOrderings<bool> get alsoBestFriend => $composableBuilder(
column: $table.alsoBestFriend,
builder: (column) => ColumnOrderings(column));
ColumnOrderings<int> get deleteMessagesAfterXMinutes => $composableBuilder( ColumnOrderings<int> get deleteMessagesAfterXMinutes => $composableBuilder(
column: $table.deleteMessagesAfterXMinutes, column: $table.deleteMessagesAfterXMinutes,
builder: (column) => ColumnOrderings(column)); builder: (column) => ColumnOrderings(column));
@ -3704,6 +3809,10 @@ class $$ContactsTableOrderingComposer
column: $table.lastFlameCounterChange, column: $table.lastFlameCounterChange,
builder: (column) => ColumnOrderings(column)); builder: (column) => ColumnOrderings(column));
ColumnOrderings<DateTime> get lastFlameSync => $composableBuilder(
column: $table.lastFlameSync,
builder: (column) => ColumnOrderings(column));
ColumnOrderings<DateTime> get lastMessageExchange => $composableBuilder( ColumnOrderings<DateTime> get lastMessageExchange => $composableBuilder(
column: $table.lastMessageExchange, column: $table.lastMessageExchange,
builder: (column) => ColumnOrderings(column)); builder: (column) => ColumnOrderings(column));
@ -3758,6 +3867,9 @@ class $$ContactsTableAnnotationComposer
GeneratedColumn<bool> get pinned => GeneratedColumn<bool> get pinned =>
$composableBuilder(column: $table.pinned, builder: (column) => column); $composableBuilder(column: $table.pinned, builder: (column) => column);
GeneratedColumn<bool> get alsoBestFriend => $composableBuilder(
column: $table.alsoBestFriend, builder: (column) => column);
GeneratedColumn<int> get deleteMessagesAfterXMinutes => $composableBuilder( GeneratedColumn<int> get deleteMessagesAfterXMinutes => $composableBuilder(
column: $table.deleteMessagesAfterXMinutes, builder: (column) => column); column: $table.deleteMessagesAfterXMinutes, builder: (column) => column);
@ -3776,6 +3888,9 @@ class $$ContactsTableAnnotationComposer
GeneratedColumn<DateTime> get lastFlameCounterChange => $composableBuilder( GeneratedColumn<DateTime> get lastFlameCounterChange => $composableBuilder(
column: $table.lastFlameCounterChange, builder: (column) => column); column: $table.lastFlameCounterChange, builder: (column) => column);
GeneratedColumn<DateTime> get lastFlameSync => $composableBuilder(
column: $table.lastFlameSync, builder: (column) => column);
GeneratedColumn<DateTime> get lastMessageExchange => $composableBuilder( GeneratedColumn<DateTime> get lastMessageExchange => $composableBuilder(
column: $table.lastMessageExchange, builder: (column) => column); column: $table.lastMessageExchange, builder: (column) => column);
@ -3839,12 +3954,14 @@ class $$ContactsTableTableManager extends RootTableManager<
Value<bool> verified = const Value.absent(), Value<bool> verified = const Value.absent(),
Value<bool> archived = const Value.absent(), Value<bool> archived = const Value.absent(),
Value<bool> pinned = const Value.absent(), Value<bool> pinned = const Value.absent(),
Value<bool> alsoBestFriend = const Value.absent(),
Value<int> deleteMessagesAfterXMinutes = const Value.absent(), Value<int> deleteMessagesAfterXMinutes = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(), Value<DateTime> createdAt = const Value.absent(),
Value<int> totalMediaCounter = const Value.absent(), Value<int> totalMediaCounter = const Value.absent(),
Value<DateTime?> lastMessageSend = const Value.absent(), Value<DateTime?> lastMessageSend = const Value.absent(),
Value<DateTime?> lastMessageReceived = const Value.absent(), Value<DateTime?> lastMessageReceived = const Value.absent(),
Value<DateTime?> lastFlameCounterChange = const Value.absent(), Value<DateTime?> lastFlameCounterChange = const Value.absent(),
Value<DateTime?> lastFlameSync = const Value.absent(),
Value<DateTime> lastMessageExchange = const Value.absent(), Value<DateTime> lastMessageExchange = const Value.absent(),
Value<int> flameCounter = const Value.absent(), Value<int> flameCounter = const Value.absent(),
}) => }) =>
@ -3861,12 +3978,14 @@ class $$ContactsTableTableManager extends RootTableManager<
verified: verified, verified: verified,
archived: archived, archived: archived,
pinned: pinned, pinned: pinned,
alsoBestFriend: alsoBestFriend,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes,
createdAt: createdAt, createdAt: createdAt,
totalMediaCounter: totalMediaCounter, totalMediaCounter: totalMediaCounter,
lastMessageSend: lastMessageSend, lastMessageSend: lastMessageSend,
lastMessageReceived: lastMessageReceived, lastMessageReceived: lastMessageReceived,
lastFlameCounterChange: lastFlameCounterChange, lastFlameCounterChange: lastFlameCounterChange,
lastFlameSync: lastFlameSync,
lastMessageExchange: lastMessageExchange, lastMessageExchange: lastMessageExchange,
flameCounter: flameCounter, flameCounter: flameCounter,
), ),
@ -3883,12 +4002,14 @@ class $$ContactsTableTableManager extends RootTableManager<
Value<bool> verified = const Value.absent(), Value<bool> verified = const Value.absent(),
Value<bool> archived = const Value.absent(), Value<bool> archived = const Value.absent(),
Value<bool> pinned = const Value.absent(), Value<bool> pinned = const Value.absent(),
Value<bool> alsoBestFriend = const Value.absent(),
Value<int> deleteMessagesAfterXMinutes = const Value.absent(), Value<int> deleteMessagesAfterXMinutes = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(), Value<DateTime> createdAt = const Value.absent(),
Value<int> totalMediaCounter = const Value.absent(), Value<int> totalMediaCounter = const Value.absent(),
Value<DateTime?> lastMessageSend = const Value.absent(), Value<DateTime?> lastMessageSend = const Value.absent(),
Value<DateTime?> lastMessageReceived = const Value.absent(), Value<DateTime?> lastMessageReceived = const Value.absent(),
Value<DateTime?> lastFlameCounterChange = const Value.absent(), Value<DateTime?> lastFlameCounterChange = const Value.absent(),
Value<DateTime?> lastFlameSync = const Value.absent(),
Value<DateTime> lastMessageExchange = const Value.absent(), Value<DateTime> lastMessageExchange = const Value.absent(),
Value<int> flameCounter = const Value.absent(), Value<int> flameCounter = const Value.absent(),
}) => }) =>
@ -3905,12 +4026,14 @@ class $$ContactsTableTableManager extends RootTableManager<
verified: verified, verified: verified,
archived: archived, archived: archived,
pinned: pinned, pinned: pinned,
alsoBestFriend: alsoBestFriend,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes,
createdAt: createdAt, createdAt: createdAt,
totalMediaCounter: totalMediaCounter, totalMediaCounter: totalMediaCounter,
lastMessageSend: lastMessageSend, lastMessageSend: lastMessageSend,
lastMessageReceived: lastMessageReceived, lastMessageReceived: lastMessageReceived,
lastFlameCounterChange: lastFlameCounterChange, lastFlameCounterChange: lastFlameCounterChange,
lastFlameSync: lastFlameSync,
lastMessageExchange: lastMessageExchange, lastMessageExchange: lastMessageExchange,
flameCounter: flameCounter, flameCounter: flameCounter,
), ),

View file

@ -1467,6 +1467,240 @@ i1.GeneratedColumn<bool> _column_53(String aliasedName) =>
defaultConstraints: defaultConstraints:
i1.GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'), i1.GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'),
defaultValue: const CustomExpression('0')); defaultValue: const CustomExpression('0'));
final class Schema8 extends i0.VersionedSchema {
Schema8({required super.database}) : super(version: 8);
@override
late final List<i1.DatabaseSchemaEntity> entities = [
contacts,
messages,
mediaUploads,
mediaDownloads,
signalIdentityKeyStores,
signalPreKeyStores,
signalSenderKeyStores,
signalSessionStores,
];
late final Shape12 contacts = Shape12(
source: i0.VersionedTable(
entityName: 'contacts',
withoutRowId: false,
isStrict: false,
tableConstraints: [
'PRIMARY KEY(user_id)',
],
columns: [
_column_0,
_column_1,
_column_2,
_column_3,
_column_4,
_column_5,
_column_6,
_column_7,
_column_8,
_column_9,
_column_39,
_column_53,
_column_54,
_column_40,
_column_10,
_column_11,
_column_12,
_column_13,
_column_14,
_column_55,
_column_15,
_column_16,
],
attachedDatabase: database,
),
alias: null);
late final Shape10 messages = Shape10(
source: i0.VersionedTable(
entityName: 'messages',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_17,
_column_18,
_column_19,
_column_48,
_column_49,
_column_20,
_column_21,
_column_22,
_column_52,
_column_23,
_column_24,
_column_25,
_column_26,
_column_27,
_column_28,
_column_29,
_column_30,
],
attachedDatabase: database,
),
alias: null);
late final Shape7 mediaUploads = Shape7(
source: i0.VersionedTable(
entityName: 'media_uploads',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_41,
_column_42,
_column_43,
_column_44,
_column_45,
_column_46,
_column_47,
],
attachedDatabase: database,
),
alias: null);
late final Shape9 mediaDownloads = Shape9(
source: i0.VersionedTable(
entityName: 'media_downloads',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_50,
_column_51,
],
attachedDatabase: database,
),
alias: null);
late final Shape2 signalIdentityKeyStores = Shape2(
source: i0.VersionedTable(
entityName: 'signal_identity_key_stores',
withoutRowId: false,
isStrict: false,
tableConstraints: [
'PRIMARY KEY(device_id, name)',
],
columns: [
_column_31,
_column_32,
_column_33,
_column_10,
],
attachedDatabase: database,
),
alias: null);
late final Shape3 signalPreKeyStores = Shape3(
source: i0.VersionedTable(
entityName: 'signal_pre_key_stores',
withoutRowId: false,
isStrict: false,
tableConstraints: [
'PRIMARY KEY(pre_key_id)',
],
columns: [
_column_34,
_column_35,
_column_10,
],
attachedDatabase: database,
),
alias: null);
late final Shape4 signalSenderKeyStores = Shape4(
source: i0.VersionedTable(
entityName: 'signal_sender_key_stores',
withoutRowId: false,
isStrict: false,
tableConstraints: [
'PRIMARY KEY(sender_key_name)',
],
columns: [
_column_36,
_column_37,
],
attachedDatabase: database,
),
alias: null);
late final Shape5 signalSessionStores = Shape5(
source: i0.VersionedTable(
entityName: 'signal_session_stores',
withoutRowId: false,
isStrict: false,
tableConstraints: [
'PRIMARY KEY(device_id, name)',
],
columns: [
_column_31,
_column_32,
_column_38,
_column_10,
],
attachedDatabase: database,
),
alias: null);
}
class Shape12 extends i0.VersionedTable {
Shape12({required super.source, required super.alias}) : super.aliased();
i1.GeneratedColumn<int> get userId =>
columnsByName['user_id']! as i1.GeneratedColumn<int>;
i1.GeneratedColumn<String> get username =>
columnsByName['username']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get displayName =>
columnsByName['display_name']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get nickName =>
columnsByName['nick_name']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get avatarSvg =>
columnsByName['avatar_svg']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<int> get myAvatarCounter =>
columnsByName['my_avatar_counter']! as i1.GeneratedColumn<int>;
i1.GeneratedColumn<bool> get accepted =>
columnsByName['accepted']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get requested =>
columnsByName['requested']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get blocked =>
columnsByName['blocked']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get verified =>
columnsByName['verified']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get archived =>
columnsByName['archived']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get pinned =>
columnsByName['pinned']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get alsoBestFriend =>
columnsByName['also_best_friend']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<int> get deleteMessagesAfterXMinutes =>
columnsByName['delete_messages_after_x_minutes']!
as i1.GeneratedColumn<int>;
i1.GeneratedColumn<DateTime> get createdAt =>
columnsByName['created_at']! as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<int> get totalMediaCounter =>
columnsByName['total_media_counter']! as i1.GeneratedColumn<int>;
i1.GeneratedColumn<DateTime> get lastMessageSend =>
columnsByName['last_message_send']! as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<DateTime> get lastMessageReceived =>
columnsByName['last_message_received']! as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<DateTime> get lastFlameCounterChange =>
columnsByName['last_flame_counter_change']!
as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<DateTime> get lastFlameSync =>
columnsByName['last_flame_sync']! as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<DateTime> get lastMessageExchange =>
columnsByName['last_message_exchange']! as i1.GeneratedColumn<DateTime>;
i1.GeneratedColumn<int> get flameCounter =>
columnsByName['flame_counter']! as i1.GeneratedColumn<int>;
}
i1.GeneratedColumn<bool> _column_54(String aliasedName) =>
i1.GeneratedColumn<bool>('also_best_friend', aliasedName, false,
type: i1.DriftSqlType.bool,
defaultConstraints: i1.GeneratedColumn.constraintIsAlways(
'CHECK ("also_best_friend" IN (0, 1))'),
defaultValue: const CustomExpression('0'));
i1.GeneratedColumn<DateTime> _column_55(String aliasedName) =>
i1.GeneratedColumn<DateTime>('last_flame_sync', aliasedName, true,
type: i1.DriftSqlType.dateTime);
i0.MigrationStepWithVersion migrationSteps({ i0.MigrationStepWithVersion migrationSteps({
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2, required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3, required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
@ -1474,6 +1708,7 @@ i0.MigrationStepWithVersion migrationSteps({
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5, required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6, required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
required Future<void> Function(i1.Migrator m, Schema7 schema) from6To7, required Future<void> Function(i1.Migrator m, Schema7 schema) from6To7,
required Future<void> Function(i1.Migrator m, Schema8 schema) from7To8,
}) { }) {
return (currentVersion, database) async { return (currentVersion, database) async {
switch (currentVersion) { switch (currentVersion) {
@ -1507,6 +1742,11 @@ i0.MigrationStepWithVersion migrationSteps({
final migrator = i1.Migrator(database, schema); final migrator = i1.Migrator(database, schema);
await from6To7(migrator, schema); await from6To7(migrator, schema);
return 7; return 7;
case 7:
final schema = Schema8(database: database);
final migrator = i1.Migrator(database, schema);
await from7To8(migrator, schema);
return 8;
default: default:
throw ArgumentError.value('Unknown migration from $currentVersion'); throw ArgumentError.value('Unknown migration from $currentVersion');
} }
@ -1520,6 +1760,7 @@ i1.OnUpgrade stepByStep({
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5, required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6, required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
required Future<void> Function(i1.Migrator m, Schema7 schema) from6To7, required Future<void> Function(i1.Migrator m, Schema7 schema) from6To7,
required Future<void> Function(i1.Migrator m, Schema8 schema) from7To8,
}) => }) =>
i0.VersionedSchema.stepByStepHelper( i0.VersionedSchema.stepByStepHelper(
step: migrationSteps( step: migrationSteps(
@ -1529,4 +1770,5 @@ i1.OnUpgrade stepByStep({
from4To5: from4To5, from4To5: from4To5,
from5To6: from5To6, from5To6: from5To6,
from6To7: from6To7, from6To7: from6To7,
from7To8: from7To8,
)); ));

View file

@ -87,6 +87,8 @@ class MessageContent {
return PushKeyContent.fromJson(json); return PushKeyContent.fromJson(json);
case MessageKind.reopenedMedia: case MessageKind.reopenedMedia:
return ReopenedMediaFileContent.fromJson(json); return ReopenedMediaFileContent.fromJson(json);
case MessageKind.flameSync:
return FlameSyncContent.fromJson(json);
default: default:
return null; return null;
} }
@ -242,3 +244,33 @@ class PushKeyContent extends MessageContent {
}; };
} }
} }
class FlameSyncContent extends MessageContent {
int flameCounter;
DateTime lastFlameCounterChange;
bool bestFriend;
FlameSyncContent(
{required this.flameCounter,
required this.bestFriend,
required this.lastFlameCounterChange});
static FlameSyncContent fromJson(Map json) {
return FlameSyncContent(
flameCounter: json['flameCounter'],
bestFriend: json['bestFriend'],
lastFlameCounterChange:
DateTime.fromMillisecondsSinceEpoch(json['lastFlameCounterChange']),
);
}
@override
Map toJson() {
return {
'flameCounter': flameCounter,
'bestFriend': bestFriend,
'lastFlameCounterChange':
lastFlameCounterChange.toUtc().millisecondsSinceEpoch,
};
}
}

View file

@ -34,6 +34,8 @@ class UserData {
DateTime? lastImageSend; DateTime? lastImageSend;
int? todaysImageCounter; int? todaysImageCounter;
int? myBestFriendContactId;
final int userId; final int userId;
factory UserData.fromJson(Map<String, dynamic> json) => factory UserData.fromJson(Map<String, dynamic> json) =>

View file

@ -35,7 +35,9 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) => UserData(
..lastImageSend = json['lastImageSend'] == null ..lastImageSend = json['lastImageSend'] == null
? null ? null
: DateTime.parse(json['lastImageSend'] as String) : DateTime.parse(json['lastImageSend'] as String)
..todaysImageCounter = (json['todaysImageCounter'] as num?)?.toInt(); ..todaysImageCounter = (json['todaysImageCounter'] as num?)?.toInt()
..myBestFriendContactId =
(json['myBestFriendContactId'] as num?)?.toInt();
Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
'username': instance.username, 'username': instance.username,
@ -55,6 +57,7 @@ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
'additionalUserInvites': instance.additionalUserInvites, 'additionalUserInvites': instance.additionalUserInvites,
'lastImageSend': instance.lastImageSend?.toIso8601String(), 'lastImageSend': instance.lastImageSend?.toIso8601String(),
'todaysImageCounter': instance.todaysImageCounter, 'todaysImageCounter': instance.todaysImageCounter,
'myBestFriendContactId': instance.myBestFriendContactId,
'userId': instance.userId, 'userId': instance.userId,
}; };

View file

@ -18,6 +18,7 @@ import 'package:twonly/src/providers/api/api.dart';
import 'package:twonly/src/providers/api/api_utils.dart'; import 'package:twonly/src/providers/api/api_utils.dart';
import 'package:twonly/src/providers/api/media_received.dart'; import 'package:twonly/src/providers/api/media_received.dart';
import 'package:twonly/src/services/notification_service.dart'; import 'package:twonly/src/services/notification_service.dart';
import 'package:twonly/src/utils/misc.dart';
// ignore: library_prefixes // ignore: library_prefixes
import 'package:twonly/src/utils/signal.dart' as SignalHelper; import 'package:twonly/src/utils/signal.dart' as SignalHelper;
@ -67,6 +68,29 @@ Future<client.Response> handleNewMessage(int fromUserId, Uint8List body) async {
case MessageKind.contactRequest: case MessageKind.contactRequest:
return handleContactRequest(fromUserId, message); return handleContactRequest(fromUserId, message);
case MessageKind.flameSync:
Contact? contact = await twonlyDatabase.contactsDao
.getContactByUserId(fromUserId)
.getSingleOrNull();
if (contact != null && contact.lastFlameCounterChange != null) {
final content = message.content;
if (content is FlameSyncContent) {
var updates = ContactsCompanion(
alsoBestFriend: Value(content.bestFriend),
);
if (isToday(contact.lastFlameCounterChange!) &&
isToday(content.lastFlameCounterChange)) {
if (content.flameCounter > contact.flameCounter) {
updates = ContactsCompanion(
alsoBestFriend: Value(content.bestFriend),
flameCounter: Value(content.flameCounter),
);
}
}
await twonlyDatabase.contactsDao.updateContact(fromUserId, updates);
}
}
case MessageKind.opened: case MessageKind.opened:
final update = MessagesCompanion(openedAt: Value(message.timestamp)); final update = MessagesCompanion(openedAt: Value(message.timestamp));
await twonlyDatabase.messagesDao.updateMessageByOtherUser( await twonlyDatabase.messagesDao.updateMessageByOtherUser(

View file

@ -23,6 +23,7 @@ import 'package:twonly/src/providers/api/media_received.dart';
import 'package:twonly/src/providers/api/media_send.dart'; import 'package:twonly/src/providers/api/media_send.dart';
import 'package:twonly/src/providers/api/server_messages.dart'; import 'package:twonly/src/providers/api/server_messages.dart';
import 'package:twonly/src/services/fcm_service.dart'; import 'package:twonly/src/services/fcm_service.dart';
import 'package:twonly/src/services/flame_service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/utils/storage.dart';
// ignore: library_prefixes // ignore: library_prefixes
@ -77,10 +78,6 @@ class ApiProvider {
Future onAuthenticated() async { Future onAuthenticated() async {
isAuthenticated = true; isAuthenticated = true;
initFCMAfterAuthenticated(); initFCMAfterAuthenticated();
}
Future onConnected() async {
await authenticate();
globalCallbackConnectionState(true); globalCallbackConnectionState(true);
if (!globalIsAppInBackground) { if (!globalIsAppInBackground) {
@ -89,9 +86,15 @@ class ApiProvider {
tryDownloadAllMediaFiles(); tryDownloadAllMediaFiles();
notifyContactsAboutProfileChange(); notifyContactsAboutProfileChange();
twonlyDatabase.markUpdated(); twonlyDatabase.markUpdated();
syncFlameCounters();
} }
} }
Future onConnected() async {
await authenticate();
globalCallbackConnectionState(true);
}
Future onClosed() async { Future onClosed() async {
_channel = null; _channel = null;
isAuthenticated = false; isAuthenticated = false;

View file

@ -0,0 +1,60 @@
import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:twonly/globals.dart';
import 'package:twonly/src/database/daos/contacts_dao.dart';
import 'package:twonly/src/database/tables/messages_table.dart';
import 'package:twonly/src/database/twonly_database.dart';
import 'package:twonly/src/providers/api/api.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart';
import 'package:twonly/src/model/json/message.dart' as my;
Future syncFlameCounters() async {
var user = await getUser();
if (user == null) return;
List<Contact> contacts =
await twonlyDatabase.contactsDao.getAllNotBlockedContacts();
if (contacts.isEmpty) return;
int maxMessageCounter = contacts.map((x) => x.totalMediaCounter).max;
Contact bestFriend =
contacts.firstWhere((x) => x.totalMediaCounter == maxMessageCounter);
if (user.myBestFriendContactId != bestFriend.userId) {
user.myBestFriendContactId = bestFriend.userId;
await updateUser(user);
}
for (Contact contact in contacts) {
if (contact.lastFlameCounterChange == null) continue;
if (contact.lastFlameSync != null) {
if (isToday(contact.lastFlameSync!)) continue;
}
int flameCounter = getFlameCounterFromContact(contact) - 1;
// only sync when flame counter is higher than three days
if (flameCounter < 1 && bestFriend.userId != contact.userId) continue;
encryptAndSendMessage(
null,
contact.userId,
my.MessageJson(
kind: MessageKind.flameSync,
content: my.FlameSyncContent(
flameCounter: flameCounter,
lastFlameCounterChange: contact.lastFlameCounterChange!,
bestFriend: contact.userId == bestFriend.userId,
),
timestamp: DateTime.now(),
),
);
await twonlyDatabase.contactsDao.updateContact(
contact.userId,
ContactsCompanion(
lastFlameSync: Value(DateTime.now()),
),
);
}
}

View file

@ -13,14 +13,12 @@ class BestFriendsSelector extends StatelessWidget {
final List<Contact> users; final List<Contact> users;
final Function(int, bool) updateStatus; final Function(int, bool) updateStatus;
final HashSet<int> selectedUserIds; final HashSet<int> selectedUserIds;
final int maxTotalMediaCounter;
final bool isRealTwonly; final bool isRealTwonly;
final String title; final String title;
const BestFriendsSelector( const BestFriendsSelector(
{super.key, {super.key,
required this.users, required this.users,
required this.maxTotalMediaCounter,
required this.isRealTwonly, required this.isRealTwonly,
required this.updateStatus, required this.updateStatus,
required this.selectedUserIds, required this.selectedUserIds,
@ -81,7 +79,6 @@ class BestFriendsSelector extends StatelessWidget {
user: users[firstUserIndex], user: users[firstUserIndex],
onChanged: updateStatus, onChanged: updateStatus,
isRealTwonly: isRealTwonly, isRealTwonly: isRealTwonly,
maxTotalMediaCounter: maxTotalMediaCounter,
), ),
), ),
(secondUserIndex < users.length) (secondUserIndex < users.length)
@ -92,7 +89,7 @@ class BestFriendsSelector extends StatelessWidget {
user: users[secondUserIndex], user: users[secondUserIndex],
onChanged: updateStatus, onChanged: updateStatus,
isRealTwonly: isRealTwonly, isRealTwonly: isRealTwonly,
maxTotalMediaCounter: maxTotalMediaCounter), ),
) )
: Expanded( : Expanded(
child: Container(), child: Container(),
@ -112,12 +109,10 @@ class UserCheckbox extends StatelessWidget {
final Function(int, bool) onChanged; final Function(int, bool) onChanged;
final bool isChecked; final bool isChecked;
final bool isRealTwonly; final bool isRealTwonly;
final int maxTotalMediaCounter;
const UserCheckbox({ const UserCheckbox({
super.key, super.key,
required this.user, required this.user,
required this.maxTotalMediaCounter,
required this.onChanged, required this.onChanged,
required this.isRealTwonly, required this.isRealTwonly,
required this.isChecked, required this.isChecked,
@ -181,8 +176,7 @@ class UserCheckbox extends StatelessWidget {
if (!snapshot.hasData || snapshot.data! == 0) { if (!snapshot.hasData || snapshot.data! == 0) {
return Container(); return Container();
} }
return FlameCounterWidget( return FlameCounterWidget(user, snapshot.data!);
user, snapshot.data!, maxTotalMediaCounter);
}, },
) )
], ],

View file

@ -44,7 +44,6 @@ class _ShareImageView extends State<ShareImageView> {
List<Contact> _otherUsers = []; List<Contact> _otherUsers = [];
List<Contact> _bestFriends = []; List<Contact> _bestFriends = [];
List<Contact> _pinnedContacs = []; List<Contact> _pinnedContacs = [];
int maxTotalMediaCounter = 0;
Uint8List? imageBytes; Uint8List? imageBytes;
bool sendingImage = false; bool sendingImage = false;
bool hideArchivedUsers = true; bool hideArchivedUsers = true;
@ -100,12 +99,6 @@ class _ShareImageView extends State<ShareImageView> {
a.totalMediaCounter); // Sort by totalMediaCounter in descending order a.totalMediaCounter); // Sort by totalMediaCounter in descending order
}); });
maxTotalMediaCounter = 0;
if (users.isNotEmpty) {
maxTotalMediaCounter =
users.map((x) => x.totalMediaCounter).reduce((a, b) => a > b ? a : b);
}
// Separate best friends and other users // Separate best friends and other users
List<Contact> bestFriends = []; List<Contact> bestFriends = [];
List<Contact> otherUsers = []; List<Contact> otherUsers = [];
@ -201,7 +194,6 @@ class _ShareImageView extends State<ShareImageView> {
BestFriendsSelector( BestFriendsSelector(
users: _pinnedContacs, users: _pinnedContacs,
selectedUserIds: _selectedUserIds, selectedUserIds: _selectedUserIds,
maxTotalMediaCounter: maxTotalMediaCounter,
isRealTwonly: widget.isRealTwonly, isRealTwonly: widget.isRealTwonly,
updateStatus: updateStatus, updateStatus: updateStatus,
title: context.lang.shareImagePinnedContacts, title: context.lang.shareImagePinnedContacts,
@ -210,7 +202,6 @@ class _ShareImageView extends State<ShareImageView> {
BestFriendsSelector( BestFriendsSelector(
users: _bestFriends, users: _bestFriends,
selectedUserIds: _selectedUserIds, selectedUserIds: _selectedUserIds,
maxTotalMediaCounter: maxTotalMediaCounter,
isRealTwonly: widget.isRealTwonly, isRealTwonly: widget.isRealTwonly,
updateStatus: updateStatus, updateStatus: updateStatus,
title: context.lang.shareImageBestFriends, title: context.lang.shareImageBestFriends,
@ -259,7 +250,6 @@ class _ShareImageView extends State<ShareImageView> {
Expanded( Expanded(
child: UserList( child: UserList(
List.from(_otherUsers), List.from(_otherUsers),
maxTotalMediaCounter,
selectedUserIds: _selectedUserIds, selectedUserIds: _selectedUserIds,
isRealTwonly: widget.isRealTwonly, isRealTwonly: widget.isRealTwonly,
updateStatus: updateStatus, updateStatus: updateStatus,
@ -351,8 +341,7 @@ class _ShareImageView extends State<ShareImageView> {
class UserList extends StatelessWidget { class UserList extends StatelessWidget {
const UserList( const UserList(
this.users, this.users, {
this.maxTotalMediaCounter, {
super.key, super.key,
required this.selectedUserIds, required this.selectedUserIds,
required this.updateStatus, required this.updateStatus,
@ -360,7 +349,6 @@ class UserList extends StatelessWidget {
}); });
final Function(int, bool) updateStatus; final Function(int, bool) updateStatus;
final List<Contact> users; final List<Contact> users;
final int maxTotalMediaCounter;
final bool isRealTwonly; final bool isRealTwonly;
final HashSet<int> selectedUserIds; final HashSet<int> selectedUserIds;
@ -391,7 +379,6 @@ class UserList extends StatelessWidget {
FlameCounterWidget( FlameCounterWidget(
user, user,
flameCounter, flameCounter,
maxTotalMediaCounter,
prefix: true, prefix: true,
), ),
], ],

View file

@ -334,7 +334,6 @@ class _UserListItem extends State<UserListItem> {
FlameCounterWidget( FlameCounterWidget(
widget.user, widget.user,
flameCounter, flameCounter,
widget.maxTotalMediaCounter,
prefix: true, prefix: true,
), ),
], ],

View file

@ -24,7 +24,6 @@ class _StartNewChat extends State<StartNewChat> {
List<Contact> allContacts = []; List<Contact> allContacts = [];
final TextEditingController searchUserName = TextEditingController(); final TextEditingController searchUserName = TextEditingController();
late StreamSubscription<List<Contact>> contactSub; late StreamSubscription<List<Contact>> contactSub;
int maxTotalMediaCounter = 1000;
@override @override
void initState() { void initState() {
@ -96,7 +95,6 @@ class _StartNewChat extends State<StartNewChat> {
Expanded( Expanded(
child: UserList( child: UserList(
contacts, contacts,
maxTotalMediaCounter,
), ),
) )
], ],
@ -110,12 +108,10 @@ class _StartNewChat extends State<StartNewChat> {
class UserList extends StatelessWidget { class UserList extends StatelessWidget {
const UserList( const UserList(
this.users, this.users, {
this.maxTotalMediaCounter, {
super.key, super.key,
}); });
final List<Contact> users; final List<Contact> users;
final int maxTotalMediaCounter;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -161,7 +157,6 @@ class UserList extends StatelessWidget {
FlameCounterWidget( FlameCounterWidget(
user, user,
flameCounter, flameCounter,
maxTotalMediaCounter,
prefix: true, prefix: true,
), ),
Spacer(), Spacer(),

View file

@ -1,17 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:twonly/app.dart';
import 'package:twonly/src/views/components/animate_icon.dart'; import 'package:twonly/src/views/components/animate_icon.dart';
import 'package:twonly/src/database/twonly_database.dart'; import 'package:twonly/src/database/twonly_database.dart';
class FlameCounterWidget extends StatelessWidget { class FlameCounterWidget extends StatelessWidget {
final Contact user; final Contact user;
final int maxTotalMediaCounter;
final int flameCounter; final int flameCounter;
final bool prefix; final bool prefix;
const FlameCounterWidget( const FlameCounterWidget(
this.user, this.user,
this.flameCounter, this.flameCounter, {
this.maxTotalMediaCounter, {
this.prefix = false, this.prefix = false,
super.key, super.key,
}); });
@ -30,9 +29,7 @@ class FlameCounterWidget extends StatelessWidget {
SizedBox( SizedBox(
height: 15, height: 15,
child: EmojiAnimation( child: EmojiAnimation(
emoji: (maxTotalMediaCounter == user.totalMediaCounter) emoji: (globalBestFriendUserId == user.userId) ? "❤️‍🔥" : "🔥"),
? "❤️‍🔥"
: "🔥"),
), ),
], ],
); );

View file

@ -60,7 +60,6 @@ class _ContactViewState extends State<ContactView> {
FlameCounterWidget( FlameCounterWidget(
contact, contact,
flameCounter, flameCounter,
110000000,
prefix: true, prefix: true,
), ),
], ],

View file

@ -10,6 +10,7 @@ import 'schema_v4.dart' as v4;
import 'schema_v5.dart' as v5; import 'schema_v5.dart' as v5;
import 'schema_v6.dart' as v6; import 'schema_v6.dart' as v6;
import 'schema_v7.dart' as v7; import 'schema_v7.dart' as v7;
import 'schema_v8.dart' as v8;
class GeneratedHelper implements SchemaInstantiationHelper { class GeneratedHelper implements SchemaInstantiationHelper {
@override @override
@ -29,10 +30,12 @@ class GeneratedHelper implements SchemaInstantiationHelper {
return v6.DatabaseAtV6(db); return v6.DatabaseAtV6(db);
case 7: case 7:
return v7.DatabaseAtV7(db); return v7.DatabaseAtV7(db);
case 8:
return v8.DatabaseAtV8(db);
default: default:
throw MissingSchemaException(version, versions); throw MissingSchemaException(version, versions);
} }
} }
static const versions = const [1, 2, 3, 4, 5, 6, 7]; static const versions = const [1, 2, 3, 4, 5, 6, 7, 8];
} }

File diff suppressed because it is too large Load diff