move some settings to extras

This commit is contained in:
BalazsManus 2025-02-15 13:36:18 +01:00
parent eb0308cbed
commit 8925b3a5f8
6 changed files with 1071 additions and 1275 deletions

View File

@ -1,28 +1,28 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/async" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/cli" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/collection" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/concurrent" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/convert" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/core" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/developer" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/ffi" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/html" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/indexed_db" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/io" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/isolate" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/js" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/js_interop" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/js_interop_unsafe" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/js_util" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/math" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/mirrors" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/svg" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/typed_data" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/web_audio" />
<root url="file://$USER_HOME$/3D Objects/dart-sdk/lib/web_gl" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/concurrent" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/ffi" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://P:/flutter/bin/cache/dart-sdk/lib/web_gl" />
</CLASSES>
<JAVADOC />
<SOURCES />

View File

@ -92,7 +92,6 @@ class SettingsScreen extends StatefulWidget {
class SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 5;
bool __ss = false; // secret settings
Future<Map>? futureRelease;
@ -107,8 +106,7 @@ class SettingsScreenState extends State<SettingsScreen>
late AnimationController _hideContainersController;
Future<void> restore() =>
Future.wait([
Future<void> restore() => Future.wait([
Provider.of<GradeProvider>(context, listen: false).restore(),
Provider.of<TimetableProvider>(context, listen: false).restoreUser(),
Provider.of<ExamProvider>(context, listen: false).restore(),
@ -153,8 +151,7 @@ class SettingsScreenState extends State<SettingsScreen>
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,8 +165,7 @@ class SettingsScreenState extends State<SettingsScreen>
if (err != null) {
showDialog(
context: context,
builder: (_) =>
AlertDialog(
builder: (_) => AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0)),
title: Text('oopsie'.i18n),
@ -183,26 +179,16 @@ class SettingsScreenState extends State<SettingsScreen>
// delete user
user.removeUser(userId);
await Provider
.of<DatabaseProvider>(context,
await Provider.of<DatabaseProvider>(context,
listen: false)
.store
.removeUser(userId);
// if no users, show login, else login with back button
if (user
.getUsers()
.isNotEmpty) {
user.setUser(user
.getUsers()
.first
.id);
if (user.getUsers().isNotEmpty) {
user.setUser(user.getUsers().first.id);
restore().then(
(_) =>
user.setUser(user
.getUsers()
.first
.id));
(_) => user.setUser(user.getUsers().first.id));
Navigator.of(context).pop();
Navigator.of(context)
@ -213,8 +199,7 @@ class SettingsScreenState extends State<SettingsScreen>
} else {
Navigator.of(context).pop();
Navigator.of(context)
.pushNamedAndRemoveUntil(
"login", (_) => false);
.pushNamedAndRemoveUntil("login", (_) => false);
}
})
],
@ -260,17 +245,14 @@ class SettingsScreenState extends State<SettingsScreen>
]);
}
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,
),
),
),
@ -336,8 +318,7 @@ class SettingsScreenState extends State<SettingsScreen>
return AnimatedBuilder(
animation: _hideContainersController,
builder: (context, child) =>
Opacity(
builder: (context, child) => Opacity(
opacity: 1 - _hideContainersController.value,
child: Column(
children: [
@ -386,10 +367,7 @@ class SettingsScreenState extends State<SettingsScreen>
Navigator.of(context).pop();
},
icon: Icon(FeatherIcons.x,
color: AppColors
.of(context)
.text
.withOpacity(0.8)),
color: AppColors.of(context).text.withOpacity(0.8)),
),
const SizedBox(
width: 5.0,
@ -410,8 +388,7 @@ class SettingsScreenState extends State<SettingsScreen>
role: user.role,
profilePictureString: user.picture,
gradeStreak: (user.gradeStreak ?? 0) > 1,
backgroundColor: Theme
.of(context)
backgroundColor: Theme.of(context)
.colorScheme
.tertiary, //!settings.presentationMode
//? ColorUtils.stringToColor(user.displayName ?? "?")
@ -423,7 +400,6 @@ class SettingsScreenState extends State<SettingsScreen>
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 ?? "?")
@ -435,9 +411,7 @@ class SettingsScreenState extends State<SettingsScreen>
style: TextStyle(
fontSize: 22.0,
fontWeight: FontWeight.w600,
color: AppColors
.of(context)
.text),
color: AppColors.of(context).text),
),
),
),
@ -458,14 +432,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.info,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(4.0)),
top: Radius.circular(12.0), bottom: Radius.circular(4.0)),
),
// open dcs (digital collaboration space)
PanelButton(
@ -474,14 +444,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.grid,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(4.0)),
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
),
// edit user
PanelButton(
@ -491,14 +457,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.edit3,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(4.0)),
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
),
// switch account
PanelButton(
@ -515,14 +477,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.users,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(4.0)),
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
),
// log user out
PanelButton(
@ -532,25 +490,15 @@ class SettingsScreenState extends State<SettingsScreen>
// delete user
user.removeUser(userId);
await Provider
.of<DatabaseProvider>(context, listen: false)
await Provider.of<DatabaseProvider>(context, listen: false)
.store
.removeUser(userId);
// if no users, show login
if (user
.getUsers()
.isNotEmpty) {
user.setUser(user
.getUsers()
.first
.id);
if (user.getUsers().isNotEmpty) {
user.setUser(user.getUsers().first.id);
restore()
.then((_) =>
user.setUser(user
.getUsers()
.first
.id));
.then((_) => user.setUser(user.getUsers().first.id));
} else {
Navigator.of(context)
.pushNamedAndRemoveUntil("login", (_) => false);
@ -559,14 +507,11 @@ class SettingsScreenState extends State<SettingsScreen>
title: Text("log_out".i18n),
leading: Icon(
FeatherIcons.logOut,
color: AppColors
.of(context)
.red,
color: AppColors.of(context).red,
size: 22.0,
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(12.0)),
top: Radius.circular(4.0), bottom: Radius.circular(12.0)),
),
// SplittedMenuOption(
// padding: const EdgeInsets.all(8.0),
@ -670,10 +615,7 @@ class SettingsScreenState extends State<SettingsScreen>
updateProvider.releases.first.tag,
style: TextStyle(
fontWeight: FontWeight.w500,
color: Theme
.of(context)
.colorScheme
.secondary,
color: Theme.of(context).colorScheme.secondary,
),
),
),
@ -697,174 +639,23 @@ class SettingsScreenState extends State<SettingsScreen>
// 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<GradeProvider>(
context,
listen: false)
.convertBySettings();
})
],
),
),
);
} else {
settings.update(goodStudent: v);
Provider.of<GradeProvider>(
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(
ListTile(
title: Text(
"grade_streak".i18n,
style: TextStyle(
color: AppColors
.of(context)
.text
.withOpacity(0.95),
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),
color: AppColors.of(context).text.withOpacity(0.75),
),
),
leading: Image.asset(
@ -878,96 +669,26 @@ class SettingsScreenState extends State<SettingsScreen>
trailing: Text(
"${user.gradeStreak}",
style: TextStyle(
color: AppColors
.of(context)
.text
.withOpacity(0.95),
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),
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),
@ -977,13 +698,13 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
// general settings
const SplittedPanel(
padding: EdgeInsets.zero,
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(12.0),
bottom: Radius.circular(4.0),
),
),
],
@ -996,7 +717,7 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
const MenuPersonalizeSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
top: Radius.circular(4.0),
bottom: Radius.circular(4.0),
),
),
@ -1009,10 +730,7 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.sun,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
trailing: Text(
themeModeText,
@ -1020,25 +738,25 @@ class SettingsScreenState extends State<SettingsScreen>
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
bottom: Radius.circular(12.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),
),
),*/
],
),
//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(
@ -1047,7 +765,7 @@ class SettingsScreenState extends State<SettingsScreen>
children: [
MenuExtrasSettings(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.0),
top: Radius.circular(4.0),
bottom: Radius.circular(12.0),
),
),
@ -1105,10 +823,7 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.mail,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("news".i18n),
onPressed: () => _openNews(context),
@ -1121,14 +836,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.map,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("stickermap".i18n),
onPressed: () =>
launchUrl(
onPressed: () => launchUrl(
Uri.parse("https://map.qwit.cloud"),
mode: LaunchMode.inAppBrowserView,
),
@ -1176,10 +887,7 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.lock,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("privacy".i18n),
onPressed: () => _openPrivacy(context),
@ -1192,14 +900,11 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.atSign,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: const Text("Discord"),
onPressed: () =>
launchUrl(Uri.parse("https://discord.gg/6DvjyPAw2T"),
onPressed: () => launchUrl(
Uri.parse("https://discord.gg/6DvjyPAw2T"),
mode: LaunchMode.externalApplication),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
@ -1224,16 +929,11 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.github,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: const Text("Gitea"),
onPressed: () =>
launchUrl(
Uri.parse(
"https://git.qwit.cloud/refilc/student-legacy"),
onPressed: () => launchUrl(
Uri.parse("https://git.qwit.cloud/refilc/student-legacy"),
mode: LaunchMode.externalApplication),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(4.0),
@ -1244,10 +944,7 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.award,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("licenses".i18n),
onPressed: () => showLicensePage(context: context),
@ -1262,14 +959,9 @@ class SettingsScreenState extends State<SettingsScreen>
margin: const EdgeInsets.all(10.0),
textStyle: TextStyle(
fontWeight: FontWeight.w500,
color: AppColors
.of(context)
.text),
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme
.of(context)
.colorScheme
.surface,
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(12.0),
boxShadow: [
BoxShadow(
@ -1293,35 +985,24 @@ class SettingsScreenState extends State<SettingsScreen>
FeatherIcons.barChart2,
size: 22.0,
color: settings.analyticsEnabled
? AppColors
.of(context)
.text
.withOpacity(0.95)
: AppColors
.of(context)
.text
.withOpacity(.25),
? 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(
color: AppColors.of(context).text.withOpacity(
settings.analyticsEnabled ? 1.0 : .5),
),
),
subtitle: Text(
"Anonymous Usage Analytics".i18n,
style: TextStyle(
color: AppColors
.of(context)
color: AppColors.of(context)
.text
.withOpacity(
settings.analyticsEnabled ? .5 : .2),
.withOpacity(settings.analyticsEnabled ? .5 : .2),
),
),
onChanged: (v) {
@ -1336,10 +1017,7 @@ class SettingsScreenState extends State<SettingsScreen>
settings.update(analyticsEnabled: v);
},
value: settings.analyticsEnabled,
activeColor: Theme
.of(context)
.colorScheme
.secondary,
activeColor: Theme.of(context).colorScheme.secondary,
),
),
),
@ -1347,14 +1025,10 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
Icons.feedback_outlined,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(0.95),
color: AppColors.of(context).text.withOpacity(0.95),
),
title: Text("feedback".i18n),
onPressed: () =>
{
onPressed: () => {
Shake.setScreenshotIncluded(false),
Shake.show(ShakeScreen.newTicket),
Shake.setScreenshotIncluded(true),
@ -1375,8 +1049,7 @@ class SettingsScreenState extends State<SettingsScreen>
PanelButton(
title: const Text('loginToGoogle'),
onPressed: () async {
ThirdPartyProvider tpp = Provider.of<
ThirdPartyProvider>(
ThirdPartyProvider tpp = Provider.of<ThirdPartyProvider>(
context,
listen: false);
@ -1414,15 +1087,10 @@ class SettingsScreenState extends State<SettingsScreen>
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),
style: const TextStyle(fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(developerMode: false),
value: settings.developerMode,
activeColor: Theme
.of(context)
.colorScheme
.secondary,
activeColor: Theme.of(context).colorScheme.secondary,
),
),
PanelButton(
@ -1433,22 +1101,17 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
Icons.tune_outlined,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(.95),
color: AppColors.of(context).text.withOpacity(.95),
),
title: Text("exp_settings".i18n),
onPressed: () =>
Clipboard.setData(ClipboardData(
onPressed: () => Clipboard.setData(ClipboardData(
text: json.encode(settings.toMap()),
)),
),
PanelButton(
borderRadius: BorderRadius.vertical(
top: const Radius.circular(4.0),
bottom: Provider
.of<PlusProvider>(context, listen: false)
bottom: Provider.of<PlusProvider>(context, listen: false)
.hasPremium
? const Radius.circular(4.0)
: const Radius.circular(12.0),
@ -1456,20 +1119,14 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.copy,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(.95),
color: AppColors.of(context).text.withOpacity(.95),
),
title: Text("copy_jwt".i18n),
onPressed: () =>
Clipboard.setData(ClipboardData(
text: Provider
.of<KretaClient>(context, listen: false)
onPressed: () => Clipboard.setData(ClipboardData(
text: Provider.of<KretaClient>(context, listen: false)
.accessToken!)),
),
if (Provider
.of<PlusProvider>(context, listen: false)
if (Provider.of<PlusProvider>(context, listen: false)
.hasPremium)
PanelButton(
borderRadius: const BorderRadius.vertical(
@ -1479,10 +1136,7 @@ class SettingsScreenState extends State<SettingsScreen>
leading: Icon(
FeatherIcons.key,
size: 22.0,
color: AppColors
.of(context)
.text
.withOpacity(.95),
color: AppColors.of(context).text.withOpacity(.95),
),
title: const Text("Remove Premium"),
onPressed: () {
@ -1490,8 +1144,7 @@ class SettingsScreenState extends State<SettingsScreen>
.activate(removePremium: true);
settings.update(
accentColor: AccentColor.filc, store: true);
Provider.of<ThemeModeObserver>(
context, listen: false)
Provider.of<ThemeModeObserver>(context, listen: false)
.changeTheme(settings.theme);
},
),
@ -1508,21 +1161,18 @@ class SettingsScreenState extends State<SettingsScreen>
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";
"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)
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(
fontWeight: FontWeight.w600,
color: AppColors
.of(context)
color: AppColors.of(context)
.text
.withOpacity(0.65)),
child: Text(versionText),
@ -1553,8 +1203,7 @@ class SettingsScreenState extends State<SettingsScreen>
),
],
),
)
,
),
);
}

View File

@ -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.",

View File

@ -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<ExtrasSettingsScreen> {
),
],
),
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<GradeProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
})
],
),
),
);
} else {
settingsProvider.update(goodStudent: false);
Provider.of<GradeProvider>(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<GradeProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
})
],
),
),
);
} else {
settingsProvider.update(goodStudent: false);
Provider.of<GradeProvider>(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),
),
),
],
),
],
),
),

View File

@ -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;

View File

@ -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)",
},
};