diff --git a/firka/lib/helpers/api/client/kreta_client.dart b/firka/lib/helpers/api/client/kreta_client.dart index bf41063..9759d6f 100644 --- a/firka/lib/helpers/api/client/kreta_client.dart +++ b/firka/lib/helpers/api/client/kreta_client.dart @@ -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>> _getHomework( - DateTime from, DateTime to, bool forceCache) async { - var (resp, status, ex, cached) = await _timedCachingGet( - isar.homeworkCacheModels, - KretaEndpoints.getHomework(model.iss!), - from, - null, + Future>> 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.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.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>> getHomework(DateTime from, DateTime to, - {bool forceCache = true}) async { - var homework = List.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>> getTimeTable(DateTime from, DateTime to, {bool forceCache = true}) async { @@ -625,7 +580,8 @@ class KretaClient { return ApiResponse(lessons, 200, err, cached); } - Future>> getLessons({bool forceCache = true}) async { + Future>> getLessons( + {bool forceCache = true}) async { var (resp, status, ex, cached) = await _cachingGet( CacheId.getLessons, KretaEndpoints.getLessons(model.iss!), diff --git a/firka/lib/helpers/db/models/generic_cache_model.dart b/firka/lib/helpers/db/models/generic_cache_model.dart index a42f881..175a85b 100644 --- a/firka/lib/helpers/db/models/generic_cache_model.dart +++ b/firka/lib/helpers/db/models/generic_cache_model.dart @@ -11,7 +11,8 @@ enum CacheId { getTests, getClassGroup, getSubjectAvg, - getLessons + getLessons, + getHomework } @collection diff --git a/firka/lib/l10n b/firka/lib/l10n index 572abf7..2dc2d5b 160000 --- a/firka/lib/l10n +++ b/firka/lib/l10n @@ -1 +1 @@ -Subproject commit 572abf7d8ddaa718f80750294f863d62ef55045d +Subproject commit 2dc2d5b9d7b16515220ea8ac32010eaccfb0cf3d diff --git a/firka/lib/ui/phone/pages/home/home_main.dart b/firka/lib/ui/phone/pages/home/home_main.dart index c27a761..b9c76fa 100644 --- a/firka/lib/ui/phone/pages/home/home_main.dart +++ b/firka/lib/ui/phone/pages/home/home_main.dart @@ -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 { List? infoBoard; List? tests; List? grades; + List? homework; Student? student; Timer? timer; @@ -74,26 +77,32 @@ class _HomeMainScreen extends FirkaState { Future<(List, List, List, 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 { 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 { )); } + for (final entry in homework!) { + noticeBoardWidgets + .add((HomeworkWidget(widget.data, entry), entry.creationDate)); + } + noticeBoardWidgets .sort((item1, item2) => item2.$2.difference(item1.$2).inMilliseconds); diff --git a/firka/lib/ui/phone/screens/debug/debug_screen.dart b/firka/lib/ui/phone/screens/debug/debug_screen.dart index 49d8f49..ccb8eba 100644 --- a/firka/lib/ui/phone/screens/debug/debug_screen.dart +++ b/firka/lib/ui/phone/screens/debug/debug_screen.dart @@ -172,13 +172,8 @@ class _DebugScreen extends FirkaState { ), 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()'), ), diff --git a/firka/lib/ui/phone/widgets/homework.dart b/firka/lib/ui/phone/widgets/homework.dart new file mode 100644 index 0000000..f73f1db --- /dev/null +++ b/firka/lib/ui/phone/widgets/homework.dart @@ -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); + }, + ); + } +}