diff --git a/lib/config/ui_config.dart b/lib/config/ui_config.dart index b21c57f3..bd19bd81 100644 --- a/lib/config/ui_config.dart +++ b/lib/config/ui_config.dart @@ -138,6 +138,11 @@ abstract class AboutUsConfig { static const borderRadius = 8.0; static const iconPadding = 10.0; static const photoSize = 92.0; + + static const dialogHorizontalPadding = 14.0; + static const dialogVerticalPadding = 20.0; + static const dialogButtonFontSize = 16.0; + static const dialogTitleFontSize = 24.0; } abstract class GuideDetailViewConfig { diff --git a/lib/features/about_us_view/utils/custom_license_dialog.dart b/lib/features/about_us_view/utils/custom_license_dialog.dart new file mode 100644 index 00000000..1fe88c00 --- /dev/null +++ b/lib/features/about_us_view/utils/custom_license_dialog.dart @@ -0,0 +1,145 @@ +import "package:flutter/material.dart"; + +import "../../../config/ui_config.dart"; +import "../../../theme/app_theme.dart"; +import "../../../utils/context_extensions.dart"; + +Future showCustomLicenseDialog({ + required BuildContext context, + required String applicationName, + required String applicationVersion, + required String applicationLegalese, + required Widget applicationIcon, +}) async { + await showDialog( + context: context, + builder: (BuildContext context) { + return _AlertDialog( + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationLegalese: applicationLegalese, + applicationIcon: applicationIcon, + ); + }, + ); +} + +class _AlertDialog extends StatelessWidget { + final String applicationName; + final String applicationVersion; + final String applicationLegalese; + final Widget applicationIcon; + + const _AlertDialog({ + required this.applicationName, + required this.applicationVersion, + required this.applicationLegalese, + required this.applicationIcon, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + content: Padding( + padding: const EdgeInsets.symmetric( + horizontal: AboutUsConfig.dialogHorizontalPadding, + vertical: AboutUsConfig.dialogVerticalPadding, + ), + child: _DialogContent( + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationIcon: applicationIcon, + applicationLegalese: applicationLegalese, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + child: Text( + context.localize.show_license, + style: context.textTheme.bodyOrange.copyWith( + fontSize: AboutUsConfig.dialogButtonFontSize, + ), + ), + onPressed: () { + showLicensePage( + context: context, + applicationName: applicationName, + applicationIcon: applicationIcon, + applicationVersion: applicationVersion, + applicationLegalese: applicationLegalese, + ); + }, + ), + TextButton( + child: Text( + context.localize.close, + style: context.textTheme.body.copyWith( + fontSize: AboutUsConfig.dialogButtonFontSize, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), + ], + ); + } +} + +class _DialogContent extends StatelessWidget { + const _DialogContent({ + required this.applicationName, + required this.applicationVersion, + required this.applicationIcon, + required this.applicationLegalese, + }); + + final String applicationName; + final String applicationVersion; + final Widget applicationIcon; + final String applicationLegalese; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + applicationName, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: AboutUsConfig.dialogTitleFontSize, + ), + ), + Text( + applicationVersion, + style: context.textTheme.lightTitle, + ), + ], + ), + applicationIcon, + ], + ), + const SizedBox( + height: 20, + ), + Text( + applicationLegalese, + style: context.textTheme.body, + ), + ], + ); + } +} diff --git a/lib/features/about_us_view/widgets/app_version.dart b/lib/features/about_us_view/widgets/app_version.dart index 9b910b4e..c88607c2 100644 --- a/lib/features/about_us_view/widgets/app_version.dart +++ b/lib/features/about_us_view/widgets/app_version.dart @@ -5,6 +5,7 @@ import "../../../config/ui_config.dart"; import "../../../theme/app_theme.dart"; import "../../../utils/context_extensions.dart"; import "../../splash_screen/widgets/flutter_splash_screen.dart"; +import "../utils/custom_license_dialog.dart"; class AppVersionTile extends StatelessWidget { const AppVersionTile({super.key}); @@ -31,16 +32,22 @@ class AppVersionTile extends StatelessWidget { horizontal: WideTileCardConfig.basePadding, ), horizontalTitleGap: 8, - onTap: () { + onTap: () async { // TODO(simon-the-shark): customize [LicensePage] theme - showAboutDialog( + await showCustomLicenseDialog( context: context, - applicationIcon: const SizedBox.square( - dimension: 20, - child: FlutterSplashScreen(), + applicationIcon: Container( + width: 50, + height: 50, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + ), + child: const FlutterSplashScreen(), ), applicationName: MyAppConfig.title, - applicationVersion: snapshot.data?.version, + applicationVersion: + snapshot.data?.version ?? context.localize.no_version, applicationLegalese: "\u{a9} 2024 Koło Naukowe Solvro, Politechnika Wrocławska", ); diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 111a8a86..1caf7fa8 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -96,5 +96,8 @@ "praise" : "Pochwała", "until_the_end_of_the_semester_break": "do końca przerwy międzysemestralnej", "until_the_session_ends": "do zakończenia sesji", - "app_info": "(informacje o aplikacji)" + "app_info": "(informacje o aplikacji)", + "show_license": "Wyświelt licencję", + "close": "Zamknij", + "no_version": "Brak wersji" } \ No newline at end of file