relatica/lib/controls/timeline/status_header_control.dart

136 lines
4 KiB
Dart
Raw Normal View History

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../globals.dart';
import '../../models/connection.dart';
import '../../models/timeline_entry.dart';
import '../../routes.dart';
import '../../services/connections_manager.dart';
import '../../utils/dateutils.dart';
import '../../utils/url_opening_utils.dart';
import '../padding.dart';
class StatusHeaderControl extends StatelessWidget {
final TimelineEntry entry;
final bool openRemote;
final bool showOpenControl;
const StatusHeaderControl(
{super.key,
required this.entry,
required this.openRemote,
required this.showOpenControl});
2022-12-28 03:54:33 +00:00
void goToProfile(BuildContext context, String id) {
context.pushNamed(ScreenPaths.userProfile, params: {'id': id});
}
@override
Widget build(BuildContext context) {
final author = getIt<ConnectionsManager>()
2022-12-28 03:54:33 +00:00
.getById(entry.authorId)
.getValueOrElse(() => Connection());
final reshareAuthor = getIt<ConnectionsManager>()
.getById(entry.reshareAuthorId)
.getValueOrElse(() => Connection());
return Wrap(
children: [
GestureDetector(
2022-12-28 03:54:33 +00:00
onTap: () => goToProfile(context, author.id),
child: CachedNetworkImage(
imageUrl: author.avatarUrl.toString(),
width: 32.0,
),
),
const HorizontalPadding(),
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector(
2022-12-28 03:54:33 +00:00
onTap: () => goToProfile(context, author.id),
child: Text(
author.name,
style: Theme.of(context).textTheme.bodyText1,
),
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
ElapsedDateUtils.epochSecondsToString(
entry.backdatedTimestamp),
style: Theme.of(context).textTheme.caption,
),
const HorizontalPadding(),
Icon(
entry.isPublic ? Icons.public : Icons.lock,
color: Theme.of(context).hintColor,
size: Theme.of(context).textTheme.caption?.fontSize,
),
],
),
// Text(
// entry.id,
// ),
],
),
2022-12-28 03:54:33 +00:00
if (reshareAuthor.isNotEmpty) ...[
const HorizontalPadding(width: 3.0),
const Icon(Icons.repeat),
const HorizontalPadding(width: 3.0),
GestureDetector(
onTap: () => goToProfile(context, reshareAuthor.id),
child: CachedNetworkImage(
imageUrl: reshareAuthor.avatarUrl.toString(),
width: 32.0,
),
),
const HorizontalPadding(width: 3.0),
GestureDetector(
onTap: () => goToProfile(context, reshareAuthor.id),
child: Text(
reshareAuthor.name,
style: Theme.of(context).textTheme.bodyText1,
),
),
],
if (showOpenControl) ...[
SizedBox(
width: 20.0,
),
buildActionBar(context),
],
],
);
}
Widget buildActionBar(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: () async {
await _openAction(context);
},
icon: const Icon(Icons.launch),
),
],
);
}
Future<void> _openAction(BuildContext context) async {
if (openRemote) {
final openInBrowser =
await showYesNoDialog(context, 'Open in external browser?');
if (openInBrowser == true) {
await openUrlStringInSystembrowser(context, entry.externalLink, 'Post');
}
} else {
context.push('/post/view/${entry.id}');
}
}
}