From 8f499aac21846d6d953a608ef10838c708eafaeb Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Mon, 6 Oct 2025 16:56:08 +0200 Subject: [PATCH] tt: implement view subject button --- .../lib/helpers/ui/common_bottom_sheets.dart | 5 +- firka/lib/helpers/update_notifier.dart | 2 +- .../ui/phone/screens/home/home_screen.dart | 201 ++++++++++++++---- 3 files changed, 166 insertions(+), 42 deletions(-) diff --git a/firka/lib/helpers/ui/common_bottom_sheets.dart b/firka/lib/helpers/ui/common_bottom_sheets.dart index fc3f4088..e04812e5 100644 --- a/firka/lib/helpers/ui/common_bottom_sheets.dart +++ b/firka/lib/helpers/ui/common_bottom_sheets.dart @@ -12,6 +12,7 @@ import 'package:majesticons_flutter/majesticons_flutter.dart'; import '../../main.dart'; import '../../ui/model/style.dart'; +import '../../ui/phone/screens/home/home_screen.dart'; import '../../ui/phone/widgets/lesson.dart'; import '../../ui/widget/class_icon.dart'; import '../api/model/timetable.dart'; @@ -266,8 +267,8 @@ Future showLessonBottomSheet( color: appStyle.colors.buttonSecondaryFill, ), onTap: () { - // TODO: Ide jön az a rész, hogy átkéne irányitania a tantárgy megtekintésére - + Navigator.pop(context); + pageNavNotifier.value = PageNavData(HomePage.grades, lesson.subject!.uid); }, ), ), diff --git a/firka/lib/helpers/update_notifier.dart b/firka/lib/helpers/update_notifier.dart index fd46a460..f34fdea1 100644 --- a/firka/lib/helpers/update_notifier.dart +++ b/firka/lib/helpers/update_notifier.dart @@ -1,4 +1,4 @@ -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; class UpdateNotifier with ChangeNotifier { void update() { diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index 1287ccda..32d2942a 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -35,6 +35,16 @@ import '../../pages/extras/main_error.dart'; import '../../pages/home/home_grades_subject.dart'; import '../../pages/home/home_timetable.dart'; +class PageNavData { + HomePage page; + String? subPageParams; + + PageNavData(this.page, this.subPageParams); +} + +final ValueNotifier pageNavNotifier = ValueNotifier(PageNavData(HomePage.home, null)); +bool forcedNavPage = false; // TODO: this is a hack! + class HomeScreen extends StatefulWidget { final AppInitialization data; final bool watchPair; @@ -58,11 +68,12 @@ bool canPop = true; ValueNotifier subPageActive = ValueNotifier(false); UpdateNotifier subPageBack = UpdateNotifier(); +HomePage homeScreenPage = HomePage.home; +List previousPages = List.empty(growable: true); + class _HomeScreenState extends FirkaState { _HomeScreenState(); - HomePage page = HomePage.home; - List previousPages = List.empty(growable: true); final PageController _pageController = PageController(); Widget? toast; @@ -71,16 +82,16 @@ class _HomeScreenState extends FirkaState { bool _preloadDone = false; int forcedNav = 0; final RefreshController _refreshController = - RefreshController(initialRefresh: false); + RefreshController(initialRefresh: false); ActiveToastType activeToast = ActiveToastType.none; void setPageCB(HomePage newPage, bool setPrev) { if (_disposed) return; setState(() { - if (setPrev) previousPages.add(page); + if (setPrev) previousPages.add(homeScreenPage); canPop = false; - page = newPage; + homeScreenPage = newPage; }); } @@ -92,7 +103,7 @@ class _HomeScreenState extends FirkaState { var random = Random(); ApiResponse res = - await widget.data.client.getStudent(forceCache: false); + await widget.data.client.getStudent(forceCache: false); if (res.statusCode >= 400 || res.err == TokenExpiredException().toString()) { if (_disposed) return; @@ -134,7 +145,7 @@ class _HomeScreenState extends FirkaState { builder: (BuildContext context) { return LoginWebviewWidget(widget.data, username: - widget.data.client.model.studentId.toString(), + widget.data.client.model.studentId.toString(), schoolId: widget.data.client.model.iss!); }, ); @@ -163,7 +174,7 @@ class _HomeScreenState extends FirkaState { var end = start.add(Duration(days: 6)); res = - await widget.data.client.getTimeTable(start, end, forceCache: false); + await widget.data.client.getTimeTable(start, end, forceCache: false); if (res.err != null) { throw "await widget.data.client.getTimeTable\n${res.err!}"; } @@ -309,7 +320,7 @@ class _HomeScreenState extends FirkaState { Timer.run(() { Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => BetaScreen(widget.data)), - (route) => false, + (route) => false, ); }); @@ -427,9 +438,9 @@ class _HomeScreenState extends FirkaState { } setState(() { - previousPages.add(page); + previousPages.add(homeScreenPage); canPop = false; - page = HomePage.values[index]; + homeScreenPage = HomePage.values[index]; }); }, children: [ @@ -475,7 +486,19 @@ class _HomeScreenState extends FirkaState { children: [ // Home Button BottomNavIconWidget(() { - if (page != HomePage.home) { + if (homeScreenPage != HomePage.home) { + if (previousPages.length > 1 && forcedNavPage) { + forcedNavPage = false; + _pageController.jumpToPage( + previousPages[previousPages.length - 2].index + ); + } + if (previousPages.length > 1 && forcedNavPage) { + forcedNavPage = false; + _pageController.jumpToPage( + previousPages[previousPages.length - 2].index + ); + } _pageController.animateToPage( HomePage.home.index, duration: Duration(milliseconds: 175), @@ -483,18 +506,24 @@ class _HomeScreenState extends FirkaState { ); } }, - page == HomePage.home, - page == HomePage.home + homeScreenPage == HomePage.home, + homeScreenPage == HomePage.home ? Majesticon.homeSolid : Majesticon.homeLine, widget.data.l10n.home, - page == HomePage.home + homeScreenPage == HomePage.home ? appStyle.colors.accent : appStyle.colors.secondary, appStyle.colors.textPrimary), // Grades Button BottomNavIconWidget(() { - if (page != HomePage.grades) { + if (homeScreenPage != HomePage.grades) { + if (previousPages.length > 1 && forcedNavPage) { + forcedNavPage = false; + _pageController.jumpToPage( + previousPages[previousPages.length - 2].index + ); + } _pageController.animateToPage( HomePage.grades.index, duration: Duration(milliseconds: 175), @@ -502,18 +531,24 @@ class _HomeScreenState extends FirkaState { ); } }, - page == HomePage.grades, - page == HomePage.grades + homeScreenPage == HomePage.grades, + homeScreenPage == HomePage.grades ? Majesticon.bookmarkSolid : Majesticon.bookmarkLine, widget.data.l10n.grades, - page == HomePage.grades + homeScreenPage == HomePage.grades ? appStyle.colors.accent : appStyle.colors.secondary, appStyle.colors.textPrimary), // Timetable Button BottomNavIconWidget(() { - if (page != HomePage.timetable) { + if (homeScreenPage != HomePage.timetable) { + if (previousPages.length > 1 && forcedNavPage) { + forcedNavPage = false; + _pageController.jumpToPage( + previousPages[previousPages.length - 2].index + ); + } _pageController.animateToPage( HomePage.timetable.index, duration: Duration(milliseconds: 175), @@ -521,18 +556,18 @@ class _HomeScreenState extends FirkaState { ); } }, - page == HomePage.timetable, - page == HomePage.timetable + homeScreenPage == HomePage.timetable, + homeScreenPage == HomePage.timetable ? Majesticon.calendarSolid : Majesticon.calendarLine, widget.data.l10n.timetable, - page == HomePage.timetable + homeScreenPage == HomePage.timetable ? appStyle.colors.accent : appStyle.colors.secondary, appStyle.colors.textPrimary), // More Button BottomNavIconWidget( - () { + () { HapticFeedback.lightImpact(); showExtrasBottomSheet(context, widget.data); }, @@ -544,7 +579,7 @@ class _HomeScreenState extends FirkaState { appStyle.colors.secondary, appStyle.colors.textPrimary, isProfilePicture: - widget.data.profilePicture != null, + widget.data.profilePicture != null, ), ], ), @@ -564,13 +599,13 @@ class _HomeScreenState extends FirkaState { return; } - if (previousPages.isNotEmpty && page != previousPages.last) { + if (previousPages.isNotEmpty && homeScreenPage != previousPages.last) { setState(() { - page = previousPages.removeLast(); + homeScreenPage = previousPages.removeLast(); forcedNav++; _pageController.animateToPage( - page.index, + homeScreenPage.index, duration: Duration(milliseconds: 175), curve: Curves.easeInOut, ); @@ -600,7 +635,7 @@ class _HomeScreenState extends FirkaState { } } -class HomeSubPage extends StatelessWidget { +class HomeSubPage extends StatefulWidget { final HomePage page; final AppInitialization data; final UpdateNotifier _updateNotifier; @@ -610,25 +645,113 @@ class HomeSubPage extends StatelessWidget { this.page, this.data, this._updateNotifier, this._updateFinishNotifier, {super.key}); + @override + State createState() => _HomeSubPage(); +} + +class _HomeSubPage extends State { + + HomePage? forcedHomePage; + String? subPageData; + + @override + void initState() { + super.initState(); + pageNavNotifier.addListener(forcePageNavHandler); + } + @override Widget build(BuildContext context) { - switch (page) { + if (forcedHomePage != null) { + final p = forcedHomePage!; + if (subPageData == null) { + switch (p) { + case HomePage.home: + 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) + ], 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) + ], subPageActive, subPageBack, pageIndex: 0); + } + } else { + switch (p) { + case HomePage.home: + return HomeMainScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier); + case HomePage.grades: + activeSubjectUid = subPageData!; + return PageWithSubPages([ + (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) + ], subPageActive, subPageBack, pageIndex: 0); + } + } + } + + switch (widget.page) { case HomePage.home: - return HomeMainScreen(data, _updateNotifier, _updateFinishNotifier); + return HomeMainScreen(widget.data, widget._updateNotifier, widget._updateFinishNotifier); case HomePage.grades: return PageWithSubPages([ - (cb) => HomeGradesScreen( - data, _updateNotifier, _updateFinishNotifier, cb), - (cb) => HomeGradesSubjectScreen( - data, _updateNotifier, _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( - data, _updateNotifier, _updateFinishNotifier, cb), - (cb) => HomeTimetableMonthlyScreen( - data, _updateNotifier, _updateFinishNotifier, cb) + (cb) => HomeTimetableScreen( + widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb), + (cb) => HomeTimetableMonthlyScreen( + widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb) ], subPageActive, subPageBack, pageIndex: 0); } } + + @override + void dispose() { + super.dispose(); + pageNavNotifier.removeListener(forcePageNavHandler); + } + + void forcePageNavHandler() { + if (!mounted) return; + + forcedNavPage = true; + setState(() { + forcedHomePage = pageNavNotifier.value.page; + subPageData = pageNavNotifier.value.subPageParams; + + previousPages.add(homeScreenPage); + homeScreenPage = forcedHomePage!; + globalUpdate.update(); + }); + } }