136 lines
4.4 KiB
Dart
136 lines
4.4 KiB
Dart
import 'package:collection/collection.dart';
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:gap/gap.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:island/models/post.dart';
|
|
import 'package:island/widgets/post/post_shared.dart';
|
|
import 'package:qr_flutter/qr_flutter.dart';
|
|
import 'package:styled_widget/styled_widget.dart';
|
|
|
|
class PostItemScreenshot extends ConsumerWidget {
|
|
final SnPost item;
|
|
final EdgeInsets? padding;
|
|
final bool isFullPost;
|
|
final bool isShowReference;
|
|
const PostItemScreenshot({
|
|
super.key,
|
|
required this.item,
|
|
this.padding,
|
|
this.isFullPost = false,
|
|
this.isShowReference = true,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final renderingPadding =
|
|
padding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 8);
|
|
|
|
final mostReaction =
|
|
item.reactionsCount.isEmpty
|
|
? null
|
|
: item.reactionsCount.entries
|
|
.sortedBy((e) => e.value)
|
|
.map((e) => e.key)
|
|
.last;
|
|
|
|
final isDark = MediaQuery.of(context).platformBrightness == Brightness.dark;
|
|
|
|
return Material(
|
|
elevation: 0,
|
|
color: Theme.of(context).colorScheme.surface,
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Gap(renderingPadding.vertical),
|
|
PostHeader(
|
|
item: item,
|
|
isFullPost: isFullPost,
|
|
isInteractive: false,
|
|
renderingPadding: renderingPadding,
|
|
isRelativeTime: false,
|
|
trailing:
|
|
mostReaction != null
|
|
? Row(
|
|
children: [
|
|
Text(
|
|
kReactionTemplates[mostReaction]?.icon ?? '',
|
|
style: const TextStyle(fontSize: 20),
|
|
),
|
|
const Gap(4),
|
|
Text(
|
|
'x${item.reactionsCount[mostReaction]}',
|
|
style: const TextStyle(fontSize: 11),
|
|
),
|
|
],
|
|
)
|
|
: null,
|
|
),
|
|
PostBody(
|
|
item: item,
|
|
renderingPadding: renderingPadding,
|
|
isFullPost: isFullPost,
|
|
isTextSelectable: false,
|
|
isInteractive: false,
|
|
),
|
|
if (isShowReference)
|
|
ReferencedPostWidget(
|
|
item: item,
|
|
isInteractive: false,
|
|
renderingPadding: renderingPadding,
|
|
),
|
|
Container(
|
|
color: Theme.of(context).colorScheme.surfaceContainerLow,
|
|
margin: const EdgeInsets.only(top: 8),
|
|
padding: EdgeInsets.symmetric(
|
|
horizontal: renderingPadding.horizontal,
|
|
vertical: 4,
|
|
),
|
|
child: Row(
|
|
children: [
|
|
SizedBox(
|
|
width: 44,
|
|
height: 44,
|
|
child: Image.asset(
|
|
'assets/icons/icon${isDark ? '-dark' : ''}.png',
|
|
width: 40,
|
|
height: 40,
|
|
),
|
|
).padding(vertical: 8, right: 12),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const Text(
|
|
'Solar Network',
|
|
style: TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
const Text(
|
|
'sharePostSlogan',
|
|
style: TextStyle(fontSize: 12),
|
|
).tr().opacity(0.9),
|
|
],
|
|
),
|
|
),
|
|
QrImageView(
|
|
data: 'https://solian.app/posts/${item.id}',
|
|
version: QrVersions.auto,
|
|
size: 60,
|
|
errorCorrectionLevel: QrErrorCorrectLevel.M,
|
|
backgroundColor: Colors.transparent,
|
|
foregroundColor: Theme.of(context).colorScheme.onSurface,
|
|
padding: const EdgeInsets.all(8),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|