diff --git a/lib/appdata.dart b/lib/appdata.dart index 86db39d..f49d574 100644 --- a/lib/appdata.dart +++ b/lib/appdata.dart @@ -23,6 +23,7 @@ class _Appdata { "readingFontSize": 16.0, "readingLineHeight": 1.5, "readingParagraphSpacing": 8.0, + "blockTags": [], }; bool lock = false; diff --git a/lib/components/loading.dart b/lib/components/loading.dart index 4f41c58..c37b612 100644 --- a/lib/components/loading.dart +++ b/lib/components/loading.dart @@ -108,7 +108,7 @@ abstract class MultiPageLoadingState Widget? buildFrame(BuildContext context, Widget child) => null; - Widget buildContent(BuildContext context, final List data); + Widget buildContent(BuildContext context, List data); bool get isLoading => _isLoading || _isFirstLoading; diff --git a/lib/network/models.dart b/lib/network/models.dart index 89db466..9a3023d 100644 --- a/lib/network/models.dart +++ b/lib/network/models.dart @@ -181,6 +181,7 @@ class Illust { bool isBookmarked; final bool isAi; final bool isUgoira; + final bool isBlocked; bool get isR18 => tags.contains(const Tag("R-18", null)); @@ -227,7 +228,8 @@ class Illust { totalBookmarks = json['total_bookmarks'], isBookmarked = json['is_bookmarked'], isAi = json['illust_ai_type'] == 2, - isUgoira = json['type'] == "ugoira"; + isUgoira = json['type'] == "ugoira", + isBlocked = json['is_muted'] ?? false; } class TrendingTag { diff --git a/lib/pages/following_artworks.dart b/lib/pages/following_artworks.dart index 87d29ce..7293afb 100644 --- a/lib/pages/following_artworks.dart +++ b/lib/pages/following_artworks.dart @@ -2,6 +2,7 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:pixes/components/title_bar.dart'; import 'package:pixes/foundation/app.dart'; +import 'package:pixes/utils/block.dart'; import 'package:pixes/utils/translation.dart'; import '../components/batch_download.dart'; @@ -27,7 +28,10 @@ class _FollowingArtworksPageState extends State { children: [ buildTab(), Expanded( - child: _OneFollowingPage(restrict, key: Key(restrict),), + child: _OneFollowingPage( + restrict, + key: Key(restrict), + ), ) ], ); @@ -38,8 +42,11 @@ class _FollowingArtworksPageState extends State { title: "Following".tl, action: Row( children: [ - BatchDownloadButton(request: () => Network().getFollowingArtworks(restrict)), - const SizedBox(width: 8,), + BatchDownloadButton( + request: () => Network().getFollowingArtworks(restrict)), + const SizedBox( + width: 8, + ), SegmentedButton( options: [ SegmentedButtonOption("all", "All".tl), @@ -47,7 +54,7 @@ class _FollowingArtworksPageState extends State { SegmentedButtonOption("private", "Private".tl), ], onPressed: (key) { - if(key != restrict) { + if (key != restrict) { setState(() { restrict = key; }); @@ -70,27 +77,26 @@ class _OneFollowingPage extends StatefulWidget { State<_OneFollowingPage> createState() => _OneFollowingPageState(); } -class _OneFollowingPageState extends MultiPageLoadingState<_OneFollowingPage, Illust> { +class _OneFollowingPageState + extends MultiPageLoadingState<_OneFollowingPage, Illust> { @override - Widget buildContent(BuildContext context, final List data) { - return LayoutBuilder(builder: (context, constrains){ + Widget buildContent(BuildContext context, List data) { + checkIllusts(data); + return LayoutBuilder(builder: (context, constrains) { return MasonryGridView.builder( - padding: const EdgeInsets.symmetric(horizontal: 8) - + EdgeInsets.only(bottom: context.padding.bottom), + padding: const EdgeInsets.symmetric(horizontal: 8) + + EdgeInsets.only(bottom: context.padding.bottom), gridDelegate: const SliverSimpleGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 240, ), itemCount: data.length, itemBuilder: (context, index) { - if(index == data.length - 1){ + if (index == data.length - 1) { nextPage(); } return IllustWidget(data[index], onTap: () { context.to(() => IllustGalleryPage( - illusts: data, - initialPage: index, - nextUrl: nextUrl - )); + illusts: data, initialPage: index, nextUrl: nextUrl)); }); }, ); @@ -100,16 +106,15 @@ class _OneFollowingPageState extends MultiPageLoadingState<_OneFollowingPage, Il String? nextUrl; @override - Future>> loadData(page) async{ - if(nextUrl == "end") { + Future>> loadData(page) async { + if (nextUrl == "end") { return Res.error("No more data"); } var res = await Network().getFollowingArtworks(widget.restrict, nextUrl); - if(!res.error) { + if (!res.error) { nextUrl = res.subData; nextUrl ??= "end"; } return res; } } - diff --git a/lib/pages/ranking.dart b/lib/pages/ranking.dart index 2cb8d79..6a79159 100644 --- a/lib/pages/ranking.dart +++ b/lib/pages/ranking.dart @@ -1,6 +1,7 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:pixes/foundation/app.dart'; +import 'package:pixes/utils/block.dart'; import 'package:pixes/utils/translation.dart'; import '../components/batch_download.dart'; @@ -86,6 +87,7 @@ class _OneRankingPage extends StatefulWidget { class _OneRankingPageState extends MultiPageLoadingState<_OneRankingPage, Illust> { @override Widget buildContent(BuildContext context, final List data) { + checkIllusts(data); return LayoutBuilder(builder: (context, constrains){ return MasonryGridView.builder( padding: const EdgeInsets.symmetric(horizontal: 8) diff --git a/lib/pages/recommendation_page.dart b/lib/pages/recommendation_page.dart index 668a743..dc75317 100644 --- a/lib/pages/recommendation_page.dart +++ b/lib/pages/recommendation_page.dart @@ -6,6 +6,7 @@ import 'package:pixes/components/title_bar.dart'; import 'package:pixes/foundation/app.dart'; import 'package:pixes/network/network.dart'; import 'package:pixes/pages/illust_page.dart'; +import 'package:pixes/utils/block.dart'; import 'package:pixes/utils/translation.dart'; import '../components/grid.dart'; @@ -75,6 +76,7 @@ class _RecommendationArtworksPageState extends MultiPageLoadingState<_RecommendationArtworksPage, Illust> { @override Widget buildContent(BuildContext context, final List data) { + checkIllusts(data); return LayoutBuilder(builder: (context, constrains) { return MasonryGridView.builder( padding: const EdgeInsets.symmetric(horizontal: 8) + diff --git a/lib/pages/search_page.dart b/lib/pages/search_page.dart index 94ec3dc..41cae87 100644 --- a/lib/pages/search_page.dart +++ b/lib/pages/search_page.dart @@ -11,6 +11,7 @@ import 'package:pixes/network/network.dart'; import 'package:pixes/pages/illust_page.dart'; import 'package:pixes/pages/novel_page.dart'; import 'package:pixes/pages/user_info_page.dart'; +import 'package:pixes/utils/block.dart'; import 'package:pixes/utils/translation.dart'; import '../components/animated_image.dart'; @@ -456,6 +457,7 @@ class _SearchResultPageState @override Widget buildContent(BuildContext context, final List data) { + checkIllusts(data); return CustomScrollView( slivers: [ buildSearchBar(), diff --git a/lib/pages/user_info_page.dart b/lib/pages/user_info_page.dart index 8a23970..7b2ce20 100644 --- a/lib/pages/user_info_page.dart +++ b/lib/pages/user_info_page.dart @@ -13,6 +13,7 @@ import 'package:pixes/foundation/app.dart'; import 'package:pixes/foundation/image_provider.dart'; import 'package:pixes/network/network.dart'; import 'package:pixes/pages/following_users_page.dart'; +import 'package:pixes/utils/block.dart'; import 'package:pixes/utils/translation.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -360,7 +361,8 @@ class _UserArtworksState extends MultiPageLoadingState<_UserArtworks, Illust> { } @override - Widget buildContent(BuildContext context, final List data) { + Widget buildContent(BuildContext context, List data) { + checkIllusts(data); return SliverMasonryGrid( gridDelegate: const SliverSimpleGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 240, diff --git a/lib/utils/block.dart b/lib/utils/block.dart new file mode 100644 index 0000000..606820f --- /dev/null +++ b/lib/utils/block.dart @@ -0,0 +1,22 @@ +import 'package:pixes/appdata.dart'; +import 'package:pixes/network/models.dart'; + +void checkIllusts(List illusts) { + illusts.removeWhere((illust) { + if (illust.isBlocked) { + return true; + } + if (appdata.settings["blockTags"] == null) { + return false; + } + if (appdata.settings["blockTags"].contains(illust.author.name)) { + return true; + } + for (var tag in illust.tags) { + if ((appdata.settings["blockTags"] as List).contains(tag.name)) { + return true; + } + } + return false; + }); +}