lemmur-app-android/lib/widgets/about_tile.dart

118 lines
3.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../gen/assets.gen.dart';
import '../hooks/memo_future.dart';
import '../pages/log_console/log_console.dart';
import '../resources/links.dart';
import '../url_launcher.dart';
import 'bottom_safe.dart';
/// Title that opens a dialog with information about Lemmur.
/// Licenses, changelog, version etc.
class AboutTile extends HookWidget {
const AboutTile();
@override
Widget build(BuildContext context) {
final packageInfoSnap = useMemoFuture(PackageInfo.fromPlatform);
final assetBundle = DefaultAssetBundle.of(context);
final changelogSnap =
useMemoFuture(() => assetBundle.loadString('CHANGELOG.md'));
final packageInfo = packageInfoSnap.data;
final changelog = changelogSnap.data;
if (!packageInfoSnap.hasData ||
!changelogSnap.hasData ||
packageInfo == null ||
changelog == null) {
return const SizedBox.shrink();
}
return AboutListTile(
icon: const Icon(Icons.info),
aboutBoxChildren: [
TextButton.icon(
icon: const Icon(Icons.subject),
label: const Text('changelog'),
onPressed: () =>
Navigator.of(context).push(ChangelogPage.route(changelog))),
TextButton.icon(
icon: const Icon(Icons.code),
label: const Text('source code'),
onPressed: () =>
launchLink(link: lemmurRepositoryUrl, context: context),
),
TextButton.icon(
icon: const Icon(Icons.monetization_on),
label: const Text('support development'),
onPressed: () {
showDialog(
context: context,
builder: (_) => Dialog(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextButton(
onPressed: () => launchLink(
link: patreonUrl,
context: context,
),
child: const Text('Patreon'),
),
TextButton(
onPressed: () => launchLink(
link: buyMeACoffeeUrl,
context: context,
),
child: const Text('Buy Me a Coffee'),
),
],
),
),
);
},
),
TextButton.icon(
icon: const Icon(Icons.list_alt),
label: const Text('logs'),
onPressed: () {
Navigator.of(context).push(LogConsolePage.route());
},
),
],
applicationIcon: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Assets.appIcon.image(width: 54),
),
applicationVersion: packageInfo.version,
);
}
}
class ChangelogPage extends StatelessWidget {
final String changelog;
const ChangelogPage(this.changelog, {super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Changelog')),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
MarkdownBody(data: changelog),
const BottomSafe(),
],
));
}
static Route route(String changelog) => MaterialPageRoute(
builder: (context) => ChangelogPage(changelog),
);
}