diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index 9bce8064..bd40a530 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -349,12 +349,27 @@ class BangumiIntroController try { EpisodeItem item = bangumiItem!.episodes! .firstWhere((item) => item.epId == epId); - PageUtils.pmShareVideo( - id: epId!, - source: 16, - cover: item.cover!, - title: '${bangumiItem!.title!} ${item.showTitle}', - url: item.shareUrl, + final title = '${bangumiItem!.title!} ${item.showTitle}'; + PageUtils.pmShare( + content: { + "id": epId!.toString(), + "title": title, + "url": item.shareUrl, + "headline": title, + "source": 16, + "extra": {}, + "thumb": item.cover, + "source_desc": switch (bangumiItem!.type) { + 1 => '番剧', + 2 => '电影', + 3 => '纪录片', + 4 => '国创', + 5 => '电视剧', + 6 => '漫画', + 7 => '综艺', + _ => null, + } + }, ); } catch (e) { SmartDialog.showToast(e.toString()); diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 4341655f..8bc1335a 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/report.dart'; import 'package:PiliPlus/common/widgets/save_panel.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/utils/extension.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:cached_network_image/cached_network_image.dart'; @@ -284,6 +285,16 @@ class AuthorPanel extends StatelessWidget { style: Theme.of(context).textTheme.titleSmall, ), ), + ListTile( + onTap: () { + Get.back(); + SavePanel.toSavePanel(item: item); + }, + minLeadingWidth: 0, + leading: const Icon(Icons.save_alt, size: 19), + title: Text('保存动态', + style: Theme.of(context).textTheme.titleSmall!), + ), ListTile( title: Text( '分享动态', @@ -297,16 +308,52 @@ class AuthorPanel extends StatelessWidget { }, minLeadingWidth: 0, ), - ListTile( - onTap: () { - Get.back(); - SavePanel.toSavePanel(item: item); - }, - minLeadingWidth: 0, - leading: const Icon(Icons.save_alt, size: 19), - title: Text('保存动态', - style: Theme.of(context).textTheme.titleSmall!), - ), + if (item.basic['comment_type'] == 17 || + item.basic['comment_type'] == 11) + ListTile( + title: Text( + '分享至消息', + style: Theme.of(context).textTheme.titleSmall, + ), + leading: const Icon(Icons.forward_to_inbox, size: 19), + onTap: () { + Get.back(); + try { + bool isDyn = item.basic['comment_type'] == 17; + String id = isDyn ? item.idStr : item.basic['rid_str']; + int source = isDyn ? 11 : 2; + String title; + if (item.modules.moduleDynamic.desc != null) { + title = item.modules.moduleDynamic.desc.text; + } else if (item.modules.moduleDynamic.major != null) { + title = + item.modules.moduleDynamic.major.opus.summary.text; + } else { + throw UnsupportedError( + 'error getting title: {"type": ${item.basic['comment_type']}, "id": $id}'); + } + String thumb = isDyn + ? item.modules.moduleAuthor.face + : item + .modules.moduleDynamic.major.opus.pics.first.url; + PageUtils.pmShare( + content: { + "id": id, + "title": title, + "headline": "", + "source": source, + "extra": {}, + "thumb": thumb, + "author": item.modules.moduleAuthor.name, + "author_id": item.modules.moduleAuthor.mid.toString() + }, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + }, + minLeadingWidth: 0, + ), ListTile( title: Text( '临时屏蔽:${item.modules?.moduleAuthor?.name}', @@ -317,9 +364,9 @@ class AuthorPanel extends StatelessWidget { Get.back(); Get.find() .tempBannedList - .add(item.modules!.moduleAuthor!.mid!); + .add(item.modules.moduleAuthor.mid); SmartDialog.showToast( - '已临时屏蔽${item.modules?.moduleAuthor?.name}(${item.modules!.moduleAuthor!.mid}),重启恢复'); + '已临时屏蔽${item.modules?.moduleAuthor?.name}(${item.modules.moduleAuthor.mid}),重启恢复'); }, minLeadingWidth: 0, ), diff --git a/lib/pages/html/controller.dart b/lib/pages/html/controller.dart index bdc89cd3..ab2b5cea 100644 --- a/lib/pages/html/controller.dart +++ b/lib/pages/html/controller.dart @@ -56,6 +56,7 @@ class HtmlRenderController extends ReplyController { 'status': true, 'isFav': res['data']?['favorite'] ?? false, 'favNum': res['data']?['stats']?['favorite'] ?? 0, + 'data': res['data'], }); } }); diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index da164af3..2390bb32 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -17,6 +17,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; @@ -633,6 +634,40 @@ class _HtmlRenderPageState extends State ], ), ), + if (_htmlRenderCtr.dynamicType == 'read' && + _htmlRenderCtr.favStat['status']) + PopupMenuItem( + onTap: () { + try { + PageUtils.pmShare( + content: { + "id": _htmlRenderCtr.id.substring(2), + "title": "- 哔哩哔哩专栏", + "headline": _htmlRenderCtr.favStat['data']['title'], + "source": 6, + "thumb": (_htmlRenderCtr.favStat['data'] + ['origin_image_urls'] as List?) + ?.firstOrNull ?? + '', + "author": _htmlRenderCtr.favStat['data'] + ['author_name'], + "author_id": + _htmlRenderCtr.favStat['data']['mid'].toString(), + }, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + }, + child: const Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.forward_to_inbox, size: 19), + SizedBox(width: 10), + Text('分享至动态'), + ], + ), + ), ], ), const SizedBox(width: 6) diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 9e12d727..86ec7726 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -18,7 +18,6 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/plugin/pl_player/index.dart'; -import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:screen_brightness/screen_brightness.dart'; import '../../utils/storage.dart'; @@ -416,35 +415,6 @@ class _LiveRoomPageState extends State ), ], ), - const Spacer(), - Obx( - () => IconButton( - onPressed: plPlayerController.setOnlyPlayAudio, - icon: Icon( - plPlayerController.onlyPlayAudio.value - ? MdiIcons.musicCircle - : MdiIcons.musicCircleOutline, - color: Colors.white, - ), - ), - ), - IconButton( - tooltip: '刷新', - onPressed: () { - _futureBuilderFuture = - _liveRoomController.queryLiveInfo(); - }, - icon: const Icon(Icons.refresh), - ), - IconButton( - tooltip: '浏览器打开', - onPressed: () { - PageUtils.inAppWebview( - 'https://live.bilibili.com/h5/${_liveRoomController.roomId}', - off: true, - ); - }, - icon: const Icon(Icons.open_in_browser)), ], ), ); @@ -453,6 +423,71 @@ class _LiveRoomPageState extends State } }, ), + actions: [ + IconButton( + tooltip: '刷新', + onPressed: () { + _futureBuilderFuture = _liveRoomController.queryLiveInfo(); + }, + icon: const Icon(Icons.refresh), + ), + PopupMenuButton( + icon: const Icon(Icons.more_vert, size: 19), + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + onTap: () { + PageUtils.inAppWebview( + 'https://live.bilibili.com/h5/${_liveRoomController.roomId}', + off: true, + ); + }, + child: const Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.open_in_browser, size: 19), + SizedBox(width: 10), + Text('浏览器打开'), + ], + ), + ), + PopupMenuItem( + onTap: () { + try { + PageUtils.pmShare( + content: { + "cover": _liveRoomController + .roomInfoH5.value.roomInfo!.cover!, + "sourceID": _liveRoomController.roomId.toString(), + "title": _liveRoomController + .roomInfoH5.value.roomInfo!.title!, + "url": + "https://live.bilibili.com/${_liveRoomController.roomId}", + "authorID": _liveRoomController + .roomInfoH5.value.roomInfo!.uid + .toString(), + "source": "直播", + "desc": _liveRoomController + .roomInfoH5.value.roomInfo!.title!, + "author": _liveRoomController + .roomInfoH5.value.anchorInfo!.baseInfo!.uname, + }, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + }, + child: const Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.forward_to_inbox, size: 19), + SizedBox(width: 10), + Text('分享至消息'), + ], + ), + ), + ], + ), + ], ); Widget get _buildBodyH { diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index 1b9a2c1c..97edb5f9 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -509,13 +509,16 @@ class VideoIntroController extends GetxController { onTap: () { Get.back(); try { - PageUtils.pmShareVideo( - author: videoDetail.value.owner!.name!, - id: videoDetail.value.aid!, - source: 5, - cover: videoDetail.value.pic!, - title: videoDetail.value.title!, - bvid: videoDetail.value.bvid!, + PageUtils.pmShare( + content: { + "id": videoDetail.value.aid!.toString(), + "title": videoDetail.value.title!, + "headline": videoDetail.value.title!, + "source": 5, + "thumb": videoDetail.value.pic!, + "author": videoDetail.value.owner!.name!, + "author_id": videoDetail.value.owner!.mid!.toString(), + }, ); } catch (e) { SmartDialog.showToast(e.toString()); diff --git a/lib/pages/video/detail/share/view.dart b/lib/pages/video/detail/share/view.dart index 387805a9..47674c69 100644 --- a/lib/pages/video/detail/share/view.dart +++ b/lib/pages/video/detail/share/view.dart @@ -34,37 +34,21 @@ class UserModel { int get hashCode => mid.hashCode; } -class ShareVideoPanel extends StatefulWidget { - const ShareVideoPanel({ +class SharePanel extends StatefulWidget { + const SharePanel({ super.key, - this.author, - required this.id, - required this.source, - required this.cover, - required this.title, - this.bvid, - this.url, - this.authorId, - this.sourceDesc, + required this.content, this.userList, }); - final String? author; - final int id; - final int source; - final String cover; - final String title; - final String? bvid; - final String? url; - final int? authorId; - final String? sourceDesc; + final Map content; final List? userList; @override - State createState() => _ShareVideoPanelState(); + State createState() => _SharePanelState(); } -class _ShareVideoPanelState extends State { +class _SharePanelState extends State { int _selectedIndex = -1; final List _userList = []; final ScrollController _scrollController = ScrollController(); @@ -245,17 +229,9 @@ class _ShareVideoPanelState extends State { SmartDialog.showToast('请选择分享的用户'); return; } - RequestUtils.pmShareVideo( + RequestUtils.pmShare( receiverId: _userList[_selectedIndex].mid, - author: widget.author, - id: widget.id, - source: widget.source, - cover: widget.cover, - title: widget.title, - bvid: widget.bvid, - url: widget.url, - authorId: widget.authorId, - sourceDesc: widget.sourceDesc, + content: widget.content, message: _controller.text, ); }, diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 9507751a..94edef4f 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -28,17 +28,9 @@ import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; class PageUtils { - static void pmShareVideo({ - String? author, - required int id, - required int source, - required String cover, - required String title, - String? bvid, - String? url, - int? authorId, - String? sourceDesc, - }) async { + static void pmShare({required Map content}) async { + // debugPrint(content.toString()); + List userList = []; final shareListRes = await GrpcRepo.shareList(size: 3); @@ -64,16 +56,8 @@ class PageUtils { showModalBottomSheet( context: Get.context!, - builder: (context) => ShareVideoPanel( - author: author, - id: id, - source: source, - cover: cover, - title: title, - bvid: bvid, - url: url, - authorId: authorId, - sourceDesc: sourceDesc, + builder: (context) => SharePanel( + content: content, userList: userList, ), useSafeArea: true, diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index 8138bbf5..66319af0 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -39,17 +39,9 @@ class RequestUtils { // 16:番剧(id 为 epid) // 17:番剧 // https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/message/private_msg_content.md - static Future pmShareVideo({ + static Future pmShare({ required int receiverId, - String? author, - required int id, - required int source, - required String cover, - required String title, - String? bvid, - String? url, - int? authorId, - String? sourceDesc, + required Map content, String? message, ValueChanged? callback, }) async { @@ -59,22 +51,10 @@ class RequestUtils { final videoRes = await GrpcRepo.sendMsg( senderUid: ownerMid, receiverId: receiverId, - content: jsonEncode( - { - if (author != null) "author": author, - "headline": title, - "id": id, - "source": source, - "thumb": cover, - "title": title, - if (bvid != null) "bvid": bvid, - // pgc - if (url != null) "url": url, - if (authorId != null) "author_id": authorId, - if (sourceDesc != null) "source_desc": sourceDesc, - }, - ), - msgType: MsgType.EN_MSG_TYPE_SHARE_V2, + content: jsonEncode(content), + msgType: content['source'] is String + ? MsgType.EN_MSG_TYPE_COMMON_SHARE_CARD + : MsgType.EN_MSG_TYPE_SHARE_V2, ); if (videoRes['status']) {