forked from firka/student-legacy
added goal provider thing
This commit is contained in:
parent
fef0857050
commit
4a43f1607c
@ -12,6 +12,7 @@ import 'package:filcnaplo/theme/observer.dart';
|
|||||||
import 'package:filcnaplo/theme/theme.dart';
|
import 'package:filcnaplo/theme/theme.dart';
|
||||||
import 'package:filcnaplo_kreta_api/client/client.dart';
|
import 'package:filcnaplo_kreta_api/client/client.dart';
|
||||||
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
|
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
|
||||||
|
import 'package:filcnaplo_premium/providers/goal_provider.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -89,6 +90,7 @@ class App extends StatelessWidget {
|
|||||||
|
|
||||||
return MultiProvider(
|
return MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
|
// refilc providers
|
||||||
ChangeNotifierProvider<PremiumProvider>(create: (_) => premium),
|
ChangeNotifierProvider<PremiumProvider>(create: (_) => premium),
|
||||||
ChangeNotifierProvider<SettingsProvider>(create: (_) => settings),
|
ChangeNotifierProvider<SettingsProvider>(create: (_) => settings),
|
||||||
ChangeNotifierProvider<UserProvider>(create: (_) => user),
|
ChangeNotifierProvider<UserProvider>(create: (_) => user),
|
||||||
@ -103,7 +105,7 @@ class App extends StatelessWidget {
|
|||||||
ChangeNotifierProvider<UpdateProvider>(
|
ChangeNotifierProvider<UpdateProvider>(
|
||||||
create: (context) => UpdateProvider(context: context)),
|
create: (context) => UpdateProvider(context: context)),
|
||||||
|
|
||||||
// User data providers
|
// user data (kreten) providers
|
||||||
ChangeNotifierProvider<GradeProvider>(
|
ChangeNotifierProvider<GradeProvider>(
|
||||||
create: (_) => GradeProvider(
|
create: (_) => GradeProvider(
|
||||||
settings: settings,
|
settings: settings,
|
||||||
@ -125,6 +127,7 @@ class App extends StatelessWidget {
|
|||||||
ChangeNotifierProvider<AbsenceProvider>(
|
ChangeNotifierProvider<AbsenceProvider>(
|
||||||
create: (context) => AbsenceProvider(context: context)),
|
create: (context) => AbsenceProvider(context: context)),
|
||||||
|
|
||||||
|
// other providers
|
||||||
ChangeNotifierProvider<GradeCalculatorProvider>(
|
ChangeNotifierProvider<GradeCalculatorProvider>(
|
||||||
create: (_) => GradeCalculatorProvider(
|
create: (_) => GradeCalculatorProvider(
|
||||||
settings: settings,
|
settings: settings,
|
||||||
@ -133,7 +136,9 @@ class App extends StatelessWidget {
|
|||||||
kreta: kreta)),
|
kreta: kreta)),
|
||||||
ChangeNotifierProvider<LiveCardProvider>(
|
ChangeNotifierProvider<LiveCardProvider>(
|
||||||
create: (context) =>
|
create: (context) =>
|
||||||
LiveCardProvider(timetable: timetable, settings: settings))
|
LiveCardProvider(timetable: timetable, settings: settings)),
|
||||||
|
ChangeNotifierProvider<GoalProvider>(
|
||||||
|
create: (context) => GoalProvider(database: database, user: user)),
|
||||||
],
|
],
|
||||||
child: Consumer<ThemeModeObserver>(
|
child: Consumer<ThemeModeObserver>(
|
||||||
builder: (context, themeMode, child) {
|
builder: (context, themeMode, child) {
|
||||||
|
@ -12,6 +12,7 @@ import 'package:flutter_acrylic/flutter_acrylic.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:filcnaplo/models/settings.dart';
|
import 'package:filcnaplo/models/settings.dart';
|
||||||
import 'package:filcnaplo_kreta_api/client/client.dart';
|
import 'package:filcnaplo_kreta_api/client/client.dart';
|
||||||
|
import 'package:filcnaplo_premium/providers/goal_provider.dart';
|
||||||
|
|
||||||
class NavigationScreen extends StatefulWidget {
|
class NavigationScreen extends StatefulWidget {
|
||||||
const NavigationScreen({Key? key}) : super(key: key);
|
const NavigationScreen({Key? key}) : super(key: key);
|
||||||
@ -29,6 +30,7 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
late NavigationRoute selected;
|
late NavigationRoute selected;
|
||||||
late SettingsProvider settings;
|
late SettingsProvider settings;
|
||||||
late NewsProvider newsProvider;
|
late NewsProvider newsProvider;
|
||||||
|
late GoalProvider goalProvider;
|
||||||
double topInset = 0.0;
|
double topInset = 0.0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -45,10 +47,14 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
Provider.of<KretaClient>(context, listen: false).userAgent =
|
Provider.of<KretaClient>(context, listen: false).userAgent =
|
||||||
settings.config.userAgent;
|
settings.config.userAgent;
|
||||||
|
|
||||||
// Get news
|
// get news
|
||||||
newsProvider = Provider.of<NewsProvider>(context, listen: false);
|
newsProvider = Provider.of<NewsProvider>(context, listen: false);
|
||||||
newsProvider.restore().then((value) => newsProvider.fetch());
|
newsProvider.restore().then((value) => newsProvider.fetch());
|
||||||
|
|
||||||
|
// get goals
|
||||||
|
// goalProvider = Provider.of<GoalProvider>(context, listen: false);
|
||||||
|
// goalProvider.fetchDone();
|
||||||
|
|
||||||
// Initial sync
|
// Initial sync
|
||||||
syncAll(context);
|
syncAll(context);
|
||||||
|
|
||||||
@ -98,13 +104,17 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
settings = Provider.of<SettingsProvider>(context);
|
settings = Provider.of<SettingsProvider>(context);
|
||||||
newsProvider = Provider.of<NewsProvider>(context);
|
newsProvider = Provider.of<NewsProvider>(context);
|
||||||
|
goalProvider = Provider.of<GoalProvider>(context);
|
||||||
|
|
||||||
// Show news
|
// show news / complete goals
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
if (newsProvider.show) {
|
if (newsProvider.show) {
|
||||||
newsProvider.lock();
|
newsProvider.lock();
|
||||||
// NewsView.show(newsProvider.news[newsProvider.state], context: context).then((value) => newsProvider.release());
|
// NewsView.show(newsProvider.news[newsProvider.state], context: context).then((value) => newsProvider.release());
|
||||||
}
|
}
|
||||||
|
if (goalProvider.hasDoneGoals) {
|
||||||
|
// to-do
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
@ -3,6 +3,7 @@ import 'package:filcnaplo/helpers/quick_actions.dart';
|
|||||||
import 'package:filcnaplo/models/settings.dart';
|
import 'package:filcnaplo/models/settings.dart';
|
||||||
import 'package:filcnaplo/theme/observer.dart';
|
import 'package:filcnaplo/theme/observer.dart';
|
||||||
import 'package:filcnaplo_kreta_api/client/client.dart';
|
import 'package:filcnaplo_kreta_api/client/client.dart';
|
||||||
|
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
|
||||||
import 'package:filcnaplo_mobile_ui/common/system_chrome.dart';
|
import 'package:filcnaplo_mobile_ui/common/system_chrome.dart';
|
||||||
import 'package:filcnaplo_mobile_ui/screens/navigation/nabar.dart';
|
import 'package:filcnaplo_mobile_ui/screens/navigation/nabar.dart';
|
||||||
import 'package:filcnaplo_mobile_ui/screens/navigation/navbar_item.dart';
|
import 'package:filcnaplo_mobile_ui/screens/navigation/navbar_item.dart';
|
||||||
@ -12,6 +13,7 @@ import 'package:filcnaplo/icons/filc_icons.dart';
|
|||||||
import 'package:filcnaplo_mobile_ui/screens/navigation/status_bar.dart';
|
import 'package:filcnaplo_mobile_ui/screens/navigation/status_bar.dart';
|
||||||
import 'package:filcnaplo_mobile_ui/screens/news/news_view.dart';
|
import 'package:filcnaplo_mobile_ui/screens/news/news_view.dart';
|
||||||
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart';
|
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.dart';
|
||||||
|
import 'package:filcnaplo_premium/ui/mobile/goal_planner/goal_complete_modal.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@ -23,6 +25,7 @@ import 'package:filcnaplo/api/providers/sync.dart';
|
|||||||
import 'package:home_widget/home_widget.dart';
|
import 'package:home_widget/home_widget.dart';
|
||||||
import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart';
|
import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart';
|
||||||
import 'package:background_fetch/background_fetch.dart';
|
import 'package:background_fetch/background_fetch.dart';
|
||||||
|
import 'package:filcnaplo_premium/providers/goal_provider.dart';
|
||||||
|
|
||||||
class NavigationScreen extends StatefulWidget {
|
class NavigationScreen extends StatefulWidget {
|
||||||
const NavigationScreen({Key? key}) : super(key: key);
|
const NavigationScreen({Key? key}) : super(key: key);
|
||||||
@ -42,7 +45,9 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
|
|
||||||
late SettingsProvider settings;
|
late SettingsProvider settings;
|
||||||
late NewsProvider newsProvider;
|
late NewsProvider newsProvider;
|
||||||
|
late GoalProvider goalProvider;
|
||||||
late UpdateProvider updateProvider;
|
late UpdateProvider updateProvider;
|
||||||
|
late GradeProvider gradeProvicer;
|
||||||
|
|
||||||
NavigatorState? get navigator => _navigatorState.currentState;
|
NavigatorState? get navigator => _navigatorState.currentState;
|
||||||
|
|
||||||
@ -156,15 +161,22 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
Provider.of<KretaClient>(context, listen: false).userAgent =
|
Provider.of<KretaClient>(context, listen: false).userAgent =
|
||||||
settings.config.userAgent;
|
settings.config.userAgent;
|
||||||
|
|
||||||
// Get news
|
// get news
|
||||||
newsProvider = Provider.of<NewsProvider>(context, listen: false);
|
newsProvider = Provider.of<NewsProvider>(context, listen: false);
|
||||||
newsProvider.restore().then((value) => newsProvider.fetch());
|
newsProvider.restore().then((value) => newsProvider.fetch());
|
||||||
|
|
||||||
// Get releases
|
// init grade provider (for goals)
|
||||||
|
gradeProvicer = Provider.of<GradeProvider>(context, listen: false);
|
||||||
|
|
||||||
|
// get goals
|
||||||
|
goalProvider = Provider.of<GoalProvider>(context, listen: false);
|
||||||
|
goalProvider.fetchDone(gradeProvider: gradeProvicer);
|
||||||
|
|
||||||
|
// get releases
|
||||||
updateProvider = Provider.of<UpdateProvider>(context, listen: false);
|
updateProvider = Provider.of<UpdateProvider>(context, listen: false);
|
||||||
updateProvider.fetch();
|
updateProvider.fetch();
|
||||||
|
|
||||||
// Initial sync
|
// initial sync
|
||||||
syncAll(context);
|
syncAll(context);
|
||||||
setupQuickActions();
|
setupQuickActions();
|
||||||
}
|
}
|
||||||
@ -195,14 +207,20 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
setSystemChrome(context);
|
setSystemChrome(context);
|
||||||
settings = Provider.of<SettingsProvider>(context);
|
settings = Provider.of<SettingsProvider>(context);
|
||||||
newsProvider = Provider.of<NewsProvider>(context);
|
newsProvider = Provider.of<NewsProvider>(context);
|
||||||
|
goalProvider = Provider.of<GoalProvider>(context);
|
||||||
|
|
||||||
// Show news
|
// show news and complete goals
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
if (newsProvider.show) {
|
if (newsProvider.show) {
|
||||||
NewsView.show(newsProvider.news[0], context: context)
|
NewsView.show(newsProvider.news[0], context: context)
|
||||||
.then((value) => newsProvider.release());
|
.then((value) => newsProvider.release());
|
||||||
newsProvider.lock();
|
newsProvider.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (goalProvider.hasDoneGoals) {
|
||||||
|
GoalCompleteModal.show(goalProvider.doneSubject!, context: context);
|
||||||
|
goalProvider.lock();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
handleQuickActions(context, (page) {
|
handleQuickActions(context, (page) {
|
||||||
|
@ -7,27 +7,24 @@ import 'package:flutter/widgets.dart';
|
|||||||
class GoalProvider extends ChangeNotifier {
|
class GoalProvider extends ChangeNotifier {
|
||||||
final DatabaseProvider _db;
|
final DatabaseProvider _db;
|
||||||
final UserProvider _user;
|
final UserProvider _user;
|
||||||
final GradeProvider _gradeProvider;
|
|
||||||
|
|
||||||
late bool _done = false;
|
late bool _done = false;
|
||||||
late Subject _doneSubject;
|
late Subject? _doneSubject;
|
||||||
|
|
||||||
bool get hasDoneGoals => _done;
|
bool get hasDoneGoals => _done;
|
||||||
Subject get doneSubject => _doneSubject;
|
Subject? get doneSubject => _doneSubject;
|
||||||
|
|
||||||
GoalProvider({
|
GoalProvider({
|
||||||
required DatabaseProvider database,
|
required DatabaseProvider database,
|
||||||
required UserProvider user,
|
required UserProvider user,
|
||||||
required GradeProvider gradeProvider,
|
|
||||||
}) : _db = database,
|
}) : _db = database,
|
||||||
_user = user,
|
_user = user;
|
||||||
_gradeProvider = gradeProvider;
|
|
||||||
|
|
||||||
Future<void> fetchDone() async {
|
Future<void> fetchDone({required GradeProvider gradeProvider}) async {
|
||||||
var goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
var goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
||||||
var beforeAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
var beforeAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
||||||
|
|
||||||
List<Subject> subjects = _gradeProvider.grades
|
List<Subject> subjects = gradeProvider.grades
|
||||||
.map((e) => e.subject)
|
.map((e) => e.subject)
|
||||||
.toSet()
|
.toSet()
|
||||||
.toList()
|
.toList()
|
||||||
@ -42,4 +39,30 @@ class GoalProvider extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lock() {
|
||||||
|
_done = false;
|
||||||
|
_doneSubject = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> clearGoal(Subject subject) async {
|
||||||
|
final goalPlans = await _db.userQuery.subjectGoalPlans(userId: _user.id!);
|
||||||
|
final goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
||||||
|
final goalBeforeGrades =
|
||||||
|
await _db.userQuery.subjectGoalBefores(userId: _user.id!);
|
||||||
|
final goalPinDates =
|
||||||
|
await _db.userQuery.subjectGoalPinDates(userId: _user.id!);
|
||||||
|
|
||||||
|
goalPlans.remove(subject.id);
|
||||||
|
goalAvgs.remove(subject.id);
|
||||||
|
goalBeforeGrades.remove(subject.id);
|
||||||
|
goalPinDates.remove(subject.id);
|
||||||
|
|
||||||
|
await _db.userStore.storeSubjectGoalPlans(goalPlans, userId: _user.id!);
|
||||||
|
await _db.userStore.storeSubjectGoalAverages(goalAvgs, userId: _user.id!);
|
||||||
|
await _db.userStore
|
||||||
|
.storeSubjectGoalBefores(goalBeforeGrades, userId: _user.id!);
|
||||||
|
await _db.userStore
|
||||||
|
.storeSubjectGoalPinDates(goalPinDates, userId: _user.id!);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user