finished customizable grade rarities

This commit is contained in:
Kima 2024-02-11 14:27:15 +01:00
parent 4b2b90be8e
commit 06247a160d
8 changed files with 253 additions and 11 deletions

View File

@ -67,6 +67,7 @@ const userDataDB = DatabaseStruct("user_data", {
"todo_items": String, "self_notes": String, "todo_items": String, "self_notes": String,
// v5 shit // v5 shit
"roundings": String, "roundings": String,
"grade_rarities": String,
}); });
Future<void> createTable(Database db, DatabaseStruct struct) => Future<void> createTable(Database db, DatabaseStruct struct) =>
@ -128,6 +129,7 @@ Future<Database> initDB(DatabaseProvider database) async {
"todo_items": "{}", "self_notes": "[]", "todo_items": "{}", "self_notes": "[]",
// v5 shit // v5 shit
"roundings": "{}", "roundings": "{}",
"grade_rarities": "{}",
}); });
} catch (error) { } catch (error) {
print("ERROR: migrateDB: $error"); print("ERROR: migrateDB: $error");

View File

@ -316,4 +316,14 @@ class UserDatabaseQuery {
return (jsonDecode(roundingsJson) as Map) return (jsonDecode(roundingsJson) as Map)
.map((key, value) => MapEntry(key.toString(), value.toString())); .map((key, value) => MapEntry(key.toString(), value.toString()));
} }
Future<Map<String, String>> getGradeRarities({required String userId}) async {
List<Map> userData =
await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return {};
String? raritiesJson = userData.elementAt(0)["grade_rarities"] as String?;
if (raritiesJson == null) return {};
return (jsonDecode(raritiesJson) as Map)
.map((key, value) => MapEntry(key.toString(), value.toString()));
}
} }

View File

@ -201,4 +201,11 @@ class UserDatabaseStore {
await db.update("user_data", {"roundings": roundingsJson}, await db.update("user_data", {"roundings": roundingsJson},
where: "id = ?", whereArgs: [userId]); where: "id = ?", whereArgs: [userId]);
} }
Future<void> storeGradeRarities(Map<String, String> rarities,
{required String userId}) async {
String raritiesJson = jsonEncode(rarities);
await db.update("user_data", {"grade_rarities": raritiesJson},
where: "id = ?", whereArgs: [userId]);
}
} }

View File

@ -54,6 +54,15 @@ class GradeProvider with ChangeNotifier {
} }
} }
Future<void> unseenAll() async {
String? userId = _user.id;
if (userId != null) {
final userStore = _database.userStore;
userStore.storeLastSeenGrade(DateTime(1969), userId: userId);
_lastSeen = DateTime(1969);
}
}
Future<void> restore() async { Future<void> restore() async {
String? userId = _user.id; String? userId = _user.id;
@ -125,6 +134,9 @@ class GradeProvider with ChangeNotifier {
// Fetches Grades from the Kreta API then stores them in the database // Fetches Grades from the Kreta API then stores them in the database
Future<void> fetch() async { Future<void> fetch() async {
// test cucc
// unseenAll();
User? user = _user.user; User? user = _user.user;
if (user == null) throw "Cannot fetch Grades for User null"; if (user == null) throw "Cannot fetch Grades for User null";
String iss = user.instituteCode; String iss = user.instituteCode;

View File

@ -1,7 +1,11 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:math'; import 'dart:math';
import 'dart:ui'; import 'dart:ui';
import 'package:animated_background/animated_background.dart' as bg; import 'package:animated_background/animated_background.dart' as bg;
import 'package:filcnaplo/api/providers/database_provider.dart';
import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo/helpers/subject.dart'; import 'package:filcnaplo/helpers/subject.dart';
import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart';
@ -33,6 +37,15 @@ class _SurpriseGradeState extends State<SurpriseGrade>
late SettingsProvider settingsProvider; late SettingsProvider settingsProvider;
List<String> defaultRarities = [
"common",
"uncommon",
"rare",
"epic",
"legendary",
];
Map<String, String> rarities = {};
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -54,6 +67,8 @@ class _SurpriseGradeState extends State<SurpriseGrade>
setState(() => subtitle = true); setState(() => subtitle = true);
}); });
}); });
_fetchRarities();
}); });
seed = Random().nextInt(100000000); seed = Random().nextInt(100000000);
@ -69,6 +84,15 @@ class _SurpriseGradeState extends State<SurpriseGrade>
super.dispose(); super.dispose();
} }
_fetchRarities() async {
rarities = await Provider.of<DatabaseProvider>(context, listen: false)
.userQuery
.getGradeRarities(
userId: Provider.of<UserProvider>(context, listen: false).id!);
setState(() {});
}
bool hold = false; bool hold = false;
bool subtitle = false; bool subtitle = false;
late int seed; late int seed;
@ -321,6 +345,15 @@ class _SurpriseGradeState extends State<SurpriseGrade>
AnimationStatus.reverse) { AnimationStatus.reverse) {
shouldPaint = true; shouldPaint = true;
} }
String? rr =
rarities[widget.grade.value.value.toString()];
rr ??= '';
if (rr.replaceAll(' ', '') == '') {
rr = defaultRarities[widget.grade.value.value - 1].i18n;
}
return ScaleTransition( return ScaleTransition(
scale: _revealAnimGrade, scale: _revealAnimGrade,
child: FadeTransition( child: FadeTransition(
@ -337,14 +370,7 @@ class _SurpriseGradeState extends State<SurpriseGrade>
begin: Offset.zero, begin: Offset.zero,
end: const Offset(0, -0.9))), end: const Offset(0, -0.9))),
child: Text( child: Text(
[ rr,
"legendary",
"epic",
"rare",
"uncommon",
"common"
][5 - widget.grade.value.value]
.i18n,
style: TextStyle( style: TextStyle(
fontSize: 46.0, fontSize: 46.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,

View File

@ -387,10 +387,21 @@ class SettingsHelper {
} }
// v5 grade rarity texts // v5 grade rarity texts
static void surpriseGradeRarityText(BuildContext context) { static void surpriseGradeRarityText(
BuildContext context, {
required String title,
required String cancel,
required String done,
required List<String> rarities,
}) {
showRoundedModalBottomSheet( showRoundedModalBottomSheet(
context, context,
child: const GradeColorsSetting(), child: GradeRarityTextSetting(
title: title,
cancel: cancel,
done: done,
defaultRarities: rarities,
),
); );
} }
} }
@ -726,6 +737,141 @@ class _GradeColorsSettingState extends State<GradeColorsSetting> {
} }
} }
class GradeRarityTextSetting extends StatefulWidget {
const GradeRarityTextSetting({
super.key,
required this.title,
required this.cancel,
required this.done,
required this.defaultRarities,
});
final String title;
final String cancel;
final String done;
final List<String> defaultRarities;
@override
_GradeRarityTextSettingState createState() => _GradeRarityTextSettingState();
}
class _GradeRarityTextSettingState extends State<GradeRarityTextSetting> {
late SettingsProvider settings;
late DatabaseProvider db;
late UserProvider user;
final _rarityText = TextEditingController();
@override
void initState() {
super.initState();
settings = Provider.of<SettingsProvider>(context, listen: false);
db = Provider.of<DatabaseProvider>(context, listen: false);
user = Provider.of<UserProvider>(context, listen: false);
}
@override
Widget build(BuildContext context) {
return Column(children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: List.generate(5, (index) {
return ClipOval(
child: Material(
type: MaterialType.transparency,
child: InkWell(
onTap: () async {
showRenameDialog(
title: widget.title,
cancel: widget.cancel,
done: widget.done,
rarities:
await db.userQuery.getGradeRarities(userId: user.id!),
gradeIndex: (index + 1).toString(),
defaultRarities: widget.defaultRarities,
);
},
child: GradeValueWidget(GradeValue(index + 1, "", "", 0),
fill: true, size: 36.0),
),
),
);
}),
),
),
]);
}
void showRenameDialog(
{required String title,
required String cancel,
required String done,
required Map<String, String> rarities,
required String gradeIndex,
required List<String> defaultRarities,
required}) {
showDialog(
context: context,
builder: (context) => StatefulBuilder(builder: (context, setS) {
String? rr = rarities[gradeIndex];
rr ??= '';
_rarityText.text = rr;
return AlertDialog(
title: Text(title),
content: TextField(
controller: _rarityText,
autofocus: true,
decoration: InputDecoration(
border: const OutlineInputBorder(),
label: Text(defaultRarities[int.parse(gradeIndex) - 1]),
suffixIcon: IconButton(
icon: const Icon(FeatherIcons.x),
onPressed: () {
setState(() {
_rarityText.clear();
});
},
),
),
),
actions: [
TextButton(
child: Text(
cancel,
style: const TextStyle(fontWeight: FontWeight.w500),
),
onPressed: () {
Navigator.of(context).maybePop();
},
),
TextButton(
child: Text(
done,
style: const TextStyle(fontWeight: FontWeight.w500),
),
onPressed: () {
rarities[gradeIndex] = _rarityText.text;
Provider.of<DatabaseProvider>(context, listen: false)
.userStore
.storeGradeRarities(rarities, userId: user.id!);
Navigator.of(context).pop(true);
},
),
],
);
}),
).then((val) {
_rarityText.clear();
});
}
}
class LiveActivityColorSetting extends StatefulWidget { class LiveActivityColorSetting extends StatefulWidget {
const LiveActivityColorSetting({super.key}); const LiveActivityColorSetting({super.key});

View File

@ -84,7 +84,19 @@ class ExtrasSettingsScreenState extends State<ExtrasSettingsScreen> {
onPressed: () async { onPressed: () async {
// settingsProvider.update( // settingsProvider.update(
// gradeOpeningFun: !settingsProvider.gradeOpeningFun); // gradeOpeningFun: !settingsProvider.gradeOpeningFun);
SettingsHelper.surpriseGradeRarityText(context); SettingsHelper.surpriseGradeRarityText(
context,
title: 'rarity_title'.i18n,
cancel: 'cancel'.i18n,
done: 'done'.i18n,
rarities: [
"common".i18n,
"uncommon".i18n,
"rare".i18n,
"epic".i18n,
"legendary".i18n,
],
);
setState(() {}); setState(() {});
}, },
trailingDivider: true, trailingDivider: true,

View File

@ -8,18 +8,45 @@ extension SettingsLocalization on String {
"personalization": "Personalization", "personalization": "Personalization",
"extras": "Extras", "extras": "Extras",
"surprise_grades": "Surprise Grades", "surprise_grades": "Surprise Grades",
"cancel": "Cancel",
"done": "Done",
"rarity_title": "Rarity Text",
// default rarities
"common": "Common",
"uncommon": "Uncommon",
"rare": "Rare",
"epic": "Epic",
"legendary": "Legendary",
}, },
"hu_hu": { "hu_hu": {
"general": "Általános", "general": "Általános",
"personalization": "Személyre szabás", "personalization": "Személyre szabás",
"extras": "Extrák", "extras": "Extrák",
"surprise_grades": "Meglepetés jegyek", "surprise_grades": "Meglepetés jegyek",
"cancel": "Mégse",
"done": "Kész",
"rarity_title": "Ritkaság szövege",
// default rarities
"common": "Gyakori",
"uncommon": "Nem gyakori",
"rare": "Ritka",
"epic": "Epikus",
"legendary": "Legendás",
}, },
"de_de": { "de_de": {
"general": "Allgemeine", "general": "Allgemeine",
"personalization": "Personalisierung", "personalization": "Personalisierung",
"extras": "Extras", "extras": "Extras",
"surprise_grades": "Überraschende Noten", "surprise_grades": "Überraschende Noten",
"cancel": "Abbrechen",
"done": "Bereit",
"rarity_title": "Text zur Seltenheit",
// default rarities
"common": "Gemeinsam",
"uncommon": "Gelegentlich",
"rare": "Selten",
"epic": "Episch",
"legendary": "Legendär",
}, },
}; };