This commit is contained in:
otsmr 2025-04-29 18:35:22 +02:00
parent 776108d9e7
commit 580dc3c3cf
16 changed files with 3331 additions and 55 deletions

File diff suppressed because one or more lines are too long

View file

@ -15,6 +15,7 @@ class Contacts extends Table {
BoolColumn get blocked => boolean().withDefault(Constant(false))(); BoolColumn get blocked => boolean().withDefault(Constant(false))();
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))();
IntColumn get deleteMessagesAfterXMinutes => IntColumn get deleteMessagesAfterXMinutes =>
integer().withDefault(Constant(60 * 24))(); integer().withDefault(Constant(60 * 24))();

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 => 6; int get schemaVersion => 7;
static QueryExecutor _openConnection() { static QueryExecutor _openConnection() {
return driftDatabase( return driftDatabase(
@ -57,21 +57,30 @@ class TwonlyDatabase extends _$TwonlyDatabase {
@override @override
MigrationStrategy get migration { MigrationStrategy get migration {
return MigrationStrategy( return MigrationStrategy(
onUpgrade: stepByStep(from1To2: (m, schema) async { onUpgrade: stepByStep(
from1To2: (m, schema) async {
m.addColumn(schema.messages, schema.messages.errorWhileSending); m.addColumn(schema.messages, schema.messages.errorWhileSending);
}, from2To3: (m, schema) async { },
from2To3: (m, schema) async {
m.addColumn(schema.contacts, schema.contacts.archived); m.addColumn(schema.contacts, schema.contacts.archived);
m.addColumn( m.addColumn(
schema.contacts, schema.contacts.deleteMessagesAfterXMinutes); schema.contacts, schema.contacts.deleteMessagesAfterXMinutes);
}, from3To4: (m, schema) async { },
from3To4: (m, schema) async {
m.createTable(mediaUploads); m.createTable(mediaUploads);
}, from4To5: (m, schema) async { },
from4To5: (m, schema) async {
m.createTable(mediaDownloads); m.createTable(mediaDownloads);
m.addColumn(schema.messages, schema.messages.mediaDownloadId); m.addColumn(schema.messages, schema.messages.mediaDownloadId);
m.addColumn(schema.messages, schema.messages.mediaUploadId); m.addColumn(schema.messages, schema.messages.mediaUploadId);
}, from5To6: (m, schema) async { },
from5To6: (m, schema) async {
m.addColumn(schema.messages, schema.messages.mediaStored); m.addColumn(schema.messages, schema.messages.mediaStored);
}), },
from6To7: (m, schema) async {
m.addColumn(schema.contacts, schema.contacts.pinned);
},
),
); );
} }

View file

@ -97,6 +97,15 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
defaultConstraints: defaultConstraints:
GeneratedColumn.constraintIsAlways('CHECK ("archived" IN (0, 1))'), GeneratedColumn.constraintIsAlways('CHECK ("archived" IN (0, 1))'),
defaultValue: Constant(false)); defaultValue: Constant(false));
static const VerificationMeta _pinnedMeta = const VerificationMeta('pinned');
@override
late final GeneratedColumn<bool> pinned = GeneratedColumn<bool>(
'pinned', aliasedName, false,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints:
GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'),
defaultValue: Constant(false));
static const VerificationMeta _deleteMessagesAfterXMinutesMeta = static const VerificationMeta _deleteMessagesAfterXMinutesMeta =
const VerificationMeta('deleteMessagesAfterXMinutes'); const VerificationMeta('deleteMessagesAfterXMinutes');
@override @override
@ -169,6 +178,7 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
blocked, blocked,
verified, verified,
archived, archived,
pinned,
deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes,
createdAt, createdAt,
totalMediaCounter, totalMediaCounter,
@ -238,6 +248,10 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
context.handle(_archivedMeta, context.handle(_archivedMeta,
archived.isAcceptableOrUnknown(data['archived']!, _archivedMeta)); archived.isAcceptableOrUnknown(data['archived']!, _archivedMeta));
} }
if (data.containsKey('pinned')) {
context.handle(_pinnedMeta,
pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta));
}
if (data.containsKey('delete_messages_after_x_minutes')) { if (data.containsKey('delete_messages_after_x_minutes')) {
context.handle( context.handle(
_deleteMessagesAfterXMinutesMeta, _deleteMessagesAfterXMinutesMeta,
@ -316,6 +330,8 @@ class $ContactsTable extends Contacts with TableInfo<$ContactsTable, Contact> {
.read(DriftSqlType.bool, data['${effectivePrefix}verified'])!, .read(DriftSqlType.bool, data['${effectivePrefix}verified'])!,
archived: attachedDatabase.typeMapping archived: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}archived'])!, .read(DriftSqlType.bool, data['${effectivePrefix}archived'])!,
pinned: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!,
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'])!,
@ -357,6 +373,7 @@ class Contact extends DataClass implements Insertable<Contact> {
final bool blocked; final bool blocked;
final bool verified; final bool verified;
final bool archived; final bool archived;
final bool pinned;
final int deleteMessagesAfterXMinutes; final int deleteMessagesAfterXMinutes;
final DateTime createdAt; final DateTime createdAt;
final int totalMediaCounter; final int totalMediaCounter;
@ -377,6 +394,7 @@ class Contact extends DataClass implements Insertable<Contact> {
required this.blocked, required this.blocked,
required this.verified, required this.verified,
required this.archived, required this.archived,
required this.pinned,
required this.deleteMessagesAfterXMinutes, required this.deleteMessagesAfterXMinutes,
required this.createdAt, required this.createdAt,
required this.totalMediaCounter, required this.totalMediaCounter,
@ -405,6 +423,7 @@ class Contact extends DataClass implements Insertable<Contact> {
map['blocked'] = Variable<bool>(blocked); map['blocked'] = Variable<bool>(blocked);
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['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);
@ -443,6 +462,7 @@ class Contact extends DataClass implements Insertable<Contact> {
blocked: Value(blocked), blocked: Value(blocked),
verified: Value(verified), verified: Value(verified),
archived: Value(archived), archived: Value(archived),
pinned: Value(pinned),
deleteMessagesAfterXMinutes: Value(deleteMessagesAfterXMinutes), deleteMessagesAfterXMinutes: Value(deleteMessagesAfterXMinutes),
createdAt: Value(createdAt), createdAt: Value(createdAt),
totalMediaCounter: Value(totalMediaCounter), totalMediaCounter: Value(totalMediaCounter),
@ -475,6 +495,7 @@ class Contact extends DataClass implements Insertable<Contact> {
blocked: serializer.fromJson<bool>(json['blocked']), blocked: serializer.fromJson<bool>(json['blocked']),
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']),
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
serializer.fromJson<int>(json['deleteMessagesAfterXMinutes']), serializer.fromJson<int>(json['deleteMessagesAfterXMinutes']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']), createdAt: serializer.fromJson<DateTime>(json['createdAt']),
@ -504,6 +525,7 @@ class Contact extends DataClass implements Insertable<Contact> {
'blocked': serializer.toJson<bool>(blocked), 'blocked': serializer.toJson<bool>(blocked),
'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),
'deleteMessagesAfterXMinutes': 'deleteMessagesAfterXMinutes':
serializer.toJson<int>(deleteMessagesAfterXMinutes), serializer.toJson<int>(deleteMessagesAfterXMinutes),
'createdAt': serializer.toJson<DateTime>(createdAt), 'createdAt': serializer.toJson<DateTime>(createdAt),
@ -529,6 +551,7 @@ class Contact extends DataClass implements Insertable<Contact> {
bool? blocked, bool? blocked,
bool? verified, bool? verified,
bool? archived, bool? archived,
bool? pinned,
int? deleteMessagesAfterXMinutes, int? deleteMessagesAfterXMinutes,
DateTime? createdAt, DateTime? createdAt,
int? totalMediaCounter, int? totalMediaCounter,
@ -549,6 +572,7 @@ class Contact extends DataClass implements Insertable<Contact> {
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
verified: verified ?? this.verified, verified: verified ?? this.verified,
archived: archived ?? this.archived, archived: archived ?? this.archived,
pinned: pinned ?? this.pinned,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
@ -581,6 +605,7 @@ class Contact extends DataClass implements Insertable<Contact> {
blocked: data.blocked.present ? data.blocked.value : this.blocked, blocked: data.blocked.present ? data.blocked.value : this.blocked,
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,
deleteMessagesAfterXMinutes: data.deleteMessagesAfterXMinutes.present deleteMessagesAfterXMinutes: data.deleteMessagesAfterXMinutes.present
? data.deleteMessagesAfterXMinutes.value ? data.deleteMessagesAfterXMinutes.value
: this.deleteMessagesAfterXMinutes, : this.deleteMessagesAfterXMinutes,
@ -620,6 +645,7 @@ class Contact extends DataClass implements Insertable<Contact> {
..write('blocked: $blocked, ') ..write('blocked: $blocked, ')
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('archived: $archived, ') ..write('archived: $archived, ')
..write('pinned: $pinned, ')
..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ')
..write('createdAt: $createdAt, ') ..write('createdAt: $createdAt, ')
..write('totalMediaCounter: $totalMediaCounter, ') ..write('totalMediaCounter: $totalMediaCounter, ')
@ -645,6 +671,7 @@ class Contact extends DataClass implements Insertable<Contact> {
blocked, blocked,
verified, verified,
archived, archived,
pinned,
deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes,
createdAt, createdAt,
totalMediaCounter, totalMediaCounter,
@ -668,6 +695,7 @@ class Contact extends DataClass implements Insertable<Contact> {
other.blocked == this.blocked && other.blocked == this.blocked &&
other.verified == this.verified && other.verified == this.verified &&
other.archived == this.archived && other.archived == this.archived &&
other.pinned == this.pinned &&
other.deleteMessagesAfterXMinutes == other.deleteMessagesAfterXMinutes ==
this.deleteMessagesAfterXMinutes && this.deleteMessagesAfterXMinutes &&
other.createdAt == this.createdAt && other.createdAt == this.createdAt &&
@ -691,6 +719,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
final Value<bool> blocked; final Value<bool> blocked;
final Value<bool> verified; final Value<bool> verified;
final Value<bool> archived; final Value<bool> archived;
final Value<bool> pinned;
final Value<int> deleteMessagesAfterXMinutes; final Value<int> deleteMessagesAfterXMinutes;
final Value<DateTime> createdAt; final Value<DateTime> createdAt;
final Value<int> totalMediaCounter; final Value<int> totalMediaCounter;
@ -711,6 +740,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
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.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(),
@ -732,6 +762,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
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.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(),
@ -753,6 +784,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
Expression<bool>? blocked, Expression<bool>? blocked,
Expression<bool>? verified, Expression<bool>? verified,
Expression<bool>? archived, Expression<bool>? archived,
Expression<bool>? pinned,
Expression<int>? deleteMessagesAfterXMinutes, Expression<int>? deleteMessagesAfterXMinutes,
Expression<DateTime>? createdAt, Expression<DateTime>? createdAt,
Expression<int>? totalMediaCounter, Expression<int>? totalMediaCounter,
@ -774,6 +806,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
if (blocked != null) 'blocked': blocked, if (blocked != null) 'blocked': blocked,
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 (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,
@ -801,6 +834,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
Value<bool>? blocked, Value<bool>? blocked,
Value<bool>? verified, Value<bool>? verified,
Value<bool>? archived, Value<bool>? archived,
Value<bool>? pinned,
Value<int>? deleteMessagesAfterXMinutes, Value<int>? deleteMessagesAfterXMinutes,
Value<DateTime>? createdAt, Value<DateTime>? createdAt,
Value<int>? totalMediaCounter, Value<int>? totalMediaCounter,
@ -821,6 +855,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
verified: verified ?? this.verified, verified: verified ?? this.verified,
archived: archived ?? this.archived, archived: archived ?? this.archived,
pinned: pinned ?? this.pinned,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes:
deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
@ -870,6 +905,9 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
if (archived.present) { if (archived.present) {
map['archived'] = Variable<bool>(archived.value); map['archived'] = Variable<bool>(archived.value);
} }
if (pinned.present) {
map['pinned'] = Variable<bool>(pinned.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);
@ -915,6 +953,7 @@ class ContactsCompanion extends UpdateCompanion<Contact> {
..write('blocked: $blocked, ') ..write('blocked: $blocked, ')
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('archived: $archived, ') ..write('archived: $archived, ')
..write('pinned: $pinned, ')
..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ')
..write('createdAt: $createdAt, ') ..write('createdAt: $createdAt, ')
..write('totalMediaCounter: $totalMediaCounter, ') ..write('totalMediaCounter: $totalMediaCounter, ')
@ -3445,6 +3484,7 @@ typedef $$ContactsTableCreateCompanionBuilder = ContactsCompanion Function({
Value<bool> blocked, Value<bool> blocked,
Value<bool> verified, Value<bool> verified,
Value<bool> archived, Value<bool> archived,
Value<bool> pinned,
Value<int> deleteMessagesAfterXMinutes, Value<int> deleteMessagesAfterXMinutes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<int> totalMediaCounter, Value<int> totalMediaCounter,
@ -3466,6 +3506,7 @@ typedef $$ContactsTableUpdateCompanionBuilder = ContactsCompanion Function({
Value<bool> blocked, Value<bool> blocked,
Value<bool> verified, Value<bool> verified,
Value<bool> archived, Value<bool> archived,
Value<bool> pinned,
Value<int> deleteMessagesAfterXMinutes, Value<int> deleteMessagesAfterXMinutes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<int> totalMediaCounter, Value<int> totalMediaCounter,
@ -3539,6 +3580,9 @@ class $$ContactsTableFilterComposer
ColumnFilters<bool> get archived => $composableBuilder( ColumnFilters<bool> get archived => $composableBuilder(
column: $table.archived, builder: (column) => ColumnFilters(column)); column: $table.archived, builder: (column) => ColumnFilters(column));
ColumnFilters<bool> get pinned => $composableBuilder(
column: $table.pinned, 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));
@ -3634,6 +3678,9 @@ class $$ContactsTableOrderingComposer
ColumnOrderings<bool> get archived => $composableBuilder( ColumnOrderings<bool> get archived => $composableBuilder(
column: $table.archived, builder: (column) => ColumnOrderings(column)); column: $table.archived, builder: (column) => ColumnOrderings(column));
ColumnOrderings<bool> get pinned => $composableBuilder(
column: $table.pinned, 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));
@ -3708,6 +3755,9 @@ class $$ContactsTableAnnotationComposer
GeneratedColumn<bool> get archived => GeneratedColumn<bool> get archived =>
$composableBuilder(column: $table.archived, builder: (column) => column); $composableBuilder(column: $table.archived, builder: (column) => column);
GeneratedColumn<bool> get pinned =>
$composableBuilder(column: $table.pinned, 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);
@ -3788,6 +3838,7 @@ class $$ContactsTableTableManager extends RootTableManager<
Value<bool> blocked = const Value.absent(), Value<bool> blocked = const Value.absent(),
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<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(),
@ -3809,6 +3860,7 @@ class $$ContactsTableTableManager extends RootTableManager<
blocked: blocked, blocked: blocked,
verified: verified, verified: verified,
archived: archived, archived: archived,
pinned: pinned,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes,
createdAt: createdAt, createdAt: createdAt,
totalMediaCounter: totalMediaCounter, totalMediaCounter: totalMediaCounter,
@ -3830,6 +3882,7 @@ class $$ContactsTableTableManager extends RootTableManager<
Value<bool> blocked = const Value.absent(), Value<bool> blocked = const Value.absent(),
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<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(),
@ -3851,6 +3904,7 @@ class $$ContactsTableTableManager extends RootTableManager<
blocked: blocked, blocked: blocked,
verified: verified, verified: verified,
archived: archived, archived: archived,
pinned: pinned,
deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes, deleteMessagesAfterXMinutes: deleteMessagesAfterXMinutes,
createdAt: createdAt, createdAt: createdAt,
totalMediaCounter: totalMediaCounter, totalMediaCounter: totalMediaCounter,

View file

@ -1242,12 +1242,238 @@ i1.GeneratedColumn<bool> _column_52(String aliasedName) =>
defaultConstraints: i1.GeneratedColumn.constraintIsAlways( defaultConstraints: i1.GeneratedColumn.constraintIsAlways(
'CHECK ("media_stored" IN (0, 1))'), 'CHECK ("media_stored" IN (0, 1))'),
defaultValue: const CustomExpression('0')); defaultValue: const CustomExpression('0'));
final class Schema7 extends i0.VersionedSchema {
Schema7({required super.database}) : super(version: 7);
@override
late final List<i1.DatabaseSchemaEntity> entities = [
contacts,
messages,
mediaUploads,
mediaDownloads,
signalIdentityKeyStores,
signalPreKeyStores,
signalSenderKeyStores,
signalSessionStores,
];
late final Shape11 contacts = Shape11(
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_40,
_column_10,
_column_11,
_column_12,
_column_13,
_column_14,
_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 Shape11 extends i0.VersionedTable {
Shape11({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<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 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_53(String aliasedName) =>
i1.GeneratedColumn<bool>('pinned', aliasedName, false,
type: i1.DriftSqlType.bool,
defaultConstraints:
i1.GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'),
defaultValue: const CustomExpression('0'));
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,
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4, required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
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,
}) { }) {
return (currentVersion, database) async { return (currentVersion, database) async {
switch (currentVersion) { switch (currentVersion) {
@ -1276,6 +1502,11 @@ i0.MigrationStepWithVersion migrationSteps({
final migrator = i1.Migrator(database, schema); final migrator = i1.Migrator(database, schema);
await from5To6(migrator, schema); await from5To6(migrator, schema);
return 6; return 6;
case 6:
final schema = Schema7(database: database);
final migrator = i1.Migrator(database, schema);
await from6To7(migrator, schema);
return 7;
default: default:
throw ArgumentError.value('Unknown migration from $currentVersion'); throw ArgumentError.value('Unknown migration from $currentVersion');
} }
@ -1288,6 +1519,7 @@ i1.OnUpgrade stepByStep({
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4, required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
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,
}) => }) =>
i0.VersionedSchema.stepByStepHelper( i0.VersionedSchema.stepByStepHelper(
step: migrationSteps( step: migrationSteps(
@ -1296,4 +1528,5 @@ i1.OnUpgrade stepByStep({
from3To4: from3To4, from3To4: from3To4,
from4To5: from4To5, from4To5: from4To5,
from5To6: from5To6, from5To6: from5To6,
from6To7: from6To7,
)); ));

View file

@ -26,10 +26,12 @@
"cameraPreviewSendTo": "Senden an", "cameraPreviewSendTo": "Senden an",
"shareImageTitle": "Teilen mit", "shareImageTitle": "Teilen mit",
"shareImageBestFriends": "Beste Freunde", "shareImageBestFriends": "Beste Freunde",
"shareImagePinnedContacts": "Angeheftet",
"shareImagedEditorSendImage": "Senden", "shareImagedEditorSendImage": "Senden",
"shareImagedEditorShareWith": "Teilen mit", "shareImagedEditorShareWith": "Teilen mit",
"shareImagedEditorSaveImage": "Speichern", "shareImagedEditorSaveImage": "Speichern",
"shareImagedEditorSavedImage": "Gespeichert", "shareImagedEditorSavedImage": "Gespeichert",
"shareImagedSelectAll": "Alle auswählen",
"shareImageAllUsers": "Alle Kontakte", "shareImageAllUsers": "Alle Kontakte",
"shareImageAllTwonlyWarning": "Twonlies können nur an verifizierte Kontakte gesendet werden!", "shareImageAllTwonlyWarning": "Twonlies können nur an verifizierte Kontakte gesendet werden!",
"shareImageSearchAllContacts": "Alle Kontakte durchsuchen", "shareImageSearchAllContacts": "Alle Kontakte durchsuchen",
@ -68,7 +70,8 @@
"startNewChatYourContacts": "Deine Kontakte", "startNewChatYourContacts": "Deine Kontakte",
"@startNewChatYourContacts": {}, "@startNewChatYourContacts": {},
"contextMenuOpenChat": "Chat", "contextMenuOpenChat": "Chat",
"contextMenuSendImage": "Bild senden", "contextMenuPin": "Anheften",
"contextMenuUnpin": "Lösen",
"mediaViewerAuthReason": "Bitte authentifiziere dich, um diesen twonly zu sehen!", "mediaViewerAuthReason": "Bitte authentifiziere dich, um diesen twonly zu sehen!",
"messageSendState_Received": "Empfangen", "messageSendState_Received": "Empfangen",
"messageSendState_Opened": "Geöffnet", "messageSendState_Opened": "Geöffnet",

View file

@ -52,6 +52,8 @@
"@shareImageTitle": {}, "@shareImageTitle": {},
"shareImageBestFriends": "Best friends", "shareImageBestFriends": "Best friends",
"@shareImageBestFriends": {}, "@shareImageBestFriends": {},
"shareImagePinnedContacts": "Pinnded",
"@shareImagePinnedContacts": {},
"shareImagedEditorSendImage": "Send", "shareImagedEditorSendImage": "Send",
"@shareImagedEditorSendImage": {}, "@shareImagedEditorSendImage": {},
"shareImagedEditorShareWith": "Share with", "shareImagedEditorShareWith": "Share with",
@ -62,6 +64,8 @@
"@shareImagedEditorSavedImage": {}, "@shareImagedEditorSavedImage": {},
"shareImageSearchAllContacts": "Search all contacts", "shareImageSearchAllContacts": "Search all contacts",
"@shareImageSearchAllContacts": {}, "@shareImageSearchAllContacts": {},
"shareImagedSelectAll": "Select all",
"@shareImagedSelectAll": {},
"startNewChatTitle": "Select Contact", "startNewChatTitle": "Select Contact",
"@startNewChatTitle": {}, "@startNewChatTitle": {},
"startNewChatNewContact": "New Contact", "startNewChatNewContact": "New Contact",
@ -110,8 +114,10 @@
"@contextMenuUndoArchiveUser": {}, "@contextMenuUndoArchiveUser": {},
"contextMenuOpenChat": "Open chat", "contextMenuOpenChat": "Open chat",
"@contextMenuOpenChat": {}, "@contextMenuOpenChat": {},
"contextMenuSendImage": "Send image", "contextMenuPin": "Pin",
"@contextMenuSendImage": {}, "@contextMenuPin": {},
"contextMenuUnpin": "Unpin",
"@contextMenuUnpin": {},
"mediaViewerAuthReason": "Please authenticate to see this twonly!", "mediaViewerAuthReason": "Please authenticate to see this twonly!",
"@mediaViewerAuthReason": {}, "@mediaViewerAuthReason": {},
"messageSendState_Received": "Received", "messageSendState_Received": "Received",

View file

@ -251,6 +251,12 @@ abstract class AppLocalizations {
/// **'Best friends'** /// **'Best friends'**
String get shareImageBestFriends; String get shareImageBestFriends;
/// No description provided for @shareImagePinnedContacts.
///
/// In en, this message translates to:
/// **'Pinnded'**
String get shareImagePinnedContacts;
/// No description provided for @shareImagedEditorSendImage. /// No description provided for @shareImagedEditorSendImage.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -281,6 +287,12 @@ abstract class AppLocalizations {
/// **'Search all contacts'** /// **'Search all contacts'**
String get shareImageSearchAllContacts; String get shareImageSearchAllContacts;
/// No description provided for @shareImagedSelectAll.
///
/// In en, this message translates to:
/// **'Select all'**
String get shareImagedSelectAll;
/// No description provided for @startNewChatTitle. /// No description provided for @startNewChatTitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -413,11 +425,17 @@ abstract class AppLocalizations {
/// **'Open chat'** /// **'Open chat'**
String get contextMenuOpenChat; String get contextMenuOpenChat;
/// No description provided for @contextMenuSendImage. /// No description provided for @contextMenuPin.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Send image'** /// **'Pin'**
String get contextMenuSendImage; String get contextMenuPin;
/// No description provided for @contextMenuUnpin.
///
/// In en, this message translates to:
/// **'Unpin'**
String get contextMenuUnpin;
/// No description provided for @mediaViewerAuthReason. /// No description provided for @mediaViewerAuthReason.
/// ///

View file

@ -86,6 +86,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get shareImageBestFriends => 'Beste Freunde'; String get shareImageBestFriends => 'Beste Freunde';
@override
String get shareImagePinnedContacts => 'Angeheftet';
@override @override
String get shareImagedEditorSendImage => 'Senden'; String get shareImagedEditorSendImage => 'Senden';
@ -101,6 +104,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get shareImageSearchAllContacts => 'Alle Kontakte durchsuchen'; String get shareImageSearchAllContacts => 'Alle Kontakte durchsuchen';
@override
String get shareImagedSelectAll => 'Alle auswählen';
@override @override
String get startNewChatTitle => 'Kontakt wählen'; String get startNewChatTitle => 'Kontakt wählen';
@ -170,7 +176,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get contextMenuOpenChat => 'Chat'; String get contextMenuOpenChat => 'Chat';
@override @override
String get contextMenuSendImage => 'Bild senden'; String get contextMenuPin => 'Anheften';
@override
String get contextMenuUnpin => 'Lösen';
@override @override
String get mediaViewerAuthReason => 'Bitte authentifiziere dich, um diesen twonly zu sehen!'; String get mediaViewerAuthReason => 'Bitte authentifiziere dich, um diesen twonly zu sehen!';

View file

@ -86,6 +86,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get shareImageBestFriends => 'Best friends'; String get shareImageBestFriends => 'Best friends';
@override
String get shareImagePinnedContacts => 'Pinnded';
@override @override
String get shareImagedEditorSendImage => 'Send'; String get shareImagedEditorSendImage => 'Send';
@ -101,6 +104,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get shareImageSearchAllContacts => 'Search all contacts'; String get shareImageSearchAllContacts => 'Search all contacts';
@override
String get shareImagedSelectAll => 'Select all';
@override @override
String get startNewChatTitle => 'Select Contact'; String get startNewChatTitle => 'Select Contact';
@ -170,7 +176,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get contextMenuOpenChat => 'Open chat'; String get contextMenuOpenChat => 'Open chat';
@override @override
String get contextMenuSendImage => 'Send image'; String get contextMenuPin => 'Pin';
@override
String get contextMenuUnpin => 'Unpin';
@override @override
String get mediaViewerAuthReason => 'Please authenticate to see this twonly!'; String get mediaViewerAuthReason => 'Please authenticate to see this twonly!';

View file

@ -15,15 +15,16 @@ class BestFriendsSelector extends StatelessWidget {
final HashSet<int> selectedUserIds; final HashSet<int> selectedUserIds;
final int maxTotalMediaCounter; final int maxTotalMediaCounter;
final bool isRealTwonly; final bool isRealTwonly;
final String title;
const BestFriendsSelector({ const BestFriendsSelector(
super.key, {super.key,
required this.users, required this.users,
required this.maxTotalMediaCounter, required this.maxTotalMediaCounter,
required this.isRealTwonly, required this.isRealTwonly,
required this.updateStatus, required this.updateStatus,
required this.selectedUserIds, required this.selectedUserIds,
}); required this.title});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -36,7 +37,7 @@ class BestFriendsSelector extends StatelessWidget {
Row( Row(
children: [ children: [
Expanded( Expanded(
child: HeadLineComponent(context.lang.shareImageBestFriends), child: HeadLineComponent(title),
), ),
if (!isRealTwonly) if (!isRealTwonly)
GestureDetector( GestureDetector(
@ -57,7 +58,8 @@ class BestFriendsSelector extends StatelessWidget {
], ],
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
), ),
child: Text("Alle auswählen", style: TextStyle(fontSize: 10)), child: Text(context.lang.shareImagedSelectAll,
style: TextStyle(fontSize: 10)),
), ),
), ),
], ],

View file

@ -42,6 +42,7 @@ class _ShareImageView extends State<ShareImageView> {
List<Contact> contacts = []; List<Contact> contacts = [];
List<Contact> _otherUsers = []; List<Contact> _otherUsers = [];
List<Contact> _bestFriends = []; List<Contact> _bestFriends = [];
List<Contact> _pinnedContacs = [];
int maxTotalMediaCounter = 0; int maxTotalMediaCounter = 0;
Uint8List? imageBytes; Uint8List? imageBytes;
bool sendingImage = false; bool sendingImage = false;
@ -105,8 +106,10 @@ class _ShareImageView extends State<ShareImageView> {
// Separate best friends and other users // Separate best friends and other users
List<Contact> bestFriends = []; List<Contact> bestFriends = [];
List<Contact> otherUsers = []; List<Contact> otherUsers = [];
List<Contact> pinnedContacts = users.where((c) => c.pinned).toList();
for (var contact in users) { for (var contact in users) {
if (contact.pinned) continue;
if (!contact.archived && if (!contact.archived &&
(getFlameCounterFromContact(contact)) > 0 && (getFlameCounterFromContact(contact)) > 0 &&
bestFriends.length < 6) { bestFriends.length < 6) {
@ -118,6 +121,7 @@ class _ShareImageView extends State<ShareImageView> {
setState(() { setState(() {
_bestFriends = bestFriends; _bestFriends = bestFriends;
_pinnedContacs = pinnedContacts;
_otherUsers = otherUsers; _otherUsers = otherUsers;
}); });
} }
@ -184,6 +188,15 @@ class _ShareImageView extends State<ShareImageView> {
), ),
), ),
), ),
if (_pinnedContacs.isNotEmpty) const SizedBox(height: 10),
BestFriendsSelector(
users: _pinnedContacs,
selectedUserIds: _selectedUserIds,
maxTotalMediaCounter: maxTotalMediaCounter,
isRealTwonly: widget.isRealTwonly,
updateStatus: updateStatus,
title: context.lang.shareImagePinnedContacts,
),
const SizedBox(height: 10), const SizedBox(height: 10),
BestFriendsSelector( BestFriendsSelector(
users: _bestFriends, users: _bestFriends,
@ -191,6 +204,7 @@ class _ShareImageView extends State<ShareImageView> {
maxTotalMediaCounter: maxTotalMediaCounter, maxTotalMediaCounter: maxTotalMediaCounter,
isRealTwonly: widget.isRealTwonly, isRealTwonly: widget.isRealTwonly,
updateStatus: updateStatus, updateStatus: updateStatus,
title: context.lang.shareImageBestFriends,
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
if (_otherUsers.isNotEmpty) if (_otherUsers.isNotEmpty)

View file

@ -116,24 +116,45 @@ class _ChatListViewState extends State<ChatListView> {
.reduce((a, b) => a > b ? a : b); .reduce((a, b) => a > b ? a : b);
} }
final pinnedUsers = contacts.where((c) => c.pinned);
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
await apiProvider.close(() {}); await apiProvider.close(() {});
await apiProvider.connect(); await apiProvider.connect();
await Future.delayed(Duration(seconds: 1)); await Future.delayed(Duration(seconds: 1));
}, },
child: ListView.builder( child: ListView(
restorationId: 'chat_list_view', children: [
itemCount: contacts.length, ...pinnedUsers.map((contact) {
itemBuilder: (BuildContext context, int index) {
final user = contacts[index];
return UserListItem( return UserListItem(
key: ValueKey(user.userId), key: ValueKey(contact.userId),
user: user, user: contact,
maxTotalMediaCounter: maxTotalMediaCounter, maxTotalMediaCounter: maxTotalMediaCounter,
); );
}, }),
if (pinnedUsers.isNotEmpty) Divider(),
...contacts.where((c) => !c.pinned).map((contact) {
return UserListItem(
key: ValueKey(contact.userId),
user: contact,
maxTotalMediaCounter: maxTotalMediaCounter,
);
})
],
), ),
// child: ListView.builder(
// restorationId: 'chat_list_view',
// itemCount: contacts.length,
// itemBuilder: (BuildContext context, int index) {
// final user = contacts[index];
// return UserListItem(
// key: ValueKey(user.userId),
// user: user,
// maxTotalMediaCounter: maxTotalMediaCounter,
// );
// },
// ),
); );
}, },
), ),

View file

@ -5,7 +5,6 @@ import 'package:pie_menu/pie_menu.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/src/database/twonly_database.dart'; import 'package:twonly/src/database/twonly_database.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/views/camera/camera_send_to_view.dart';
import 'package:twonly/src/views/chats/chat_item_details_view.dart'; import 'package:twonly/src/views/chats/chat_item_details_view.dart';
import 'package:twonly/src/views/contact/contact_verify_view.dart'; import 'package:twonly/src/views/contact/contact_verify_view.dart';
@ -74,15 +73,22 @@ class _UserContextMenuState extends State<UserContextMenu> {
child: const FaIcon(FontAwesomeIcons.solidComments), child: const FaIcon(FontAwesomeIcons.solidComments),
), ),
PieAction( PieAction(
tooltip: Text(context.lang.contextMenuSendImage), tooltip: Text(
onSelect: () { widget.contact.pinned
Navigator.push(context, MaterialPageRoute( ? context.lang.contextMenuUnpin
builder: (context) { : context.lang.contextMenuPin,
return CameraSendToView(widget.contact); ),
onSelect: () async {
final update =
ContactsCompanion(pinned: Value(!widget.contact.pinned));
if (context.mounted) {
await twonlyDatabase.contactsDao
.updateContact(widget.contact.userId, update);
}
}, },
)); child: FaIcon(widget.contact.pinned
}, ? FontAwesomeIcons.thumbtackSlash
child: const FaIcon(FontAwesomeIcons.camera), : FontAwesomeIcons.thumbtack),
), ),
], ],
child: widget.child, child: widget.child,

View file

@ -9,6 +9,7 @@ import 'schema_v3.dart' as v3;
import 'schema_v4.dart' as v4; 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;
class GeneratedHelper implements SchemaInstantiationHelper { class GeneratedHelper implements SchemaInstantiationHelper {
@override @override
@ -26,10 +27,12 @@ class GeneratedHelper implements SchemaInstantiationHelper {
return v5.DatabaseAtV5(db); return v5.DatabaseAtV5(db);
case 6: case 6:
return v6.DatabaseAtV6(db); return v6.DatabaseAtV6(db);
case 7:
return v7.DatabaseAtV7(db);
default: default:
throw MissingSchemaException(version, versions); throw MissingSchemaException(version, versions);
} }
} }
static const versions = const [1, 2, 3, 4, 5, 6]; static const versions = const [1, 2, 3, 4, 5, 6, 7];
} }

File diff suppressed because it is too large Load diff