fixing uuid issue in tables

This commit is contained in:
otsmr 2025-10-25 12:00:40 +02:00
parent 8b48db26f4
commit 18dd85d937
19 changed files with 173 additions and 124 deletions

View file

@ -386,14 +386,14 @@ SPEC CHECKSUMS:
GoogleAppMeasurement: 1e718274b7e015cefd846ac1fcf7820c70dc017d GoogleAppMeasurement: 1e718274b7e015cefd846ac1fcf7820c70dc017d
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
no_screenshot: 6d183496405a3ab709a67a54e5cd0f639e94729e no_screenshot: 6d183496405a3ab709a67a54e5cd0f639e94729e
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
restart_app: 9cda5378aacc5000e3f66ee76a9201534e7d3ecf restart_app: 9cda5378aacc5000e3f66ee76a9201534e7d3ecf
@ -401,14 +401,14 @@ SPEC CHECKSUMS:
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b
sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1
SwiftProtobuf: 81e341191afbddd64aa031bd12862dccfab2f639 SwiftProtobuf: 81e341191afbddd64aa031bd12862dccfab2f639
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
video_compress: f2133a07762889d67f0711ac831faa26f956980e video_compress: f2133a07762889d67f0711ac831faa26f956980e
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140 video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140
PODFILE CHECKSUM: 47470fbd5b59affa461eaf943ac57acce81e0ee8 PODFILE CHECKSUM: 47470fbd5b59affa461eaf943ac57acce81e0ee8

View file

@ -1,6 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:path/path.dart' show join;
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/src/localization/generated/app_localizations.dart'; import 'package:twonly/src/localization/generated/app_localizations.dart';
@ -11,6 +14,7 @@ import 'package:twonly/src/views/components/app_outdated.dart';
import 'package:twonly/src/views/home.view.dart'; import 'package:twonly/src/views/home.view.dart';
import 'package:twonly/src/views/onboarding/onboarding.view.dart'; import 'package:twonly/src/views/onboarding/onboarding.view.dart';
import 'package:twonly/src/views/onboarding/register.view.dart'; import 'package:twonly/src/views/onboarding/register.view.dart';
import 'package:twonly/src/views/updates/62_database_migration.view.dart';
class App extends StatefulWidget { class App extends StatefulWidget {
const App({super.key}); const App({super.key});
@ -144,36 +148,60 @@ class AppMainWidget extends StatefulWidget {
} }
class _AppMainWidgetState extends State<AppMainWidget> { class _AppMainWidgetState extends State<AppMainWidget> {
Future<bool> userCreated = isUserCreated(); bool _isUserCreated = false;
bool showOnboarding = true; bool _showDatabaseMigration = false;
bool _showOnboarding = true;
bool _isLoaded = false;
@override
void initState() {
initAsync();
super.initState();
}
Future<void> initAsync() async {
_showDatabaseMigration = File(
join(
(await getApplicationSupportDirectory()).path,
'twonly_database.sqlite',
),
).existsSync();
_isUserCreated = await isUserCreated();
setState(() {
_isLoaded = true;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( if (!_isLoaded) {
children: [
FutureBuilder<bool>(
future: userCreated,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(child: Container()); return Center(child: Container());
} else if (snapshot.data!) { }
return HomeView(
late Widget child;
if (_showDatabaseMigration) {
child = const DatabaseMigrationView();
} else if (_isUserCreated) {
child = HomeView(
initialPage: widget.initialPage, initialPage: widget.initialPage,
); );
} else if (showOnboarding) { } else if (_showOnboarding) {
return OnboardingView( child = OnboardingView(
callbackOnSuccess: () => setState(() { callbackOnSuccess: () => setState(() {
showOnboarding = false; _showOnboarding = false;
}), }),
); );
} else {
child = RegisterView(
callbackOnSuccess: initAsync,
);
} }
return RegisterView(
callbackOnSuccess: () => setState(() { return Stack(
userCreated = isUserCreated(); children: [
}), child,
);
},
),
const AppOutdated(), const AppOutdated(),
], ],
); );

View file

@ -1,5 +1,3 @@
import 'dart:async';
import 'package:camera/camera.dart'; import 'package:camera/camera.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -12,7 +10,6 @@ import 'package:twonly/src/providers/settings.provider.dart';
import 'package:twonly/src/services/api.service.dart'; import 'package:twonly/src/services/api.service.dart';
import 'package:twonly/src/services/api/mediafiles/media_background.service.dart'; import 'package:twonly/src/services/api/mediafiles/media_background.service.dart';
import 'package:twonly/src/services/fcm.service.dart'; import 'package:twonly/src/services/fcm.service.dart';
import 'package:twonly/src/services/notifications/setup.notifications.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/utils/storage.dart';
@ -27,9 +24,6 @@ void main() async {
final user = await getUser(); final user = await getUser();
if (user != null) { if (user != null) {
gUser = user; gUser = user;
if (user.isDemoUser) {
await deleteLocalUserData();
}
} }
final settingsController = SettingsChangeProvider(); final settingsController = SettingsChangeProvider();
@ -37,7 +31,7 @@ void main() async {
await settingsController.loadSettings(); await settingsController.loadSettings();
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
unawaited(setupPushNotification()); // unawaited(setupPushNotification());
gCameras = await availableCameras(); gCameras = await availableCameras();

View file

@ -1,4 +1,5 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
@ -33,7 +34,11 @@ class GroupsDao extends DatabaseAccessor<TwonlyDB> with _$GroupsDaoMixin {
} }
Future<void> insertGroup(GroupsCompanion group) async { Future<void> insertGroup(GroupsCompanion group) async {
await into(groups).insert(group); await into(groups).insert(
group.copyWith(
groupId: Value(uuid.v4()),
),
);
} }
Future<List<Contact>> getGroupContact(String groupId) async { Future<List<Contact>> getGroupContact(String groupId) async {

View file

@ -1,4 +1,5 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
@ -15,7 +16,11 @@ class MediaFilesDao extends DatabaseAccessor<TwonlyDB>
Future<MediaFile?> insertMedia(MediaFilesCompanion mediaFile) async { Future<MediaFile?> insertMedia(MediaFilesCompanion mediaFile) async {
try { try {
final rowId = await into(mediaFiles).insert(mediaFile); final rowId = await into(mediaFiles).insert(
mediaFile.copyWith(
mediaId: Value(uuid.v7()),
),
);
return await (select(mediaFiles)..where((t) => t.rowId.equals(rowId))) return await (select(mediaFiles)..where((t) => t.rowId.equals(rowId)))
.getSingle(); .getSingle();

View file

@ -1,4 +1,5 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/contacts.table.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
@ -290,7 +291,11 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
Future<Message?> insertMessage(MessagesCompanion message) async { Future<Message?> insertMessage(MessagesCompanion message) async {
try { try {
final rowId = await into(messages).insert(message); final rowId = await into(messages).insert(
message.copyWith(
messageId: Value(uuid.v7()),
),
);
await twonlyDB.groupsDao.updateGroup( await twonlyDB.groupsDao.updateGroup(
message.groupId.value, message.groupId.value,

View file

@ -1,4 +1,5 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart';
import 'package:twonly/src/database/tables/receipts.table.dart'; import 'package:twonly/src/database/tables/receipts.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
@ -51,7 +52,11 @@ class ReceiptsDao extends DatabaseAccessor<TwonlyDB> with _$ReceiptsDaoMixin {
Future<Receipt?> insertReceipt(ReceiptsCompanion entry) async { Future<Receipt?> insertReceipt(ReceiptsCompanion entry) async {
try { try {
final id = await into(receipts).insert(entry); final id = await into(receipts).insert(
entry.copyWith(
receiptId: Value(uuid.v4()),
),
);
return await (select(receipts)..where((t) => t.rowId.equals(id))) return await (select(receipts)..where((t) => t.rowId.equals(id)))
.getSingle(); .getSingle();
} catch (e) { } catch (e) {

View file

@ -1,10 +1,9 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/contacts.table.dart';
@DataClassName('Group') @DataClassName('Group')
class Groups extends Table { class Groups extends Table {
TextColumn get groupId => text().clientDefault(() => uuid.v4())(); TextColumn get groupId => text()();
BoolColumn get isGroupAdmin => boolean()(); BoolColumn get isGroupAdmin => boolean()();
BoolColumn get isDirectChat => boolean()(); BoolColumn get isDirectChat => boolean()();

View file

@ -1,7 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
enum MediaType { enum MediaType {
image, image,
@ -36,7 +34,7 @@ enum DownloadState {
@DataClassName('MediaFile') @DataClassName('MediaFile')
class MediaFiles extends Table { class MediaFiles extends Table {
TextColumn get mediaId => text().clientDefault(() => uuid.v7())(); TextColumn get mediaId => text()();
TextColumn get type => textEnum<MediaType>()(); TextColumn get type => textEnum<MediaType>()();

View file

@ -1,5 +1,4 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/contacts.table.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart';
@ -10,7 +9,7 @@ enum MessageType { media, text }
class Messages extends Table { class Messages extends Table {
TextColumn get groupId => TextColumn get groupId =>
text().references(Groups, #groupId, onDelete: KeyAction.cascade)(); text().references(Groups, #groupId, onDelete: KeyAction.cascade)();
TextColumn get messageId => text().clientDefault(() => uuid.v7())(); TextColumn get messageId => text()();
// in case senderId is null, it was send by user itself // in case senderId is null, it was send by user itself
IntColumn get senderId => IntColumn get senderId =>

View file

@ -1,11 +1,10 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:hashlib/random.dart';
import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/contacts.table.dart';
import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart';
@DataClassName('Receipt') @DataClassName('Receipt')
class Receipts extends Table { class Receipts extends Table {
TextColumn get receiptId => text().clientDefault(() => uuid.v4())(); TextColumn get receiptId => text()();
IntColumn get contactId => IntColumn get contactId =>
integer().references(Contacts, #userId, onDelete: KeyAction.cascade)(); integer().references(Contacts, #userId, onDelete: KeyAction.cascade)();

View file

@ -606,9 +606,7 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> {
@override @override
late final GeneratedColumn<String> groupId = GeneratedColumn<String>( late final GeneratedColumn<String> groupId = GeneratedColumn<String>(
'group_id', aliasedName, false, 'group_id', aliasedName, false,
type: DriftSqlType.string, type: DriftSqlType.string, requiredDuringInsert: true);
requiredDuringInsert: false,
clientDefault: () => uuid.v4());
static const VerificationMeta _isGroupAdminMeta = static const VerificationMeta _isGroupAdminMeta =
const VerificationMeta('isGroupAdmin'); const VerificationMeta('isGroupAdmin');
@override @override
@ -759,6 +757,8 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> {
if (data.containsKey('group_id')) { if (data.containsKey('group_id')) {
context.handle(_groupIdMeta, context.handle(_groupIdMeta,
groupId.isAcceptableOrUnknown(data['group_id']!, _groupIdMeta)); groupId.isAcceptableOrUnknown(data['group_id']!, _groupIdMeta));
} else if (isInserting) {
context.missing(_groupIdMeta);
} }
if (data.containsKey('is_group_admin')) { if (data.containsKey('is_group_admin')) {
context.handle( context.handle(
@ -1239,7 +1239,7 @@ class GroupsCompanion extends UpdateCompanion<Group> {
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
GroupsCompanion.insert({ GroupsCompanion.insert({
this.groupId = const Value.absent(), required String groupId,
required bool isGroupAdmin, required bool isGroupAdmin,
required bool isDirectChat, required bool isDirectChat,
this.pinned = const Value.absent(), this.pinned = const Value.absent(),
@ -1256,7 +1256,8 @@ class GroupsCompanion extends UpdateCompanion<Group> {
this.flameCounter = const Value.absent(), this.flameCounter = const Value.absent(),
this.lastMessageExchange = const Value.absent(), this.lastMessageExchange = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : isGroupAdmin = Value(isGroupAdmin), }) : groupId = Value(groupId),
isGroupAdmin = Value(isGroupAdmin),
isDirectChat = Value(isDirectChat), isDirectChat = Value(isDirectChat),
groupName = Value(groupName); groupName = Value(groupName);
static Insertable<Group> custom({ static Insertable<Group> custom({
@ -1442,9 +1443,7 @@ class $MediaFilesTable extends MediaFiles
@override @override
late final GeneratedColumn<String> mediaId = GeneratedColumn<String>( late final GeneratedColumn<String> mediaId = GeneratedColumn<String>(
'media_id', aliasedName, false, 'media_id', aliasedName, false,
type: DriftSqlType.string, type: DriftSqlType.string, requiredDuringInsert: true);
requiredDuringInsert: false,
clientDefault: () => uuid.v7());
@override @override
late final GeneratedColumnWithTypeConverter<MediaType, String> type = late final GeneratedColumnWithTypeConverter<MediaType, String> type =
GeneratedColumn<String>('type', aliasedName, false, GeneratedColumn<String>('type', aliasedName, false,
@ -1566,6 +1565,8 @@ class $MediaFilesTable extends MediaFiles
if (data.containsKey('media_id')) { if (data.containsKey('media_id')) {
context.handle(_mediaIdMeta, context.handle(_mediaIdMeta,
mediaId.isAcceptableOrUnknown(data['media_id']!, _mediaIdMeta)); mediaId.isAcceptableOrUnknown(data['media_id']!, _mediaIdMeta));
} else if (isInserting) {
context.missing(_mediaIdMeta);
} }
if (data.containsKey('requires_authentication')) { if (data.containsKey('requires_authentication')) {
context.handle( context.handle(
@ -2020,7 +2021,7 @@ class MediaFilesCompanion extends UpdateCompanion<MediaFile> {
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
MediaFilesCompanion.insert({ MediaFilesCompanion.insert({
this.mediaId = const Value.absent(), required String mediaId,
required MediaType type, required MediaType type,
this.uploadState = const Value.absent(), this.uploadState = const Value.absent(),
this.downloadState = const Value.absent(), this.downloadState = const Value.absent(),
@ -2035,7 +2036,8 @@ class MediaFilesCompanion extends UpdateCompanion<MediaFile> {
this.encryptionNonce = const Value.absent(), this.encryptionNonce = const Value.absent(),
this.createdAt = const Value.absent(), this.createdAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : type = Value(type); }) : mediaId = Value(mediaId),
type = Value(type);
static Insertable<MediaFile> custom({ static Insertable<MediaFile> custom({
Expression<String>? mediaId, Expression<String>? mediaId,
Expression<String>? type, Expression<String>? type,
@ -2212,9 +2214,7 @@ class $MessagesTable extends Messages with TableInfo<$MessagesTable, Message> {
@override @override
late final GeneratedColumn<String> messageId = GeneratedColumn<String>( late final GeneratedColumn<String> messageId = GeneratedColumn<String>(
'message_id', aliasedName, false, 'message_id', aliasedName, false,
type: DriftSqlType.string, type: DriftSqlType.string, requiredDuringInsert: true);
requiredDuringInsert: false,
clientDefault: () => uuid.v7());
static const VerificationMeta _senderIdMeta = static const VerificationMeta _senderIdMeta =
const VerificationMeta('senderId'); const VerificationMeta('senderId');
@override @override
@ -2334,6 +2334,8 @@ class $MessagesTable extends Messages with TableInfo<$MessagesTable, Message> {
if (data.containsKey('message_id')) { if (data.containsKey('message_id')) {
context.handle(_messageIdMeta, context.handle(_messageIdMeta,
messageId.isAcceptableOrUnknown(data['message_id']!, _messageIdMeta)); messageId.isAcceptableOrUnknown(data['message_id']!, _messageIdMeta));
} else if (isInserting) {
context.missing(_messageIdMeta);
} }
if (data.containsKey('sender_id')) { if (data.containsKey('sender_id')) {
context.handle(_senderIdMeta, context.handle(_senderIdMeta,
@ -2714,7 +2716,7 @@ class MessagesCompanion extends UpdateCompanion<Message> {
}); });
MessagesCompanion.insert({ MessagesCompanion.insert({
required String groupId, required String groupId,
this.messageId = const Value.absent(), required String messageId,
this.senderId = const Value.absent(), this.senderId = const Value.absent(),
required MessageType type, required MessageType type,
this.content = const Value.absent(), this.content = const Value.absent(),
@ -2728,6 +2730,7 @@ class MessagesCompanion extends UpdateCompanion<Message> {
this.modifiedAt = const Value.absent(), this.modifiedAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : groupId = Value(groupId), }) : groupId = Value(groupId),
messageId = Value(messageId),
type = Value(type); type = Value(type);
static Insertable<Message> custom({ static Insertable<Message> custom({
Expression<String>? groupId, Expression<String>? groupId,
@ -3744,9 +3747,7 @@ class $ReceiptsTable extends Receipts with TableInfo<$ReceiptsTable, Receipt> {
@override @override
late final GeneratedColumn<String> receiptId = GeneratedColumn<String>( late final GeneratedColumn<String> receiptId = GeneratedColumn<String>(
'receipt_id', aliasedName, false, 'receipt_id', aliasedName, false,
type: DriftSqlType.string, type: DriftSqlType.string, requiredDuringInsert: true);
requiredDuringInsert: false,
clientDefault: () => uuid.v4());
static const VerificationMeta _contactIdMeta = static const VerificationMeta _contactIdMeta =
const VerificationMeta('contactId'); const VerificationMeta('contactId');
@override @override
@ -3834,6 +3835,8 @@ class $ReceiptsTable extends Receipts with TableInfo<$ReceiptsTable, Receipt> {
if (data.containsKey('receipt_id')) { if (data.containsKey('receipt_id')) {
context.handle(_receiptIdMeta, context.handle(_receiptIdMeta,
receiptId.isAcceptableOrUnknown(data['receipt_id']!, _receiptIdMeta)); receiptId.isAcceptableOrUnknown(data['receipt_id']!, _receiptIdMeta));
} else if (isInserting) {
context.missing(_receiptIdMeta);
} }
if (data.containsKey('contact_id')) { if (data.containsKey('contact_id')) {
context.handle(_contactIdMeta, context.handle(_contactIdMeta,
@ -4119,7 +4122,7 @@ class ReceiptsCompanion extends UpdateCompanion<Receipt> {
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
ReceiptsCompanion.insert({ ReceiptsCompanion.insert({
this.receiptId = const Value.absent(), required String receiptId,
required int contactId, required int contactId,
this.messageId = const Value.absent(), this.messageId = const Value.absent(),
required Uint8List message, required Uint8List message,
@ -4129,7 +4132,8 @@ class ReceiptsCompanion extends UpdateCompanion<Receipt> {
this.lastRetry = const Value.absent(), this.lastRetry = const Value.absent(),
this.createdAt = const Value.absent(), this.createdAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : contactId = Value(contactId), }) : receiptId = Value(receiptId),
contactId = Value(contactId),
message = Value(message); message = Value(message);
static Insertable<Receipt> custom({ static Insertable<Receipt> custom({
Expression<String>? receiptId, Expression<String>? receiptId,
@ -6992,7 +6996,7 @@ typedef $$ContactsTableProcessedTableManager = ProcessedTableManager<
bool signalContactPreKeysRefs, bool signalContactPreKeysRefs,
bool signalContactSignedPreKeysRefs})>; bool signalContactSignedPreKeysRefs})>;
typedef $$GroupsTableCreateCompanionBuilder = GroupsCompanion Function({ typedef $$GroupsTableCreateCompanionBuilder = GroupsCompanion Function({
Value<String> groupId, required String groupId,
required bool isGroupAdmin, required bool isGroupAdmin,
required bool isDirectChat, required bool isDirectChat,
Value<bool> pinned, Value<bool> pinned,
@ -7346,7 +7350,7 @@ class $$GroupsTableTableManager extends RootTableManager<
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: ({ createCompanionCallback: ({
Value<String> groupId = const Value.absent(), required String groupId,
required bool isGroupAdmin, required bool isGroupAdmin,
required bool isDirectChat, required bool isDirectChat,
Value<bool> pinned = const Value.absent(), Value<bool> pinned = const Value.absent(),
@ -7425,7 +7429,7 @@ typedef $$GroupsTableProcessedTableManager = ProcessedTableManager<
Group, Group,
PrefetchHooks Function({bool messagesRefs})>; PrefetchHooks Function({bool messagesRefs})>;
typedef $$MediaFilesTableCreateCompanionBuilder = MediaFilesCompanion Function({ typedef $$MediaFilesTableCreateCompanionBuilder = MediaFilesCompanion Function({
Value<String> mediaId, required String mediaId,
required MediaType type, required MediaType type,
Value<UploadState?> uploadState, Value<UploadState?> uploadState,
Value<DownloadState?> downloadState, Value<DownloadState?> downloadState,
@ -7758,7 +7762,7 @@ class $$MediaFilesTableTableManager extends RootTableManager<
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: ({ createCompanionCallback: ({
Value<String> mediaId = const Value.absent(), required String mediaId,
required MediaType type, required MediaType type,
Value<UploadState?> uploadState = const Value.absent(), Value<UploadState?> uploadState = const Value.absent(),
Value<DownloadState?> downloadState = const Value.absent(), Value<DownloadState?> downloadState = const Value.absent(),
@ -7838,7 +7842,7 @@ typedef $$MediaFilesTableProcessedTableManager = ProcessedTableManager<
PrefetchHooks Function({bool messagesRefs})>; PrefetchHooks Function({bool messagesRefs})>;
typedef $$MessagesTableCreateCompanionBuilder = MessagesCompanion Function({ typedef $$MessagesTableCreateCompanionBuilder = MessagesCompanion Function({
required String groupId, required String groupId,
Value<String> messageId, required String messageId,
Value<int?> senderId, Value<int?> senderId,
required MessageType type, required MessageType type,
Value<String?> content, Value<String?> content,
@ -8587,7 +8591,7 @@ class $$MessagesTableTableManager extends RootTableManager<
), ),
createCompanionCallback: ({ createCompanionCallback: ({
required String groupId, required String groupId,
Value<String> messageId = const Value.absent(), required String messageId,
Value<int?> senderId = const Value.absent(), Value<int?> senderId = const Value.absent(),
required MessageType type, required MessageType type,
Value<String?> content = const Value.absent(), Value<String?> content = const Value.absent(),
@ -9647,7 +9651,7 @@ typedef $$GroupMembersTableProcessedTableManager = ProcessedTableManager<
GroupMember, GroupMember,
PrefetchHooks Function({bool contactId})>; PrefetchHooks Function({bool contactId})>;
typedef $$ReceiptsTableCreateCompanionBuilder = ReceiptsCompanion Function({ typedef $$ReceiptsTableCreateCompanionBuilder = ReceiptsCompanion Function({
Value<String> receiptId, required String receiptId,
required int contactId, required int contactId,
Value<String?> messageId, Value<String?> messageId,
required Uint8List message, required Uint8List message,
@ -9969,7 +9973,7 @@ class $$ReceiptsTableTableManager extends RootTableManager<
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: ({ createCompanionCallback: ({
Value<String> receiptId = const Value.absent(), required String receiptId,
required int contactId, required int contactId,
Value<String?> messageId = const Value.absent(), Value<String?> messageId = const Value.absent(),
required Uint8List message, required Uint8List message,

View file

@ -9,16 +9,12 @@ class UserData {
required this.username, required this.username,
required this.displayName, required this.displayName,
required this.subscriptionPlan, required this.subscriptionPlan,
required this.isDemoUser,
}); });
factory UserData.fromJson(Map<String, dynamic> json) => factory UserData.fromJson(Map<String, dynamic> json) =>
_$UserDataFromJson(json); _$UserDataFromJson(json);
final int userId; final int userId;
@JsonKey(defaultValue: false)
bool isDemoUser = false;
// -- USER PROFILE -- // -- USER PROFILE --
String username; String username;

View file

@ -11,7 +11,6 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) => UserData(
username: json['username'] as String, username: json['username'] as String,
displayName: json['displayName'] as String, displayName: json['displayName'] as String,
subscriptionPlan: json['subscriptionPlan'] as String? ?? 'Free', subscriptionPlan: json['subscriptionPlan'] as String? ?? 'Free',
isDemoUser: json['isDemoUser'] as bool? ?? false,
) )
..avatarSvg = json['avatarSvg'] as String? ..avatarSvg = json['avatarSvg'] as String?
..avatarJson = json['avatarJson'] as String? ..avatarJson = json['avatarJson'] as String?
@ -74,7 +73,6 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) => UserData(
Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
'userId': instance.userId, 'userId': instance.userId,
'isDemoUser': instance.isDemoUser,
'username': instance.username, 'username': instance.username,
'displayName': instance.displayName, 'displayName': instance.displayName,
'avatarSvg': instance.avatarSvg, 'avatarSvg': instance.avatarSvg,

View file

@ -157,7 +157,7 @@ class ApiService {
reconnectionTimer?.cancel(); reconnectionTimer?.cancel();
reconnectionTimer = null; reconnectionTimer = null;
final user = await getUser(); final user = await getUser();
if (user != null && user.isDemoUser) { if (user != null) {
globalCallbackConnectionState(isConnected: true); globalCallbackConnectionState(isConnected: true);
return false; return false;
} }

View file

@ -23,7 +23,7 @@ import 'package:twonly/src/views/settings/backup/backup.view.dart';
Future<void> performTwonlySafeBackup({bool force = false}) async { Future<void> performTwonlySafeBackup({bool force = false}) async {
final user = await getUser(); final user = await getUser();
if (user == null || user.twonlySafeBackup == null || user.isDemoUser) { if (user == null || user.twonlySafeBackup == null) {
return; return;
} }

View file

@ -84,7 +84,6 @@ class _RegisterViewState extends State<RegisterView> {
username: username, username: username,
displayName: username, displayName: username,
subscriptionPlan: 'Preview', subscriptionPlan: 'Preview',
isDemoUser: false,
); );
await const FlutterSecureStorage() await const FlutterSecureStorage()

View file

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class DatabaseMigrationView extends StatefulWidget {
const DatabaseMigrationView({super.key});
@override
State<DatabaseMigrationView> createState() => _DatabaseMigrationViewState();
}
class _DatabaseMigrationViewState extends State<DatabaseMigrationView> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View file

@ -101,18 +101,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: build_daemon name: build_daemon
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" sha256: "409002f1adeea601018715d613115cfaf0e31f512cb80ae4534c79867ae2363d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.4" version: "4.1.0"
build_runner: build_runner:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1" sha256: a9461b8e586bf018dd4afd2e13b49b08c6a844a4b226c8d1d10f3a723cdd78c3
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.9.0" version: "2.10.1"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
@ -157,10 +157,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: camera name: camera
sha256: d6ec2cbdbe2fa8f5e0d07d8c06368fe4effa985a4a5ddade9cc58a8cd849557d sha256: "87a27e0553e3432119c1c2f6e4b9a1bbf7d2c660552b910bfa59185a9facd632"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.11.2" version: "0.11.2+1"
camera_android_camerax: camera_android_camerax:
dependency: "direct overridden" dependency: "direct overridden"
description: description:
@ -174,10 +174,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: camera_avfoundation name: camera_avfoundation
sha256: "397f44f8a63c8c0a474668d500f9739d4f2bc45ac2b21801194b7d29260f03ee" sha256: "34bcd5db30e52414f1f0783c5e3f566909fab14141a21b3b576c78bd35382bf6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.9.22+1" version: "0.9.22+4"
camera_platform_interface: camera_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -334,10 +334,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info_plus name: device_info_plus
sha256: "49413c8ca514dea7633e8def233b25efdf83ec8522955cc2c0e3ad802927e7c6" sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "12.1.0" version: "12.2.0"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -358,18 +358,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: drift name: drift
sha256: "540cf382a3bfa99b76e51514db5b0ebcd81ce3679b7c1c9cb9478ff3735e47a1" sha256: "83290a32ae006a7535c5ecf300722cb77177250d9df4ee2becc5fa8a36095114"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.28.2" version: "2.29.0"
drift_dev: drift_dev:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: drift_dev name: drift_dev
sha256: "4db0eeedc7e8bed117a9f22d867ab7a3a294300fed5c269aac90d0b3545967ca" sha256: "6019f827544e77524ffd5134ae0cb75dfd92ef5ef3e269872af92840c929cd43"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.28.3" version: "2.29.0"
drift_flutter: drift_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@ -422,10 +422,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: file_selector_macos name: file_selector_macos
sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.9.4+4" version: "0.9.4+5"
file_selector_platform_interface: file_selector_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -738,10 +738,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: font_awesome_flutter name: font_awesome_flutter
sha256: "27af5982e6c510dec1ba038eff634fa284676ee84e3fd807225c80c4ad869177" sha256: b9011df3a1fa02993630b8fb83526368cf2206a711259830325bab2f1d2a4eb0
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.10.0" version: "10.12.0"
gal: gal:
dependency: "direct main" dependency: "direct main"
description: description:
@ -866,10 +866,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image_picker_ios name: image_picker_ios
sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.13" version: "0.8.13+1"
image_picker_linux: image_picker_linux:
dependency: transitive dependency: transitive
description: description:
@ -882,18 +882,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image_picker_macos name: image_picker_macos
sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.2" version: "0.2.2+1"
image_picker_platform_interface: image_picker_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: image_picker_platform_interface name: image_picker_platform_interface
sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.11.0" version: "2.11.1"
image_picker_windows: image_picker_windows:
dependency: transitive dependency: transitive
description: description:
@ -1186,10 +1186,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_foundation name: path_provider_foundation
sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.2" version: "2.4.3"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
@ -1403,10 +1403,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: share_plus name: share_plus
sha256: "3424e9d5c22fd7f7590254ba09465febd6f8827c8b19a44350de4ac31d92d3a6" sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "12.0.0" version: "12.0.1"
share_plus_platform_interface: share_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1435,10 +1435,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_foundation name: shared_preferences_foundation
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" sha256: "1c33a907142607c40a7542768ec9badfd16293bac51da3a4482623d15845f88b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.4" version: "2.5.5"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
@ -1584,10 +1584,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sqlparser name: sqlparser
sha256: "57090342af1ce32bb499aa641f4ecdd2d6231b9403cea537ac059e803cc20d67" sha256: "54eea43e36dd3769274c3108625f9ea1a382f8d2ac8b16f3e4589d9bd9b0e16c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.41.2" version: "0.42.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1688,10 +1688,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_ios name: url_launcher_ios
sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 sha256: "6b63f1441e4f653ae799166a72b50b1767321ecc263a57aadf825a7a2a5477d9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.4" version: "6.3.5"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
@ -1704,10 +1704,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f sha256: "8262208506252a3ed4ff5c0dc1e973d2c0e0ef337d0a074d35634da5d44397c9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.3" version: "3.2.4"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1808,10 +1808,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: video_player_avfoundation name: video_player_avfoundation
sha256: f9a780aac57802b2892f93787e5ea53b5f43cc57dc107bee9436458365be71cd sha256: "19ed1162a7a5520e7d7791e0b7b73ba03161b6a69428b82e4689e435b325432d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.8.4" version: "2.8.5"
video_player_platform_interface: video_player_platform_interface:
dependency: transitive dependency: transitive
description: description: