314 lines
11 KiB
Dart
314 lines
11 KiB
Dart
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<SettingsBloc>(context);
|
|
settingsBloc.setLocale(AppLanguage().appLocal);
|
|
settingsBloc.context = context;
|
|
setContext(context);
|
|
|
|
MenuBloc menuBloc = BlocProvider.of<MenuBloc>(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<SettingsBloc, SettingsState>(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: <Widget>[
|
|
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<DropdownMenuItem<String>>((String value) {
|
|
return DropdownMenuItem<String>(
|
|
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));
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
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));
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
ListTile getTuturialBasic(SettingsBloc settingsBloc) {
|
|
final TutorialBloc tutorialBloc = BlocProvider.of<TutorialBloc>(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);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
ListTile getTermsOfUse() {
|
|
return ListTile(
|
|
leading: Icon(CustomIcon.user_cog),
|
|
title: TextButton(
|
|
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
|
|
Text("Terms Of Use", style: TextStyle(color: Colors.black)),
|
|
Icon(
|
|
Icons.arrow_forward_ios,
|
|
color: Colors.indigo,
|
|
),
|
|
]),
|
|
style: TextButton.styleFrom(
|
|
backgroundColor: Colors.white70,
|
|
onSurface: 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("Data Privacy", style: TextStyle(color: Colors.black)),
|
|
Icon(
|
|
Icons.arrow_forward_ios,
|
|
color: Colors.indigo,
|
|
),
|
|
]),
|
|
style: TextButton.styleFrom(
|
|
backgroundColor: Colors.white70,
|
|
onSurface: 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("Frequently Asked Questions", style: TextStyle(color: Colors.indigo)),
|
|
Icon(
|
|
Icons.arrow_forward_ios,
|
|
color: Colors.indigo,
|
|
),
|
|
]),
|
|
style: TextButton.styleFrom(
|
|
backgroundColor: Colors.white70,
|
|
onSurface: 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("Feedback email", style: TextStyle(color: Colors.indigo)),
|
|
Icon(
|
|
Icons.arrow_forward_ios,
|
|
color: Colors.indigo,
|
|
),
|
|
]),
|
|
style: TextButton.styleFrom(
|
|
backgroundColor: Colors.white70,
|
|
onSurface: 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");
|
|
await launch('$mailtoLink');
|
|
}
|
|
}
|