import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; import 'package:aitrainer_app/bloc/settings/settings_bloc.dart'; import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart'; import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/track.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/dialog_web_browser.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:toggle_switch/toggle_switch.dart'; import 'package:mailto/mailto.dart'; import 'package:url_launcher/url_launcher.dart'; // ignore: must_be_immutable class SettingsPage extends StatelessWidget with Trans { @override Widget build(BuildContext context) { // ignore: close_sinks SettingsBloc settingsBloc = BlocProvider.of(context); settingsBloc.setLocale(AppLanguage().appLocal); settingsBloc.context = context; setContext(context); MenuBloc menuBloc = BlocProvider.of(context); return Scaffold( appBar: AppBarMin(), body: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage('asset/image/WT_light_background.jpg'), fit: BoxFit.cover, alignment: Alignment.center, ), ), child: Form( child: BlocConsumer(listener: (context, state) { if (state is SettingsError) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); } else if (state is SettingsReady) { menuBloc.add(MenuRecreateTree()); Navigator.of(context).pushNamed("home"); } }, builder: (context, state) { return ModalProgressHUD( child: settingsUI(context, settingsBloc, menuBloc), inAsyncCall: state is SettingsLoading, opacity: 0.5, color: Colors.black54, progressIndicator: CircularProgressIndicator(), ); }), ), ), bottomNavigationBar: BottomNavigator(bottomNavIndex: 4)); } ListView settingsUI(BuildContext context, SettingsBloc settingsBloc, MenuBloc menuBloc) { return ListView(padding: EdgeInsets.only(top: 150), children: [ ListTile( leading: Icon(Icons.language), subtitle: Text(t("Change App Language")), title: DropdownButton( value: settingsBloc.getLocale() == Locale('en') ? t("English") : t("Hungarian"), items: [t("English"), t("Hungarian")].map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), onChanged: (lang) => { settingsBloc.add(SettingsChangeLanguage(language: lang as String)), Track().track(TrackingEvent.settings_lang, eventValue: lang) })), getServer(settingsBloc), //getTuturialBasic(settingsBloc), getTermsOfUse(), getPrivacy(), mailTo(), getVersion(), //welcome(), //getDevice(settingsBloc), ]); } ListTile getServer(SettingsBloc settingsBloc) { if (Cache().userLoggedIn == null || Cache().userLoggedIn!.admin != 1) { return ListTile( title: Container(), ); } return ListTile( leading: Icon(Icons.data_usage_sharp), subtitle: Text("For Test purpuses select Test-Server. After that please restart the the App"), title: ToggleSwitch( minWidth: 120.0, minHeight: 30.0, fontSize: 14.0, initialLabelIndex: Cache().liveServer ? Cache().testEnvironment == "1" ? 1 : 0 : 1, activeBgColor: [Colors.indigo], activeFgColor: Colors.white, inactiveBgColor: Colors.white60, inactiveFgColor: Colors.grey[900], labels: [t('Live-Server'), t('Test-Server')], onToggle: (index) { final String live = index == 0 ? "live" : "test"; print("Server setting to: $live"); settingsBloc.add(SettingsSetServer(live: index == 0)); }, totalSwitches: 2, ), ); } ListTile getDevice(SettingsBloc settingsBloc) { return ListTile( leading: Common.badgedIcon(Colors.grey, CustomIcon.cog, "hardware"), subtitle: Text("Do you have Smart watch, or any device which collects the fit/health data?"), title: ToggleSwitch( minWidth: 120.0, minHeight: 30.0, fontSize: 14.0, initialLabelIndex: Cache().hasHardware! ? 0 : 1, activeBgColor: [Colors.indigo], activeFgColor: Colors.white, inactiveBgColor: Colors.white60, inactiveFgColor: Colors.grey[900], labels: [t('Yes'), t('No')], onToggle: (index) { settingsBloc.add(SettingsSetHardware(hasHardware: index == 0)); }, totalSwitches: 2, ), ); } ListTile getTuturialBasic(SettingsBloc settingsBloc) { final TutorialBloc tutorialBloc = BlocProvider.of(context); return ListTile( leading: Icon(Icons.not_started), subtitle: Text(t("Activating the basic tutorial")), title: ToggleSwitch( minWidth: 120.0, minHeight: 30.0, fontSize: 14.0, initialLabelIndex: 0, activeBgColor: [Colors.indigo], activeFgColor: Colors.white, inactiveBgColor: Colors.white60, inactiveFgColor: Colors.grey[900], labels: [t('Basic Tutorial'), t('Activate')], onToggle: (index) { ActivityDone activity = ActivityDone.tutorialExecuteFirstTest; if (Cache().userLoggedIn != null) { if (Cache().userLoggedIn!.sex == "m") { activity = ActivityDone.tutorialBasicChestPress; } else { activity = ActivityDone.tutorialBasicLegPress; } } settingsBloc.add(SettingsActivateTutorial(activity: activity)); tutorialBloc.add(TutorialStart()); Track().track(TrackingEvent.tutorial_activate); }, totalSwitches: 2, ), ); } ListTile getTermsOfUse() { return ListTile( leading: Icon(CustomIcon.user_cog), title: TextButton( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(t("Terms Of Use"), style: TextStyle(color: Colors.black)), Icon( Icons.arrow_forward_ios, color: Colors.indigo, ), ]), style: TextButton.styleFrom( backgroundColor: Colors.white70, disabledForegroundColor: Colors.grey, ), onPressed: () => { Track().track(TrackingEvent.terms_of_use), showDialog( context: context, builder: (BuildContext context) { return DialogWebBrowser(url: 'https://workouttest.com/terms-of-use/', javascriptEnabled: true); }) }, ), ); } ListTile getPrivacy() { return ListTile( leading: Icon(Icons.enhanced_encryption), title: TextButton( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(t("Data Privacy"), style: TextStyle(color: Colors.black)), Icon( Icons.arrow_forward_ios, color: Colors.indigo, ), ]), style: TextButton.styleFrom( backgroundColor: Colors.white70, disabledForegroundColor: Colors.grey, ), onPressed: () => { Track().track(TrackingEvent.data_privacy), showDialog( context: context, builder: (BuildContext context) { return DialogWebBrowser(url: 'https://workouttest.com/privacy/', javascriptEnabled: true); }) }, ), ); } ListTile getFaq() { return ListTile( leading: Icon(CustomIcon.question), title: TextButton( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(t("Frequently Asked Questions"), style: TextStyle(color: Colors.indigo)), Icon( Icons.arrow_forward_ios, color: Colors.indigo, ), ]), style: TextButton.styleFrom( backgroundColor: Colors.white70, disabledForegroundColor: Colors.grey, ), onPressed: () => { Navigator.of(context).pushNamed("faqPage"), Track().track(TrackingEvent.faq), }, ), ); } ListTile getVersion() { final String version = Cache().packageInfo != null ? Cache().packageInfo!.version + "+" + Cache().packageInfo!.buildNumber : ""; return ListTile( title: Text( "Version: $version", style: GoogleFonts.inter(fontSize: 12), ), ); } ListTile welcome() { return ListTile( title: TextButton( child: Text("Welcome"), onPressed: () => { Navigator.of(context).pushNamed("customerWelcomePage"), }), ); } ListTile mailTo() { return ListTile( leading: Icon(CustomIcon.mail_1), title: TextButton( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(t("Feedback email"), style: TextStyle(color: Colors.indigo)), Icon( Icons.arrow_forward_ios, color: Colors.indigo, ), ]), style: TextButton.styleFrom( backgroundColor: Colors.white70, disabledForegroundColor: Colors.grey, ), onPressed: () => { launchMailto(), Track().track(TrackingEvent.feedback_email), }, ), ); } launchMailto() async { String from = Cache().userLoggedIn == null ? "" : Cache().userLoggedIn!.customerId!.toStringAsFixed(0); final mailtoLink = Mailto( to: ['service@workouttest.com'], subject: 'Feedback from app: $from', body: '', ); // Convert the Mailto instance into a string. // Use either Dart's string interpolation // or the toString() method. print("Mailto: $mailtoLink"); final Uri _url = Uri.parse("$mailtoLink"); await launchUrl(_url); } }