import "package:inventree/api.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/settings/release.dart"; import "package:flutter/material.dart"; import "package:flutter/services.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:inventree/l10.dart"; import "package:url_launcher/url_launcher.dart"; class InvenTreeAboutWidget extends StatelessWidget { const InvenTreeAboutWidget(this.info) : super(); final PackageInfo info; Future _releaseNotes(BuildContext context) async { // Load release notes from external file String notes = await rootBundle.loadString("assets/release_notes.md"); Navigator.push( context, MaterialPageRoute(builder: (context) => ReleaseNotesWidget(notes)) ); } Future _credits(BuildContext context) async { String notes = await rootBundle.loadString("assets/credits.md"); Navigator.push( context, MaterialPageRoute(builder: (context) => CreditsWidget(notes)) ); } Future _openDocs() async { var docsUrl = Uri( scheme: "https", host: "docs.inventree.org", path: "en/latest/app/app/"); if (await canLaunchUrl(docsUrl)) { await launchUrl(docsUrl); } } Future _reportBug(BuildContext context) async { var url = Uri( scheme: "https", host: "github.com", path: "inventree/inventree-app/issues/new?title=Enter+bug+description"); if (await canLaunchUrl(url)) { await launchUrl(url); } } Future _translate() async { var url = Uri( scheme: "https", host: "crowdin.com", path: "/project/inventree"); if (await canLaunchUrl(url)) { await launchUrl(url); } } @override Widget build(BuildContext context) { List tiles = []; tiles.add( ListTile( title: Text( L10().serverDetails, style: TextStyle(fontWeight: FontWeight.bold), ), ) ); if (InvenTreeAPI().isConnected()) { tiles.add( ListTile( title: Text(L10().address), subtitle: Text(InvenTreeAPI().baseUrl.isNotEmpty ? InvenTreeAPI().baseUrl : L10().notConnected), leading: Icon(TablerIcons.globe), trailing: InvenTreeAPI().isConnected() ? Icon(TablerIcons.circle_check, color: COLOR_SUCCESS) : Icon(TablerIcons.circle_x, color: COLOR_DANGER), ) ); tiles.add( ListTile( title: Text(L10().username), subtitle: Text(InvenTreeAPI().username), leading: InvenTreeAPI().username.isNotEmpty ? Icon(TablerIcons.user) : Icon(TablerIcons.user_cancel, color: COLOR_DANGER), ) ); tiles.add( ListTile( title: Text(L10().version), subtitle: Text(InvenTreeAPI().serverVersion.isNotEmpty ? InvenTreeAPI().serverVersion : L10().notConnected), leading: Icon(TablerIcons.info_circle), ) ); tiles.add( ListTile( title: Text(L10().serverInstance), subtitle: Text(InvenTreeAPI().serverInstance.isNotEmpty ? InvenTreeAPI().serverInstance : L10().notConnected), leading: Icon(TablerIcons.server), ) ); // Display extra tile if the server supports plugins tiles.add( ListTile( title: Text(L10().pluginSupport), subtitle: Text(L10().pluginSupportDetail), leading: Icon(TablerIcons.plug), ) ); } else { tiles.add( ListTile( title: Text(L10().notConnected), subtitle: Text( L10().serverNotConnected, style: TextStyle(fontStyle: FontStyle.italic), ), leading: Icon(TablerIcons.exclamation_circle) ) ); } tiles.add( ListTile( title: Text( L10().appDetails, style: TextStyle(fontWeight: FontWeight.bold), ), ) ); tiles.add( ListTile( title: Text(L10().packageName), subtitle: Text("${info.packageName}"), leading: Icon(TablerIcons.box) ) ); tiles.add( ListTile( title: Text(L10().version), subtitle: Text("${info.version} - Build ${info.buildNumber}"), leading: Icon(TablerIcons.info_circle) ) ); tiles.add( ListTile( title: Text(L10().releaseNotes), subtitle: Text(L10().appReleaseNotes), leading: Icon(TablerIcons.file, color: COLOR_ACTION), onTap: () { _releaseNotes(context); }, ) ); tiles.add( ListTile( title: Text(L10().credits), subtitle: Text(L10().appCredits), leading: Icon(TablerIcons.balloon, color: COLOR_ACTION), onTap: () { _credits(context); } ) ); tiles.add( ListTile( title: Text(L10().documentation), subtitle: Text("https://docs.inventree.org/app"), leading: Icon(TablerIcons.book, color: COLOR_ACTION), onTap: () { _openDocs(); }, ) ); tiles.add( ListTile( title: Text(L10().translate), subtitle: Text(L10().translateHelp), leading: Icon(TablerIcons.language, color: COLOR_ACTION), onTap: () { _translate(); } ) ); tiles.add( ListTile( title: Text(L10().reportBug), subtitle: Text(L10().reportBugDescription), leading: Icon(TablerIcons.bug, color: COLOR_ACTION), onTap: () { _reportBug(context); }, ) ); return Scaffold( appBar: AppBar( title: Text(L10().appAbout), ), body: ListView( children: ListTile.divideTiles( context: context, tiles: tiles, ).toList(), ) ); } }