forked from firka/firka
home/main: add homework entries
This commit is contained in:
@@ -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!),
|
||||
|
||||
@@ -11,7 +11,8 @@ enum CacheId {
|
||||
getTests,
|
||||
getClassGroup,
|
||||
getSubjectAvg,
|
||||
getLessons
|
||||
getLessons,
|
||||
getHomework
|
||||
}
|
||||
|
||||
@collection
|
||||
|
||||
Submodule firka/lib/l10n updated: 572abf7d8d...2dc2d5b9d7
@@ -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);
|
||||
|
||||
|
||||
@@ -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()'),
|
||||
),
|
||||
|
||||
51
firka/lib/ui/phone/widgets/homework.dart
Normal file
51
firka/lib/ui/phone/widgets/homework.dart
Normal 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);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user