show forwarded dyn pic

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-06-18 20:50:38 +08:00
parent cc4100d74f
commit 448d7c38db
4 changed files with 73 additions and 29 deletions

View File

@@ -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';
}

View File

@@ -493,4 +493,21 @@ class DynamicsHttp {
return Error(res.data['message']);
}
}
static Future<LoadingState<List<OpusPicModel>?>> 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']);
}
}
}

View File

@@ -1175,13 +1175,13 @@ class DynamicOpusModel {
});
String? jumpUrl;
List<OpusPicsModel>? pics;
List<OpusPicModel>? pics;
SummaryModel? summary;
String? title;
DynamicOpusModel.fromJson(Map<String, dynamic> json) {
jumpUrl = json['jump_url'];
pics = (json['pics'] as List?)
?.map<OpusPicsModel>((e) => OpusPicsModel.fromJson(e))
?.map<OpusPicModel>((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<OpusPicsModel>? pics;
List<OpusPicModel>? pics;
String? jumpUrl;
RichTextNodeItem.fromJson(Map<String, dynamic> 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<String, dynamic> json) {
OpusPicModel.fromJson(Map<String, dynamic> 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'];

View File

@@ -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));