diff --git a/lib/main.dart b/lib/main.dart index 039386b07..aebb4644d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_user_agent/flutter_user_agent.dart'; import 'package:genshindb/domain/services/locale_service.dart'; import 'package:genshindb/domain/services/telemetry_service.dart'; @@ -14,6 +15,7 @@ import 'presentation/app_widget.dart'; Future main() async { //This is required by app center WidgetsFlutterBinding.ensureInitialized(); + await FlutterUserAgent.init(); await initInjection(); runApp(MyApp()); } diff --git a/lib/presentation/game_codes/game_codes_page.dart b/lib/presentation/game_codes/game_codes_page.dart index db761c487..331a003b7 100644 --- a/lib/presentation/game_codes/game_codes_page.dart +++ b/lib/presentation/game_codes/game_codes_page.dart @@ -10,6 +10,7 @@ import 'package:genshindb/presentation/shared/loading.dart'; import 'package:genshindb/presentation/shared/styles.dart'; import 'package:genshindb/presentation/shared/utils/toast_utils.dart'; import 'package:genshindb/presentation/shared/wrapped_ascension_material.dart'; +import 'package:url_launcher/url_launcher.dart'; class GameCodesPage extends StatelessWidget { const GameCodesPage({ @@ -20,7 +21,15 @@ class GameCodesPage extends StatelessWidget { Widget build(BuildContext context) { final s = S.of(context); return Scaffold( - appBar: AppBar(title: Text(s.gameCodes)), + appBar: AppBar( + title: Text(s.gameCodes), + actions: [ + IconButton( + icon: const Icon(Icons.open_in_new), + onPressed: () => _launchUrl('https://genshin.mihoyo.com/en/gift'), + ) + ], + ), body: SafeArea( child: SingleChildScrollView( child: Padding( @@ -107,4 +116,10 @@ class GameCodesPage extends StatelessWidget { ], ); } + + Future _launchUrl(String url) async { + if (await canLaunch(url)) { + await launch(url); + } + } } diff --git a/lib/presentation/home/home_page.dart b/lib/presentation/home/home_page.dart index 99f1d1a7a..a964e8a34 100644 --- a/lib/presentation/home/home_page.dart +++ b/lib/presentation/home/home_page.dart @@ -8,6 +8,7 @@ import 'package:genshindb/presentation/today_materials/materials_page.dart'; import 'widgets/sliver_calculators_card.dart'; import 'widgets/sliver_characters_birthday_card.dart'; import 'widgets/sliver_elements_card.dart'; +import 'widgets/sliver_game_codes_card.dart'; import 'widgets/sliver_main_title.dart'; import 'widgets/sliver_settings_card.dart'; import 'widgets/sliver_today_char_ascension_materials.dart'; @@ -44,6 +45,8 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin< SliverWishSimulatorCard(), SliverMainTitle(title: s.tierListBuilder), SliverTierList(), + SliverMainTitle(title: s.gameCodes), + SliverGameCodesCard(), SliverMainTitle(title: s.settings), SliverSettingsCard(), ], diff --git a/lib/presentation/home/widgets/sliver_game_codes_card.dart b/lib/presentation/home/widgets/sliver_game_codes_card.dart new file mode 100644 index 000000000..33b45d88e --- /dev/null +++ b/lib/presentation/home/widgets/sliver_game_codes_card.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:genshindb/application/bloc.dart'; +import 'package:genshindb/generated/l10n.dart'; +import 'package:genshindb/presentation/game_codes/game_codes_page.dart'; + +import 'sliver_card_item.dart'; + +class SliverGameCodesCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final s = S.of(context); + return SliverCardItem( + onClick: _showGameCodesDialog, + icon: Icon(Icons.code, size: 60, color: theme.accentColor), + children: [ + Text(s.seeAllInGameGameCodes, textAlign: TextAlign.center, style: theme.textTheme.subtitle2), + ], + ); + } + + Future _showGameCodesDialog(BuildContext context) async { + context.read().add(const GameCodesEvent.opened()); + await Navigator.push(context, MaterialPageRoute(fullscreenDialog: true, builder: (ctx) => const GameCodesPage())); + } +} diff --git a/lib/presentation/home/widgets/sliver_settings_card.dart b/lib/presentation/home/widgets/sliver_settings_card.dart index 8caa8d04d..477430d60 100644 --- a/lib/presentation/home/widgets/sliver_settings_card.dart +++ b/lib/presentation/home/widgets/sliver_settings_card.dart @@ -11,6 +11,7 @@ class SliverSettingsCard extends StatelessWidget { final s = S.of(context); return SliverCardItem( onClick: _gotoSettingsPage, + iconToTheLeft: true, icon: Icon(Icons.settings, size: 60, color: theme.accentColor), children: [ Text(s.theme, style: theme.textTheme.subtitle2), diff --git a/lib/presentation/settings/widgets/other_settings.dart b/lib/presentation/settings/widgets/other_settings.dart index 45cf86866..de16f82b1 100644 --- a/lib/presentation/settings/widgets/other_settings.dart +++ b/lib/presentation/settings/widgets/other_settings.dart @@ -4,7 +4,6 @@ import 'package:genshindb/application/bloc.dart'; import 'package:genshindb/application/settings/settings_bloc.dart'; import 'package:genshindb/domain/enums/enums.dart'; import 'package:genshindb/generated/l10n.dart'; -import 'package:genshindb/presentation/game_codes/game_codes_page.dart'; import 'package:genshindb/presentation/shared/extensions/i18n_extensions.dart'; import 'package:genshindb/presentation/shared/loading.dart'; import 'package:genshindb/presentation/shared/styles.dart'; @@ -89,28 +88,8 @@ class OtherSettings extends StatelessWidget { ); }, ), - ListTile( - dense: false, - title: Text(s.gameCodes), - subtitle: Container( - margin: const EdgeInsets.only(left: 10), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - s.seeAllInGameGameCodes, - style: const TextStyle(color: Colors.grey, fontSize: 11), - ), - ), - ), - onTap: () => _showGameCodesDialog(context), - ) ], ), ); } - - Future _showGameCodesDialog(BuildContext context) async { - context.read().add(const GameCodesEvent.opened()); - await Navigator.push(context, MaterialPageRoute(fullscreenDialog: true, builder: (ctx) => const GameCodesPage())); - } }