From 6c7d42c31a88d08a0cb18f915cbf2da56eaddae0 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 30 Jun 2025 23:55:44 +0800 Subject: [PATCH] :bug: Bug fixes --- lib/route.dart | 4 +- lib/screens/posts/compose.dart | 2 +- lib/screens/posts/compose_article.dart | 2 +- .../posts/{detail.dart => post_detail.dart} | 48 +++++++++++++++---- .../{detail.g.dart => post_detail.g.dart} | 2 +- .../realm/{detail.dart => realm_detail.dart} | 2 +- .../{detail.g.dart => realm_detail.g.dart} | 2 +- .../content/cloud_file_collection.dart | 47 +++++++++++++++++- 8 files changed, 93 insertions(+), 16 deletions(-) rename lib/screens/posts/{detail.dart => post_detail.dart} (65%) rename lib/screens/posts/{detail.g.dart => post_detail.g.dart} (99%) rename lib/screens/realm/{detail.dart => realm_detail.dart} (99%) rename lib/screens/realm/{detail.g.dart => realm_detail.g.dart} (99%) diff --git a/lib/route.dart b/lib/route.dart index 305a579..d50d0b7 100644 --- a/lib/route.dart +++ b/lib/route.dart @@ -29,13 +29,13 @@ import 'package:island/screens/creators/publishers.dart'; import 'package:island/screens/creators/webfeed/webfeed_list.dart'; import 'package:island/screens/creators/webfeed/webfeed_edit.dart'; import 'package:island/screens/posts/compose.dart'; -import 'package:island/screens/posts/detail.dart'; +import 'package:island/screens/posts/post_detail.dart'; import 'package:island/screens/posts/pub_profile.dart'; import 'package:island/screens/auth/login.dart'; import 'package:island/screens/auth/create_account.dart'; import 'package:island/screens/settings.dart'; import 'package:island/screens/realm/realms.dart'; -import 'package:island/screens/realm/detail.dart'; +import 'package:island/screens/realm/realm_detail.dart'; import 'package:island/screens/account/event_calendar.dart'; import 'package:island/screens/discovery/realms.dart'; diff --git a/lib/screens/posts/compose.dart b/lib/screens/posts/compose.dart index 4fde655..e3dd042 100644 --- a/lib/screens/posts/compose.dart +++ b/lib/screens/posts/compose.dart @@ -15,7 +15,7 @@ import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/post/compose_shared.dart'; import 'package:island/widgets/post/post_item.dart'; import 'package:island/widgets/post/publishers_modal.dart'; -import 'package:island/screens/posts/detail.dart'; +import 'package:island/screens/posts/post_detail.dart'; import 'package:island/widgets/post/compose_settings_sheet.dart'; import 'package:island/services/compose_storage_db.dart'; import 'package:island/widgets/post/draft_manager.dart'; diff --git a/lib/screens/posts/compose_article.dart b/lib/screens/posts/compose_article.dart index bbc199d..476e8f2 100644 --- a/lib/screens/posts/compose_article.dart +++ b/lib/screens/posts/compose_article.dart @@ -12,7 +12,7 @@ import 'package:island/models/post.dart'; import 'package:island/screens/creators/publishers.dart'; import 'package:island/services/responsive.dart'; import 'package:island/widgets/app_scaffold.dart'; -import 'package:island/screens/posts/detail.dart'; +import 'package:island/screens/posts/post_detail.dart'; import 'package:island/widgets/content/attachment_preview.dart'; import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/markdown.dart'; diff --git a/lib/screens/posts/detail.dart b/lib/screens/posts/post_detail.dart similarity index 65% rename from lib/screens/posts/detail.dart rename to lib/screens/posts/post_detail.dart index af51bee..ed769d8 100644 --- a/lib/screens/posts/detail.dart +++ b/lib/screens/posts/post_detail.dart @@ -9,10 +9,11 @@ import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/post/post_item.dart'; import 'package:island/widgets/post/post_quick_reply.dart'; import 'package:island/widgets/post/post_replies.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:styled_widget/styled_widget.dart'; -part 'detail.g.dart'; +part 'post_detail.g.dart'; @riverpod Future post(Ref ref, String id) async { @@ -21,20 +22,43 @@ Future post(Ref ref, String id) async { return SnPost.fromJson(resp.data); } +final postStateProvider = StateNotifierProvider.family, String>( + (ref, id) => PostState(ref, id), +); + +class PostState extends StateNotifier> { + final Ref _ref; + final String _id; + + PostState(this._ref, this._id) : super(const AsyncValue.loading()) { + // Initialize with the initial post data + _ref.listen>( + postProvider(_id), + (_, next) => state = next, + ); + } + + void updatePost(SnPost? newPost) { + if (newPost != null) { + state = AsyncData(newPost); + } + } +} + class PostDetailScreen extends HookConsumerWidget { final String id; const PostDetailScreen({super.key, required this.id}); @override Widget build(BuildContext context, WidgetRef ref) { - final post = ref.watch(postProvider(id)); + final postState = ref.watch(postStateProvider(id)); final user = ref.watch(userInfoProvider); final isWide = isWideScreen(context); return AppScaffold( appBar: AppBar(title: const Text('Post')), - body: post.when( + body: postState.when( data: (post) { return Stack( fit: StackFit.expand, @@ -49,6 +73,10 @@ class PostDetailScreen extends HookConsumerWidget { isOpenable: false, isFullPost: true, backgroundColor: isWide ? Colors.transparent : null, + onUpdate: (newItem) { + // Update the local state with the new post data + ref.read(postStateProvider(id).notifier).updatePost(newItem); + }, ), const Divider(height: 1), ], @@ -65,11 +93,15 @@ class PostDetailScreen extends HookConsumerWidget { right: 0, child: Material( elevation: 2, - child: PostQuickReply( - parent: post, - onPosted: () { - ref.invalidate(postRepliesNotifierProvider(id)); - }, + child: postState.when( + data: (post) => PostQuickReply( + parent: post!, + onPosted: () { + ref.invalidate(postRepliesNotifierProvider(id)); + }, + ), + loading: () => const SizedBox.shrink(), + error: (_, __) => const SizedBox.shrink(), ).padding( bottom: MediaQuery.of(context).padding.bottom + 16, top: 16, diff --git a/lib/screens/posts/detail.g.dart b/lib/screens/posts/post_detail.g.dart similarity index 99% rename from lib/screens/posts/detail.g.dart rename to lib/screens/posts/post_detail.g.dart index d196b89..00b4176 100644 --- a/lib/screens/posts/detail.g.dart +++ b/lib/screens/posts/post_detail.g.dart @@ -1,6 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'detail.dart'; +part of 'post_detail.dart'; // ************************************************************************** // RiverpodGenerator diff --git a/lib/screens/realm/detail.dart b/lib/screens/realm/realm_detail.dart similarity index 99% rename from lib/screens/realm/detail.dart rename to lib/screens/realm/realm_detail.dart index 78718c4..948c4db 100644 --- a/lib/screens/realm/detail.dart +++ b/lib/screens/realm/realm_detail.dart @@ -22,7 +22,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; import 'package:styled_widget/styled_widget.dart'; -part 'detail.g.dart'; +part 'realm_detail.g.dart'; @riverpod Future realmAppbarForegroundColor(Ref ref, String realmSlug) async { diff --git a/lib/screens/realm/detail.g.dart b/lib/screens/realm/realm_detail.g.dart similarity index 99% rename from lib/screens/realm/detail.g.dart rename to lib/screens/realm/realm_detail.g.dart index 754e997..0b231a0 100644 --- a/lib/screens/realm/detail.g.dart +++ b/lib/screens/realm/realm_detail.g.dart @@ -1,6 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'detail.dart'; +part of 'realm_detail.dart'; // ************************************************************************** // RiverpodGenerator diff --git a/lib/widgets/content/cloud_file_collection.dart b/lib/widgets/content/cloud_file_collection.dart index 7f14a90..68d6922 100644 --- a/lib/widgets/content/cloud_file_collection.dart +++ b/lib/widgets/content/cloud_file_collection.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:math' as math; import 'dart:ui'; @@ -13,6 +14,7 @@ import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/cloud_files.dart'; +import 'package:island/widgets/content/sheet.dart'; import 'package:path/path.dart' show extension; import 'package:path_provider/path_provider.dart'; import 'package:photo_view/photo_view.dart'; @@ -210,6 +212,35 @@ class CloudFileZoomIn extends HookConsumerWidget { } } + void showInfoSheet() { + final exifData = item.fileMeta?['exif'] ?? {}; + showModalBottomSheet( + useRootNavigator: true, + context: context, + builder: + (context) => SheetScaffold( + titleText: 'File Info', + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Name: ${item.name}'), + Text('Size: ${item.size} bytes'), + Text('Type: ${item.mimeType ?? 'Unknown'}'), + if (exifData.isNotEmpty) ...[ + const Gap(16), + Text('EXIF Data:'), + const Gap(8), + for (var entry in exifData.entries) + Text('${entry.key}: ${entry.value}'), + ], + ], + ), + ), + ), + ); + } + return DismissiblePage( isFullScreen: true, backgroundColor: Colors.transparent, @@ -288,8 +319,22 @@ class CloudFileZoomIn extends HookConsumerWidget { left: 16, right: 16, child: Row( - mainAxisAlignment: MainAxisAlignment.end, children: [ + IconButton( + icon: Icon( + Icons.info_outline, + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black54, + blurRadius: 5.0, + offset: Offset(1.0, 1.0), + ), + ], + ), + onPressed: showInfoSheet, + ), + Spacer(), IconButton( icon: Icon(Icons.remove, color: Colors.white), onPressed: () {