From d5293fbc721835d15f3ff50ab7e193e43aa70ce1 Mon Sep 17 00:00:00 2001 From: My-Responsitories <107370289+My-Responsitories@users.noreply.github.com> Date: Fri, 15 May 2026 10:42:38 +0000 Subject: [PATCH] feat: handle vote uri (#2105) --- lib/http/dynamics.dart | 5 ++++- lib/pages/dynamics/widgets/vote.dart | 13 +++++-------- lib/pages/dynamics_topic/view.dart | 3 ++- lib/utils/app_scheme.dart | 23 +++++++++++++++++------ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index 7ef924a8d..340337f83 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -375,7 +375,10 @@ abstract final class DynamicsHttp { queryParameters: {'vote_id': voteId}, ); if (res.data['code'] == 0) { - return Success(VoteInfo.fromSeparatedJson(res.data['data'])); + final voteInfo = VoteInfo.fromSeparatedJson(res.data['data']); + return voteInfo.voteId == null + ? const Error('无效的投票id') + : Success(voteInfo); } else { return Error(res.data['message']); } diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index 0e4f8947f..48a3bf88f 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -48,7 +48,7 @@ class _VotePanelState extends State { late bool _showPercentage = !_enabled; late final _maxCnt = _voteInfo.choiceCnt ?? _voteInfo.options.length; final isLogin = Accounts.main.isLogin; - late final Rxn> followeeVote = Rxn>(); + late final followeeVote = Rxn>(); @override void initState() { @@ -551,18 +551,15 @@ Future showVoteDialog( ]) async { final voteInfo = await DynamicsHttp.voteInfo(voteId); if (context.mounted) { - if (voteInfo.isSuccess) { + if (voteInfo case Success(:final response)) { showDialog( context: context, builder: (context) => Dialog( - constraints: const BoxConstraints( - minWidth: 280, - maxWidth: 625, - ), + constraints: const BoxConstraints(minWidth: 280, maxWidth: 625), child: Padding( - padding: const EdgeInsets.all(24), + padding: const .all(24), child: VotePanel( - voteInfo: voteInfo.data, + voteInfo: response, onVote: (votes, anonymous) => DynamicsHttp.doVote( voteId: voteId, votes: votes.toList(), diff --git a/lib/pages/dynamics_topic/view.dart b/lib/pages/dynamics_topic/view.dart index d7c1114ae..9249e2d68 100644 --- a/lib/pages/dynamics_topic/view.dart +++ b/lib/pages/dynamics_topic/view.dart @@ -6,6 +6,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart'; +import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/item.dart'; @@ -315,7 +316,7 @@ class _DynTopicPageState extends State with DynMixin { return; } PageUtils.inAppWebview( - 'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${ThemeUtils.themeUrl(colorScheme.isDark)}', + '${HttpString.baseUrl}/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${ThemeUtils.themeUrl(colorScheme.isDark)}', ); }, ), diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index 334340417..60790d644 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -7,6 +7,7 @@ import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/models/common/fav_type.dart'; import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/pages/audio/view.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/pages/fan/view.dart'; import 'package:PiliPlus/pages/follow/view.dart'; import 'package:PiliPlus/pages/follow_type/followed/view.dart'; @@ -478,13 +479,25 @@ abstract final class PiliScheme { } final String path = uri.path; + late final queryParameters = uri.queryParameters; if (host.contains('t.bilibili.com')) { - bool hasMatch = _onPushDynDetail(uri, off); - if (!hasMatch) { - launchURL(); + if (_onPushDynDetail(uri, off)) { + return true; + } else if (path.startsWith('/vote')) { + // t.bilibili.com/vote/h5/index?vote_id={{vote_id}}#/result + if (queryParameters['vote_id'] case final voteIdStr?) { + final voteId = int.tryParse(voteIdStr); + if (voteId != null) { + if (Get.context != null) { + showVoteDialog(Get.context!, voteId); + } + return true; + } + } } - return hasMatch; + launchURL(); + return false; } else if (host.contains('live.bilibili.com')) { String? roomId = uriDigitRegExp.firstMatch(path)?.group(1); if (roomId != null) { @@ -513,8 +526,6 @@ abstract final class PiliScheme { } } - late final queryParameters = uri.queryParameters; - // space.bilibili.com/h5/follow?mid={{mid}}&type={{type}} if (path.startsWith('/h5/follow')) { final mid = queryParameters['mid'];