Replies sheet is back

🗑️ The silver paging helper is merged, remove the one inside the own codebase
This commit is contained in:
2025-06-20 01:11:17 +08:00
parent 89fd80bcb8
commit 8d855867c1
12 changed files with 146 additions and 312 deletions

View File

@ -213,7 +213,7 @@ class ComposeLogic {
// Prepare API request
final client = ref.watch(apiClientProvider);
final isNewPost = originalPost == null;
final endpoint = isNewPost ? '/posts' : '/posts/${originalPost!.id}';
final endpoint = isNewPost ? '/posts' : '/posts/${originalPost.id}';
// Create request payload
final payload = {

View File

@ -19,6 +19,7 @@ import 'package:island/widgets/app_scaffold.dart';
import 'package:island/widgets/content/cloud_file_collection.dart';
import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/content/markdown.dart';
import 'package:island/widgets/post/post_replies_sheet.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:super_context_menu/super_context_menu.dart';
@ -235,18 +236,52 @@ class PostItem extends HookConsumerWidget {
),
],
),
PostReactionList(
parentId: item.id,
reactions: item.reactionsCount,
padding: EdgeInsets.only(left: 48),
onReact: (symbol, attitude, delta) {
final reactionsCount = Map<String, int>.from(
item.reactionsCount,
);
reactionsCount[symbol] =
(reactionsCount[symbol] ?? 0) + delta;
onUpdate?.call(item.copyWith(reactionsCount: reactionsCount));
},
Row(
children: [
// Replies count button
Padding(
padding: const EdgeInsets.only(left: 48, right: 12),
child: ActionChip(
avatar: Icon(Symbols.reply, size: 16),
label: Text(
(item.repliesCount > 0)
? 'repliesCount'.plural(item.repliesCount)
: 'reply'.tr(),
),
visualDensity: const VisualDensity(
horizontal: VisualDensity.minimumDensity,
vertical: VisualDensity.minimumDensity,
),
onPressed: () {
if (isOpenable) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) => PostRepliesSheet(post: item),
);
}
},
),
),
// Reactions list
Expanded(
child: PostReactionList(
parentId: item.id,
reactions: item.reactionsCount,
padding: EdgeInsets.zero,
onReact: (symbol, attitude, delta) {
final reactionsCount = Map<String, int>.from(
item.reactionsCount,
);
reactionsCount[symbol] =
(reactionsCount[symbol] ?? 0) + delta;
onUpdate?.call(
item.copyWith(reactionsCount: reactionsCount),
);
},
),
),
],
),
],
),

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post.dart';
import 'package:island/pods/network.dart';
import 'package:island/widgets/content/paging_helper_ext.dart';
import 'package:island/widgets/post/post_item.dart';
import 'package:island/widgets/post/post_item_creator.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

View File

@ -3,7 +3,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post.dart';
import 'package:island/pods/network.dart';
import 'package:island/services/responsive.dart';
import 'package:island/widgets/content/paging_helper_ext.dart';
import 'package:island/widgets/post/post_item.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:riverpod_paging_utils/riverpod_paging_utils.dart';
@ -57,7 +56,8 @@ class PostRepliesNotifier extends _$PostRepliesNotifier
class PostRepliesList extends HookConsumerWidget {
final String postId;
const PostRepliesList({super.key, required this.postId});
final Color? backgroundColor;
const PostRepliesList({super.key, required this.postId, this.backgroundColor});
@override
Widget build(BuildContext context, WidgetRef ref) {
@ -93,7 +93,7 @@ class PostRepliesList extends HookConsumerWidget {
children: [
PostItem(
item: data.items[index],
backgroundColor: isWide ? Colors.transparent : null,
backgroundColor: backgroundColor ?? (isWide ? Colors.transparent : null),
showReferencePost: false,
),
const Divider(height: 1),

View File

@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post.dart';
import 'package:island/widgets/content/sheet.dart';
import 'package:island/widgets/post/post_replies.dart';
import 'package:island/widgets/post/post_quick_reply.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:styled_widget/styled_widget.dart';
class PostRepliesSheet extends HookConsumerWidget {
final SnPost post;
const PostRepliesSheet({super.key, required this.post});
@override
Widget build(BuildContext context, WidgetRef ref) {
return SheetScaffold(
titleText: 'repliesCount'.plural(post.repliesCount),
child: Column(
children: [
// Replies list
Expanded(
child: CustomScrollView(
slivers: [PostRepliesList(
postId: post.id.toString(),
backgroundColor: Colors.transparent,
)],
),
),
// Quick reply section
Material(
elevation: 2,
child: PostQuickReply(
parent: post,
onPosted: () {
ref.invalidate(postRepliesNotifierProvider(post.id));
},
).padding(
bottom: MediaQuery.of(context).padding.bottom + 16,
top: 16,
horizontal: 16,
),
),
],
),
);
}
}