forked from firka/firka
refactor: use streams for fetching data
This commit is contained in:
165
firka/lib/helpers/api/client/kreta_stream.dart
Normal file
165
firka/lib/helpers/api/client/kreta_stream.dart
Normal file
@@ -0,0 +1,165 @@
|
||||
import 'package:firka/helpers/api/model/class_group.dart';
|
||||
import 'package:firka/helpers/api/model/homework.dart';
|
||||
import 'package:firka/helpers/api/model/notice_board.dart';
|
||||
import 'package:firka/helpers/api/model/omission.dart';
|
||||
import 'package:firka/helpers/api/model/test.dart';
|
||||
import 'package:firka/helpers/api/model/timetable.dart';
|
||||
|
||||
import '../model/grade.dart';
|
||||
import '../model/student.dart';
|
||||
import 'kreta_client.dart';
|
||||
|
||||
bool getStudentFL = false;
|
||||
bool getClassGroupsFL = false;
|
||||
bool getNoticeBoardStreamFL = false;
|
||||
bool getInfoBoardStreamFL = false;
|
||||
bool getGradesStreamFL = false;
|
||||
bool getSubjectAverageStreamFL = false;
|
||||
bool getHomeworkStreamFL = false;
|
||||
bool getTimeTableStreamFL = false;
|
||||
bool getTestsStreamFL = false;
|
||||
bool getOmissionsStreamFL = false;
|
||||
|
||||
extension KretaStream on KretaClient {
|
||||
Stream<ApiResponse<Student>> getStudentStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getStudentFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getStudentFL = true;
|
||||
yield await getStudent(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getStudent(forceCache: false);
|
||||
}
|
||||
getStudentFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<ClassGroup>>> getClassGroupsStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getClassGroupsFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getClassGroupsFL = true;
|
||||
yield await getClassGroups(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getClassGroups(forceCache: false);
|
||||
}
|
||||
getClassGroupsFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<NoticeBoardItem>>> getNoticeBoardStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getNoticeBoardStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getNoticeBoardStreamFL = true;
|
||||
yield await getNoticeBoard(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getNoticeBoard(forceCache: false);
|
||||
}
|
||||
getNoticeBoardStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<InfoBoardItem>>> getInfoBoardStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getInfoBoardStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getInfoBoardStreamFL = true;
|
||||
yield await getInfoBoard(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getInfoBoard(forceCache: false);
|
||||
}
|
||||
getInfoBoardStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<Grade>>> getGradesStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getGradesStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getGradesStreamFL = true;
|
||||
yield await getGrades(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getGrades(forceCache: false);
|
||||
}
|
||||
getGradesStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<SubjectAverage>>> getSubjectAverageStream(
|
||||
ClassGroup classGroup,
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getSubjectAverageStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getSubjectAverageStreamFL = true;
|
||||
yield await getSubjectAverage(classGroup, forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getSubjectAverage(classGroup, forceCache: false);
|
||||
}
|
||||
getSubjectAverageStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<Homework>>> getHomeworkStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getHomeworkStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getHomeworkStreamFL = true;
|
||||
yield await getHomework(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getHomework(forceCache: false);
|
||||
}
|
||||
getHomeworkStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<Lesson>>> getTimeTableStream(
|
||||
DateTime from, DateTime to,
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getTimeTableStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getTimeTableStreamFL = true;
|
||||
yield await getTimeTable(from, to, forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getTimeTable(from, to, forceCache: false);
|
||||
}
|
||||
getTimeTableStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<Test>>> getTestsStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getTestsStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getTestsStreamFL = true;
|
||||
yield await getTests(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getTests(forceCache: false);
|
||||
}
|
||||
getTestsStreamFL = false;
|
||||
}
|
||||
|
||||
Stream<ApiResponse<List<Omission>>> getOmissionsStream(
|
||||
{bool cacheOnly = true}) async* {
|
||||
while (getOmissionsStreamFL) {
|
||||
await Future.delayed(Duration(milliseconds: 10));
|
||||
}
|
||||
getOmissionsStreamFL = true;
|
||||
yield await getOmissions(forceCache: true);
|
||||
|
||||
if (!cacheOnly) {
|
||||
yield await getOmissions(forceCache: false);
|
||||
}
|
||||
getOmissionsStreamFL = false;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:firka/helpers/api/client/kreta_stream.dart';
|
||||
import 'package:firka/helpers/api/model/grade.dart';
|
||||
import 'package:firka/helpers/extensions.dart';
|
||||
import 'package:firka/helpers/ui/common_bottom_sheets.dart';
|
||||
@@ -62,53 +63,115 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
|
||||
}
|
||||
|
||||
void updateListener() async {
|
||||
final newData = await loadData(now, forceCache: false);
|
||||
await fetchData(cacheOnly: false);
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
lessons = newData.$1;
|
||||
noticeBoard = newData.$2;
|
||||
infoBoard = newData.$3;
|
||||
student = newData.$4;
|
||||
});
|
||||
}
|
||||
widget.finishNotifier.update();
|
||||
}
|
||||
|
||||
Future<(List<Lesson>, List<NoticeBoardItem>, List<InfoBoardItem>, Student)>
|
||||
loadData(DateTime now, {bool forceCache = true}) async {
|
||||
Future<void> fetchData({bool cacheOnly = true}) async {
|
||||
final midnight = now.getMidnight();
|
||||
|
||||
final respTT = await widget.data.client.getTimeTable(
|
||||
midnight, midnight.add(Duration(hours: 23, minutes: 59)),
|
||||
forceCache: forceCache);
|
||||
var lessonsFetched = 0;
|
||||
var noticeBoardFetched = 0;
|
||||
var infoBoardFetched = 0;
|
||||
var studentFetched = 0;
|
||||
var testsFetched = 0;
|
||||
var gradesFetched = 0;
|
||||
var homeworkFetched = 0;
|
||||
|
||||
final respNB =
|
||||
await widget.data.client.getNoticeBoard(forceCache: forceCache);
|
||||
widget.data.client
|
||||
.getTimeTableStream(
|
||||
midnight, midnight.add(Duration(hours: 23, minutes: 59)),
|
||||
cacheOnly: cacheOnly)
|
||||
.forEach((lessons) {
|
||||
lessonsFetched++;
|
||||
|
||||
final respIB =
|
||||
await widget.data.client.getInfoBoard(forceCache: forceCache);
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
this.lessons = lessons.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
final respStudent =
|
||||
await widget.data.client.getStudent(forceCache: forceCache);
|
||||
widget.data.client
|
||||
.getNoticeBoardStream(cacheOnly: cacheOnly)
|
||||
.forEach((items) {
|
||||
noticeBoardFetched++;
|
||||
|
||||
final testsResp = await widget.data.client.getTests(forceCache: forceCache);
|
||||
tests = testsResp.response;
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
noticeBoard = items.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
final gradesResp =
|
||||
await widget.data.client.getGrades(forceCache: forceCache);
|
||||
grades = gradesResp.response;
|
||||
widget.data.client
|
||||
.getInfoBoardStream(cacheOnly: cacheOnly)
|
||||
.forEach((items) {
|
||||
infoBoardFetched++;
|
||||
|
||||
final homeworkResp =
|
||||
await widget.data.client.getHomework(forceCache: forceCache);
|
||||
homework = homeworkResp.response;
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
infoBoard = items.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return Future.value((
|
||||
respTT.response!,
|
||||
respNB.response!,
|
||||
respIB.response!,
|
||||
respStudent.response!,
|
||||
));
|
||||
widget.data.client
|
||||
.getStudentStream(cacheOnly: cacheOnly)
|
||||
.forEach((student) {
|
||||
studentFetched++;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
this.student = student.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
widget.data.client.getTestsStream(cacheOnly: cacheOnly).forEach((tests) {
|
||||
testsFetched++;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
this.tests = tests.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
widget.data.client.getGradesStream(cacheOnly: cacheOnly).forEach((grades) {
|
||||
gradesFetched++;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
this.grades = grades.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
widget.data.client
|
||||
.getHomeworkStream(cacheOnly: cacheOnly)
|
||||
.forEach((homework) {
|
||||
homeworkFetched++;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
this.homework = homework.response;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
final r = cacheOnly ? 1 : 2;
|
||||
|
||||
while (lessonsFetched < r ||
|
||||
noticeBoardFetched < r ||
|
||||
infoBoardFetched < r ||
|
||||
studentFetched < r ||
|
||||
testsFetched < r ||
|
||||
gradesFetched < r ||
|
||||
homeworkFetched < r) {
|
||||
await Future.delayed(Duration(milliseconds: 50));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -121,16 +184,7 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
|
||||
if (!mounted) return;
|
||||
|
||||
(() async {
|
||||
final newData = await loadData(now);
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
lessons = newData.$1;
|
||||
noticeBoard = newData.$2;
|
||||
infoBoard = newData.$3;
|
||||
student = newData.$4;
|
||||
});
|
||||
}
|
||||
await fetchData();
|
||||
})();
|
||||
|
||||
timer = Timer.periodic(Duration(seconds: 1), (timer) async {
|
||||
@@ -227,6 +281,7 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
|
||||
grades != null &&
|
||||
noticeBoard != null &&
|
||||
lessons != null &&
|
||||
homework != null &&
|
||||
tests != null) {
|
||||
List<(Widget, DateTime)> noticeBoardWidgets = List.empty(growable: true);
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:firka/helpers/api/client/kreta_client.dart';
|
||||
import 'package:firka/helpers/api/client/kreta_stream.dart';
|
||||
import 'package:firka/helpers/api/model/test.dart';
|
||||
import 'package:firka/helpers/api/model/timetable.dart';
|
||||
import 'package:firka/helpers/debug_helper.dart';
|
||||
@@ -144,13 +146,10 @@ class _HomeTimetableScreen extends FirkaState<HomeTimetableScreen>
|
||||
await widget.data.client.getTests();
|
||||
}
|
||||
|
||||
Future<void> initForWeek(DateTime now, {bool forceCache = true}) async {
|
||||
Future<void> _updateState(DateTime now, ApiResponse<List<Lesson>> lessonsResp,
|
||||
ApiResponse<List<Test>> testsResp) async {
|
||||
var monday = now.getMonday().getMidnight();
|
||||
var sunday = monday.add(Duration(days: 6));
|
||||
|
||||
var lessonsResp = await widget.data.client
|
||||
.getTimeTable(monday, sunday, forceCache: forceCache);
|
||||
var testsResp = await widget.data.client.getTests(forceCache: forceCache);
|
||||
List<DateTime> dates = List.empty(growable: true);
|
||||
|
||||
if (lessonsResp.response != null) {
|
||||
@@ -193,6 +192,37 @@ class _HomeTimetableScreen extends FirkaState<HomeTimetableScreen>
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> initForWeek(DateTime now, {bool forceCache = true}) async {
|
||||
var monday = now.getMonday().getMidnight();
|
||||
var sunday = monday.add(Duration(days: 6));
|
||||
|
||||
ApiResponse<List<Lesson>>? lessonsResp;
|
||||
var lessonsFetched = 0;
|
||||
ApiResponse<List<Test>>? testsResp;
|
||||
var testsFetched = 0;
|
||||
|
||||
widget.data.client
|
||||
.getTimeTableStream(monday, sunday, cacheOnly: forceCache)
|
||||
.forEach((lessons) {
|
||||
lessonsResp = lessons;
|
||||
lessonsFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getTestsStream(cacheOnly: forceCache).forEach((tests) {
|
||||
testsResp = tests;
|
||||
testsFetched++;
|
||||
});
|
||||
|
||||
while (lessonsFetched < 1 || testsFetched < 1) {
|
||||
await Future.delayed(Duration(milliseconds: 50));
|
||||
}
|
||||
await _updateState(now, lessonsResp!, testsResp!);
|
||||
while (lessonsFetched < 2 || testsFetched < 2) {
|
||||
await Future.delayed(Duration(milliseconds: 50));
|
||||
}
|
||||
await _updateState(now, lessonsResp!, testsResp!);
|
||||
}
|
||||
|
||||
void updateListener() async {
|
||||
if (now != null) {
|
||||
await initForWeek(now!, forceCache: false);
|
||||
@@ -320,16 +350,6 @@ class _HomeTimetableScreen extends FirkaState<HomeTimetableScreen>
|
||||
final date = dates![i];
|
||||
final realIndex = i; // Always use real index for nav icons
|
||||
|
||||
final lessonsOnDate = lessons!
|
||||
.where((lesson) =>
|
||||
lesson.start.isAfter(date) &&
|
||||
lesson.end.isBefore(date.add(Duration(hours: 24))))
|
||||
.toList();
|
||||
final eventsOnDate = events!
|
||||
.where((lesson) =>
|
||||
lesson.start.isAfter(date.subtract(Duration(seconds: 1))) &&
|
||||
lesson.end.isBefore(date.add(Duration(hours: 23, minutes: 59))))
|
||||
.toList();
|
||||
final testsOnDate = tests!
|
||||
.where((test) =>
|
||||
test.date.isAfter(date.subtract(Duration(seconds: 1))) &&
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:firka/helpers/api/client/kreta_client.dart';
|
||||
import 'package:firka/helpers/api/exceptions/token.dart';
|
||||
import 'package:firka/helpers/api/client/kreta_stream.dart';
|
||||
import 'package:firka/helpers/extensions.dart';
|
||||
import 'package:firka/helpers/settings.dart';
|
||||
import 'package:firka/helpers/update_notifier.dart';
|
||||
import 'package:firka/main.dart';
|
||||
@@ -15,7 +14,6 @@ import 'package:firka/ui/phone/pages/home/home_subpage.dart';
|
||||
import 'package:firka/ui/phone/pages/home/home_timetable_mo.dart';
|
||||
import 'package:firka/ui/phone/screens/home/beta_screen.dart';
|
||||
import 'package:firka/ui/phone/widgets/bottom_nav_icon.dart';
|
||||
import 'package:firka/ui/phone/widgets/login_webview.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -43,7 +41,8 @@ class PageNavData {
|
||||
PageNavData(this.page, this.subPageParams, this.subjectName);
|
||||
}
|
||||
|
||||
final ValueNotifier<PageNavData> pageNavNotifier = ValueNotifier(PageNavData(HomePage.home, null, ""));
|
||||
final ValueNotifier<PageNavData> pageNavNotifier =
|
||||
ValueNotifier(PageNavData(HomePage.home, null, ""));
|
||||
bool forcedNavPage = false; // TODO: this is a hack!
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
@@ -83,7 +82,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
bool _preloadDone = false;
|
||||
int forcedNav = 0;
|
||||
final RefreshController _refreshController =
|
||||
RefreshController(initialRefresh: false);
|
||||
RefreshController(initialRefresh: false);
|
||||
|
||||
ActiveToastType activeToast = ActiveToastType.none;
|
||||
|
||||
@@ -101,84 +100,8 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
|
||||
try {
|
||||
_prefetched = true;
|
||||
var random = Random();
|
||||
|
||||
ApiResponse<Object> res =
|
||||
await widget.data.client.getStudent(forceCache: false);
|
||||
if (res.statusCode >= 400 ||
|
||||
res.err == TokenExpiredException().toString()) {
|
||||
if (_disposed) return;
|
||||
setState(() {
|
||||
activeToast = ActiveToastType.reauth;
|
||||
toast = Positioned(
|
||||
top: MediaQuery.of(context).size.height / 1.6,
|
||||
left: 0.0,
|
||||
right: 0.0,
|
||||
bottom: 0,
|
||||
child: Center(
|
||||
child: GestureDetector(
|
||||
child: Card(
|
||||
color: appStyle.colors.warningCard,
|
||||
shadowColor: Colors.transparent,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
// Use min to prevent filling the width
|
||||
children: [
|
||||
FirkaIconWidget(FirkaIconType.majesticons,
|
||||
Majesticon.alertCircleSolid,
|
||||
color: appStyle.colors.warningAccent, size: 24),
|
||||
SizedBox(width: 4),
|
||||
Text(
|
||||
widget.data.l10n.reauth,
|
||||
style: appStyle.fonts.B_16SB
|
||||
.copyWith(color: appStyle.colors.warningText),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
showModalBottomSheet<void>(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (BuildContext context) {
|
||||
return LoginWebviewWidget(widget.data,
|
||||
username:
|
||||
widget.data.client.model.studentId.toString(),
|
||||
schoolId: widget.data.client.model.iss!);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (res.err != null) {
|
||||
throw "await widget.data.client.getStudent\n${res.err!}";
|
||||
}
|
||||
|
||||
res = await widget.data.client.getGrades(forceCache: false);
|
||||
|
||||
if (res.err != null) {
|
||||
throw "await widget.data.client.getGrades\n${res.err!}";
|
||||
}
|
||||
|
||||
await Future.delayed(Duration(seconds: 1 + random.nextInt(2)));
|
||||
|
||||
var now = timeNow();
|
||||
var start = now.subtract(Duration(days: now.weekday - 1));
|
||||
var end = start.add(Duration(days: 6));
|
||||
|
||||
res =
|
||||
await widget.data.client.getTimeTable(start, end, forceCache: false);
|
||||
if (res.err != null) {
|
||||
throw "await widget.data.client.getTimeTable\n${res.err!}";
|
||||
}
|
||||
await fetchData();
|
||||
|
||||
if (Platform.isAndroid) {
|
||||
await WidgetCacheHelper.updateWidgetCache(appStyle, widget.data.client);
|
||||
@@ -257,6 +180,60 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> fetchData() async {
|
||||
var lessonsFetched = 0;
|
||||
var noticeBoardFetched = 0;
|
||||
var infoBoardFetched = 0;
|
||||
var studentFetched = 0;
|
||||
var testsFetched = 0;
|
||||
var gradesFetched = 0;
|
||||
var homeworkFetched = 0;
|
||||
|
||||
final midnight = timeNow().getMidnight();
|
||||
|
||||
widget.data.client
|
||||
.getTimeTableStream(
|
||||
midnight, midnight.add(Duration(hours: 23, minutes: 59)),
|
||||
cacheOnly: false)
|
||||
.forEach((lessons) {
|
||||
lessonsFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getNoticeBoardStream(cacheOnly: false).forEach((items) {
|
||||
noticeBoardFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getInfoBoardStream(cacheOnly: false).forEach((items) {
|
||||
infoBoardFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getStudentStream(cacheOnly: false).forEach((student) {
|
||||
studentFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getTestsStream(cacheOnly: false).forEach((tests) {
|
||||
testsFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getGradesStream(cacheOnly: false).forEach((grades) {
|
||||
gradesFetched++;
|
||||
});
|
||||
|
||||
widget.data.client.getHomeworkStream(cacheOnly: false).forEach((homework) {
|
||||
homeworkFetched++;
|
||||
});
|
||||
|
||||
while (lessonsFetched < 2 ||
|
||||
noticeBoardFetched < 2 ||
|
||||
infoBoardFetched < 2 ||
|
||||
studentFetched < 2 ||
|
||||
testsFetched < 2 ||
|
||||
gradesFetched < 2 ||
|
||||
homeworkFetched < 2) {
|
||||
await Future.delayed(Duration(milliseconds: 50));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -321,7 +298,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
Timer.run(() {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => BetaScreen(widget.data)),
|
||||
(route) => false,
|
||||
(route) => false,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -488,17 +465,19 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
// Home Button
|
||||
BottomNavIconWidget(() {
|
||||
if (homeScreenPage != HomePage.home) {
|
||||
if (previousPages.length > 1 && forcedNavPage) {
|
||||
if (previousPages.length > 1 &&
|
||||
forcedNavPage) {
|
||||
forcedNavPage = false;
|
||||
_pageController.jumpToPage(
|
||||
previousPages[previousPages.length - 2].index
|
||||
);
|
||||
_pageController.jumpToPage(previousPages[
|
||||
previousPages.length - 2]
|
||||
.index);
|
||||
}
|
||||
if (previousPages.length > 1 && forcedNavPage) {
|
||||
if (previousPages.length > 1 &&
|
||||
forcedNavPage) {
|
||||
forcedNavPage = false;
|
||||
_pageController.jumpToPage(
|
||||
previousPages[previousPages.length - 2].index
|
||||
);
|
||||
_pageController.jumpToPage(previousPages[
|
||||
previousPages.length - 2]
|
||||
.index);
|
||||
}
|
||||
_pageController.animateToPage(
|
||||
HomePage.home.index,
|
||||
@@ -519,11 +498,12 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
// Grades Button
|
||||
BottomNavIconWidget(() {
|
||||
if (homeScreenPage != HomePage.grades) {
|
||||
if (previousPages.length > 1 && forcedNavPage) {
|
||||
if (previousPages.length > 1 &&
|
||||
forcedNavPage) {
|
||||
forcedNavPage = false;
|
||||
_pageController.jumpToPage(
|
||||
previousPages[previousPages.length - 2].index
|
||||
);
|
||||
_pageController.jumpToPage(previousPages[
|
||||
previousPages.length - 2]
|
||||
.index);
|
||||
}
|
||||
_pageController.animateToPage(
|
||||
HomePage.grades.index,
|
||||
@@ -544,11 +524,12 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
// Timetable Button
|
||||
BottomNavIconWidget(() {
|
||||
if (homeScreenPage != HomePage.timetable) {
|
||||
if (previousPages.length > 1 && forcedNavPage) {
|
||||
if (previousPages.length > 1 &&
|
||||
forcedNavPage) {
|
||||
forcedNavPage = false;
|
||||
_pageController.jumpToPage(
|
||||
previousPages[previousPages.length - 2].index
|
||||
);
|
||||
_pageController.jumpToPage(previousPages[
|
||||
previousPages.length - 2]
|
||||
.index);
|
||||
}
|
||||
_pageController.animateToPage(
|
||||
HomePage.timetable.index,
|
||||
@@ -568,7 +549,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
appStyle.colors.textPrimary),
|
||||
// More Button
|
||||
BottomNavIconWidget(
|
||||
() {
|
||||
() {
|
||||
HapticFeedback.lightImpact();
|
||||
showExtrasBottomSheet(context, widget.data);
|
||||
},
|
||||
@@ -580,7 +561,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
appStyle.colors.secondary,
|
||||
appStyle.colors.textPrimary,
|
||||
isProfilePicture:
|
||||
widget.data.profilePicture != null,
|
||||
widget.data.profilePicture != null,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -600,7 +581,8 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
|
||||
return;
|
||||
}
|
||||
|
||||
if (previousPages.isNotEmpty && homeScreenPage != previousPages.last) {
|
||||
if (previousPages.isNotEmpty &&
|
||||
homeScreenPage != previousPages.last) {
|
||||
setState(() {
|
||||
homeScreenPage = previousPages.removeLast();
|
||||
|
||||
@@ -651,7 +633,6 @@ class HomeSubPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _HomeSubPage extends State<HomeSubPage> {
|
||||
|
||||
HomePage? forcedHomePage;
|
||||
String? subPageData;
|
||||
|
||||
@@ -668,20 +649,21 @@ class _HomeSubPage extends State<HomeSubPage> {
|
||||
if (subPageData == null) {
|
||||
switch (p) {
|
||||
case HomePage.home:
|
||||
return HomeMainScreen(widget.data, widget._updateNotifier, widget._updateFinishNotifier);
|
||||
return HomeMainScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier);
|
||||
case HomePage.grades:
|
||||
return PageWithSubPages([
|
||||
(cb) => HomeGradesScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeGradesSubjectScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier)
|
||||
(cb) => HomeGradesScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeGradesSubjectScreen(widget.data,
|
||||
widget._updateNotifier, widget._updateFinishNotifier)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
case HomePage.timetable:
|
||||
return PageWithSubPages([
|
||||
(cb) => HomeTimetableScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeTimetableMonthlyScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb)
|
||||
(cb) => HomeTimetableScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeTimetableMonthlyScreen(widget.data,
|
||||
widget._updateNotifier, widget._updateFinishNotifier, cb)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
}
|
||||
} else {
|
||||
@@ -692,25 +674,17 @@ class _HomeSubPage extends State<HomeSubPage> {
|
||||
case HomePage.grades:
|
||||
activeSubjectUid = subPageData!;
|
||||
return PageWithSubPages([
|
||||
(cb) =>
|
||||
HomeGradesSubjectScreen(
|
||||
widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier),
|
||||
(cb) =>
|
||||
HomeGradesScreen(
|
||||
widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb)
|
||||
(cb) => HomeGradesSubjectScreen(widget.data,
|
||||
widget._updateNotifier, widget._updateFinishNotifier),
|
||||
(cb) => HomeGradesScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
case HomePage.timetable:
|
||||
return PageWithSubPages([
|
||||
(cb) =>
|
||||
HomeTimetableMonthlyScreen(
|
||||
widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb),
|
||||
(cb) =>
|
||||
HomeTimetableScreen(
|
||||
widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb)
|
||||
(cb) => HomeTimetableMonthlyScreen(widget.data,
|
||||
widget._updateNotifier, widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeTimetableScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
}
|
||||
}
|
||||
@@ -718,20 +692,21 @@ class _HomeSubPage extends State<HomeSubPage> {
|
||||
|
||||
switch (widget.page) {
|
||||
case HomePage.home:
|
||||
return HomeMainScreen(widget.data, widget._updateNotifier, widget._updateFinishNotifier);
|
||||
return HomeMainScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier);
|
||||
case HomePage.grades:
|
||||
return PageWithSubPages([
|
||||
(cb) => HomeGradesScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeGradesSubjectScreen(
|
||||
(cb) => HomeGradesScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeGradesSubjectScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
case HomePage.timetable:
|
||||
return PageWithSubPages([
|
||||
(cb) => HomeTimetableScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeTimetableMonthlyScreen(
|
||||
widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb)
|
||||
(cb) => HomeTimetableScreen(widget.data, widget._updateNotifier,
|
||||
widget._updateFinishNotifier, cb),
|
||||
(cb) => HomeTimetableMonthlyScreen(widget.data,
|
||||
widget._updateNotifier, widget._updateFinishNotifier, cb)
|
||||
], subPageActive, subPageBack, pageIndex: 0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user