diff --git a/lib/http/video.dart b/lib/http/video.dart index d01f68895..b1e4698ca 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -157,15 +157,12 @@ class VideoHttp { // (取消)收藏 static Future favVideo( - {required String aid, - required bool type, - required String addIds, - required String delIds}) async { + {required String aid, String? addIds, String? delIds}) async { var res = await Request().post(Api.favVideo, queryParameters: { 'rid': aid, 'type': 2, - 'add_media_ids': addIds, - 'del_media_ids': delIds, + 'add_media_ids': addIds ?? '', + 'del_media_ids': delIds ?? '', 'csrf': await Request.getCsrf(), }); if (res.data['code'] == 0) { diff --git a/lib/pages/favDetail/controller.dart b/lib/pages/favDetail/controller.dart index 213031153..cc59676a8 100644 --- a/lib/pages/favDetail/controller.dart +++ b/lib/pages/favDetail/controller.dart @@ -1,5 +1,7 @@ +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/http/user.dart'; +import 'package:pilipala/http/video.dart'; import 'package:pilipala/models/user/fav_detail.dart'; import 'package:pilipala/models/user/fav_folder.dart'; @@ -26,4 +28,23 @@ class FavDetailController extends GetxController { favDetailData.value = res['data']; return res; } + + onCancelFav(int id) async { + var result = await VideoHttp.favVideo( + aid: id.toString(), addIds: '', delIds: mediaId.toString()); + if (result['status']) { + if (result['data']['prompt']) { + List dataList = favDetailData.value.medias!; + for (var i in dataList) { + if (i.id == id) { + dataList.remove(i); + break; + } + } + favDetailData.value.medias = dataList; + favDetailData.refresh(); + SmartDialog.showToast('取消收藏'); + } + } + } } diff --git a/lib/pages/favDetail/view.dart b/lib/pages/favDetail/view.dart index e637c6d52..7ee7d4297 100644 --- a/lib/pages/favDetail/view.dart +++ b/lib/pages/favDetail/view.dart @@ -152,12 +152,15 @@ class _FavDetailPageState extends State { SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.only(top: 15, bottom: 8, left: 14), - child: Text( - '共${_favDetailController.item!.mediaCount}条视频', - style: TextStyle( - fontSize: Theme.of(context).textTheme.labelMedium!.fontSize, - color: Theme.of(context).colorScheme.outline, - letterSpacing: 1), + child: Obx( + () => Text( + '共${_favDetailController.favDetailData.value.medias != null ? _favDetailController.favDetailData.value.medias!.length : '-'}条视频', + style: TextStyle( + fontSize: + Theme.of(context).textTheme.labelMedium!.fontSize, + color: Theme.of(context).colorScheme.outline, + letterSpacing: 1), + ), ), ), ), diff --git a/lib/pages/favDetail/widget/fav_video_card.dart b/lib/pages/favDetail/widget/fav_video_card.dart index 1cfc3c91d..d4e9f6da2 100644 --- a/lib/pages/favDetail/widget/fav_video_card.dart +++ b/lib/pages/favDetail/widget/fav_video_card.dart @@ -1,14 +1,18 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:pilipala/common/constants.dart'; -import 'package:pilipala/common/widgets/stat/up.dart'; +import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; +import '../controller.dart'; + // 收藏视频卡片 - 水平布局 class FavVideoCardH extends StatelessWidget { var videoItem; + final FavDetailController _favDetailController = + Get.put(FavDetailController()); FavVideoCardH({Key? key, required this.videoItem}) : super(key: key); @@ -16,75 +20,99 @@ class FavVideoCardH extends StatelessWidget { Widget build(BuildContext context) { int id = videoItem.id; String heroTag = Utils.makeHeroTag(id); - return InkWell( - onTap: () async { - await Future.delayed(const Duration(milliseconds: 200)); - Get.toNamed('/video?aid=$id', - arguments: {'videoItem': videoItem, 'heroTag': heroTag}); + return Dismissible( + movementDuration: const Duration(milliseconds: 300), + background: Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.errorContainer, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Icon(Icons.clear_all_rounded), + SizedBox(width: 6), + Text('取消收藏') + ], + )), + direction: DismissDirection.endToStart, + key: ValueKey(videoItem.id), + onDismissed: (DismissDirection direction) { + _favDetailController.onCancelFav(videoItem.id); + // widget.onDeleteNotice(); }, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(12, 5, 12, 5), - child: LayoutBuilder( - builder: (context, boxConstraints) { - double width = - (boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2; - return SizedBox( - height: width / StyleString.aspectRatio, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder( - builder: (context, boxConstraints) { - double maxWidth = boxConstraints.maxWidth; - double maxHeight = boxConstraints.maxHeight; - double PR = MediaQuery.of(context).devicePixelRatio; - return Stack( - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - // src: videoItem['pic'] + - // '@${(maxWidth * 2).toInt()}w', - src: videoItem.pic + '@.webp', - width: maxWidth, - height: maxHeight, - ), - ), - // Image.network( videoItem['pic'], width: double.infinity, height: double.infinity,), - Positioned( - right: 4, - bottom: 4, - child: Container( - padding: const EdgeInsets.symmetric( - vertical: 1, horizontal: 6), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - color: Colors.black54.withOpacity(0.4)), - child: Text( - Utils.timeFormat(videoItem.duration!), - style: const TextStyle( - fontSize: 11, color: Colors.white), + child: InkWell( + onTap: () async { + await Future.delayed(const Duration(milliseconds: 200)); + Get.toNamed('/video?aid=$id', + arguments: {'videoItem': videoItem, 'heroTag': heroTag}); + }, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(12, 5, 12, 5), + child: LayoutBuilder( + builder: (context, boxConstraints) { + double width = + (boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2; + return SizedBox( + height: width / StyleString.aspectRatio, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder( + builder: (context, boxConstraints) { + double maxWidth = boxConstraints.maxWidth; + double maxHeight = boxConstraints.maxHeight; + double PR = + MediaQuery.of(context).devicePixelRatio; + return Stack( + children: [ + Hero( + tag: heroTag, + child: NetworkImgLayer( + // src: videoItem['pic'] + + // '@${(maxWidth * 2).toInt()}w', + src: videoItem.pic + '@.webp', + width: maxWidth, + height: maxHeight, ), ), - ) - ], - ); - }, + // Image.network( videoItem['pic'], width: double.infinity, height: double.infinity,), + Positioned( + right: 4, + bottom: 4, + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 1, horizontal: 6), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(4), + color: + Colors.black54.withOpacity(0.4)), + child: Text( + Utils.timeFormat(videoItem.duration!), + style: const TextStyle( + fontSize: 11, color: Colors.white), + ), + ), + ) + ], + ); + }, + ), ), - ), - VideoContent(videoItem: videoItem) - ], - ), - ); - }, + VideoContent(videoItem: videoItem) + ], + ), + ); + }, + ), ), - ), - ], + ], + ), ), ); } @@ -112,7 +140,6 @@ class VideoContent extends StatelessWidget { overflow: TextOverflow.ellipsis, ), const Spacer(), - const SizedBox(height: 4), Text( videoItem.owner.name, style: TextStyle( @@ -127,12 +154,7 @@ class VideoContent extends StatelessWidget { view: videoItem.cntInfo['play'], ), const SizedBox(width: 8), - Text( - Utils.dateFormat(videoItem.pubdate!), - style: TextStyle( - fontSize: 11, - color: Theme.of(context).colorScheme.outline), - ) + StatDanMu(theme: 'gray', danmu: videoItem.cntInfo['danmaku']) ], ), ], diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index 716164234..faf7cfb60 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -186,7 +186,6 @@ class VideoIntroController extends GetxController { } catch (e) {} var result = await VideoHttp.favVideo( aid: aid, - type: true, addIds: addMediaIdsNew.join(','), delIds: delMediaIdsNew.join(',')); if (result['status']) {