From bf4892b34d6cf0f452d02c529a68b075a5b5089d Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 24 Sep 2025 20:52:56 +0800 Subject: [PATCH] :bug: Fix bugs --- lib/database/drift_db.dart | 32 +++-- lib/models/file_pool.dart | 12 -- lib/pods/message.dart | 12 +- lib/screens/files/file_list.g.dart | 6 +- lib/screens/settings.dart | 16 ++- lib/widgets/account/account_pfc.dart | 1 + lib/widgets/chat/message_item.dart | 192 ++++++++++++++------------- setup.iss | 4 +- 8 files changed, 146 insertions(+), 129 deletions(-) diff --git a/lib/database/drift_db.dart b/lib/database/drift_db.dart index 2b4e57ea..63e14448 100644 --- a/lib/database/drift_db.dart +++ b/lib/database/drift_db.dart @@ -33,17 +33,27 @@ class AppDatabase extends _$AppDatabase { await _migrateToVersion6(m); } if (from < 7) { - // Add new columns from SnChatMessage - await m.addColumn(chatMessages, chatMessages.updatedAt); - await m.addColumn(chatMessages, chatMessages.deletedAt); - await m.addColumn(chatMessages, chatMessages.type); - await m.addColumn(chatMessages, chatMessages.meta); - await m.addColumn(chatMessages, chatMessages.membersMentioned); - await m.addColumn(chatMessages, chatMessages.editedAt); - await m.addColumn(chatMessages, chatMessages.attachments); - await m.addColumn(chatMessages, chatMessages.reactions); - await m.addColumn(chatMessages, chatMessages.repliedMessageId); - await m.addColumn(chatMessages, chatMessages.forwardedMessageId); + // Add new columns from SnChatMessage, ignore if they already exist + final columnsToAdd = [ + chatMessages.updatedAt, + chatMessages.deletedAt, + chatMessages.type, + chatMessages.meta, + chatMessages.membersMentioned, + chatMessages.editedAt, + chatMessages.attachments, + chatMessages.reactions, + chatMessages.repliedMessageId, + chatMessages.forwardedMessageId, + ]; + + for (final column in columnsToAdd) { + try { + await m.addColumn(chatMessages, column); + } catch (e) { + // Column already exists, skip + } + } } }, ); diff --git a/lib/models/file_pool.dart b/lib/models/file_pool.dart index 262535fd..13b39d0a 100644 --- a/lib/models/file_pool.dart +++ b/lib/models/file_pool.dart @@ -23,15 +23,3 @@ sealed class SnFilePool with _$SnFilePool { factory SnFilePool.fromJson(Map json) => _$SnFilePoolFromJson(json); } - -extension SnFilePoolList on List { - static List listFromResponse(dynamic data) { - if (data is List) { - return data - .whereType>() - .map(SnFilePool.fromJson) - .toList(); - } - throw ArgumentError('Unexpected response format: $data'); - } -} diff --git a/lib/pods/message.dart b/lib/pods/message.dart index 2f2019b6..6d2728b4 100644 --- a/lib/pods/message.dart +++ b/lib/pods/message.dart @@ -10,17 +10,19 @@ Future resetDatabase(WidgetRef ref) async { if (kIsWeb) return; final db = ref.read(databaseProvider); - final basepath = await getApplicationSupportDirectory(); - final file = File(join(basepath.path, 'solar_network_data.sqlite')); // Close current database connection - db.close(); + await db.close(); - // Delete database file + // Get the correct database file path + final dbFolder = await getApplicationDocumentsDirectory(); + final file = File(join(dbFolder.path, 'solar_network_data.sqlite')); + + // Delete database file if it exists if (await file.exists()) { await file.delete(); } - // Force refresh the database provider + // Force refresh the database provider to create a new instance ref.invalidate(databaseProvider); } diff --git a/lib/screens/files/file_list.g.dart b/lib/screens/files/file_list.g.dart index b500d44a..6275e7c8 100644 --- a/lib/screens/files/file_list.g.dart +++ b/lib/screens/files/file_list.g.dart @@ -6,7 +6,7 @@ part of 'file_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$billingUsageHash() => r'270ec8499378ee0c038aa44ad1c2e3ad9025740a'; +String _$billingUsageHash() => r'58d8bc774868d60781574c85d6b25869a79c57aa'; /// See also [billingUsage]. @ProviderFor(billingUsage) @@ -25,7 +25,7 @@ final billingUsageProvider = @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef BillingUsageRef = AutoDisposeFutureProviderRef?>; -String _$billingQuotaHash() => r'0696b500fa8bb1270641bcacf262be58caff9b38'; +String _$billingQuotaHash() => r'4ec5d728e439015800abb2d0d673b5a7329cc654'; /// See also [billingQuota]. @ProviderFor(billingQuota) @@ -45,7 +45,7 @@ final billingQuotaProvider = // ignore: unused_element typedef BillingQuotaRef = AutoDisposeFutureProviderRef?>; String _$cloudFileListNotifierHash() => - r'e2c8a076a9e635c7b43a87d00f78775427ba6334'; + r'22c45a8ea23147a3835ba870ad2f0bb833f853ea'; /// See also [CloudFileListNotifier]. @ProviderFor(CloudFileListNotifier) diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index bcf37fa6..45801f07 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -22,7 +22,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:island/pods/config.dart'; import 'package:island/pods/file_pool.dart'; -import 'package:island/models/file_pool.dart'; class SettingsScreen extends HookConsumerWidget { const SettingsScreen({super.key}); @@ -417,7 +416,7 @@ class SettingsScreen extends HookConsumerWidget { if (user.value != null) pools.when( data: (data) { - final validPools = data.filterValid(); + final validPools = data; final currentPoolId = resolveDefaultPoolId(ref, data); return ListTile( @@ -437,11 +436,14 @@ class SettingsScreen extends HookConsumerWidget { validPools.map((p) { return DropdownMenuItem( value: p.id, - child: Text( - p.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ).fontSize(14), + child: Tooltip( + message: p.name, + child: Text( + p.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ).fontSize(14), + ), ); }).toList(), value: currentPoolId, diff --git a/lib/widgets/account/account_pfc.dart b/lib/widgets/account/account_pfc.dart index 9053033c..59a6c5bc 100644 --- a/lib/widgets/account/account_pfc.dart +++ b/lib/widgets/account/account_pfc.dart @@ -147,6 +147,7 @@ class AccountProfileCard extends HookConsumerWidget { if (data.badges.isNotEmpty) BadgeList(badges: data.badges).padding(top: 12), LevelingProgressCard( + isCompact: true, level: data.profile.level, experience: data.profile.experience, progress: data.profile.levelingProgress, diff --git a/lib/widgets/chat/message_item.dart b/lib/widgets/chat/message_item.dart index c042925e..c9be4cfd 100644 --- a/lib/widgets/chat/message_item.dart +++ b/lib/widgets/chat/message_item.dart @@ -343,6 +343,10 @@ class MessageItemDisplayBubble extends HookConsumerWidget { isCurrentUser ? Theme.of(context).colorScheme.onPrimaryContainer : Theme.of(context).colorScheme.onSurfaceVariant; + final containerColor = + isCurrentUser + ? Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5) + : Theme.of(context).colorScheme.surfaceContainer; final hasBackground = ref.watch(backgroundImageFileProvider).valueOrNull != null; @@ -377,98 +381,108 @@ class MessageItemDisplayBubble extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.end, children: [ Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (remoteMessage.repliedMessageId != null) - MessageQuoteWidget( - message: message, - textColor: textColor, - isReply: true, - ).padding(vertical: 4), - if (remoteMessage.forwardedMessageId != null) - MessageQuoteWidget( - message: message, - textColor: textColor, - isReply: false, - ).padding(vertical: 4), - if (MessageContent.hasContent(remoteMessage)) - MessageContent( - item: remoteMessage, - translatedText: translatedText, - ), - if (remoteMessage.attachments.isNotEmpty) - LayoutBuilder( - builder: (context, constraints) { - return CloudFileList( - files: remoteMessage.attachments, - maxWidth: constraints.maxWidth, - padding: EdgeInsets.symmetric(vertical: 4), - ); - }, - ), - if (remoteMessage.meta['embeds'] != null) - ...((remoteMessage.meta['embeds'] as List) - .map((embed) => convertMapKeysToSnakeCase(embed)) - .where((embed) => embed['type'] == 'link') - .map((embed) => SnScrappedLink.fromJson(embed)) - .map( - (link) => LayoutBuilder( - builder: (context, constraints) { - return EmbedLinkWidget( - link: link, - maxWidth: math.min( - constraints.maxWidth, - 480, + child: Container( + decoration: BoxDecoration( + color: containerColor, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (remoteMessage.repliedMessageId != null) + MessageQuoteWidget( + message: message, + textColor: textColor, + isReply: true, + ).padding(vertical: 4), + if (remoteMessage.forwardedMessageId != null) + MessageQuoteWidget( + message: message, + textColor: textColor, + isReply: false, + ).padding(vertical: 4), + if (MessageContent.hasContent(remoteMessage)) + MessageContent( + item: remoteMessage, + translatedText: translatedText, + ), + if (remoteMessage.attachments.isNotEmpty) + LayoutBuilder( + builder: (context, constraints) { + return CloudFileList( + files: remoteMessage.attachments, + maxWidth: constraints.maxWidth, + padding: EdgeInsets.symmetric(vertical: 4), + ); + }, + ), + if (remoteMessage.meta['embeds'] != null) + ...((remoteMessage.meta['embeds'] as List) + .map((embed) => convertMapKeysToSnakeCase(embed)) + .where((embed) => embed['type'] == 'link') + .map((embed) => SnScrappedLink.fromJson(embed)) + .map( + (link) => LayoutBuilder( + builder: (context, constraints) { + return EmbedLinkWidget( + link: link, + maxWidth: math.min( + constraints.maxWidth, + 480, + ), + margin: const EdgeInsets.symmetric( + vertical: 4, + ), + ); + }, + ), + ) + .toList()), + if (progress != null && progress!.isNotEmpty) + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + spacing: 8, + children: [ + if ((remoteMessage.content?.isNotEmpty ?? false)) + const Gap(0), + for (var entry in progress!.entries) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'fileUploadingProgress'.tr( + args: [ + (entry.key + 1).toString(), + entry.value.toStringAsFixed(1), + ], + ), + style: TextStyle( + fontSize: 12, + color: textColor.withOpacity(0.8), + ), ), - margin: const EdgeInsets.symmetric( - vertical: 4, + const Gap(4), + LinearProgressIndicator( + value: entry.value / 100, + backgroundColor: + Theme.of( + context, + ).colorScheme.surfaceVariant, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.primary, + ), ), - ); - }, - ), - ) - .toList()), - if (progress != null && progress!.isNotEmpty) - Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - spacing: 8, - children: [ - if ((remoteMessage.content?.isNotEmpty ?? false)) + ], + ), const Gap(0), - for (var entry in progress!.entries) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'fileUploadingProgress'.tr( - args: [ - (entry.key + 1).toString(), - entry.value.toStringAsFixed(1), - ], - ), - style: TextStyle( - fontSize: 12, - color: textColor.withOpacity(0.8), - ), - ), - const Gap(4), - LinearProgressIndicator( - value: entry.value / 100, - backgroundColor: - Theme.of( - context, - ).colorScheme.surfaceVariant, - valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.primary, - ), - ), - ], - ), - const Gap(0), - ], - ), - ], + ], + ), + ], + ), ), ), MessageIndicators( diff --git a/setup.iss b/setup.iss index 9b210ab6..2510baf8 100644 --- a/setup.iss +++ b/setup.iss @@ -1,6 +1,6 @@ ; ================================================== #define AppVersion "3.2.0" -#define BuildNumber "132" +#define BuildNumber "134" ; ================================================== #define FullVersion AppVersion + "." + BuildNumber @@ -49,4 +49,4 @@ Filename: "{app}\Solian.exe"; Description: "Launch Solian"; Flags: nowait postin [UninstallDelete] Type: filesandordirs; Name: "{userappdata}\dev.solsynth\Solian" Type: files; Name: "{group}\Solian.lnk" ; -Type: files; Name: "{autodesktop}\Solian.lnk" ; \ No newline at end of file +Type: files; Name: "{autodesktop}\Solian.lnk" ;