diff --git a/lib/pages/fav/controller.dart b/lib/pages/fav/controller.dart index 8fcbf971..5be46bf0 100644 --- a/lib/pages/fav/controller.dart +++ b/lib/pages/fav/controller.dart @@ -16,10 +16,16 @@ class FavController extends GetxController { int currentPage = 1; int pageSize = 60; RxBool hasMore = true.obs; + late int mid; + late int ownerMid; + RxBool isOwner = false.obs; @override void onInit() { + mid = int.parse(Get.parameters['mid'] ?? '-1'); userInfo = userInfoCache.get('userInfoCache'); + ownerMid = userInfo != null ? userInfo!.mid! : -1; + isOwner.value = mid == -1 || mid == ownerMid; super.onInit(); } @@ -33,7 +39,7 @@ class FavController extends GetxController { var res = await UserHttp.userfavFolder( pn: currentPage, ps: pageSize, - mid: userInfo!.mid!, + mid: isOwner.value ? ownerMid : mid, ); if (res['status']) { if (type == 'init') { diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 4f48213e..7010ba0d 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -42,17 +42,25 @@ class _FavPageState extends State { appBar: AppBar( centerTitle: false, titleSpacing: 0, - title: Text( - '我的收藏', - style: Theme.of(context).textTheme.titleMedium, - ), + title: Obx(() => Text( + '${_favController.isOwner.value ? '我' : 'Ta'}的收藏', + style: Theme.of(context).textTheme.titleMedium, + )), actions: [ + Obx(() => !_favController.isOwner.value + ? IconButton( + onPressed: () => + Get.toNamed('/subscription?mid=${_favController.mid}'), + icon: const Icon(Icons.subscriptions_outlined, size: 21), + tooltip: 'Ta的订阅', + ) + : const SizedBox.shrink()), IconButton( onPressed: () => Get.toNamed( '/favSearch?searchType=1&mediaId=${_favController.favFolderData.value.list!.first.id}'), icon: const Icon(Icons.search_outlined), ), - const SizedBox(width: 6), + const SizedBox(width: 14), ], ), body: FutureBuilder( @@ -67,7 +75,9 @@ class _FavPageState extends State { itemCount: _favController.favFolderList.length, itemBuilder: (context, index) { return FavItem( - favFolderItem: _favController.favFolderList[index]); + favFolderItem: _favController.favFolderList[index], + isOwner: _favController.isOwner.value, + ); }, ), ); diff --git a/lib/pages/fav/widgets/item.dart b/lib/pages/fav/widgets/item.dart index 3c44ec9d..9d453fb5 100644 --- a/lib/pages/fav/widgets/item.dart +++ b/lib/pages/fav/widgets/item.dart @@ -7,7 +7,9 @@ import 'package:pilipala/utils/utils.dart'; class FavItem extends StatelessWidget { // ignore: prefer_typing_uninitialized_variables final favFolderItem; - const FavItem({super.key, required this.favFolderItem}); + final bool isOwner; + const FavItem( + {super.key, required this.favFolderItem, required this.isOwner}); @override Widget build(BuildContext context) { @@ -20,6 +22,7 @@ class FavItem extends StatelessWidget { parameters: { 'heroTag': heroTag, 'mediaId': favFolderItem.id.toString(), + 'isOwner': isOwner ? '1' : '0', }, ); }, diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 7af398e8..3f87c226 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -19,6 +19,7 @@ class FavDetailController extends GetxController { RxList favList = [].obs; RxString loadingText = '加载中...'.obs; RxInt mediaCount = 0.obs; + late String isOwner; @override void onInit() { @@ -26,6 +27,7 @@ class FavDetailController extends GetxController { if (Get.parameters.keys.isNotEmpty) { mediaId = int.parse(Get.parameters['mediaId']!); heroTag = Get.parameters['heroTag']!; + isOwner = Get.parameters['isOwner']!; } super.onInit(); } diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 1bf5cb6f..cb9d7e7b 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -212,6 +212,7 @@ class _FavDetailPageState extends State { SliverChildBuilderDelegate((context, index) { return FavVideoCardH( videoItem: favList[index], + isOwner: _favDetailController.isOwner, callFn: () => _favDetailController .onCancelFav(favList[index].id), ); diff --git a/lib/pages/fav_detail/widget/fav_video_card.dart b/lib/pages/fav_detail/widget/fav_video_card.dart index 79e5c073..9779c549 100644 --- a/lib/pages/fav_detail/widget/fav_video_card.dart +++ b/lib/pages/fav_detail/widget/fav_video_card.dart @@ -18,12 +18,14 @@ class FavVideoCardH extends StatelessWidget { final dynamic videoItem; final Function? callFn; final int? searchType; + final String isOwner; const FavVideoCardH({ Key? key, required this.videoItem, this.callFn, this.searchType, + required this.isOwner, }) : super(key: key); @override @@ -123,6 +125,7 @@ class FavVideoCardH extends StatelessWidget { videoItem: videoItem, callFn: callFn, searchType: searchType, + isOwner: isOwner, ) ], ), @@ -140,11 +143,13 @@ class VideoContent extends StatelessWidget { final dynamic videoItem; final Function? callFn; final int? searchType; + final String isOwner; const VideoContent({ super.key, required this.videoItem, this.callFn, this.searchType, + required this.isOwner, }); @override @@ -211,7 +216,7 @@ class VideoContent extends StatelessWidget { ), ], ), - searchType != 1 + searchType != 1 && isOwner == '1' ? Positioned( right: 0, bottom: -4, diff --git a/lib/pages/fav_search/view.dart b/lib/pages/fav_search/view.dart index 9b2ab15d..2654ccb1 100644 --- a/lib/pages/fav_search/view.dart +++ b/lib/pages/fav_search/view.dart @@ -100,6 +100,7 @@ class _FavSearchPageState extends State { return FavVideoCardH( videoItem: _favSearchCtr.favList[index], searchType: searchType, + isOwner: '0', callFn: () => searchType != 1 ? _favSearchCtr .onCancelFav(_favSearchCtr.favList[index].id!) diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index cc928a8d..ada869b5 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -27,6 +27,7 @@ class MemberController extends GetxController { RxString attributeText = '关注'.obs; RxList recentCoinsList = [].obs; RxList recentLikeList = [].obs; + RxBool isOwner = false.obs; @override void onInit() { @@ -34,6 +35,7 @@ class MemberController extends GetxController { mid = int.parse(Get.parameters['mid']!); userInfo = userInfoCache.get('userInfoCache'); ownerMid = userInfo != null ? userInfo.mid : -1; + isOwner.value = mid == ownerMid; face.value = Get.arguments['face'] ?? ''; heroTag = Get.arguments['heroTag'] ?? ''; relationSearch(); @@ -197,11 +199,12 @@ class MemberController extends GetxController { if (userInfo == null) return; var res = await MemberHttp.getMemberSeasons(mid, 1, 10); if (!res['status']) { - SmartDialog.showToast("用户专栏请求异常:${res['msg']}"); + SmartDialog.showToast("用户合集请求异常:${res['msg']}"); } else { // 只取前四个专栏 res['data'].seasonsList.map((e) { - e.archives = e.archives!.sublist(0, 4); + e.archives = + e.archives!.length > 4 ? e.archives!.sublist(0, 4) : e.archives!; }).toList(); } return res; @@ -235,4 +238,6 @@ class MemberController extends GetxController { void pushRecentCoinsPage() async { if (recentCoinsList.isNotEmpty) {} } + + void pushfavPage() => Get.toNamed('/fav?mid=$mid'); } diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index f62ffacc..c721d638 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -159,29 +159,47 @@ class _MemberPageState extends State profileWidget(), /// 动态链接 - ListTile( - onTap: _memberController.pushDynamicsPage, - title: const Text('Ta的动态'), - trailing: - const Icon(Icons.arrow_forward_outlined, size: 19), + Obx( + () => ListTile( + onTap: _memberController.pushDynamicsPage, + title: Text( + '${_memberController.isOwner.value ? '我' : 'Ta'}的动态'), + trailing: + const Icon(Icons.arrow_forward_outlined, size: 19), + ), ), const Divider(height: 1, thickness: 0.1), /// 视频 - ListTile( - onTap: _memberController.pushArchivesPage, - title: const Text('Ta的投稿'), - trailing: - const Icon(Icons.arrow_forward_outlined, size: 19), - ), + Obx(() => ListTile( + onTap: _memberController.pushArchivesPage, + title: Text( + '${_memberController.isOwner.value ? '我' : 'Ta'}的投稿'), + trailing: const Icon(Icons.arrow_forward_outlined, + size: 19), + )), + const Divider(height: 1, thickness: 0.1), + + /// 他的收藏夹 + Obx(() => ListTile( + onTap: _memberController.pushfavPage, + title: Text( + '${_memberController.isOwner.value ? '我' : 'Ta'}的收藏'), + trailing: const Icon(Icons.arrow_forward_outlined, + size: 19), + )), const Divider(height: 1, thickness: 0.1), /// 专栏 - const ListTile(title: Text('Ta的专栏')), + Obx(() => ListTile( + title: Text( + '${_memberController.isOwner.value ? '我' : 'Ta'}的专栏'))), const Divider(height: 1, thickness: 0.1), /// 合集 - const ListTile(title: Text('Ta的合集')), + Obx(() => ListTile( + title: Text( + '${_memberController.isOwner.value ? '我' : 'Ta'}的合集'))), MediaQuery.removePadding( removeTop: true, removeBottom: true, @@ -212,8 +230,6 @@ class _MemberPageState extends State ), ), - /// 收藏 - /// 追番 /// 最近投币 Obx( diff --git a/lib/pages/subscription/controller.dart b/lib/pages/subscription/controller.dart index d8a76d44..b59a42f0 100644 --- a/lib/pages/subscription/controller.dart +++ b/lib/pages/subscription/controller.dart @@ -16,11 +16,17 @@ class SubController extends GetxController { int currentPage = 1; int pageSize = 20; RxBool hasMore = true.obs; + late int mid; + late int ownerMid; + RxBool isOwner = false.obs; @override void onInit() { super.onInit(); + mid = int.parse(Get.parameters['mid'] ?? '-1'); userInfo = userInfoCache.get('userInfoCache'); + ownerMid = userInfo != null ? userInfo!.mid! : -1; + isOwner.value = mid == -1 || mid == ownerMid; } Future querySubFolder({type = 'init'}) async { @@ -30,7 +36,7 @@ class SubController extends GetxController { var res = await UserHttp.userSubFolder( pn: currentPage, ps: pageSize, - mid: userInfo!.mid!, + mid: isOwner.value ? ownerMid : mid, ); if (res['status']) { if (type == 'init') { diff --git a/lib/pages/subscription/view.dart b/lib/pages/subscription/view.dart index e1d1820d..cb9993b0 100644 --- a/lib/pages/subscription/view.dart +++ b/lib/pages/subscription/view.dart @@ -42,10 +42,10 @@ class _SubPageState extends State { appBar: AppBar( centerTitle: false, titleSpacing: 0, - title: Text( - '我的订阅', - style: Theme.of(context).textTheme.titleMedium, - ), + title: Obx(() => Text( + '${_subController.isOwner.value ? '我' : 'Ta'}的订阅', + style: Theme.of(context).textTheme.titleMedium, + )), ), body: FutureBuilder( future: _futureBuilderFuture, @@ -62,6 +62,7 @@ class _SubPageState extends State { return SubItem( subFolderItem: _subController.subFolderData.value.list![index], + isOwner: _subController.isOwner.value, cancelSub: _subController.cancelSub); }, ), diff --git a/lib/pages/subscription/widgets/item.dart b/lib/pages/subscription/widgets/item.dart index b244d3c7..0389b4a6 100644 --- a/lib/pages/subscription/widgets/item.dart +++ b/lib/pages/subscription/widgets/item.dart @@ -8,10 +8,12 @@ import '../../../models/user/sub_folder.dart'; class SubItem extends StatelessWidget { final SubFolderItemData subFolderItem; + final bool isOwner; final Function(SubFolderItemData) cancelSub; const SubItem({ super.key, required this.subFolderItem, + required this.isOwner, required this.cancelSub, }); @@ -59,6 +61,7 @@ class SubItem extends StatelessWidget { ), VideoContent( subFolderItem: subFolderItem, + isOwner: isOwner, cancelSub: cancelSub, ) ], @@ -73,8 +76,14 @@ class SubItem extends StatelessWidget { class VideoContent extends StatelessWidget { final SubFolderItemData subFolderItem; + final bool isOwner; final Function(SubFolderItemData)? cancelSub; - const VideoContent({super.key, required this.subFolderItem, this.cancelSub}); + const VideoContent({ + super.key, + required this.subFolderItem, + required this.isOwner, + this.cancelSub, + }); @override Widget build(BuildContext context) { @@ -111,22 +120,24 @@ class VideoContent extends StatelessWidget { ), ), const Spacer(), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - IconButton( - style: ButtonStyle( - padding: MaterialStateProperty.all(EdgeInsets.zero), - ), - onPressed: () => cancelSub?.call(subFolderItem), - icon: Icon( - Icons.clear_outlined, - color: Theme.of(context).colorScheme.outline, - size: 18, - ), - ) - ], - ) + isOwner + ? Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + IconButton( + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero), + ), + onPressed: () => cancelSub?.call(subFolderItem), + icon: Icon( + Icons.clear_outlined, + color: Theme.of(context).colorScheme.outline, + size: 18, + ), + ) + ], + ) + : const SizedBox() ], ), ),