diff --git a/filcnaplo/lib/api/login.dart b/filcnaplo/lib/api/login.dart index 7d98789..69225bd 100644 --- a/filcnaplo/lib/api/login.dart +++ b/filcnaplo/lib/api/login.dart @@ -21,11 +21,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:filcnaplo/api/nonce.dart'; -enum LoginState { missingFields, invalidGrant, failed, normal, inProgress, success } +enum LoginState { + missingFields, + invalidGrant, + failed, + normal, + inProgress, + success +} Nonce getNonce(String nonce, String username, String instituteCode) { - Nonce nonceEncoder = Nonce(key: [98, 97, 83, 115, 120, 79, 119, 108, 85, 49, 106, 77], nonce: nonce); - nonceEncoder.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase()); + Nonce nonceEncoder = Nonce( + key: [98, 97, 83, 115, 120, 79, 119, 108, 85, 49, 106, 77], nonce: nonce); + nonceEncoder + .encode(instituteCode.toUpperCase() + nonce + username.toUpperCase()); return nonceEncoder; } @@ -38,24 +47,27 @@ Future loginApi({ void Function(User)? onLogin, void Function()? onSuccess, }) async { - Provider.of(context, listen: false).userAgent = Provider.of(context, listen: false).config.userAgent; + Provider.of(context, listen: false).userAgent = + Provider.of(context, listen: false).config.userAgent; Map headers = { "content-type": "application/x-www-form-urlencoded", }; - String nonceStr = await Provider.of(context, listen: false).getAPI(KretaAPI.nonce, json: false); + String nonceStr = await Provider.of(context, listen: false) + .getAPI(KretaAPI.nonce, json: false); Nonce nonce = getNonce(nonceStr, username, instituteCode); headers.addAll(nonce.header()); - Map? res = await Provider.of(context, listen: false).postAPI(KretaAPI.login, - headers: headers, - body: User.loginBody( - username: username, - password: password, - instituteCode: instituteCode, - )); + Map? res = await Provider.of(context, listen: false) + .postAPI(KretaAPI.login, + headers: headers, + body: User.loginBody( + username: username, + password: password, + instituteCode: instituteCode, + )); if (res != null) { if (res.containsKey("error")) { if (res["error"] == "invalid_grant") { @@ -64,8 +76,11 @@ Future loginApi({ } else { if (res.containsKey("access_token")) { try { - Provider.of(context, listen: false).accessToken = res["access_token"]; - Map? studentJson = await Provider.of(context, listen: false).getAPI(KretaAPI.student(instituteCode)); + Provider.of(context, listen: false).accessToken = + res["access_token"]; + Map? studentJson = + await Provider.of(context, listen: false) + .getAPI(KretaAPI.student(instituteCode)); Student student = Student.fromJson(studentJson!); var user = User( username: username, @@ -79,7 +94,9 @@ Future loginApi({ if (onLogin != null) onLogin(user); // Store User in the database - await Provider.of(context, listen: false).store.storeUser(user); + await Provider.of(context, listen: false) + .store + .storeUser(user); Provider.of(context, listen: false).addUser(user); Provider.of(context, listen: false).setUser(user.id); @@ -87,7 +104,8 @@ Future loginApi({ try { await Future.wait([ Provider.of(context, listen: false).fetch(), - Provider.of(context, listen: false).fetch(week: Week.current()), + Provider.of(context, listen: false) + .fetch(week: Week.current()), Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetch(), Provider.of(context, listen: false).fetchAll(), diff --git a/filcnaplo_mobile_ui/lib/common/average_display.dart b/filcnaplo_mobile_ui/lib/common/average_display.dart index 09a88f1..735497e 100755 --- a/filcnaplo_mobile_ui/lib/common/average_display.dart +++ b/filcnaplo_mobile_ui/lib/common/average_display.dart @@ -4,30 +4,40 @@ import 'package:flutter/material.dart'; import 'package:i18n_extension/i18n_widget.dart'; class AverageDisplay extends StatelessWidget { - const AverageDisplay({Key? key, this.average = 0.0, this.border = false}) : super(key: key); + const AverageDisplay({Key? key, this.average = 0.0, this.border = false}) + : super(key: key); final double average; final bool border; @override Widget build(BuildContext context) { - Color color = average == 0.0 ? AppColors.of(context).text.withOpacity(.8) : gradeColor(context: context, value: average); + Color color = average == 0.0 + ? AppColors.of(context).text.withOpacity(.8) + : gradeColor(context: context, value: average); String averageText = average.toStringAsFixed(2); - if (I18n.of(context).locale.languageCode != "en") averageText = averageText.replaceAll(".", ","); + if (I18n.of(context).locale.languageCode != "en") { + averageText = averageText.replaceAll(".", ","); + } return Container( width: border ? 57.0 : 54.0, - padding: EdgeInsets.symmetric(horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)), + padding: EdgeInsets.symmetric( + horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)), decoration: BoxDecoration( borderRadius: BorderRadius.circular(45.0), - border: border ? Border.fromBorderSide(BorderSide(color: color.withOpacity(.5), width: 3.0)) : null, + border: border + ? Border.fromBorderSide( + BorderSide(color: color.withOpacity(.5), width: 3.0)) + : null, color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null, ), child: Text( average == 0.0 ? "-" : averageText, textAlign: TextAlign.center, - style: TextStyle(color: color, fontWeight: FontWeight.w600), + style: TextStyle( + color: color, fontWeight: FontWeight.w600, fontSize: 14.0), maxLines: 1, ), ); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart index fd7bff6..93ffacc 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart @@ -6,7 +6,12 @@ import 'package:filcnaplo_mobile_ui/common/average_display.dart'; import 'package:flutter/material.dart'; class GradeSubjectTile extends StatelessWidget { - const GradeSubjectTile(this.subject, {Key? key, this.average = 0.0, this.groupAverage = 0.0, this.onTap, this.averageBefore = 0.0}) + const GradeSubjectTile(this.subject, + {Key? key, + this.average = 0.0, + this.groupAverage = 0.0, + this.onTap, + this.averageBefore = 0.0}) : super(key: key); final Subject subject; @@ -25,7 +30,9 @@ class GradeSubjectTile extends StatelessWidget { } final String changeIcon = average < averageBefore ? "▼" : "▲"; - final Color changeColor = average < averageBefore ? Colors.redAccent : Colors.lightGreenAccent.shade700; + final Color changeColor = average < averageBefore + ? Colors.redAccent + : Colors.lightGreenAccent.shade700; return Material( type: MaterialType.transparency, @@ -36,22 +43,30 @@ class GradeSubjectTile extends StatelessWidget { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), visualDensity: VisualDensity.compact, onTap: onTap, - leading: Icon(SubjectIcon.resolveVariant(subject: subject, context: context), color: textColor.withOpacity(.75)), + leading: Icon( + SubjectIcon.resolveVariant(subject: subject, context: context), + color: textColor.withOpacity(.75)), title: Text( subject.renamedTo ?? subject.name.capital(), maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w600, fontSize: 14.0, color: textColor, fontStyle: subject.isRenamed ? FontStyle.italic : null), + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14.0, + color: textColor, + fontStyle: subject.isRenamed ? FontStyle.italic : null), ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ - if (groupAverage != 0 && averageBefore == 0.0) AverageDisplay(average: groupAverage, border: true), + if (groupAverage != 0 && averageBefore == 0.0) + AverageDisplay(average: groupAverage, border: true), const SizedBox(width: 6.0), if (averageBefore != 0.0 && averageBefore != average) ...[ AverageDisplay(average: averageBefore), Padding( - padding: const EdgeInsets.only(left: 6.0, right: 6.0, bottom: 3.5), + padding: + const EdgeInsets.only(left: 6.0, right: 6.0, bottom: 3.5), child: Text( changeIcon, style: TextStyle(