From 37ddebca5099e720f2f110c8c0007caccebb6030 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 21 Nov 2024 15:48:27 +0800 Subject: [PATCH] opt: remove fav folder after deleted Signed-off-by: bggRGjQaUbCoE --- lib/pages/fav/view.dart | 54 ++++++++++++++++++- lib/pages/fav/widgets/item.dart | 30 ++++++----- lib/pages/fav_detail/view.dart | 2 +- .../content/favorite/member_favorite.dart | 8 ++- lib/pages/video/detail/introduction/view.dart | 2 +- 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index a0697c73..eae09df9 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -1,6 +1,8 @@ import 'package:PiliPalaX/common/skeleton/video_card_h.dart'; import 'package:PiliPalaX/http/loading_state.dart'; +import 'package:PiliPalaX/models/user/fav_folder.dart'; import 'package:PiliPalaX/pages/fav_search/view.dart'; +import 'package:PiliPalaX/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -53,6 +55,32 @@ class _FavPageState extends State { style: Theme.of(context).textTheme.titleMedium, ), actions: [ + IconButton( + onPressed: () { + Get.toNamed('/createFav')?.then((data) { + if (data != null) { + List list = _favController.loadingState.value is Success + ? (_favController.loadingState.value as Success).response + : []; + list.insert( + list.isNotEmpty ? 1 : 0, + FavFolderItemData( + id: data['id'], + fid: data['fid'], + attr: data['attr'], + title: data['title'], + favState: data['fav_state'], + mediaCount: data['media_count'], + ), + ); + _favController.loadingState.value = + LoadingState.success(list); + } + }); + }, + icon: const Icon(Icons.add), + tooltip: '新建收藏夹', + ), IconButton( onPressed: () { if (_favController.loadingState.value is Success) { @@ -96,7 +124,31 @@ class _FavPageState extends State { delegate: SliverChildBuilderDelegate( childCount: loadingState.response.length, (BuildContext context, int index) { - return FavItem(favFolderItem: loadingState.response[index]); + String heroTag = + Utils.makeHeroTag(loadingState.response[index].fid); + return FavItem( + heroTag: heroTag, + favFolderItem: loadingState.response[index], + onTap: () { + Get.toNamed( + '/favDetail', + arguments: loadingState.response[index], + parameters: { + 'heroTag': heroTag, + 'mediaId': loadingState.response[index].id.toString(), + }, + )?.then((res) { + if (res == true) { + List list = + (_favController.loadingState.value as Success) + .response; + list.removeAt(index); + _favController.loadingState.value = + LoadingState.success(list); + } + }); + }, + ); }, ), ) diff --git a/lib/pages/fav/widgets/item.dart b/lib/pages/fav/widgets/item.dart index d3799964..e4fb75a6 100644 --- a/lib/pages/fav/widgets/item.dart +++ b/lib/pages/fav/widgets/item.dart @@ -1,25 +1,22 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:PiliPalaX/common/constants.dart'; import 'package:PiliPalaX/common/widgets/network_img_layer.dart'; -import 'package:PiliPalaX/utils/utils.dart'; class FavItem extends StatelessWidget { + final String heroTag; final dynamic favFolderItem; - const FavItem({super.key, required this.favFolderItem}); + final GestureTapCallback onTap; + const FavItem({ + super.key, + required this.onTap, + required this.heroTag, + required this.favFolderItem, + }); @override Widget build(BuildContext context) { - String heroTag = Utils.makeHeroTag(favFolderItem.fid); return InkWell( - onTap: () => Get.toNamed( - '/favDetail', - arguments: favFolderItem, - parameters: { - 'heroTag': heroTag, - 'mediaId': favFolderItem.id.toString(), - }, - ), + onTap: onTap, child: Padding( padding: const EdgeInsets.fromLTRB(12, 7, 12, 7), child: LayoutBuilder( @@ -80,6 +77,15 @@ class VideoContent extends StatelessWidget { letterSpacing: 0.3, ), ), + if (favFolderItem.intro.isNotEmpty) + Text( + favFolderItem.intro, + textAlign: TextAlign.start, + style: TextStyle( + fontSize: Theme.of(context).textTheme.labelMedium!.fontSize, + color: Theme.of(context).colorScheme.outline, + ), + ), Text( '${favFolderItem.mediaCount}个内容', textAlign: TextAlign.start, diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 6524cd76..6dcc00ef 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -137,7 +137,7 @@ class _FavDetailPageState extends State { .then((data) { if (data['status']) { SmartDialog.showToast('删除成功'); - Get.back(); + Get.back(result: true); } else { SmartDialog.showToast(data['msg']); } diff --git a/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart b/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart index c208c7cd..1066bbc0 100644 --- a/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart +++ b/lib/pages/member/new/content/member_contribute/content/favorite/member_favorite.dart @@ -135,7 +135,13 @@ class _MemberFavoriteState extends State 'mediaId': item1.id.toString(), 'heroTag': widget.heroTag ?? '', }, - ); + )?.then((res) { + if (res == true) { + _controller.first.value.mediaListResponse?.list + ?.remove(item1); + _controller.first.refresh(); + } + }); } else if (item1.type == 21) { PiliScheme.routePush(Uri.parse(item1.link ?? '')); } else if (item1.type == 11) { diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index bbebf1d7..bb4d5d4d 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -319,7 +319,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { gapSize: 10, itemCount: videoItem['staff'].length, childBuilder: (index) => Container( - width: 70, + width: 80, alignment: Alignment.center, child: GestureDetector( onTap: () => Get.toNamed(