started grade streak
This commit is contained in:
parent
93dd275969
commit
540e4d2812
@ -23,6 +23,7 @@ class UserProvider with ChangeNotifier {
|
|||||||
String? get nickname => user?.nickname;
|
String? get nickname => user?.nickname;
|
||||||
String get picture => user?.picture ?? "";
|
String get picture => user?.picture ?? "";
|
||||||
String? get displayName => user?.displayName;
|
String? get displayName => user?.displayName;
|
||||||
|
int? get gradeStreak => user?.gradeStreak;
|
||||||
|
|
||||||
final SettingsProvider _settings;
|
final SettingsProvider _settings;
|
||||||
|
|
||||||
|
@ -61,7 +61,8 @@ const settingsDB = DatabaseStruct("settings", {
|
|||||||
const usersDB = DatabaseStruct("users", {
|
const usersDB = DatabaseStruct("users", {
|
||||||
"id": String, "name": String, "username": String, "password": String,
|
"id": String, "name": String, "username": String, "password": String,
|
||||||
"institute_code": String, "student": String, "role": int,
|
"institute_code": String, "student": String, "role": int,
|
||||||
"nickname": String, "picture": String // premium only
|
"nickname": String, "picture": String, // premium only (it's now plus btw)
|
||||||
|
"grade_streak": int,
|
||||||
});
|
});
|
||||||
const userDataDB = DatabaseStruct("user_data", {
|
const userDataDB = DatabaseStruct("user_data", {
|
||||||
"id": String, "grades": String, "timetable": String, "exams": String,
|
"id": String, "grades": String, "timetable": String, "exams": String,
|
||||||
@ -129,7 +130,12 @@ Future<Database> initDB(DatabaseProvider database) async {
|
|||||||
await migrateDB(
|
await migrateDB(
|
||||||
db,
|
db,
|
||||||
struct: usersDB,
|
struct: usersDB,
|
||||||
defaultValues: {"role": 0, "nickname": "", "picture": ""},
|
defaultValues: {
|
||||||
|
"role": 0,
|
||||||
|
"nickname": "",
|
||||||
|
"picture": "",
|
||||||
|
"grade_streak": 0
|
||||||
|
},
|
||||||
);
|
);
|
||||||
await migrateDB(db, struct: userDataDB, defaultValues: {
|
await migrateDB(db, struct: userDataDB, defaultValues: {
|
||||||
"grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]",
|
"grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]",
|
||||||
|
@ -16,8 +16,10 @@ class User {
|
|||||||
Role role;
|
Role role;
|
||||||
String nickname;
|
String nickname;
|
||||||
String picture;
|
String picture;
|
||||||
|
int gradeStreak;
|
||||||
|
|
||||||
String get displayName => nickname != '' ? nickname : name;
|
String get displayName => nickname != '' ? nickname : name;
|
||||||
|
bool get hasStreak => gradeStreak > 0;
|
||||||
|
|
||||||
User({
|
User({
|
||||||
String? id,
|
String? id,
|
||||||
@ -29,6 +31,7 @@ class User {
|
|||||||
required this.role,
|
required this.role,
|
||||||
this.nickname = "",
|
this.nickname = "",
|
||||||
this.picture = "",
|
this.picture = "",
|
||||||
|
this.gradeStreak = 0,
|
||||||
}) {
|
}) {
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
@ -57,6 +60,7 @@ class User {
|
|||||||
role: Role.values[map["role"] ?? 0],
|
role: Role.values[map["role"] ?? 0],
|
||||||
nickname: map["nickname"] ?? "",
|
nickname: map["nickname"] ?? "",
|
||||||
picture: map["picture"] ?? "",
|
picture: map["picture"] ?? "",
|
||||||
|
gradeStreak: map["grade_streak"] ?? 0,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,8 @@ class GradeProvider with ChangeNotifier {
|
|||||||
String? userId = _user.id;
|
String? userId = _user.id;
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
final userStore = _database.userStore;
|
final userStore = _database.userStore;
|
||||||
userStore.storeLastSeen(DateTime.now(), userId: userId, category: LastSeenCategory.surprisegrade);
|
userStore.storeLastSeen(DateTime.now(),
|
||||||
|
userId: userId, category: LastSeenCategory.surprisegrade);
|
||||||
_lastSeen = DateTime.now();
|
_lastSeen = DateTime.now();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,7 +60,8 @@ class GradeProvider with ChangeNotifier {
|
|||||||
String? userId = _user.id;
|
String? userId = _user.id;
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
final userStore = _database.userStore;
|
final userStore = _database.userStore;
|
||||||
userStore.storeLastSeen(DateTime(1969), userId: userId, category: LastSeenCategory.surprisegrade);
|
userStore.storeLastSeen(DateTime(1969),
|
||||||
|
userId: userId, category: LastSeenCategory.surprisegrade);
|
||||||
_lastSeen = DateTime(1969);
|
_lastSeen = DateTime(1969);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,9 +75,11 @@ class GradeProvider with ChangeNotifier {
|
|||||||
|
|
||||||
_grades = await userQuery.getGrades(userId: userId);
|
_grades = await userQuery.getGrades(userId: userId);
|
||||||
await convertBySettings();
|
await convertBySettings();
|
||||||
|
await getGradeStreak();
|
||||||
_groupAvg = await userQuery.getGroupAverages(userId: userId);
|
_groupAvg = await userQuery.getGroupAverages(userId: userId);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
DateTime lastSeenDB = await userQuery.lastSeen(userId: userId, category: LastSeenCategory.surprisegrade);
|
DateTime lastSeenDB = await userQuery.lastSeen(
|
||||||
|
userId: userId, category: LastSeenCategory.surprisegrade);
|
||||||
if (lastSeenDB.millisecondsSinceEpoch == 0 ||
|
if (lastSeenDB.millisecondsSinceEpoch == 0 ||
|
||||||
lastSeenDB.year == 0 ||
|
lastSeenDB.year == 0 ||
|
||||||
!_settings.gradeOpeningFun) {
|
!_settings.gradeOpeningFun) {
|
||||||
@ -133,6 +137,30 @@ class GradeProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get current grade streak and set it to the user
|
||||||
|
Future<void> getGradeStreak() async {
|
||||||
|
User? user = _user.user;
|
||||||
|
if (user == null) throw "Cannot get Grade Streak for User null";
|
||||||
|
|
||||||
|
// streak magic
|
||||||
|
int gradeStreak = 0;
|
||||||
|
List<Grade> grs = _grades;
|
||||||
|
grs.sort((a, b) => -a.date.compareTo(b.date));
|
||||||
|
|
||||||
|
for (Grade grade in grs) {
|
||||||
|
if (grade.value.value == 5) {
|
||||||
|
gradeStreak++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print(gradeStreak);
|
||||||
|
|
||||||
|
user.gradeStreak = gradeStreak;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
// 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
|
// test cucc
|
||||||
@ -173,6 +201,7 @@ class GradeProvider with ChangeNotifier {
|
|||||||
await _database.userStore.storeGrades(grades, userId: userId);
|
await _database.userStore.storeGrades(grades, userId: userId);
|
||||||
_grades = grades;
|
_grades = grades;
|
||||||
await convertBySettings();
|
await convertBySettings();
|
||||||
|
await getGradeStreak();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> storeGroupAvg(List<GroupAverage> groupAvgs) async {
|
Future<void> storeGroupAvg(List<GroupAverage> groupAvgs) async {
|
||||||
|
@ -6,6 +6,7 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||||
import 'package:image_crop/image_crop.dart';
|
import 'package:image_crop/image_crop.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
@ -27,6 +28,8 @@ class ImageNoteEditor extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||||
|
final _title = TextEditingController();
|
||||||
|
|
||||||
final cropKey = GlobalKey<CropState>();
|
final cropKey = GlobalKey<CropState>();
|
||||||
File? _file;
|
File? _file;
|
||||||
File? _sample;
|
File? _sample;
|
||||||
@ -135,7 +138,8 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
|||||||
selfNotes.add(SelfNote.fromJson({
|
selfNotes.add(SelfNote.fromJson({
|
||||||
'id': const Uuid().v4(),
|
'id': const Uuid().v4(),
|
||||||
'content': base64Image,
|
'content': base64Image,
|
||||||
'note_type': 'image'
|
'note_type': 'image',
|
||||||
|
'title': _title.text,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
await Provider.of<DatabaseProvider>(context, listen: false)
|
await Provider.of<DatabaseProvider>(context, listen: false)
|
||||||
@ -171,6 +175,37 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
|||||||
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||||
child: _sample == null ? openImageWidget() : cropImageWidget(),
|
child: _sample == null ? openImageWidget() : cropImageWidget(),
|
||||||
),
|
),
|
||||||
|
Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||||
|
child: TextField(
|
||||||
|
controller: _title,
|
||||||
|
onEditingComplete: () async {},
|
||||||
|
decoration: InputDecoration(
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderSide: const BorderSide(color: Colors.grey, width: 1.5),
|
||||||
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderSide: const BorderSide(color: Colors.grey, width: 1.5),
|
||||||
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(horizontal: 12.0),
|
||||||
|
hintText: 'title'.i18n,
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
icon: const Icon(
|
||||||
|
FeatherIcons.x,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
_title.text = '';
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
// if (widget.u.picture != "")
|
// if (widget.u.picture != "")
|
||||||
// TextButton(
|
// TextButton(
|
||||||
// child: Text(
|
// child: Text(
|
||||||
|
@ -19,6 +19,7 @@ extension SettingsLocalization on String {
|
|||||||
"select_image": "to select an image",
|
"select_image": "to select an image",
|
||||||
"new_image": "New Image",
|
"new_image": "New Image",
|
||||||
"image_note": "Image",
|
"image_note": "Image",
|
||||||
|
"title": "Image title...",
|
||||||
},
|
},
|
||||||
"hu_hu": {
|
"hu_hu": {
|
||||||
"notes": "Füzet",
|
"notes": "Füzet",
|
||||||
@ -36,6 +37,7 @@ extension SettingsLocalization on String {
|
|||||||
"select_image": "kép kiválasztásához",
|
"select_image": "kép kiválasztásához",
|
||||||
"new_image": "Új kép",
|
"new_image": "Új kép",
|
||||||
"image_note": "Kép",
|
"image_note": "Kép",
|
||||||
|
"title": "Kép címe...",
|
||||||
},
|
},
|
||||||
"de_de": {
|
"de_de": {
|
||||||
"notes": "Broschüre",
|
"notes": "Broschüre",
|
||||||
@ -53,6 +55,7 @@ extension SettingsLocalization on String {
|
|||||||
"select_image": "um ein Bild auszuwählen",
|
"select_image": "um ein Bild auszuwählen",
|
||||||
"new_image": "Neues Bild",
|
"new_image": "Neues Bild",
|
||||||
"image_note": "Bild",
|
"image_note": "Bild",
|
||||||
|
"title": "Bildtitel...",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user