Files
PiliPlus/lib/pages/video/reply_search_item/child/widgets/item.dart
bggRGjQaUbCoE 05153fda72 opt pub page
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-07-09 12:02:28 +08:00

126 lines
4.1 KiB
Dart

import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show SearchItem, SearchItemVideoSubType;
import 'package:PiliPlus/models/common/badge_type.dart';
import 'package:PiliPlus/models/common/reply/reply_search_type.dart';
import 'package:PiliPlus/utils/duration_util.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class ReplySearchItem extends StatelessWidget {
const ReplySearchItem({
super.key,
required this.item,
required this.type,
});
final SearchItem item;
final ReplySearchType type;
@override
Widget build(BuildContext context) {
String title = '';
String cover = '';
String? upNickname;
String? category;
int? duration;
switch (type) {
case ReplySearchType.video:
if (item.video.type == SearchItemVideoSubType.UGC) {
final ugc = item.video.ugc;
title = ugc.title;
cover = ugc.cover;
upNickname = ugc.upNickname;
duration = ugc.duration.toInt();
} else {
final pgc = item.video.pgc;
title = pgc.title;
cover = pgc.cover;
category = pgc.category;
}
case ReplySearchType.article:
final article = item.article;
title = article.title;
cover = article.covers.firstOrNull ?? '';
upNickname = article.upNickname;
}
return Material(
type: MaterialType.transparency,
child: InkWell(
onTap: () => Get.back(result: (title: title, url: item.url)),
onLongPress: () => imageSaveDialog(
title: title,
cover: cover,
),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: StyleString.safeSpace,
vertical: 5,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: StyleString.aspectRatio,
child: LayoutBuilder(
builder: (context, boxConstraints) {
return Stack(
children: [
NetworkImgLayer(
src: cover,
width: boxConstraints.maxWidth,
height: boxConstraints.maxHeight,
),
if (category != null)
PBadge(
right: 6,
top: 6,
text: category,
),
if (duration != null)
PBadge(
right: 6,
bottom: 6,
text: DurationUtil.formatDuration(duration),
type: PBadgeType.gray,
),
],
);
},
),
),
const SizedBox(width: 10),
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
title,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
if (upNickname != null)
Text(
'UP: $upNickname',
style: TextStyle(
fontSize: 12,
color: Theme.of(context).colorScheme.outline,
),
),
],
),
),
],
),
),
),
);
}
}