Skip to content

Commit

Permalink
feat: add post count for gel (#292)
Browse files Browse the repository at this point in the history
  • Loading branch information
khoadng authored Jun 26, 2023
1 parent 61a8845 commit ed697a2
Show file tree
Hide file tree
Showing 21 changed files with 270 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// Project imports:
import 'package:boorusama/boorus/core/feats/boorus/boorus.dart';
import 'post_count_provider.dart';
import 'post_count_state.dart';
import 'posts_provider.dart';

String generatePostCountKey(List<String> tags) => tags.join('+');

Expand All @@ -22,6 +23,7 @@ class PostCountNotifier extends Notifier<PostCountState> {

@override
PostCountState build() {
ref.watch(currentBooruConfigProvider);
return PostCountState.initial();
}

Expand Down
28 changes: 28 additions & 0 deletions lib/boorus/core/feats/posts/count/post_count_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Package imports:
import 'package:flutter_riverpod/flutter_riverpod.dart';

// Project imports:
import 'package:boorusama/boorus/core/feats/boorus/boorus.dart';
import 'post_count_notifier.dart';
import 'post_count_repository.dart';
import 'post_count_state.dart';

final postCountRepoProvider = Provider<PostCountRepository>((ref) {
throw UnimplementedError();
});

final postCountStateProvider =
NotifierProvider<PostCountNotifier, PostCountState>(
PostCountNotifier.new,
dependencies: [
postCountRepoProvider,
currentBooruConfigProvider,
],
);

final postCountProvider = Provider<PostCountState>(
(ref) => ref.watch(postCountStateProvider),
dependencies: [
postCountStateProvider,
],
);
10 changes: 10 additions & 0 deletions lib/boorus/core/feats/posts/count/post_count_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
abstract class PostCountRepository {
Future<int?> count(List<String> tags);
}

class EmptyPostCountRepository implements PostCountRepository {
const EmptyPostCountRepository();

@override
Future<int?> count(List<String> tags) => Future<int?>.value(null);
}
6 changes: 6 additions & 0 deletions lib/boorus/core/feats/posts/posts.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
export 'count/post_count_notifier.dart';
export 'count/post_count_provider.dart';
export 'count/post_count_repository.dart';
export 'count/post_count_state.dart';
export 'details.dart';
export 'filter.dart';
export 'media_info_mixin.dart';
export 'post.dart';
export 'post_details_tag.dart';
export 'post_repository.dart';
export 'post_repository_cacher.dart';
export 'post_share_notifier.dart';
export 'providers.dart';
export 'rating.dart';
export 'recommend.dart';
export 'share_post_button.dart';
export 'sources/source.dart';
export 'sources/source_def.dart';
export 'sources/source_utils.dart';
export 'translatable_mixin.dart';
63 changes: 43 additions & 20 deletions lib/boorus/core/pages/search/generic_search_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -88,26 +88,9 @@ class _SearchPageState extends ConsumerState<GenericSearchPage> {
child: Builder(
builder: (context) => switch (displayState) {
DisplayState.options => widget.optionsPageBuilder?.call() ??
Scaffold(
floatingActionButton: const SearchButton(),
appBar: PreferredSize(
preferredSize: const Size.fromHeight(kToolbarHeight * 1.2),
child: SearchAppBar(
focusNode: focus,
queryEditingController: queryEditingController,
),
),
body: const SafeArea(
child: SingleChildScrollView(
child: Column(
children: [
SelectedTagListWithData(),
SearchDivider(),
SearchLandingView(),
],
),
),
),
DefaultSearchOptionsView(
focus: focus,
queryEditingController: queryEditingController,
),
DisplayState.suggestion => Scaffold(
appBar: PreferredSize(
Expand Down Expand Up @@ -140,3 +123,43 @@ class _SearchPageState extends ConsumerState<GenericSearchPage> {
);
}
}

class DefaultSearchOptionsView extends StatelessWidget {
const DefaultSearchOptionsView({
super.key,
required this.focus,
required this.queryEditingController,
this.onSearch,
});

final FocusNode focus;
final RichTextController queryEditingController;
final VoidCallback? onSearch;

@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: SearchButton(
onSearch: onSearch,
),
appBar: PreferredSize(
preferredSize: const Size.fromHeight(kToolbarHeight * 1.2),
child: SearchAppBar(
focusNode: focus,
queryEditingController: queryEditingController,
),
),
body: const SafeArea(
child: SingleChildScrollView(
child: Column(
children: [
SelectedTagListWithData(),
SearchDivider(),
SearchLandingView(),
],
),
),
),
);
}
}
70 changes: 70 additions & 0 deletions lib/boorus/core/widgets/result_header.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Flutter imports:
import 'package:flutter/material.dart';

// Package imports:
import 'package:flutter_riverpod/flutter_riverpod.dart';

// Project imports:
import 'package:boorusama/boorus/core/feats/posts/posts.dart';
import 'package:boorusama/functional.dart';
import 'package:boorusama/widgets/widgets.dart';

class ResultHeaderWithProvider extends ConsumerWidget {
const ResultHeaderWithProvider({
super.key,
required this.selectedTags,
});

final List<String> selectedTags;

@override
Widget build(BuildContext context, WidgetRef ref) {
final postCountState = ref.watch(postCountProvider);

if (postCountState.isLoading(selectedTags)) {
return const ResultHeader(count: 0, loading: true);
} else if (postCountState.isEmpty(selectedTags)) {
return const SizedBox.shrink();
} else {
return postCountState.getPostCount(selectedTags).toOption().fold(
() => const SizedBox.shrink(),
(count) => ResultHeader(
count: count,
loading: false,
),
);
}
}
}

class ResultHeader extends StatelessWidget {
const ResultHeader({
super.key,
required this.count,
required this.loading,
});

final int count;
final bool loading;

@override
Widget build(BuildContext context) {
return SizedBox(
height: 40,
child: Row(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 4,
),
child: ResultCounter(
count: count,
loading: loading,
),
),
],
),
);
}
}
3 changes: 3 additions & 0 deletions lib/boorus/danbooru/danbooru_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:boorusama/boorus/core/feats/boorus/boorus.dart';
import 'package:boorusama/boorus/core/feats/downloads/bulk_download_provider.dart';
import 'package:boorusama/boorus/core/feats/downloads/download_provider.dart';
import 'package:boorusama/boorus/core/feats/notes/notes.dart';
import 'package:boorusama/boorus/core/feats/posts/count/post_count_provider.dart';
import 'package:boorusama/boorus/core/feats/tags/tags_providers.dart';
import 'package:boorusama/boorus/core/provider.dart';
import 'package:boorusama/boorus/danbooru/feats/autocomplete/autocomplete.dart';
Expand Down Expand Up @@ -46,6 +47,8 @@ class DanbooruProvider extends ConsumerWidget {
.overrideWith((ref) => ref.watch(danbooruAutocompleteRepoProvider)),
noteRepoProvider
.overrideWith((ref) => ref.watch(danbooruNoteRepoProvider)),
postCountRepoProvider
.overrideWith((ref) => ref.watch(danbooruPostCountRepoProvider)),
],
child: Builder(builder: builder),
);
Expand Down
16 changes: 1 addition & 15 deletions lib/boorus/danbooru/feats/posts/app/posts_count_provider.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
part of 'posts_provider.dart';

final postCountRepoProvider = Provider<PostCountRepository>((ref) {
final danbooruPostCountRepoProvider = Provider<PostCountRepository>((ref) {
return PostCountRepositoryApi(
api: ref.watch(danbooruApiProvider),
//TODO: this is a hack to get around the fact that count endpoint includes all ratings
Expand All @@ -9,17 +9,3 @@ final postCountRepoProvider = Provider<PostCountRepository>((ref) {
: [],
);
});

final postCountStateProvider =
NotifierProvider<PostCountNotifier, PostCountState>(
PostCountNotifier.new,
dependencies: [
postCountRepoProvider,
],
);

final postCountProvider = Provider<PostCountState>((ref) {
return ref.watch(postCountStateProvider);
}, dependencies: [
postCountStateProvider,
]);
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Project imports:
import 'package:boorusama/api/danbooru/danbooru_api.dart';
import '../models/post_count_repository.dart';
import 'package:boorusama/boorus/core/feats/posts/posts.dart';

class PostCountRepositoryApi implements PostCountRepository {
const PostCountRepositoryApi({
Expand Down

This file was deleted.

3 changes: 0 additions & 3 deletions lib/boorus/danbooru/feats/posts/posts.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
export 'app/danbooru_favorite_group_post_mixin.dart';
export 'app/post_count_notifier.dart';
export 'app/post_count_state.dart';
export 'app/post_details_artist_notifier.dart';
export 'app/post_details_character_notifier.dart';
export 'app/post_details_children_notifier.dart';
Expand All @@ -26,7 +24,6 @@ export 'models/danbooru_post.dart';
export 'models/danbooru_post_repository.dart';
export 'models/explore_repository.dart';
export 'models/filter.dart';
export 'models/post_count_repository.dart';
export 'models/post_variant.dart';
export 'models/post_vote.dart';
export 'models/post_vote_repository.dart';
Expand Down
36 changes: 0 additions & 36 deletions lib/boorus/danbooru/pages/search/result/result_header.dart

This file was deleted.

17 changes: 2 additions & 15 deletions lib/boorus/danbooru/pages/search/result/result_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ import 'package:scroll_to_index/scroll_to_index.dart';

// Project imports:
import 'package:boorusama/boorus/core/feats/search/selected_tags_notifier.dart';
import 'package:boorusama/boorus/core/widgets/result_header.dart';
import 'package:boorusama/boorus/core/widgets/widgets.dart';
import 'package:boorusama/boorus/danbooru/feats/posts/posts.dart';
import 'package:boorusama/boorus/danbooru/widgets/widgets.dart';
import 'package:boorusama/functional.dart';
import 'related_tag_section.dart';
import 'result_header.dart';

class ResultView extends ConsumerStatefulWidget {
const ResultView({
Expand Down Expand Up @@ -47,7 +46,6 @@ class _ResultViewState extends ConsumerState<ResultView> {

@override
Widget build(BuildContext context) {
final postCountState = ref.watch(postCountProvider);
final selectedTags = ref.watch(selectedRawTagStringProvider);

return DanbooruPostScope(
Expand All @@ -65,18 +63,7 @@ class _ResultViewState extends ConsumerState<ResultView> {
SliverToBoxAdapter(
child: Row(
children: [
if (postCountState.isLoading(selectedTags))
const ResultHeader(count: 0, loading: true)
else if (postCountState.isEmpty(selectedTags))
const SizedBox.shrink()
else
postCountState.getPostCount(selectedTags).toOption().fold(
() => const SizedBox.shrink(),
(count) => ResultHeader(
count: count,
loading: false,
),
),
ResultHeaderWithProvider(selectedTags: selectedTags),
const Spacer(),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 8),
Expand Down
2 changes: 1 addition & 1 deletion lib/boorus/danbooru/pages/search/search_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:page_transition/page_transition.dart';
import 'package:rich_text_controller/rich_text_controller.dart';

// Project imports:
import 'package:boorusama/boorus/core/feats/posts/posts.dart';
import 'package:boorusama/boorus/core/feats/search/search.dart';
import 'package:boorusama/boorus/core/pages/search/generic_search_page.dart';
import 'package:boorusama/boorus/core/pages/search/metatags/danbooru_metatags_section.dart';
Expand All @@ -19,7 +20,6 @@ import 'package:boorusama/boorus/core/pages/search/selected_tag_list_with_data.d
import 'package:boorusama/boorus/core/provider.dart';
import 'package:boorusama/boorus/core/widgets/widgets.dart';
import 'package:boorusama/boorus/danbooru/danbooru_provider.dart';
import 'package:boorusama/boorus/danbooru/feats/posts/posts.dart';
import 'package:boorusama/flutter.dart';
import 'landing/trending/trending_section.dart';
import 'result/result_view.dart';
Expand Down
Loading

0 comments on commit ed697a2

Please sign in to comment.