loris/lib/partials/post_options.dart

143 lines
4.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:localization/localization.dart';
import 'package:loris/business_logic/interactions/interactions.dart';
import 'package:loris/business_logic/timeline/timeline.dart';
import 'package:loris/dialogues/full_post_view.dart';
import 'package:loris/partials/interaction_button.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:clipboard/clipboard.dart';
import 'package:loris/global.dart' as global;
void popupPostOptions(context, PostModel model) {
showModalBottomSheet(
barrierColor: Colors.transparent,
context: context,
builder: (context) => PostOptions(model: model),
);
}
class PostOptions extends StatefulWidget {
const PostOptions({Key? key, required this.model}) : super(key: key);
final PostModel model;
@override
State<PostOptions> createState() => _PostOptionsState();
}
class _PostOptionsState extends State<PostOptions> {
bool justCopied = false;
@override
Widget build(BuildContext context) {
final time = DateTime.parse(widget.model.createdAt).toLocal();
List<Widget?> c = [
const SizedBox(
height: 24,
),
// title
SelectableText("post-options".i18n(),
style: Theme.of(context).textTheme.displayMedium),
// time
SelectableText(
"${"day-${time.weekday}".i18n()} ${time.day}.${time.month}.${time.year} ${time.hour}:${time.minute} ${time.timeZoneName.toLowerCase()}",
style: Theme.of(context).textTheme.bodyMedium,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(widget.model.visibility.icon),
SelectableText(widget.model.visibility.name),
],
),
const SizedBox(
height: 24,
),
TextButton.icon(
onPressed: () => showDialog(
barrierColor: Colors.transparent,
context: context,
builder: (context) =>
FullPostView(originPostModel: widget.model),
),
icon: const Icon(
Icons.open_in_full,
),
label: Text("show-in-full".i18n())),
TextButton.icon(
onPressed: () async {
FlutterClipboard.copy(widget.model.uri);
setState(() {
justCopied = true;
});
await Future.delayed(const Duration(seconds: 1));
if (mounted) {
setState(() {
justCopied = false;
});
}
},
icon: const Icon(Icons.copy),
label: Text(
justCopied
? "${"copied-post-by".i18n()} ${widget.model.account.acct}"
: "copy-url-to-clipboard".i18n(),
),
),
TextButton.icon(
onPressed: () {
launchUrl(
Uri.parse(widget.model.uri),
);
},
icon: const Icon(Icons.open_in_browser),
label: Text(
"show-in-browser".i18n(),
),
),
widget.model.visibility.boostable
? InteractionButton(
model: widget.model,
type: InteractionType.reblog,
extended: true,
)
: null,
InteractionButton(
model: widget.model,
type: InteractionType.favorite,
extended: true,
),
if ("${widget.model.account.acct}@${global.settings!.identities[widget.model.identity]!.instanceUrl}" ==
widget.model.identity)
TextButton.icon(
onPressed: () async {
final result = await deletePost(widget.model);
if (result == 200) {
// ignore: use_build_context_synchronously
Navigator.of(context).pop();
// ignore: use_build_context_synchronously
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("post-deleted".i18n())));
}
// ignore: use_build_context_synchronously
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("deletion-failed".i18n())));
},
icon: const Icon(Icons.delete),
label: Text("delete-this".i18n())),
const SizedBox(
height: 24,
),
];
return SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
for (var i in c)
if (i != null) i
],
),
);
}
}