diff --git a/lib/http/api.dart b/lib/http/api.dart index 478b5211f..5b32ad6a5 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -892,4 +892,6 @@ class Api { static const String dynTopicRcmd = '/x/topic/web/dynamic/rcmd'; static const String matchInfo = '/x/esports/match/info'; + + static const String dynPic = '/x/polymer/web-dynamic/v1/detail/pic'; } diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index 2cf4e2928..406b364a5 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -493,4 +493,21 @@ class DynamicsHttp { return Error(res.data['message']); } } + + static Future?>> dynPic(dynamic id) async { + final res = await Request().get( + Api.dynPic, + queryParameters: { + 'id': id, + 'web_location': 333.1368, + }, + ); + if (res.data['code'] == 0) { + return Success((res.data['data'] as List?) + ?.map((e) => OpusPicModel.fromJson(e)) + .toList()); + } else { + return Error(res.data['message']); + } + } } diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 03083f4e9..5c2d929d5 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -1175,13 +1175,13 @@ class DynamicOpusModel { }); String? jumpUrl; - List? pics; + List? pics; SummaryModel? summary; String? title; DynamicOpusModel.fromJson(Map json) { jumpUrl = json['jump_url']; pics = (json['pics'] as List?) - ?.map((e) => OpusPicsModel.fromJson(e)) + ?.map((e) => OpusPicModel.fromJson(e)) .toList(); summary = json['summary'] != null ? SummaryModel.fromJson(json['summary']) : null; @@ -1219,7 +1219,7 @@ class RichTextNodeItem { String? text; String? type; String? rid; - List? pics; + List? pics; String? jumpUrl; RichTextNodeItem.fromJson(Map json) { @@ -1231,7 +1231,7 @@ class RichTextNodeItem { pics = json['pics'] == null ? null : (json['pics'] as List?) - ?.map((e) => OpusPicsModel.fromJson(e)) + ?.map((e) => OpusPicModel.fromJson(e)) .toList(); jumpUrl = json['jump_url']; } @@ -1267,26 +1267,23 @@ class DynamicNoneModel { } } -class OpusPicsModel { - OpusPicsModel({ +class OpusPicModel { + OpusPicModel({ this.width, this.height, - this.size, this.src, this.url, }); int? width; int? height; - int? size; String? src; String? url; String? liveUrl; - OpusPicsModel.fromJson(Map json) { + OpusPicModel.fromJson(Map json) { width = json['width']; height = json['height']; - size = json['size'] != null ? json['size'].toInt() : 0; src = json['src']; url = json['url']; liveUrl = json['live_url']; diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index ae72a3043..53a324452 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -1,10 +1,14 @@ import 'package:PiliPlus/common/widgets/image/image_view.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; +import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/search.dart'; +import 'package:PiliPlus/models/common/image_preview_type.dart' + show SourceModel; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -235,28 +239,52 @@ TextSpan? richNode( ), ); break; - case 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE' - when (i.pics?.isNotEmpty == true): - spanChildren - ..add(const TextSpan(text: '\n')) - ..add( - WidgetSpan( - child: LayoutBuilder( - builder: (context, constraints) { - return imageView( - constraints.maxWidth, - i.pics! - .map((item) => ImageModel( - url: item.src ?? '', - width: item.width, - height: item.height, - )) - .toList(), - ); - }, + case 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE': + if (i.pics?.isNotEmpty == true) { + spanChildren + ..add(const TextSpan(text: '\n')) + ..add( + WidgetSpan( + child: LayoutBuilder( + builder: (context, constraints) { + return imageView( + constraints.maxWidth, + i.pics! + .map((item) => ImageModel( + url: item.src ?? '', + width: item.width, + height: item.height, + )) + .toList(), + ); + }, + ), ), + ); + } else { + spanChildren.add( + TextSpan( + text: i.text, + style: style, + recognizer: TapGestureRecognizer() + ..onTap = () { + DynamicsHttp.dynPic(i.rid).then((res) { + if (res.isSuccess) { + var list = res.data; + if (list?.isNotEmpty == true) { + Get.context!.imageView( + imgList: list! + .map((e) => SourceModel(url: e.src!)) + .toList()); + } + } else { + res.toast(); + } + }); + }, ), ); + } break; default: spanChildren.add(TextSpan(text: i.text, style: style));