diff --git a/lib/http/api.dart b/lib/http/api.dart index 1757f2fc7..72bf8b038 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -953,4 +953,6 @@ class Api { '/x/web-interface/popular/series/list'; static const String popularPrecious = '/x/web-interface/popular/precious'; + + static const String userRealName = '/x/member/app/up/realname'; } diff --git a/lib/http/user.dart b/lib/http/user.dart index 9fcd49ede..a30df31c0 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -11,9 +11,11 @@ import 'package:PiliPlus/models_new/login_log/data.dart'; import 'package:PiliPlus/models_new/media_list/data.dart'; import 'package:PiliPlus/models_new/space_setting/data.dart'; import 'package:PiliPlus/models_new/sub/sub/data.dart'; +import 'package:PiliPlus/models_new/user_real_name/data.dart'; import 'package:PiliPlus/models_new/video/video_tag/data.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; +import 'package:PiliPlus/utils/app_sign.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; @@ -475,4 +477,23 @@ class UserHttp { return Error(res.data['message']); } } + + static Future> getUserRealName( + Object mid, + ) async { + final params = { + 'access_key': Accounts.main.accessKey, + 'up_mid': mid, + }; + AppSign.appSign(params); + final res = await Request().get( + Api.userRealName, + queryParameters: params, + ); + if (res.data['code'] == 0) { + return Success(UserRealNameData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } } diff --git a/lib/models_new/space/space/card.dart b/lib/models_new/space/space/card.dart index 257618f2b..0504e4362 100644 --- a/lib/models_new/space/space/card.dart +++ b/lib/models_new/space/space/card.dart @@ -169,7 +169,7 @@ class SpaceCard { json['live_fans_wearing'] as Map, ), spaceTag: (json['space_tag'] as List?) - ?.where((e) => (e?['title'] as String?)?.startsWith('IP') == true) + ?.where((e) => const ['location', 'real_name'].contains(e['type'])) .map((e) => SpaceTag.fromJson(e as Map)) .toList(), faceNftNew: json['face_nft_new'] as int?, diff --git a/lib/models_new/user_real_name/data.dart b/lib/models_new/user_real_name/data.dart new file mode 100644 index 000000000..250020405 --- /dev/null +++ b/lib/models_new/user_real_name/data.dart @@ -0,0 +1,20 @@ +import 'package:PiliPlus/models_new/user_real_name/reject_page.dart'; + +class UserRealNameData { + String? name; + String? namePrefix; + bool? show; + RejectPage? rejectPage; + + UserRealNameData({this.name, this.namePrefix, this.show, this.rejectPage}); + + factory UserRealNameData.fromJson(Map json) => + UserRealNameData( + name: json['name'] as String?, + namePrefix: json['name_prefix'] as String?, + show: json['show'] as bool?, + rejectPage: json['reject_page'] == null + ? null + : RejectPage.fromJson(json['reject_page'] as Map), + ); +} diff --git a/lib/models_new/user_real_name/reject_page.dart b/lib/models_new/user_real_name/reject_page.dart new file mode 100644 index 000000000..ed9a9efb1 --- /dev/null +++ b/lib/models_new/user_real_name/reject_page.dart @@ -0,0 +1,19 @@ +class RejectPage { + String? title; + String? text; + String? img; + + RejectPage({this.title, this.text, this.img}); + + factory RejectPage.fromJson(Map json) => RejectPage( + title: json['title'] as String?, + text: json['text'] as String?, + img: json['img'] as String?, + ); + + Map toJson() => { + 'title': title, + 'text': text, + 'img': img, + }; +} diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index 6372df873..b4f5454b1 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/models_new/space/space/images.dart'; import 'package:PiliPlus/models_new/space/space/live.dart'; import 'package:PiliPlus/models_new/space/space/pr_info.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/context_ext.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -240,9 +241,9 @@ class UserInfoCard extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 20, top: 6, right: 20), child: Wrap( - spacing: 8, + spacing: 10, runSpacing: 8, - crossAxisAlignment: WrapCrossAlignment.end, + crossAxisAlignment: WrapCrossAlignment.center, children: [ GestureDetector( onTap: () => Utils.copyText(card.mid.toString()), @@ -255,13 +256,23 @@ class UserInfoCard extends StatelessWidget { ), ), ...?card.spaceTag?.map( - (item) => Text( - item.title ?? '', - style: TextStyle( - fontSize: 12, - color: colorScheme.outline, - ), - ), + (item) { + final hasUri = item.uri?.isNotEmpty == true; + final child = Text( + item.title ?? '', + style: TextStyle( + fontSize: 12, + color: hasUri ? colorScheme.secondary : colorScheme.outline, + ), + ); + if (hasUri) { + return GestureDetector( + onTap: () => PiliScheme.routePushFromUrl(item.uri!), + child: child, + ); + } + return child; + }, ), ], ), diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index 7406210e8..7f1901d94 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -195,8 +195,8 @@ class _UgcIntroPanelState extends State { if (introController.enableAi) _aiBtn, ], ), - if (videoDetail.argueInfo?.argueMsg?.isNotEmpty == true && - introController.showArgueMsg) ...[ + if (introController.showArgueMsg && + videoDetail.argueInfo?.argueMsg?.isNotEmpty == true) ...[ const SizedBox(height: 2), Text.rich( TextSpan( diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index a0fbdc0a6..ff5fbacb6 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -11,6 +11,7 @@ import 'package:PiliPlus/pages/video/reply_reply/view.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/url_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:app_links/app_links.dart'; @@ -102,6 +103,10 @@ abstract class PiliScheme { // bilibili://space/12345678?frommodule=XX&h5awaken=random String? mid = uriDigitRegExp.firstMatch(path)?.group(1); if (mid != null) { + if (path.startsWith('/realname')) { + RequestUtils.showUserRealName(mid); + return true; + } PageUtils.toDupNamed('/member?mid=$mid', off: off); return true; } diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index e36b0ca59..27832a5cb 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -24,6 +24,7 @@ import 'package:PiliPlus/pages/group_panel/view.dart'; import 'package:PiliPlus/pages/later/controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/context_ext.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; @@ -618,4 +619,28 @@ abstract class RequestUtils { ) ..startCaptcha(registerData); } + + static Future showUserRealName(String mid) async { + final res = await UserHttp.getUserRealName(mid); + if (res.isSuccess) { + final data = res.data; + final show = !data.name.isNullOrEmpty; + Get.dialog( + AlertDialog( + title: SelectableText( + show ? data.name! : data.rejectPage?.title ?? '', + ), + content: show ? null : Text(data.rejectPage?.text ?? ''), + actions: [ + TextButton( + onPressed: Get.back, + child: const Text('关闭'), + ), + ], + ), + ); + } else { + res.toast(); + } + } }