fixed grade font size

This commit is contained in:
Kima 2023-05-28 12:51:45 +02:00
parent 9411208f81
commit ebdac408b0
3 changed files with 71 additions and 28 deletions

View File

@ -21,11 +21,20 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:filcnaplo/api/nonce.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 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); Nonce nonceEncoder = Nonce(
nonceEncoder.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase()); key: [98, 97, 83, 115, 120, 79, 119, 108, 85, 49, 106, 77], nonce: nonce);
nonceEncoder
.encode(instituteCode.toUpperCase() + nonce + username.toUpperCase());
return nonceEncoder; return nonceEncoder;
} }
@ -38,18 +47,21 @@ Future loginApi({
void Function(User)? onLogin, void Function(User)? onLogin,
void Function()? onSuccess, void Function()? onSuccess,
}) async { }) async {
Provider.of<KretaClient>(context, listen: false).userAgent = Provider.of<SettingsProvider>(context, listen: false).config.userAgent; Provider.of<KretaClient>(context, listen: false).userAgent =
Provider.of<SettingsProvider>(context, listen: false).config.userAgent;
Map<String, String> headers = { Map<String, String> headers = {
"content-type": "application/x-www-form-urlencoded", "content-type": "application/x-www-form-urlencoded",
}; };
String nonceStr = await Provider.of<KretaClient>(context, listen: false).getAPI(KretaAPI.nonce, json: false); String nonceStr = await Provider.of<KretaClient>(context, listen: false)
.getAPI(KretaAPI.nonce, json: false);
Nonce nonce = getNonce(nonceStr, username, instituteCode); Nonce nonce = getNonce(nonceStr, username, instituteCode);
headers.addAll(nonce.header()); headers.addAll(nonce.header());
Map? res = await Provider.of<KretaClient>(context, listen: false).postAPI(KretaAPI.login, Map? res = await Provider.of<KretaClient>(context, listen: false)
.postAPI(KretaAPI.login,
headers: headers, headers: headers,
body: User.loginBody( body: User.loginBody(
username: username, username: username,
@ -64,8 +76,11 @@ Future loginApi({
} else { } else {
if (res.containsKey("access_token")) { if (res.containsKey("access_token")) {
try { try {
Provider.of<KretaClient>(context, listen: false).accessToken = res["access_token"]; Provider.of<KretaClient>(context, listen: false).accessToken =
Map? studentJson = await Provider.of<KretaClient>(context, listen: false).getAPI(KretaAPI.student(instituteCode)); res["access_token"];
Map? studentJson =
await Provider.of<KretaClient>(context, listen: false)
.getAPI(KretaAPI.student(instituteCode));
Student student = Student.fromJson(studentJson!); Student student = Student.fromJson(studentJson!);
var user = User( var user = User(
username: username, username: username,
@ -79,7 +94,9 @@ Future loginApi({
if (onLogin != null) onLogin(user); if (onLogin != null) onLogin(user);
// Store User in the database // Store User in the database
await Provider.of<DatabaseProvider>(context, listen: false).store.storeUser(user); await Provider.of<DatabaseProvider>(context, listen: false)
.store
.storeUser(user);
Provider.of<UserProvider>(context, listen: false).addUser(user); Provider.of<UserProvider>(context, listen: false).addUser(user);
Provider.of<UserProvider>(context, listen: false).setUser(user.id); Provider.of<UserProvider>(context, listen: false).setUser(user.id);
@ -87,7 +104,8 @@ Future loginApi({
try { try {
await Future.wait([ await Future.wait([
Provider.of<GradeProvider>(context, listen: false).fetch(), Provider.of<GradeProvider>(context, listen: false).fetch(),
Provider.of<TimetableProvider>(context, listen: false).fetch(week: Week.current()), Provider.of<TimetableProvider>(context, listen: false)
.fetch(week: Week.current()),
Provider.of<ExamProvider>(context, listen: false).fetch(), Provider.of<ExamProvider>(context, listen: false).fetch(),
Provider.of<HomeworkProvider>(context, listen: false).fetch(), Provider.of<HomeworkProvider>(context, listen: false).fetch(),
Provider.of<MessageProvider>(context, listen: false).fetchAll(), Provider.of<MessageProvider>(context, listen: false).fetchAll(),

View File

@ -4,30 +4,40 @@ import 'package:flutter/material.dart';
import 'package:i18n_extension/i18n_widget.dart'; import 'package:i18n_extension/i18n_widget.dart';
class AverageDisplay extends StatelessWidget { 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 double average;
final bool border; final bool border;
@override @override
Widget build(BuildContext context) { 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); 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( return Container(
width: border ? 57.0 : 54.0, 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( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(45.0), 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, color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null,
), ),
child: Text( child: Text(
average == 0.0 ? "-" : averageText, average == 0.0 ? "-" : averageText,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle(color: color, fontWeight: FontWeight.w600), style: TextStyle(
color: color, fontWeight: FontWeight.w600, fontSize: 14.0),
maxLines: 1, maxLines: 1,
), ),
); );

View File

@ -6,7 +6,12 @@ import 'package:filcnaplo_mobile_ui/common/average_display.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class GradeSubjectTile extends StatelessWidget { 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); : super(key: key);
final Subject subject; final Subject subject;
@ -25,7 +30,9 @@ class GradeSubjectTile extends StatelessWidget {
} }
final String changeIcon = average < averageBefore ? "" : ""; 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( return Material(
type: MaterialType.transparency, type: MaterialType.transparency,
@ -36,22 +43,30 @@ class GradeSubjectTile extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
onTap: onTap, 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( title: Text(
subject.renamedTo ?? subject.name.capital(), subject.renamedTo ?? subject.name.capital(),
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, 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( trailing: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ 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), const SizedBox(width: 6.0),
if (averageBefore != 0.0 && averageBefore != average) ...[ if (averageBefore != 0.0 && averageBefore != average) ...[
AverageDisplay(average: averageBefore), AverageDisplay(average: averageBefore),
Padding( 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( child: Text(
changeIcon, changeIcon,
style: TextStyle( style: TextStyle(