From 8925b3a5f8fbcfe69598ce4ba831557fdf2df5c7 Mon Sep 17 00:00:00 2001 From: BalazsManus Date: Sat, 15 Feb 2025 13:36:18 +0100 Subject: [PATCH] move some settings to extras --- .idea/libraries/Dart_SDK.xml | 44 +- .../lib/screens/settings/settings_screen.dart | 2121 +++++++---------- .../settings/settings_screen.i18n.dart | 18 +- .../settings/submenu/extras_screen.dart | 146 +- .../settings/submenu/general_screen.dart | 2 +- .../settings/submenu/submenu_screen.i18n.dart | 15 + 6 files changed, 1071 insertions(+), 1275 deletions(-) diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml index d7ab9e2..5d38449 100644 --- a/.idea/libraries/Dart_SDK.xml +++ b/.idea/libraries/Dart_SDK.xml @@ -1,28 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/refilc_mobile_ui/lib/screens/settings/settings_screen.dart b/refilc_mobile_ui/lib/screens/settings/settings_screen.dart index 9edc921..48bcb3b 100644 --- a/refilc_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/refilc_mobile_ui/lib/screens/settings/settings_screen.dart @@ -92,7 +92,6 @@ class SettingsScreen extends StatefulWidget { class SettingsScreenState extends State with SingleTickerProviderStateMixin { int devmodeCountdown = 5; - bool __ss = false; // secret settings Future? futureRelease; @@ -107,8 +106,7 @@ class SettingsScreenState extends State late AnimationController _hideContainersController; - Future restore() => - Future.wait([ + Future restore() => Future.wait([ Provider.of(context, listen: false).restore(), Provider.of(context, listen: false).restoreUser(), Provider.of(context, listen: false).restore(), @@ -132,8 +130,8 @@ class SettingsScreenState extends State String _firstName; List _nameParts = - (account.nickname != '' ? account.nickname : account.displayName) - .split(" "); + (account.nickname != '' ? account.nickname : account.displayName) + .split(" "); if (!settings.presentationMode) { _firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0]; } else { @@ -153,8 +151,7 @@ class SettingsScreenState extends State name: _firstName, role: account.role, profilePictureString: account.picture, - backgroundColor: Theme - .of(context) + backgroundColor: Theme.of(context) .colorScheme .tertiary, //!settings.presentationMode //? ColorUtils.stringToColor(account.name) @@ -168,57 +165,45 @@ class SettingsScreenState extends State if (err != null) { showDialog( context: context, - builder: (_) => - AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - title: Text('oopsie'.i18n), - content: Text('session_expired'.i18n), - actions: [ - ActionButton( - label: "Ok", - onTap: () async { - String? userId = user.id; - if (userId == null) return; + builder: (_) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0)), + title: Text('oopsie'.i18n), + content: Text('session_expired'.i18n), + actions: [ + ActionButton( + label: "Ok", + onTap: () async { + String? userId = user.id; + if (userId == null) return; - // delete user - user.removeUser(userId); - await Provider - .of(context, + // delete user + user.removeUser(userId); + await Provider.of(context, listen: false) - .store - .removeUser(userId); + .store + .removeUser(userId); - // if no users, show login, else login with back button - if (user - .getUsers() - .isNotEmpty) { - user.setUser(user - .getUsers() - .first - .id); - restore().then( - (_) => - user.setUser(user - .getUsers() - .first - .id)); + // if no users, show login, else login with back button + if (user.getUsers().isNotEmpty) { + user.setUser(user.getUsers().first.id); + restore().then( + (_) => user.setUser(user.getUsers().first.id)); - Navigator.of(context).pop(); - Navigator.of(context) - .pushNamed("login_back") - .then((value) { - setSystemChrome(context); - }); - } else { - Navigator.of(context).pop(); - Navigator.of(context) - .pushNamedAndRemoveUntil( - "login", (_) => false); - } - }) - ], - ), + Navigator.of(context).pop(); + Navigator.of(context) + .pushNamed("login_back") + .then((value) { + setSystemChrome(context); + }); + } else { + Navigator.of(context).pop(); + Navigator.of(context) + .pushNamedAndRemoveUntil("login", (_) => false); + } + }) + ], + ), ); return; } @@ -260,17 +245,14 @@ class SettingsScreenState extends State ]); } - void _openDKT(User u) => - tabs.launchUrl( + void _openDKT(User u) => tabs.launchUrl( Uri.parse( "https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}"), customTabsOptions: tabs.CustomTabsOptions( showTitle: true, colorSchemes: tabs.CustomTabsColorSchemes( defaultPrams: tabs.CustomTabsColorSchemeParams( - toolbarColor: Theme - .of(context) - .scaffoldBackgroundColor, + toolbarColor: Theme.of(context).scaffoldBackgroundColor, ), ), ), @@ -316,10 +298,10 @@ class SettingsScreenState extends State // String startPageTitle = // SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?"; String themeModeText = { - ThemeMode.light: "light".i18n, - ThemeMode.dark: "dark".i18n, - ThemeMode.system: "system".i18n - }[settings.theme] ?? + ThemeMode.light: "light".i18n, + ThemeMode.dark: "dark".i18n, + ThemeMode.system: "system".i18n + }[settings.theme] ?? "?"; // String languageText = SettingsHelper.langMap[settings.language] ?? "?"; // String vibrateTitle = { @@ -336,877 +318,600 @@ class SettingsScreenState extends State return AnimatedBuilder( animation: _hideContainersController, - builder: (context, child) => - Opacity( - opacity: 1 - _hideContainersController.value, - child: Column( + builder: (context, child) => Opacity( + opacity: 1 - _hideContainersController.value, + child: Column( + children: [ + const SizedBox(height: 45.0), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const SizedBox(height: 45.0), - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + const Row( + mainAxisAlignment: MainAxisAlignment.start, children: [ - const Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - // IconButton( - // splashRadius: 32.0, - // onPressed: () => - // _showBottomSheet(user.getUser(user.id ?? "")), - // icon: Icon(FeatherIcons.moreVertical, - // color: AppColors.of(context).text.withOpacity(0.8)), - // ), - // const SizedBox( - // width: 5, - // ), - // const SizedBox( - // width: 5.0, - // ), - // IconButton( - // splashRadius: 32.0, - // // onPressed: () async => await databaseProvider.userStore - // // .storeSelfNotes([], userId: user.id!), - // onPressed: () async => _openNotes( - // context, - // await databaseProvider.userQuery - // .toDoItems(userId: user.id!), - // ), - // // _showBottomSheet(user.getUser(user.id ?? "")), - // icon: Icon(FeatherIcons.fileText, - // color: AppColors.of(context).text.withOpacity(0.8)), - // ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - IconButton( - splashRadius: 26.0, - onPressed: () { - Navigator.of(context).pop(); - }, - icon: Icon(FeatherIcons.x, - color: AppColors - .of(context) - .text - .withOpacity(0.8)), - ), - const SizedBox( - width: 5.0, - ), - ], - ), - ], - ), - - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: ProfileImage( - heroTag: "profile", - radius: 48.42069, - onTap: () => _showBottomSheet(user.getUser(user.id ?? "")), - name: firstName, - badge: updateProvider.available, - role: user.role, - profilePictureString: user.picture, - gradeStreak: (user.gradeStreak ?? 0) > 1, - backgroundColor: Theme - .of(context) - .colorScheme - .tertiary, //!settings.presentationMode - //? ColorUtils.stringToColor(user.displayName ?? "?") - //: Theme.of(context).colorScheme.secondary, - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 4.0, bottom: 12.0), - child: GestureDetector( - onTap: () => _showBottomSheet(user.getUser(user.id ?? "")), - onDoubleTap: () => setState(() => __ss = true), - child: Text( - !settings.presentationMode - ? (user.displayName ?? "?") - : "János", - maxLines: 1, - softWrap: false, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - fontWeight: FontWeight.w600, - color: AppColors - .of(context) - .text), - ), - ), - ), - - const SizedBox( - height: 18.0, - ), - - // user options - SplittedPanel( - cardPadding: const EdgeInsets.all(4.0), - children: [ - // personal details - PanelButton( - onPressed: () => - AccountView.show(user.user!, context: context), - title: Text("personal_details".i18n), - leading: Icon( - FeatherIcons.info, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(4.0)), - ), - // open dcs (digital collaboration space) - PanelButton( - onPressed: () => _openDKT(user.user!), - title: Text("open_dkt".i18n), - leading: Icon( - FeatherIcons.grid, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0)), - ), - // edit user - PanelButton( - onPressed: () => - _showBottomSheet(user.getUser(user.id ?? "")), - title: Text("edit".i18n), - leading: Icon( - FeatherIcons.edit3, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0)), - ), - // switch account - PanelButton( - // onPressed: () => SoonAlert.show(context: context), - onPressed: () { - SettingsHelper.changeCurrentUser( - context, - accountTiles, - (accountTiles.length + 2), - "add_user".i18n, - ); - }, - title: Text("switch_account".i18n), - leading: Icon( - FeatherIcons.users, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0)), - ), - // log user out - PanelButton( - onPressed: () async { - String? userId = user.id; - if (userId == null) return; - - // delete user - user.removeUser(userId); - await Provider - .of(context, listen: false) - .store - .removeUser(userId); - - // if no users, show login - if (user - .getUsers() - .isNotEmpty) { - user.setUser(user - .getUsers() - .first - .id); - restore() - .then((_) => - user.setUser(user - .getUsers() - .first - .id)); - } else { - Navigator.of(context) - .pushNamedAndRemoveUntil("login", (_) => false); - } - }, - title: Text("log_out".i18n), - leading: Icon( - FeatherIcons.logOut, - color: AppColors - .of(context) - .red, - size: 22.0, - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(12.0)), - ), - // SplittedMenuOption( - // padding: const EdgeInsets.all(8.0), - // text: 'edit'.i18n, - // trailing: const Icon( - // FeatherIcons.edit2, - // size: 22.0, + // IconButton( + // splashRadius: 32.0, + // onPressed: () => + // _showBottomSheet(user.getUser(user.id ?? "")), + // icon: Icon(FeatherIcons.moreVertical, + // color: AppColors.of(context).text.withOpacity(0.8)), + // ), + // const SizedBox( + // width: 5, + // ), + // const SizedBox( + // width: 5.0, + // ), + // IconButton( + // splashRadius: 32.0, + // // onPressed: () async => await databaseProvider.userStore + // // .storeSelfNotes([], userId: user.id!), + // onPressed: () async => _openNotes( + // context, + // await databaseProvider.userQuery + // .toDoItems(userId: user.id!), // ), - // onTap: () { - // print('object'); - // }, + // // _showBottomSheet(user.getUser(user.id ?? "")), + // icon: Icon(FeatherIcons.fileText, + // color: AppColors.of(context).text.withOpacity(0.8)), // ), ], ), - - // Padding( - // padding: - // const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), - // child: Panel( - // child: Column( - // children: [ - // // account list - // ...accountTiles, - - // if (accountTiles.isNotEmpty) - // Center( - // child: Container( - // margin: const EdgeInsets.only(top: 12.0, bottom: 4.0), - // height: 3.0, - // width: 75.0, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(12.0), - // color: AppColors.of(context).text.withOpacity(.25), - // ), - // ), - // ), - - // // add account panel - // PanelButton( - // onPressed: () { - // if (!Provider.of(context, - // listen: false) - // .hasScope(PremiumScopes.maxTwoAccounts)) { - // PlusLockedFeaturePopup.show( - // context: context, - // feature: PremiumFeature.moreAccounts); - // return; - // } - - // Navigator.of(context) - // .pushNamed("login_back") - // .then((value) { - // setSystemChrome(context); - // }); - // }, - // title: Text("add_user".i18n), - // leading: const Icon(FeatherIcons.userPlus), - // ), - // // PanelButton( - // // onPressed: () async { - // // String? userId = user.id; - // // if (userId == null) return; - - // // // Delete User - // // user.removeUser(userId); - // // await Provider.of(context, - // // listen: false) - // // .store - // // .removeUser(userId); - - // // // If no other Users left, go back to LoginScreen - // // if (user.getUsers().isNotEmpty) { - // // user.setUser(user.getUsers().first.id); - // // restore().then( - // // (_) => user.setUser(user.getUsers().first.id)); - // // } else { - // // Navigator.of(context) - // // .pushNamedAndRemoveUntil("login", (_) => false); - // // } - // // }, - // // title: Text("log_out".i18n), - // // leading: Icon(FeatherIcons.logOut, - // // color: AppColors.of(context).red), - // // ), - // ], - // ), - // ), - // ), - - // updates - if (updateProvider.available) - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 24.0), - child: Panel( - child: PanelButton( - onPressed: () => _openUpdates(context), - title: Text("update_available".i18n), - leading: const Icon(FeatherIcons.download), - trailing: Text( - updateProvider.releases.first.tag, - style: TextStyle( - fontWeight: FontWeight.w500, - color: Theme - .of(context) - .colorScheme - .secondary, - ), - ), - ), - ), - ), - - // const Padding( - // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), - // child: PremiumBannerButton(), - // ), - // if (!context.watch().hasPremium) - // const ClipRect( - // child: Padding( - // padding: EdgeInsets.symmetric(vertical: 12.0), - // child: PremiumButton(), - // ), - // ) - // else - // const Padding( - // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), - // child: ActiveSponsorCard(), - // ), - - // secret settings - if (__ss) - SplittedPanel( - isSeparated: true, - isTransparent: true, - hasShadow: false, - children: [ - SplittedPanel( - title: Text("secret".i18n), - cardPadding: const EdgeInsets.all(4.0), - padding: EdgeInsets.zero, - children: [ - // good student mode - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0, right: 6.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - title: Text("goodstudent".i18n, - style: - const TextStyle(fontWeight: FontWeight.w500)), - onChanged: (v) { - if (v) { - showDialog( - context: context, - builder: (context) => - WillPopScope( - onWillPop: () async => false, - child: AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(12.0)), - title: Text("attention".i18n), - content: - Text("goodstudent_disclaimer".i18n), - actions: [ - ActionButton( - label: "understand".i18n, - onTap: () { - Navigator.of(context).pop(); - settings.update( - goodStudent: v); - Provider.of( - context, - listen: false) - .convertBySettings(); - }) - ], - ), - ), - ); - } else { - settings.update(goodStudent: v); - Provider.of( - context, listen: false) - .convertBySettings(); - } - }, - value: settings.goodStudent, - activeColor: Theme - .of(context) - .colorScheme - .secondary, - ), - ), - ], - ), - SplittedPanel( - cardPadding: const EdgeInsets.all(4.0), - padding: EdgeInsets.zero, - children: [ - // presentation mode - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0, right: 6.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - title: Text("presentation".i18n, - style: - const TextStyle(fontWeight: FontWeight.w500)), - onChanged: (v) => - settings.update(presentationMode: v), - value: settings.presentationMode, - activeColor: Theme - .of(context) - .colorScheme - .secondary, - ), - ), - - // UwU-fied mode (why????) - // Material( - // type: MaterialType.transparency, - // child: SwitchListTile( - // contentPadding: const EdgeInsets.only(left: 12.0), - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(12.0)), - // title: Text("uwufymode".i18n, - // style: - // const TextStyle(fontWeight: FontWeight.w500)), - // onChanged: (v) { - // SettingsHelper.uwuMode(context, v); - // setState(() {}); - // }, - // value: settings.presentationMode, - // activeColor: Theme.of(context).colorScheme.secondary, - // ), - // ), - ], - ), - // uwu mode - // since it is not working i removed it - /*SplittedPanel( - cardPadding: const EdgeInsets.all(4.0), - padding: EdgeInsets.zero, - children: [ - // uwu mode - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0, right: 6.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - title: Text("uwufymode".i18n, - style: - const TextStyle(fontWeight: FontWeight.w500)), - onChanged: (v) => settings.update(uwuMode: v), - value: settings.uwuMode, - activeColor: Theme.of(context).colorScheme.secondary, - ), - ), - ], - ),*/ - ], - ), - - if ((user.gradeStreak ?? 0) > 1) - SplittedPanel( - padding: const EdgeInsets.only( - bottom: 12.0, left: 24.0, right: 24.0), - children: [ - GestureDetector( - onTap: () { - SoonAlert.show(context: context); - }, - child: ListTile( - title: Text( - "grade_streak".i18n, - style: TextStyle( - color: AppColors - .of(context) - .text - .withOpacity(0.95), - fontWeight: FontWeight.w500, - ), - ), - subtitle: Text( - "grade_streak_subtitle".i18n, - style: TextStyle( - color: AppColors - .of(context) - .text - .withOpacity(0.75), - ), - ), - leading: Image.asset( - 'assets/images/apple_fire_emoji.png', - width: 24.0, - ), - // leading: const Text( - // "🔥", - // style: TextStyle(fontSize: 22.0), - // ), - trailing: Text( - "${user.gradeStreak}", - style: TextStyle( - color: AppColors - .of(context) - .text - .withOpacity(0.95), - fontWeight: FontWeight.w500, - fontSize: 18.0, - ), - ), - ), - ), - ], - ), - - // plus subscribe inline - const PlusSettingsInline(), - - // const SizedBox( - // height: 16.0, - // ), - - // Panel( - // hasShadow: false, - // padding: const EdgeInsets.only(left: 24.0, right: 24.0), - // title: Padding( - // padding: const EdgeInsets.only(left: 24.0), - // child: Text('account_link'.i18n), - // ), - // isTransparent: true, - // child: Column( - // children: [ - // // QwID account linking - // PanelButton( - // onPressed: () { - // launchUrl( - // Uri.parse( - // 'https://qwid.qwit.dev/oauth2/authorize?client_id=refilc&response_type=code&scope=*'), - // mode: LaunchMode.externalApplication, - // ); - // }, - // title: Text("QwID fiók-összekapcsolás".i18n), - // leading: Icon( - // FeatherIcons.link, - // size: 22.0, - // color: AppColors.of(context).text.withOpacity(0.95), - // ), - // trailing: GestureDetector( - // onTap: () { - // showDialog( - // context: context, - // builder: (BuildContext context) { - // return AlertDialog( - // title: const Text("QwID?!"), - // content: const Text( - // "A QwID egy olyan fiók, mellyel az összes QwIT szolgáltatásba beléphetsz és minden adatod egy helyen kezelheted. \"Miért jó ez nekem?\" A QwID fiókba való bejelentkezéssel rengeteg új funkcióhoz férhetsz hozzá, ami sajnos korábban lehetetlen volt egy szimpla e-KRÉTA fiókkal. Fiókhoz kötve megoszthatsz bármilyen adatot a barátaiddal, vagy ha szeretnéd nyilvánosságra is hozhatod jegyeid, reFilc témáid, és még rengeteg dolgot. A QwID fiók abban is segít, hogy egyszerűbben kezelhesd előfizetéseid, valamint fiókodnak köszönhetően rengeteg ajándékot kaphatsz reFilc+ előfizetésed mellé egyéb QwIT és reFilc szolgáltatásokban. \"Miért QwID?\" A név a reFilc mögött álló fejlesztői csapat, a QwIT nevéből, valamint az angol Identity szó rövidítéséből ered. \"Egyéb hasznos tudnivalók?\" A QwID fiókodat bármikor törölheted, ha úgy érzed, hogy nem szeretnéd tovább használni. Bővebb információt az adatkezelésről és az általános feltételekről megtalálsz a regisztrációs oldalon. Fiókod kezeléséhez látogass el a qwid.qwit.dev weboldalra.", - // ), - // actions: [ - // TextButton( - // onPressed: () { - // Navigator.of(context).pop(); - // }, - // child: const Text("Szuper!"), - // ), - // ], - // ); - // }, - // ); - // }, - // child: Icon( - // FeatherIcons.helpCircle, - // size: 20.0, - // color: AppColors.of(context).text.withOpacity(0.95), - // ), - // ), - // borderRadius: const BorderRadius.vertical( - // top: Radius.circular(12.0), - // bottom: Radius.circular(4.0), - // ), - // ), - // ], - // ), - // ), - - // settings submenus - const SizedBox( - height: 16.0, - ), - Panel( - hasShadow: false, - padding: - const EdgeInsets.only(bottom: 20.0, left: 24.0, right: 24.0), - title: Padding( - padding: const EdgeInsets.only(left: 24.0), - child: Text('settings'.i18n), - ), - isTransparent: true, - child: Column( - children: [ - // general settings - const SplittedPanel( - padding: EdgeInsets.zero, - cardPadding: EdgeInsets.all(4.0), - children: [ - MenuGeneralSettings( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(12.0), - ), - ), - ], - ), - - // theme settings - SplittedPanel( - padding: const EdgeInsets.only(top: 8.0), - cardPadding: const EdgeInsets.all(4.0), - children: [ - const MenuPersonalizeSettings( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(4.0), - ), - ), - PanelButton( - onPressed: () { - SettingsHelper.theme(context); - setState(() {}); - }, - title: Text("theme".i18n), - leading: Icon( - FeatherIcons.sun, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - trailing: Text( - themeModeText, - style: const TextStyle(fontSize: 14.0), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(12.0), - ), - ), - ], - ), - - // notifications - const SplittedPanel( - padding: EdgeInsets.only(top: 8.0), - cardPadding: EdgeInsets.all(4.0), - children: [ - /*MenuNotifications( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(12.0), - ), - ),*/ - ], - ), - - // extras - const SplittedPanel( - padding: EdgeInsets.only(top: 8.0), - cardPadding: EdgeInsets.all(4.0), - children: [ - MenuExtrasSettings( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(12.0), - ), - ), - ], - ), - // const SplittedPanel( - // padding: EdgeInsets.only(top: 8.0), - // cardPadding: EdgeInsets.all(4.0), - // children: [ - // MenuOtherSettings( - // borderRadius: BorderRadius.vertical( - // top: Radius.circular(12.0), - // bottom: Radius.circular(12.0), - // ), - // ), - // ], - // ), - ], - ), - ), - - // // icon gallery (debug mode) - if (kDebugMode) - Padding( - padding: const EdgeInsets.only( - bottom: 16.0, left: 24.0, right: 24.0), - child: Panel( - title: const Text("Debug"), - child: Column( - children: [ - PanelButton( - title: const Text("Subject Icon Gallery"), - leading: - const Icon(CupertinoIcons.rectangle_3_offgrid_fill), - trailing: const Icon(Icons.arrow_forward), - onPressed: () { - Navigator.of(context, rootNavigator: true).push( - CupertinoPageRoute( - builder: (context) => - const SubjectIconGallery()), - ); - }, - ) - ], - ), - ), - ), - - // other secion - SplittedPanel( - title: Text("other".i18n), - cardPadding: const EdgeInsets.all(4.0), + Row( + mainAxisAlignment: MainAxisAlignment.end, children: [ - PanelButton( - leading: Icon( - FeatherIcons.mail, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: Text("news".i18n), - onPressed: () => _openNews(context), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0), - ), + IconButton( + splashRadius: 26.0, + onPressed: () { + Navigator.of(context).pop(); + }, + icon: Icon(FeatherIcons.x, + color: AppColors.of(context).text.withOpacity(0.8)), ), - PanelButton( - leading: Icon( - FeatherIcons.map, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: Text("stickermap".i18n), - onPressed: () => - launchUrl( - Uri.parse("https://map.qwit.cloud"), - mode: LaunchMode.inAppBrowserView, - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(12.0), - ), + const SizedBox( + width: 5.0, ), ], ), + ], + ), - // // extra settings - // Padding( - // padding: - // const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), - // child: Panel( - // title: Text("extras".i18n), - // child: Column( - // children: [ - // PremiumCustomAppIconMenu( - // settings: settings, - // ), - // // PanelButton( - // // onPressed: () { - // // SoonAlert.show(context: context); - // // }, - // // title: Text('app_icon'.i18n), - // // leading: const Icon(FeatherIcons.edit), - // // // trailing: Text( - // // // 'default'.i18n, - // // // style: const TextStyle(fontSize: 14.0), - // // // ), - // // ), - // ], - // ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: ProfileImage( + heroTag: "profile", + radius: 48.42069, + onTap: () => _showBottomSheet(user.getUser(user.id ?? "")), + name: firstName, + badge: updateProvider.available, + role: user.role, + profilePictureString: user.picture, + gradeStreak: (user.gradeStreak ?? 0) > 1, + backgroundColor: Theme.of(context) + .colorScheme + .tertiary, //!settings.presentationMode + //? ColorUtils.stringToColor(user.displayName ?? "?") + //: Theme.of(context).colorScheme.secondary, + ), + ), + + Padding( + padding: const EdgeInsets.only(top: 4.0, bottom: 12.0), + child: GestureDetector( + onTap: () => _showBottomSheet(user.getUser(user.id ?? "")), + child: Text( + !settings.presentationMode + ? (user.displayName ?? "?") + : "János", + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + fontWeight: FontWeight.w600, + color: AppColors.of(context).text), + ), + ), + ), + + const SizedBox( + height: 18.0, + ), + + // user options + SplittedPanel( + cardPadding: const EdgeInsets.all(4.0), + children: [ + // personal details + PanelButton( + onPressed: () => + AccountView.show(user.user!, context: context), + title: Text("personal_details".i18n), + leading: Icon( + FeatherIcons.info, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(12.0), bottom: Radius.circular(4.0)), + ), + // open dcs (digital collaboration space) + PanelButton( + onPressed: () => _openDKT(user.user!), + title: Text("open_dkt".i18n), + leading: Icon( + FeatherIcons.grid, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), bottom: Radius.circular(4.0)), + ), + // edit user + PanelButton( + onPressed: () => + _showBottomSheet(user.getUser(user.id ?? "")), + title: Text("edit".i18n), + leading: Icon( + FeatherIcons.edit3, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), bottom: Radius.circular(4.0)), + ), + // switch account + PanelButton( + // onPressed: () => SoonAlert.show(context: context), + onPressed: () { + SettingsHelper.changeCurrentUser( + context, + accountTiles, + (accountTiles.length + 2), + "add_user".i18n, + ); + }, + title: Text("switch_account".i18n), + leading: Icon( + FeatherIcons.users, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), bottom: Radius.circular(4.0)), + ), + // log user out + PanelButton( + onPressed: () async { + String? userId = user.id; + if (userId == null) return; + + // delete user + user.removeUser(userId); + await Provider.of(context, listen: false) + .store + .removeUser(userId); + + // if no users, show login + if (user.getUsers().isNotEmpty) { + user.setUser(user.getUsers().first.id); + restore() + .then((_) => user.setUser(user.getUsers().first.id)); + } else { + Navigator.of(context) + .pushNamedAndRemoveUntil("login", (_) => false); + } + }, + title: Text("log_out".i18n), + leading: Icon( + FeatherIcons.logOut, + color: AppColors.of(context).red, + size: 22.0, + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), bottom: Radius.circular(12.0)), + ), + // SplittedMenuOption( + // padding: const EdgeInsets.all(8.0), + // text: 'edit'.i18n, + // trailing: const Icon( + // FeatherIcons.edit2, + // size: 22.0, // ), + // onTap: () { + // print('object'); + // }, // ), + ], + ), - // about sweetie - SplittedPanel( - title: Text("about".i18n), - cardPadding: const EdgeInsets.all(4.0), - children: [ - PanelButton( - leading: Icon( - FeatherIcons.lock, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: Text("privacy".i18n), - onPressed: () => _openPrivacy(context), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(4.0), + // Padding( + // padding: + // const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), + // child: Panel( + // child: Column( + // children: [ + // // account list + // ...accountTiles, + + // if (accountTiles.isNotEmpty) + // Center( + // child: Container( + // margin: const EdgeInsets.only(top: 12.0, bottom: 4.0), + // height: 3.0, + // width: 75.0, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(12.0), + // color: AppColors.of(context).text.withOpacity(.25), + // ), + // ), + // ), + + // // add account panel + // PanelButton( + // onPressed: () { + // if (!Provider.of(context, + // listen: false) + // .hasScope(PremiumScopes.maxTwoAccounts)) { + // PlusLockedFeaturePopup.show( + // context: context, + // feature: PremiumFeature.moreAccounts); + // return; + // } + + // Navigator.of(context) + // .pushNamed("login_back") + // .then((value) { + // setSystemChrome(context); + // }); + // }, + // title: Text("add_user".i18n), + // leading: const Icon(FeatherIcons.userPlus), + // ), + // // PanelButton( + // // onPressed: () async { + // // String? userId = user.id; + // // if (userId == null) return; + + // // // Delete User + // // user.removeUser(userId); + // // await Provider.of(context, + // // listen: false) + // // .store + // // .removeUser(userId); + + // // // If no other Users left, go back to LoginScreen + // // if (user.getUsers().isNotEmpty) { + // // user.setUser(user.getUsers().first.id); + // // restore().then( + // // (_) => user.setUser(user.getUsers().first.id)); + // // } else { + // // Navigator.of(context) + // // .pushNamedAndRemoveUntil("login", (_) => false); + // // } + // // }, + // // title: Text("log_out".i18n), + // // leading: Icon(FeatherIcons.logOut, + // // color: AppColors.of(context).red), + // // ), + // ], + // ), + // ), + // ), + + // updates + if (updateProvider.available) + Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, horizontal: 24.0), + child: Panel( + child: PanelButton( + onPressed: () => _openUpdates(context), + title: Text("update_available".i18n), + leading: const Icon(FeatherIcons.download), + trailing: Text( + updateProvider.releases.first.tag, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), - PanelButton( - leading: Icon( - FeatherIcons.atSign, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: const Text("Discord"), - onPressed: () => - launchUrl(Uri.parse("https://discord.gg/6DvjyPAw2T"), - mode: LaunchMode.externalApplication), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0), + ), + ), + ), + + // const Padding( + // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), + // child: PremiumBannerButton(), + // ), + // if (!context.watch().hasPremium) + // const ClipRect( + // child: Padding( + // padding: EdgeInsets.symmetric(vertical: 12.0), + // child: PremiumButton(), + // ), + // ) + // else + // const Padding( + // padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), + // child: ActiveSponsorCard(), + // ), + + if ((user.gradeStreak ?? 0) > 1) + SplittedPanel( + padding: const EdgeInsets.only( + bottom: 12.0, left: 24.0, right: 24.0), + children: [ + ListTile( + title: Text( + "grade_streak".i18n, + style: TextStyle( + color: AppColors.of(context).text.withOpacity(0.95), + fontWeight: FontWeight.w500, ), ), - /*PanelButton( + subtitle: Text( + "grade_streak_subtitle".i18n, + style: TextStyle( + color: AppColors.of(context).text.withOpacity(0.75), + ), + ), + leading: Image.asset( + 'assets/images/apple_fire_emoji.png', + width: 24.0, + ), + // leading: const Text( + // "🔥", + // style: TextStyle(fontSize: 22.0), + // ), + trailing: Text( + "${user.gradeStreak}", + style: TextStyle( + color: AppColors.of(context).text.withOpacity(0.95), + fontWeight: FontWeight.w500, + fontSize: 18.0, + ), + ), + ), + ], + ), + + // const SizedBox( + // height: 16.0, + // ), + + // settings submenus + const SizedBox( + height: 16.0, + ), + Panel( + hasShadow: false, + padding: const EdgeInsets.only(bottom: 20.0, left: 24.0, right: 24.0), + title: Padding( + padding: const EdgeInsets.only(left: 24.0), + child: Text('settings'.i18n), + ), + isTransparent: true, + child: Column( + children: [ + // general settings + const SplittedPanel( + padding: const EdgeInsets.only(top: 8.0), + cardPadding: EdgeInsets.all(4.0), + children: [ + MenuGeneralSettings( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.0), + bottom: Radius.circular(4.0), + ), + ), + ], + ), + + // theme settings + SplittedPanel( + padding: const EdgeInsets.only(top: 8.0), + cardPadding: const EdgeInsets.all(4.0), + children: [ + const MenuPersonalizeSettings( + borderRadius: BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + ), + PanelButton( + onPressed: () { + SettingsHelper.theme(context); + setState(() {}); + }, + title: Text("theme".i18n), + leading: Icon( + FeatherIcons.sun, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + trailing: Text( + themeModeText, + style: const TextStyle(fontSize: 14.0), + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + ), + ], + ), + + // notifications + //const SplittedPanel( + // padding: EdgeInsets.only(top: 8.0), + // cardPadding: EdgeInsets.all(4.0), + // children: [ + // /*MenuNotifications( + // borderRadius: BorderRadius.vertical( + // top: Radius.circular(12.0), + // bottom: Radius.circular(12.0), + // ), + // ),*/ + // ], + //), + + // extras + const SplittedPanel( + padding: EdgeInsets.only(top: 8.0), + cardPadding: EdgeInsets.all(4.0), + children: [ + MenuExtrasSettings( + borderRadius: BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(12.0), + ), + ), + ], + ), + // const SplittedPanel( + // padding: EdgeInsets.only(top: 8.0), + // cardPadding: EdgeInsets.all(4.0), + // children: [ + // MenuOtherSettings( + // borderRadius: BorderRadius.vertical( + // top: Radius.circular(12.0), + // bottom: Radius.circular(12.0), + // ), + // ), + // ], + // ), + ], + ), + ), + + // // icon gallery (debug mode) + if (kDebugMode) + Padding( + padding: const EdgeInsets.only( + bottom: 16.0, left: 24.0, right: 24.0), + child: Panel( + title: const Text("Debug"), + child: Column( + children: [ + PanelButton( + title: const Text("Subject Icon Gallery"), + leading: + const Icon(CupertinoIcons.rectangle_3_offgrid_fill), + trailing: const Icon(Icons.arrow_forward), + onPressed: () { + Navigator.of(context, rootNavigator: true).push( + CupertinoPageRoute( + builder: (context) => + const SubjectIconGallery()), + ); + }, + ) + ], + ), + ), + ), + + // other secion + SplittedPanel( + title: Text("other".i18n), + cardPadding: const EdgeInsets.all(4.0), + children: [ + PanelButton( + leading: Icon( + FeatherIcons.mail, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: Text("news".i18n), + onPressed: () => _openNews(context), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + ), + PanelButton( + leading: Icon( + FeatherIcons.map, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: Text("stickermap".i18n), + onPressed: () => launchUrl( + Uri.parse("https://map.qwit.cloud"), + mode: LaunchMode.inAppBrowserView, + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(12.0), + ), + ), + ], + ), + + // // extra settings + // Padding( + // padding: + // const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), + // child: Panel( + // title: Text("extras".i18n), + // child: Column( + // children: [ + // PremiumCustomAppIconMenu( + // settings: settings, + // ), + // // PanelButton( + // // onPressed: () { + // // SoonAlert.show(context: context); + // // }, + // // title: Text('app_icon'.i18n), + // // leading: const Icon(FeatherIcons.edit), + // // // trailing: Text( + // // // 'default'.i18n, + // // // style: const TextStyle(fontSize: 14.0), + // // // ), + // // ), + // ], + // ), + // ), + // ), + + // about sweetie + SplittedPanel( + title: Text("about".i18n), + cardPadding: const EdgeInsets.all(4.0), + children: [ + PanelButton( + leading: Icon( + FeatherIcons.lock, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: Text("privacy".i18n), + onPressed: () => _openPrivacy(context), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(12.0), + bottom: Radius.circular(4.0), + ), + ), + PanelButton( + leading: Icon( + FeatherIcons.atSign, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: const Text("Discord"), + onPressed: () => launchUrl( + Uri.parse("https://discord.gg/6DvjyPAw2T"), + mode: LaunchMode.externalApplication), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + ), + /*PanelButton( leading: Icon( FeatherIcons.globe, size: 22.0, @@ -1220,341 +925,285 @@ class SettingsScreenState extends State bottom: Radius.circular(4.0), ), ),*/ - PanelButton( - leading: Icon( - FeatherIcons.github, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: const Text("Gitea"), - onPressed: () => - launchUrl( - Uri.parse( - "https://git.qwit.cloud/refilc/student-legacy"), - mode: LaunchMode.externalApplication), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0), - ), - ), - PanelButton( - leading: Icon( - FeatherIcons.award, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: Text("licenses".i18n), - onPressed: () => showLicensePage(context: context), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0), - ), - ), - Tooltip( - message: "data_collected".i18n, - padding: const EdgeInsets.all(4.0), - margin: const EdgeInsets.all(10.0), - textStyle: TextStyle( - fontWeight: FontWeight.w500, - color: AppColors - .of(context) - .text), - decoration: BoxDecoration( - color: Theme - .of(context) - .colorScheme - .surface, - borderRadius: BorderRadius.circular(12.0), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - blurRadius: 40.0, - ) - ], - ), - child: Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 14.0, right: 4.0), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(4.0), - ), - ), - secondary: Icon( - FeatherIcons.barChart2, - size: 22.0, - color: settings.analyticsEnabled - ? AppColors - .of(context) - .text - .withOpacity(0.95) - : AppColors - .of(context) - .text - .withOpacity(.25), - ), - title: Text( - "Analytics".i18n, - style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 16.0, - color: AppColors - .of(context) - .text - .withOpacity( - settings.analyticsEnabled ? 1.0 : .5), - ), - ), - subtitle: Text( - "Anonymous Usage Analytics".i18n, - style: TextStyle( - color: AppColors - .of(context) - .text - .withOpacity( - settings.analyticsEnabled ? .5 : .2), - ), - ), - onChanged: (v) { - // String newId; - // if (v == false) { - // newId = "none"; - // } else if (settings.xFilcId == "none") { - // newId = SettingsProvider.defaultSettings().xFilcId; - // } else { - // newId = settings.xFilcId; - // } - settings.update(analyticsEnabled: v); - }, - value: settings.analyticsEnabled, - activeColor: Theme - .of(context) - .colorScheme - .secondary, - ), - ), - ), - PanelButton( - leading: Icon( - Icons.feedback_outlined, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(0.95), - ), - title: Text("feedback".i18n), - onPressed: () => - { - Shake.setScreenshotIncluded(false), - Shake.show(ShakeScreen.newTicket), - Shake.setScreenshotIncluded(true), - }, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(12.0), - ), - ), - ], + PanelButton( + leading: Icon( + FeatherIcons.github, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: const Text("Gitea"), + onPressed: () => launchUrl( + Uri.parse("https://git.qwit.cloud/refilc/student-legacy"), + mode: LaunchMode.externalApplication), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), ), - - if (kDebugMode) - SplittedPanel( - title: const Text("debug_settings"), - cardPadding: const EdgeInsets.all(4.0), - children: [ - PanelButton( - title: const Text('loginToGoogle'), - onPressed: () async { - ThirdPartyProvider tpp = Provider.of< - ThirdPartyProvider>( - context, - listen: false); - - await tpp.googleSignIn(); - }, - ), - PanelButton( - title: const Text('pushTimetableToCalendar'), - onPressed: () async {}, - ), - PanelButton( - title: const Text('resetNewBadges'), - onPressed: () async { - Provider.of(context, listen: false) - .update( - unseenNewFeatures: ['grade_exporting'], - ); - }, - ), + PanelButton( + leading: Icon( + FeatherIcons.award, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: Text("licenses".i18n), + onPressed: () => showLicensePage(context: context), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + ), + Tooltip( + message: "data_collected".i18n, + padding: const EdgeInsets.all(4.0), + margin: const EdgeInsets.all(10.0), + textStyle: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context).text), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 40.0, + ) ], ), - // developer options - if (true) - SplittedPanel( - title: Text("devsettings".i18n), - cardPadding: const EdgeInsets.all(4.0), - children: [ - Material( - type: MaterialType.transparency, - child: SwitchListTile( - contentPadding: - const EdgeInsets.only(left: 12.0, right: 4.0), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(4.0))), - title: Text("devmode".i18n, - style: const TextStyle( - fontWeight: FontWeight.w500)), - onChanged: (v) => - settings.update(developerMode: false), - value: settings.developerMode, - activeColor: Theme - .of(context) - .colorScheme - .secondary, - ), - ), - PanelButton( - borderRadius: const BorderRadius.vertical( + child: Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 14.0, right: 4.0), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( top: Radius.circular(4.0), bottom: Radius.circular(4.0), ), - leading: Icon( - Icons.tune_outlined, - size: 22.0, - color: AppColors - .of(context) + ), + secondary: Icon( + FeatherIcons.barChart2, + size: 22.0, + color: settings.analyticsEnabled + ? AppColors.of(context).text.withOpacity(0.95) + : AppColors.of(context).text.withOpacity(.25), + ), + title: Text( + "Analytics".i18n, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16.0, + color: AppColors.of(context).text.withOpacity( + settings.analyticsEnabled ? 1.0 : .5), + ), + ), + subtitle: Text( + "Anonymous Usage Analytics".i18n, + style: TextStyle( + color: AppColors.of(context) .text - .withOpacity(.95), + .withOpacity(settings.analyticsEnabled ? .5 : .2), ), - title: Text("exp_settings".i18n), - onPressed: () => - Clipboard.setData(ClipboardData( - text: json.encode(settings.toMap()), - )), ), - PanelButton( - borderRadius: BorderRadius.vertical( - top: const Radius.circular(4.0), - bottom: Provider - .of(context, listen: false) - .hasPremium - ? const Radius.circular(4.0) - : const Radius.circular(12.0), - ), - leading: Icon( - FeatherIcons.copy, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(.95), - ), - title: Text("copy_jwt".i18n), - onPressed: () => - Clipboard.setData(ClipboardData( - text: Provider - .of(context, listen: false) - .accessToken!)), - ), - if (Provider - .of(context, listen: false) - .hasPremium) - PanelButton( - borderRadius: const BorderRadius.vertical( - top: Radius.circular(4.0), - bottom: Radius.circular(12.0), - ), - leading: Icon( - FeatherIcons.key, - size: 22.0, - color: AppColors - .of(context) - .text - .withOpacity(.95), - ), - title: const Text("Remove Premium"), - onPressed: () { - Provider.of(context, listen: false) - .activate(removePremium: true); - settings.update( - accentColor: AccentColor.filc, store: true); - Provider.of( - context, listen: false) - .changeTheme(settings.theme); - }, - ), - ], - ), - - // version info - SafeArea( - top: false, - child: Center( - child: GestureDetector( - child: FutureBuilder( - future: futureRelease, - builder: (context, release) { - String versionText; - if (release.hasData && release.data != null) { - versionText = "v${release - .data!['version']}, modosítva a Filc csapat által"; - } else { - versionText = - "reFilc, modosítva a Filc csapat által"; - } - return DefaultTextStyle( - style: Theme - .of(context) - .textTheme - .titleMedium! - .copyWith( - fontWeight: FontWeight.w600, - color: AppColors - .of(context) - .text - .withOpacity(0.65)), - child: Text(versionText), - ); - }, - ), - onTap: () { - if (devmodeCountdown > 0) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - duration: const Duration(milliseconds: 200), - content: - Text("devmoretaps".i18n.fill([devmodeCountdown])), - )); - - setState(() => devmodeCountdown--); - } else if (devmodeCountdown == 0) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("devactivated".i18n), - )); - - settings.update(developerMode: true); - - setState(() => devmodeCountdown--); - } + onChanged: (v) { + // String newId; + // if (v == false) { + // newId = "none"; + // } else if (settings.xFilcId == "none") { + // newId = SettingsProvider.defaultSettings().xFilcId; + // } else { + // newId = settings.xFilcId; + // } + settings.update(analyticsEnabled: v); }, + value: settings.analyticsEnabled, + activeColor: Theme.of(context).colorScheme.secondary, ), ), ), + PanelButton( + leading: Icon( + Icons.feedback_outlined, + size: 22.0, + color: AppColors.of(context).text.withOpacity(0.95), + ), + title: Text("feedback".i18n), + onPressed: () => { + Shake.setScreenshotIncluded(false), + Shake.show(ShakeScreen.newTicket), + Shake.setScreenshotIncluded(true), + }, + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(12.0), + ), + ), ], ), - ) - , + + if (kDebugMode) + SplittedPanel( + title: const Text("debug_settings"), + cardPadding: const EdgeInsets.all(4.0), + children: [ + PanelButton( + title: const Text('loginToGoogle'), + onPressed: () async { + ThirdPartyProvider tpp = Provider.of( + context, + listen: false); + + await tpp.googleSignIn(); + }, + ), + PanelButton( + title: const Text('pushTimetableToCalendar'), + onPressed: () async {}, + ), + PanelButton( + title: const Text('resetNewBadges'), + onPressed: () async { + Provider.of(context, listen: false) + .update( + unseenNewFeatures: ['grade_exporting'], + ); + }, + ), + ], + ), + // developer options + if (true) + SplittedPanel( + title: Text("devsettings".i18n), + cardPadding: const EdgeInsets.all(4.0), + children: [ + Material( + type: MaterialType.transparency, + child: SwitchListTile( + contentPadding: + const EdgeInsets.only(left: 12.0, right: 4.0), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.0), + bottom: Radius.circular(4.0))), + title: Text("devmode".i18n, + style: const TextStyle(fontWeight: FontWeight.w500)), + onChanged: (v) => settings.update(developerMode: false), + value: settings.developerMode, + activeColor: Theme.of(context).colorScheme.secondary, + ), + ), + PanelButton( + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(4.0), + ), + leading: Icon( + Icons.tune_outlined, + size: 22.0, + color: AppColors.of(context).text.withOpacity(.95), + ), + title: Text("exp_settings".i18n), + onPressed: () => Clipboard.setData(ClipboardData( + text: json.encode(settings.toMap()), + )), + ), + PanelButton( + borderRadius: BorderRadius.vertical( + top: const Radius.circular(4.0), + bottom: Provider.of(context, listen: false) + .hasPremium + ? const Radius.circular(4.0) + : const Radius.circular(12.0), + ), + leading: Icon( + FeatherIcons.copy, + size: 22.0, + color: AppColors.of(context).text.withOpacity(.95), + ), + title: Text("copy_jwt".i18n), + onPressed: () => Clipboard.setData(ClipboardData( + text: Provider.of(context, listen: false) + .accessToken!)), + ), + if (Provider.of(context, listen: false) + .hasPremium) + PanelButton( + borderRadius: const BorderRadius.vertical( + top: Radius.circular(4.0), + bottom: Radius.circular(12.0), + ), + leading: Icon( + FeatherIcons.key, + size: 22.0, + color: AppColors.of(context).text.withOpacity(.95), + ), + title: const Text("Remove Premium"), + onPressed: () { + Provider.of(context, listen: false) + .activate(removePremium: true); + settings.update( + accentColor: AccentColor.filc, store: true); + Provider.of(context, listen: false) + .changeTheme(settings.theme); + }, + ), + ], + ), + + // version info + SafeArea( + top: false, + child: Center( + child: GestureDetector( + child: FutureBuilder( + future: futureRelease, + builder: (context, release) { + String versionText; + if (release.hasData && release.data != null) { + versionText = + "v${release.data!['version']}, modosítva a Filc csapat által"; + } else { + versionText = "reFilc, modosítva a Filc csapat által"; + } + return DefaultTextStyle( + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + fontWeight: FontWeight.w600, + color: AppColors.of(context) + .text + .withOpacity(0.65)), + child: Text(versionText), + ); + }, + ), + onTap: () { + if (devmodeCountdown > 0) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + duration: const Duration(milliseconds: 200), + content: + Text("devmoretaps".i18n.fill([devmodeCountdown])), + )); + + setState(() => devmodeCountdown--); + } else if (devmodeCountdown == 0) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text("devactivated".i18n), + )); + + settings.update(developerMode: true); + + setState(() => devmodeCountdown--); + } + }, + ), + ), + ), + ], + ), + ), ); } @@ -1577,4 +1226,4 @@ class SettingsScreenState extends State void openSubMenu(BuildContext context, StatefulWidget screen) => Navigator.of(context) .push(CupertinoPageRoute(builder: (context) => screen)); -} \ No newline at end of file +} diff --git a/refilc_mobile_ui/lib/screens/settings/settings_screen.i18n.dart b/refilc_mobile_ui/lib/screens/settings/settings_screen.i18n.dart index 928d576..ecb7ee4 100644 --- a/refilc_mobile_ui/lib/screens/settings/settings_screen.i18n.dart +++ b/refilc_mobile_ui/lib/screens/settings/settings_screen.i18n.dart @@ -51,12 +51,8 @@ extension SettingsLocalization on String { "Analytics": "Analytics", "Anonymous Usage Analytics": "Anonymous Usage Analytics", "graph_class_avg": "Class average on graph", - "goodstudent": "Good student mode", "attention": "Attention!", - "goodstudent_disclaimer": - "reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)", "understand": "I understand", - "secret": "Secret Settings", "bell_delay": "Bell Delay", "delay": "Delay", "hurry": "Hurry", @@ -69,7 +65,7 @@ extension SettingsLocalization on String { "Background Color": "Background Color", "Highlight Color": "Highlight Color", "Adaptive Theme": "Adaptive Theme", - "presentation": "Presentation Mode", + "uwufymode": "UwU-fied Mode", "devmoretaps": "You are %s taps away from Developer Mode.", "devactivated": "Developer Mode successfully activated.", @@ -185,12 +181,8 @@ extension SettingsLocalization on String { "Analytics": "Analitika", "Anonymous Usage Analytics": "Névtelen használati analitika", "graph_class_avg": "Osztályátlag a grafikonon", - "goodstudent": "Jó tanuló mód", "attention": "Figyelem!", - "goodstudent_disclaimer": - "A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadat hibáztathatod.)", "understand": "Értem", - "secret": "Titkos Beállítások", "bell_delay": "Csengő eltolódása", "delay": "Késleltetés", "hurry": "Siettetés", @@ -203,7 +195,7 @@ extension SettingsLocalization on String { "Background Color": "Háttér színe", "Highlight Color": "Panelek színe", "Adaptive Theme": "Adaptív téma", - "presentation": "Bemutató mód", + "uwufymode": "UwU mód", "devmoretaps": "Még %s koppintásra vagy a Fejlesztői módtól.", "devactivated": "Fejlesztői mód sikeresen aktiválva.", @@ -319,12 +311,8 @@ extension SettingsLocalization on String { "Analytics": "Analytik", "Anonymous Usage Analytics": "Anonyme Nutzungsanalyse", "graph_class_avg": "Klassendurchschnitt in der Grafik", - "goodstudent": "Guter Student Modus", "attention": "Achtung!", - "goodstudent_disclaimer": - "reFilc kann nicht für die Nutzung dieser Funktion haftbar gemacht werden.\n\n(Wenn deine Mutter dich verprügelt, weil du ihr falsche Noten gezeigt hast, kannst du dir nur die Schuld dafür geben)", "understand": "Ich verstehe", - "secret": "Geheime Einstellungen", "bell_delay": "Klingelverzögerung", "delay": "Verzögern", "hurry": "Eile", @@ -337,7 +325,7 @@ extension SettingsLocalization on String { "Background Color": "Background Color", "Highlight Color": "Highlight Color", "Adaptive Theme": "Adaptive Theme", - "presentation": "Präsentationsmodus", + "uwufymode": "UwU-Modus", "devmoretaps": "Sie sind %s Taps vom Entwicklermodus entfernt.", "devactivated": "Entwicklermodus erfolgreich aktiviert.", diff --git a/refilc_mobile_ui/lib/screens/settings/submenu/extras_screen.dart b/refilc_mobile_ui/lib/screens/settings/submenu/extras_screen.dart index fcbfe74..aeaf0bf 100644 --- a/refilc_mobile_ui/lib/screens/settings/submenu/extras_screen.dart +++ b/refilc_mobile_ui/lib/screens/settings/submenu/extras_screen.dart @@ -16,6 +16,10 @@ import 'package:refilc_plus/models/premium_scopes.dart'; import 'package:refilc_plus/providers/plus_provider.dart'; import 'package:refilc_plus/ui/mobile/plus/upsell.dart'; import 'package:refilc_plus/ui/mobile/settings/welcome_message.dart'; + +import 'package:refilc_kreta_api/providers/grade_provider.dart'; +import 'package:refilc_mobile_ui/common/action_button.dart'; + // import 'package:provider/provider.dart'; import 'submenu_screen.i18n.dart'; @@ -23,7 +27,7 @@ class MenuExtrasSettings extends StatelessWidget { const MenuExtrasSettings({ super.key, this.borderRadius = const BorderRadius.vertical( - top: Radius.circular(4.0), bottom: Radius.circular(4.0)), + top: Radius.circular(4.0), bottom: Radius.circular(12.0)), }); final BorderRadius borderRadius; @@ -181,6 +185,146 @@ class ExtrasSettingsScreenState extends State { ), ], ), + SplittedPanel( + padding: const EdgeInsets.only(top: 9.0), + cardPadding: const EdgeInsets.all(4.0), + isSeparated: true, + children: [ + PanelButton( + padding: const EdgeInsets.only(left: 14.0, right: 6.0), + onPressed: () async { + if (!settingsProvider.goodStudent) { + showDialog( + context: context, + builder: (context) => WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0)), + title: Text("attention".i18n), + content: Text("goodstudent_disclaimer".i18n), + actions: [ + ActionButton( + label: "understand".i18n, + onTap: () { + Navigator.of(context).pop(); + settingsProvider.update( + goodStudent: true); + Provider.of(context, + listen: false) + .convertBySettings(); + setState(() {}); + }) + ], + ), + ), + ); + } else { + settingsProvider.update(goodStudent: false); + Provider.of(context, listen: false) + .convertBySettings(); + setState(() {}); + } + }, + title: Text( + "goodstudent".i18n, + style: TextStyle( + color: AppColors.of(context).text.withValues( + alpha: settingsProvider.goodStudent ? .95 : .25), + ), + ), + leading: Icon( + FeatherIcons.userCheck, + size: 22.0, + color: AppColors.of(context).text.withValues( + alpha: settingsProvider.goodStudent ? .95 : .25), + ), + trailing: Switch( + onChanged: (v) async { + if (v) { + showDialog( + context: context, + builder: (context) => WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0)), + title: Text("attention".i18n), + content: Text("goodstudent_disclaimer".i18n), + actions: [ + ActionButton( + label: "understand".i18n, + onTap: () { + Navigator.of(context).pop(); + settingsProvider.update( + goodStudent: true); + Provider.of(context, + listen: false) + .convertBySettings(); + setState(() {}); + }) + ], + ), + ), + ); + } else { + settingsProvider.update(goodStudent: false); + Provider.of(context, listen: false) + .convertBySettings(); + setState(() {}); + } + }, + value: settingsProvider.goodStudent, + activeColor: Theme.of(context).colorScheme.secondary, + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(12.0), + bottom: Radius.circular(12.0), + ), + ), + ], + ), + SplittedPanel( + padding: const EdgeInsets.only(top: 9.0), + cardPadding: const EdgeInsets.all(4.0), + isSeparated: true, + children: [ + PanelButton( + padding: const EdgeInsets.only(left: 14.0, right: 6.0), + onPressed: () async { + settingsProvider.update( + presentationMode: !settingsProvider.presentationMode); + setState(() {}); + }, + title: Text( + "presentation".i18n, + style: TextStyle( + color: AppColors.of(context).text.withValues( + alpha: + settingsProvider.presentationMode ? .95 : .25), + ), + ), + leading: Icon( + FeatherIcons.tv, + size: 22.0, + color: AppColors.of(context).text.withValues( + alpha: settingsProvider.presentationMode ? .95 : .25), + ), + trailing: Switch( + onChanged: (v) async { + settingsProvider.update(presentationMode: v); + setState(() {}); + }, + value: settingsProvider.presentationMode, + activeColor: Theme.of(context).colorScheme.secondary, + ), + borderRadius: const BorderRadius.vertical( + top: Radius.circular(12.0), + bottom: Radius.circular(12.0), + ), + ), + ], + ), ], ), ), diff --git a/refilc_mobile_ui/lib/screens/settings/submenu/general_screen.dart b/refilc_mobile_ui/lib/screens/settings/submenu/general_screen.dart index 507e7c8..10953ff 100644 --- a/refilc_mobile_ui/lib/screens/settings/submenu/general_screen.dart +++ b/refilc_mobile_ui/lib/screens/settings/submenu/general_screen.dart @@ -15,7 +15,7 @@ class MenuGeneralSettings extends StatelessWidget { const MenuGeneralSettings({ super.key, this.borderRadius = const BorderRadius.vertical( - top: Radius.circular(4.0), bottom: Radius.circular(4.0)), + top: Radius.circular(12.0), bottom: Radius.circular(4.0)), }); final BorderRadius borderRadius; diff --git a/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart b/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart index c6904b2..2765c14 100644 --- a/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart +++ b/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart @@ -34,6 +34,11 @@ extension SettingsLocalization on String { "theme_share_ratelimit": "You can only share 1 theme per minute.", // cloud sync "cloud_sync": "Cloud Sync", + "secret": "Secret Settings", + "goodstudent": "Good student mode", + "presentation": "Presentation Mode", + "goodstudent_disclaimer": + "reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)", }, "hu_hu": { "general": "Általános", @@ -66,6 +71,11 @@ extension SettingsLocalization on String { "theme_share_ratelimit": "Csak 1 témát oszthatsz meg percenként.", // cloud sync "cloud_sync": "Felhő szinkronizálás", + "secret": "Titkos Beállítások", + "goodstudent": "Jó tanuló mód", + "presentation": "Bemutató mód", + "goodstudent_disclaimer": + "A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadat hibáztathatod.)", }, "de_de": { "general": "Allgemeine", @@ -99,6 +109,11 @@ extension SettingsLocalization on String { "theme_share_ratelimit": "Sie können nur 1 Thema pro Minute teilen.", // cloud sync "cloud_sync": "Cloud-Synchronisierung", + "secret": "Geheime Einstellungen", + "presentation": "Präsentationsmodus", + "goodstudent": "Guter Student Modus", + "goodstudent_disclaimer": + "reFilc kann nicht für die Nutzung dieser Funktion haftbar gemacht werden.\n\n(Wenn deine Mutter dich verprügelt, weil du ihr falsche Noten gezeigt hast, kannst du dir nur die Schuld dafür geben)", }, };