home/main: add homework entries

This commit is contained in:
2025-09-30 09:54:51 +02:00
parent 3b6e5d8213
commit 6e35ca9d72
6 changed files with 92 additions and 74 deletions

View File

@@ -4,10 +4,8 @@ import 'dart:math';
import 'package:dio/dio.dart';
import 'package:firka/helpers/api/model/all_lessons.dart';
import 'package:firka/helpers/api/model/class_group.dart';
import 'package:firka/helpers/api/model/homework.dart';
import 'package:firka/helpers/api/model/timetable.dart';
import 'package:firka/helpers/db/models/generic_cache_model.dart';
import 'package:firka/helpers/db/models/homework_cache_model.dart';
import 'package:firka/helpers/db/models/timetable_cache_model.dart';
import 'package:intl/intl.dart';
import 'package:isar/isar.dart';
@@ -19,6 +17,7 @@ import '../../debug_helper.dart';
import '../consts.dart';
import '../exceptions/token.dart';
import '../model/grade.dart';
import '../model/homework.dart';
import '../model/notice_board.dart';
import '../model/omission.dart';
import '../model/student.dart';
@@ -513,28 +512,16 @@ class KretaClient {
return ApiResponse(items, status, err, cached);
}
/// Expects from and to to be 7 days apart
Future<ApiResponse<List<Homework>>> _getHomework(
DateTime from, DateTime to, bool forceCache) async {
var (resp, status, ex, cached) = await _timedCachingGet<HomeworkCacheModel>(
isar.homeworkCacheModels,
KretaEndpoints.getHomework(model.iss!),
from,
null,
Future<ApiResponse<List<Homework>>> getHomework(
{bool forceCache = true}) async {
final now = timeNow().subtract(Duration(days: 365));
var formatter = DateFormat('yyyy-MM-dd');
var start = formatter.format(now);
var (resp, status, ex, cached) = await _cachingGet(
CacheId.getHomework,
"${KretaEndpoints.getHomework(model.iss!)}?datumTol=$start",
forceCache,
0, (dynamic resp, int cacheKey) async {
HomeworkCacheModel cache = HomeworkCacheModel();
var rawClasses = List<String>.empty(growable: true);
for (var obj in resp) {
rawClasses.add(jsonEncode(obj));
}
cache.cacheKey = cacheKey;
cache.values = rawClasses;
await isar.homeworkCacheModels.put(cache as dynamic);
});
0);
var items = List<Homework>.empty(growable: true);
String? err;
@@ -551,43 +538,11 @@ class KretaClient {
err = ex.toString();
}
// items.sort((a, b) => a.date.compareTo(b.date));
return ApiResponse(items, status, err, cached);
}
/// Automatically aligns requests to start at Monday and end at Sunday
Future<ApiResponse<List<Homework>>> getHomework(DateTime from, DateTime to,
{bool forceCache = true}) async {
var homework = List<Homework>.empty(growable: true);
String? err;
bool cached = true;
for (var i = from.millisecondsSinceEpoch;
i < to.millisecondsSinceEpoch;
i += 604800000) {
var from = DateTime.fromMillisecondsSinceEpoch(i);
var start = from.subtract(Duration(days: from.weekday - 1));
var end = start.add(Duration(days: 6));
var resp = await _getHomework(start, end, forceCache);
if (resp.err != null) {
err = resp.err;
if (!resp.cached) {
return resp;
} else {
homework.addAll(resp.response!);
}
} else {
homework.addAll(resp.response!);
}
if (!resp.cached) cached = false;
}
homework.sort((a, b) => a.startDate.compareTo(b.startDate));
homework = homework.where((h) => h.dueDate.isAfter(timeNow())).toList();
return ApiResponse(homework, 200, err, cached);
}
/// Automatically aligns requests to start at Monday and end at Sunday
Future<ApiResponse<List<Lesson>>> getTimeTable(DateTime from, DateTime to,
{bool forceCache = true}) async {
@@ -625,7 +580,8 @@ class KretaClient {
return ApiResponse(lessons, 200, err, cached);
}
Future<ApiResponse<List<AllLessons>>> getLessons({bool forceCache = true}) async {
Future<ApiResponse<List<AllLessons>>> getLessons(
{bool forceCache = true}) async {
var (resp, status, ex, cached) = await _cachingGet(
CacheId.getLessons,
KretaEndpoints.getLessons(model.iss!),

View File

@@ -11,7 +11,8 @@ enum CacheId {
getTests,
getClassGroup,
getSubjectAvg,
getLessons
getLessons,
getHomework
}
@collection

View File

@@ -5,12 +5,14 @@ import 'package:firka/helpers/extensions.dart';
import 'package:firka/helpers/ui/common_bottom_sheets.dart';
import 'package:firka/ui/phone/screens/message/message_screen.dart';
import 'package:firka/ui/phone/widgets/home_main_starting_soon.dart';
import 'package:firka/ui/phone/widgets/homework.dart';
import 'package:firka/ui/phone/widgets/info_board_item.dart';
import 'package:firka/ui/phone/widgets/lesson_small.dart';
import 'package:firka/ui/widget/delayed_spinner.dart';
import 'package:flutter/material.dart';
import 'package:majesticons_flutter/majesticons_flutter.dart';
import '../../../../helpers/api/model/homework.dart';
import '../../../../helpers/api/model/notice_board.dart';
import '../../../../helpers/api/model/student.dart';
import '../../../../helpers/api/model/test.dart';
@@ -47,6 +49,7 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
List<InfoBoardItem>? infoBoard;
List<Test>? tests;
List<Grade>? grades;
List<Homework>? homework;
Student? student;
Timer? timer;
@@ -74,26 +77,32 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
Future<(List<Lesson>, List<NoticeBoardItem>, List<InfoBoardItem>, Student)>
loadData(DateTime now, {bool forceCache = true}) async {
var midnight = now.getMidnight();
final midnight = now.getMidnight();
var respTT = await widget.data.client.getTimeTable(
final respTT = await widget.data.client.getTimeTable(
midnight, midnight.add(Duration(hours: 23, minutes: 59)),
forceCache: forceCache);
var respNB =
final respNB =
await widget.data.client.getNoticeBoard(forceCache: forceCache);
var respIB = await widget.data.client.getInfoBoard(forceCache: forceCache);
final respIB =
await widget.data.client.getInfoBoard(forceCache: forceCache);
var respStudent =
final respStudent =
await widget.data.client.getStudent(forceCache: forceCache);
var testsResp = await widget.data.client.getTests(forceCache: forceCache);
final testsResp = await widget.data.client.getTests(forceCache: forceCache);
tests = testsResp.response;
var gradesResp = await widget.data.client.getGrades(forceCache: forceCache);
final gradesResp =
await widget.data.client.getGrades(forceCache: forceCache);
grades = gradesResp.response;
final homeworkResp =
await widget.data.client.getHomework(forceCache: forceCache);
homework = homeworkResp.response;
return Future.value((
respTT.response!,
respNB.response!,
@@ -217,7 +226,8 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
if (student != null &&
grades != null &&
noticeBoard != null &&
lessons != null) {
lessons != null &&
tests != null) {
List<(Widget, DateTime)> noticeBoardWidgets = List.empty(growable: true);
for (final item in infoBoard!) {
@@ -277,6 +287,11 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
));
}
for (final entry in homework!) {
noticeBoardWidgets
.add((HomeworkWidget(widget.data, entry), entry.creationDate));
}
noticeBoardWidgets
.sort((item1, item2) => item2.$2.difference(item1.$2).inMilliseconds);

View File

@@ -172,13 +172,8 @@ class _DebugScreen extends FirkaState<DebugScreen> {
),
ElevatedButton(
onPressed: () async {
var now = timeNow();
var start = now.subtract(Duration(days: 7));
var end = now.add(Duration(days: 14));
logger.finest(
"getHomework(): ${await widget.data.client.getHomework(start, end, forceCache: useCache)}");
"getHomework(): ${await widget.data.client.getHomework(forceCache: useCache)}");
},
child: const Text('getHomework()'),
),

View File

@@ -0,0 +1,51 @@
import 'package:firka/helpers/api/model/homework.dart';
import 'package:firka/helpers/ui/firka_card.dart';
import 'package:firka/main.dart';
import 'package:firka/ui/model/style.dart';
import 'package:firka/ui/widget/firka_icon.dart';
import 'package:flutter/material.dart';
import 'package:majesticons_flutter/majesticons_flutter.dart';
class HomeworkWidget extends StatelessWidget {
final AppInitialization data;
final Homework item;
const HomeworkWidget(this.data, this.item, {super.key});
@override
Widget build(BuildContext context) {
return GestureDetector(
child: FirkaCard(
left: [
Row(
children: [
FirkaIconWidget(
FirkaIconType.majesticons,
Majesticon.homeSolid,
color: appStyle.colors.accent,
size: 24,
),
SizedBox(
width: 8,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(data.l10n.homework,
style: appStyle.fonts.B_16SB
.apply(color: appStyle.colors.textPrimary)),
Text(item.subjectName,
style: appStyle.fonts.B_16R
.apply(color: appStyle.colors.textPrimary))
],
),
],
)
],
),
onTap: () {
// showGradeBottomSheet(context, widget.data, grade);
},
);
}
}