import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:go_router/go_router.dart'; import 'package:paperless_mobile/core/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:paperless_mobile/theme.dart'; class ChangelogDialog extends StatelessWidget { const ChangelogDialog({super.key}); @override Widget build(BuildContext context) { return AlertDialog( contentPadding: EdgeInsets.zero, actionsPadding: const EdgeInsets.all(4), title: Text(S.of(context)!.changelog), content: FutureBuilder( future: _loadChangelog(context), builder: (context, snapshot) { if (!snapshot.hasData) { return const Center( child: CircularProgressIndicator(), ).padded(24); } return SizedBox( width: 1000, child: Markdown( data: snapshot.data!, ), ); }, ), actions: [ TextButton( child: Text(S.of(context)!.close), onPressed: () { context.pop(); }, ), ], ); } Future _loadChangelog(BuildContext context) async { final languageCode = Localizations.localeOf(context).languageCode; final locale = switch (languageCode) { 'de' => 'de-DE', _ => 'en-US', }; 'en-US'; String changelog = await rootBundle.loadString( 'assets/changelogs/changelogs_$locale.md', ); for (var versionNumber in _versionNumbers.keys) { changelog = changelog.replaceFirst( RegExp('# $versionNumber'), '# v${_versionNumbers[versionNumber]!}', ); } return changelog; } } const _versionNumbers = { "58": "3.1.4", "57": "3.1.3", "56": "3.1.2", "55": "3.1.1", "54": "3.1.0", "53": "3.0.6", "52": "3.0.5", "51": "3.0.4", "50": "3.0.3", "49": "3.0.2", "48": "3.0.1", "47": "3.0.0", "46": "2.3.11", "45": "2.3.10", "44": "2.3.9", "43": "2.3.8", "42": "2.3.7", "41": "2.3.6", "40": "2.3.5", "39": "2.3.4", "38": "2.3.3", "37": "2.3.2", "36": "2.3.1", "35": "2.3.0", "34": "2.2.6", "33": "2.2.5", "32": "2.2.4", "31": "2.2.3", "30": "2.2.2", "29": "2.2.1", "28": "2.2.0", "27": "2.1.0", "26": "2.0.9", "25": "2.0.8", "24": "2.0.7", "23": "2.0.6", "22": "2.0.5", "21": "2.0.4", "20": "2.0.3", "19": "2.0.2", "18": "2.0.1", "17": "2.0.0", "16": "1.5.3", "15": "1.5.2", "14": "1.5.1", "13": "1.5.0", "12": "1.4.1", "11": "1.4.0", "10": "1.3.1", "9": "1.3.0", "8": "1.2.2", "7": "1.2.1", "6": "1.2.0", "5": "1.1.0", "3": "1.0.5", "4": "1.0.6", "2": "1.0.4", };