Publisher page category filter

This commit is contained in:
2025-08-06 20:17:07 +08:00
parent 4c6fea1242
commit 56543d7b4c
3 changed files with 62 additions and 15 deletions

View File

@@ -87,6 +87,12 @@ class PublisherProfileScreen extends HookConsumerWidget {
publisherAppbarForcegroundColorProvider(name), publisherAppbarForcegroundColorProvider(name),
); );
final categoryTabController = useTabController(initialLength: 3);
final categoryTab = useState(0);
categoryTabController.addListener(() {
categoryTab.value = categoryTabController.index;
});
final subscribing = useState(false); final subscribing = useState(false);
Future<void> subscribe() async { Future<void> subscribe() async {
@@ -268,6 +274,16 @@ class PublisherProfileScreen extends HookConsumerWidget {
).padding(horizontal: 20, vertical: 16), ).padding(horizontal: 20, vertical: 16),
); );
Widget publisherCategoryTabWidget() => Card(
margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: TabBar(
controller: categoryTabController,
dividerColor: Colors.transparent,
splashBorderRadius: const BorderRadius.all(Radius.circular(8)),
tabs: [Tab(text: 'All'), Tab(text: 'Posts'), Tab(text: 'Articles')],
),
);
return publisher.when( return publisher.when(
data: data:
(data) => AppScaffold( (data) => AppScaffold(
@@ -398,7 +414,16 @@ class PublisherProfileScreen extends HookConsumerWidget {
child: publisherVerificationWidget(data), child: publisherVerificationWidget(data),
), ),
SliverToBoxAdapter(child: publisherBioWidget(data)), SliverToBoxAdapter(child: publisherBioWidget(data)),
SliverPostList(pubName: name), SliverToBoxAdapter(child: publisherCategoryTabWidget()),
SliverPostList(
key: ValueKey(categoryTab.value),
pubName: name,
type: switch (categoryTab.value) {
1 => 0,
2 => 1,
_ => null,
},
),
SliverGap(MediaQuery.of(context).padding.bottom + 16), SliverGap(MediaQuery.of(context).padding.bottom + 16),
], ],
), ),

View File

@@ -15,7 +15,7 @@ class PostListNotifier extends _$PostListNotifier
static const int _pageSize = 20; static const int _pageSize = 20;
@override @override
Future<CursorPagingData<SnPost>> build(String? pubName) { Future<CursorPagingData<SnPost>> build(String? pubName, int? type) {
return fetch(cursor: null); return fetch(cursor: null);
} }
@@ -28,6 +28,7 @@ class PostListNotifier extends _$PostListNotifier
'offset': offset, 'offset': offset,
'take': _pageSize, 'take': _pageSize,
if (pubName != null) 'pub': pubName, if (pubName != null) 'pub': pubName,
if (type != null) 'type': type,
}; };
final response = await client.get( final response = await client.get(
@@ -60,6 +61,7 @@ enum PostItemType {
class SliverPostList extends HookConsumerWidget { class SliverPostList extends HookConsumerWidget {
final String? pubName; final String? pubName;
final int? type;
final PostItemType itemType; final PostItemType itemType;
final Color? backgroundColor; final Color? backgroundColor;
final EdgeInsets? padding; final EdgeInsets? padding;
@@ -70,6 +72,7 @@ class SliverPostList extends HookConsumerWidget {
const SliverPostList({ const SliverPostList({
super.key, super.key,
this.pubName, this.pubName,
this.type,
this.itemType = PostItemType.regular, this.itemType = PostItemType.regular,
this.backgroundColor, this.backgroundColor,
this.padding, this.padding,
@@ -81,9 +84,9 @@ class SliverPostList extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return PagingHelperSliverView( return PagingHelperSliverView(
provider: postListNotifierProvider(pubName), provider: postListNotifierProvider(pubName, type),
futureRefreshable: postListNotifierProvider(pubName).future, futureRefreshable: postListNotifierProvider(pubName, type).future,
notifierRefreshable: postListNotifierProvider(pubName).notifier, notifierRefreshable: postListNotifierProvider(pubName, type).notifier,
contentBuilder: contentBuilder:
(data, widgetCount, endItemView) => SliverList.builder( (data, widgetCount, endItemView) => SliverList.builder(
itemCount: widgetCount, itemCount: widgetCount,

View File

@@ -6,7 +6,7 @@ part of 'post_list.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$postListNotifierHash() => r'2e4fb36123d3f97ac1edf9945043251d4eb519a2'; String _$postListNotifierHash() => r'c7c82c8cedf6649ac0806bbbfea148dfa1422fc0';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {
@@ -32,8 +32,9 @@ class _SystemHash {
abstract class _$PostListNotifier abstract class _$PostListNotifier
extends BuildlessAutoDisposeAsyncNotifier<CursorPagingData<SnPost>> { extends BuildlessAutoDisposeAsyncNotifier<CursorPagingData<SnPost>> {
late final String? pubName; late final String? pubName;
late final int? type;
FutureOr<CursorPagingData<SnPost>> build(String? pubName); FutureOr<CursorPagingData<SnPost>> build(String? pubName, int? type);
} }
/// See also [PostListNotifier]. /// See also [PostListNotifier].
@@ -47,15 +48,15 @@ class PostListNotifierFamily
const PostListNotifierFamily(); const PostListNotifierFamily();
/// See also [PostListNotifier]. /// See also [PostListNotifier].
PostListNotifierProvider call(String? pubName) { PostListNotifierProvider call(String? pubName, int? type) {
return PostListNotifierProvider(pubName); return PostListNotifierProvider(pubName, type);
} }
@override @override
PostListNotifierProvider getProviderOverride( PostListNotifierProvider getProviderOverride(
covariant PostListNotifierProvider provider, covariant PostListNotifierProvider provider,
) { ) {
return call(provider.pubName); return call(provider.pubName, provider.type);
} }
static const Iterable<ProviderOrFamily>? _dependencies = null; static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -81,9 +82,12 @@ class PostListNotifierProvider
CursorPagingData<SnPost> CursorPagingData<SnPost>
> { > {
/// See also [PostListNotifier]. /// See also [PostListNotifier].
PostListNotifierProvider(String? pubName) PostListNotifierProvider(String? pubName, int? type)
: this._internal( : this._internal(
() => PostListNotifier()..pubName = pubName, () =>
PostListNotifier()
..pubName = pubName
..type = type,
from: postListNotifierProvider, from: postListNotifierProvider,
name: r'postListNotifierProvider', name: r'postListNotifierProvider',
debugGetCreateSourceHash: debugGetCreateSourceHash:
@@ -94,6 +98,7 @@ class PostListNotifierProvider
allTransitiveDependencies: allTransitiveDependencies:
PostListNotifierFamily._allTransitiveDependencies, PostListNotifierFamily._allTransitiveDependencies,
pubName: pubName, pubName: pubName,
type: type,
); );
PostListNotifierProvider._internal( PostListNotifierProvider._internal(
@@ -104,15 +109,17 @@ class PostListNotifierProvider
required super.debugGetCreateSourceHash, required super.debugGetCreateSourceHash,
required super.from, required super.from,
required this.pubName, required this.pubName,
required this.type,
}) : super.internal(); }) : super.internal();
final String? pubName; final String? pubName;
final int? type;
@override @override
FutureOr<CursorPagingData<SnPost>> runNotifierBuild( FutureOr<CursorPagingData<SnPost>> runNotifierBuild(
covariant PostListNotifier notifier, covariant PostListNotifier notifier,
) { ) {
return notifier.build(pubName); return notifier.build(pubName, type);
} }
@override @override
@@ -120,13 +127,17 @@ class PostListNotifierProvider
return ProviderOverride( return ProviderOverride(
origin: this, origin: this,
override: PostListNotifierProvider._internal( override: PostListNotifierProvider._internal(
() => create()..pubName = pubName, () =>
create()
..pubName = pubName
..type = type,
from: from, from: from,
name: null, name: null,
dependencies: null, dependencies: null,
allTransitiveDependencies: null, allTransitiveDependencies: null,
debugGetCreateSourceHash: null, debugGetCreateSourceHash: null,
pubName: pubName, pubName: pubName,
type: type,
), ),
); );
} }
@@ -142,13 +153,16 @@ class PostListNotifierProvider
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return other is PostListNotifierProvider && other.pubName == pubName; return other is PostListNotifierProvider &&
other.pubName == pubName &&
other.type == type;
} }
@override @override
int get hashCode { int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode); var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, pubName.hashCode); hash = _SystemHash.combine(hash, pubName.hashCode);
hash = _SystemHash.combine(hash, type.hashCode);
return _SystemHash.finish(hash); return _SystemHash.finish(hash);
} }
@@ -160,6 +174,9 @@ mixin PostListNotifierRef
on AutoDisposeAsyncNotifierProviderRef<CursorPagingData<SnPost>> { on AutoDisposeAsyncNotifierProviderRef<CursorPagingData<SnPost>> {
/// The parameter `pubName` of this provider. /// The parameter `pubName` of this provider.
String? get pubName; String? get pubName;
/// The parameter `type` of this provider.
int? get type;
} }
class _PostListNotifierProviderElement class _PostListNotifierProviderElement
@@ -173,6 +190,8 @@ class _PostListNotifierProviderElement
@override @override
String? get pubName => (origin as PostListNotifierProvider).pubName; String? get pubName => (origin as PostListNotifierProvider).pubName;
@override
int? get type => (origin as PostListNotifierProvider).type;
} }
// ignore_for_file: type=lint // ignore_for_file: type=lint