From b4cff946aafff38c28389de0e30b291df5ee17e9 Mon Sep 17 00:00:00 2001 From: wgh19 Date: Mon, 13 May 2024 20:24:07 +0800 Subject: [PATCH] recommendation users --- lib/network/network.dart | 11 ++++ lib/pages/main_page.dart | 4 +- lib/pages/recommendation_page.dart | 90 +++++++++++++++++++++++++++++- 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/lib/network/network.dart b/lib/network/network.dart index 2e8ea40..e8cdc10 100644 --- a/lib/network/network.dart +++ b/lib/network/network.dart @@ -347,4 +347,15 @@ class Network { return Res.error(res.errorMessage); } } + + Future>> getRecommendationUsers() async { + var res = await apiGet("/v1/user/recommended?filter=for_android"); + if (res.success) { + return Res( + (res.data["user_previews"] as List).map((e) => UserPreview.fromJson(e["user"])).toList(), + subData: res.data["next_url"]); + } else { + return Res.error(res.errorMessage); + } + } } diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index 0922f51..39393ce 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -103,8 +103,8 @@ class _MainPageState extends State with WindowListener { PaneItemSeparator(), PaneItemHeader(header: Text("Artwork".tl).paddingVertical(4).paddingLeft(8)), PaneItem( - icon: const Icon(MdIcons.star_border, size: 20,), - title: Text('Recommendations'.tl), + icon: const Icon(MdIcons.explore_outlined, size: 20,), + title: Text('Explore'.tl), body: const SizedBox.shrink(), ), PaneItem( diff --git a/lib/pages/recommendation_page.dart b/lib/pages/recommendation_page.dart index 5f00760..4535d5a 100644 --- a/lib/pages/recommendation_page.dart +++ b/lib/pages/recommendation_page.dart @@ -2,8 +2,13 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:pixes/components/illust_widget.dart'; import 'package:pixes/components/loading.dart'; +import 'package:pixes/foundation/app.dart'; import 'package:pixes/network/network.dart'; -import 'package:pixes/network/res.dart'; +import 'package:pixes/utils/translation.dart'; + +import '../components/grid.dart'; +import '../components/segmented_button.dart'; +import '../components/user_preview.dart'; class RecommendationPage extends StatefulWidget { const RecommendationPage({super.key}); @@ -12,7 +17,50 @@ class RecommendationPage extends StatefulWidget { State createState() => _RecommendationPageState(); } -class _RecommendationPageState extends MultiPageLoadingState { +class _RecommendationPageState extends State { + var type = 0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + buildTab(), + Expanded( + child: type == 0 + ? const _RecommendationArtworksPage() + : const _RecommendationUsersPage(), + ) + ], + ); + } + + Widget buildTab() { + return SegmentedButton( + options: [ + SegmentedButtonOption(0, "Artworks".tl), + SegmentedButtonOption(1, "Users".tl), + ], + onPressed: (key) { + if(key != type) { + setState(() { + type = key; + }); + } + }, + value: type, + ).padding(const EdgeInsets.symmetric(vertical: 8, horizontal: 8)); + } +} + + +class _RecommendationArtworksPage extends StatefulWidget { + const _RecommendationArtworksPage(); + + @override + State<_RecommendationArtworksPage> createState() => _RecommendationArtworksPageState(); +} + +class _RecommendationArtworksPageState extends MultiPageLoadingState<_RecommendationArtworksPage, Illust> { @override Widget buildContent(BuildContext context, final List data) { return LayoutBuilder(builder: (context, constrains){ @@ -35,4 +83,40 @@ class _RecommendationPageState extends MultiPageLoadingState>> loadData(page) { return Network().getRecommendedIllusts(); } -} \ No newline at end of file +} + +class _RecommendationUsersPage extends StatefulWidget { + const _RecommendationUsersPage(); + + @override + State<_RecommendationUsersPage> createState() => _RecommendationUsersPageState(); +} + +class _RecommendationUsersPageState extends MultiPageLoadingState<_RecommendationUsersPage, UserPreview> { + @override + Widget buildContent(BuildContext context, List data) { + return CustomScrollView( + slivers: [ + SliverGridViewWithFixedItemHeight( + delegate: SliverChildBuilderDelegate( + (context, index) { + if(index == data.length - 1){ + nextPage(); + } + return UserPreviewWidget(data[index]); + }, + childCount: data.length + ), + maxCrossAxisExtent: 520, + itemHeight: 114, + ).sliverPaddingHorizontal(8) + ], + ); + } + + @override + Future>> loadData(page) async{ + var res = await Network().getRecommendationUsers(); + return res; + } +}