diff --git a/lib/main.dart b/lib/main.dart index a1cf5ac..e52b7e6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smoke_cess_app/pages/main_page.dart'; +import 'package:smoke_cess_app/providers/task_provider.dart'; import 'package:smoke_cess_app/services/notification_service.dart'; import 'package:timezone/data/latest.dart' as tz; import 'globals.dart' as globals; @@ -25,8 +26,11 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: _title, - home: ChangeNotifierProvider( - create: (context) => SettingsProvider(), + home: MultiProvider( + providers: [ + ChangeNotifierProvider(create: (context) => SettingsProvider()), + ChangeNotifierProvider(create: (context) => TaskProvider()), + ], child: const MyHomePage(), )); } diff --git a/lib/mock/db_mock.dart b/lib/mock/db_mock.dart index 313cece..4e5d0e6 100644 --- a/lib/mock/db_mock.dart +++ b/lib/mock/db_mock.dart @@ -1,4 +1,3 @@ -import 'package:smoke_cess_app/interface/db_record.dart'; import 'package:smoke_cess_app/models/mood.dart'; import 'package:smoke_cess_app/models/relapse.dart'; import 'package:smoke_cess_app/models/sleep.dart'; @@ -17,7 +16,7 @@ class DatabaseMock implements DatabaseService { final List _moodRecords = []; final List _sleepRecords = []; final List _relapseRecords = []; - final List _workoutRecords = []; + final List _workoutRecords = []; @override Future addMood(Mood mood) { @@ -60,4 +59,9 @@ class DatabaseMock implements DatabaseService { Future> getRelapseRecords() { return Future.value(_relapseRecords); } + + @override + Future> getWorkoutRecords() { + return Future.value(_workoutRecords); + } } diff --git a/lib/models/mood.dart b/lib/models/mood.dart index 562b2b4..7f5e7a6 100644 --- a/lib/models/mood.dart +++ b/lib/models/mood.dart @@ -7,6 +7,8 @@ class Mood implements DatabaseRecord { Mood(this._moodValue, this._comment, this._date); + DateTime get date => _date; + @override factory Mood.fromDatabase(Map map) { DateTime date = DateTime.parse(map['date']); diff --git a/lib/models/sleep.dart b/lib/models/sleep.dart index 3474b03..74fd6cb 100644 --- a/lib/models/sleep.dart +++ b/lib/models/sleep.dart @@ -11,6 +11,8 @@ class Sleep implements DatabaseRecord { Sleep(this._sleepQualityValue, this._comment, this._date, this._sleptAt, this._wokeUpAt); + DateTime get date => _date; + @override factory Sleep.fromDatabase(Map map) { DateTime date = DateTime.parse(map['date']); diff --git a/lib/models/workout.dart b/lib/models/workout.dart index 0bba86a..39ef628 100644 --- a/lib/models/workout.dart +++ b/lib/models/workout.dart @@ -7,8 +7,10 @@ class Workout implements DatabaseRecord { Workout(this._motivationBefore, this._motivationAfter, this._workoutDate); + DateTime get date => _workoutDate; + @override - factory Workout.fromMap(Map map) { + factory Workout.fromDatabase(Map map) { return Workout(map['_workoutDuration'], map['_motivationBefore'], map['_motivationAfter']); } diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index b45b479..1d55df5 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -36,7 +36,7 @@ class MyHomePageState extends State { return Scaffold( appBar: AppBar( title: Text( - '${pages.keys.elementAt(_selectedIndex)} ${_isConfigured ? "Gruppe $group" : ""}')), + '${pages.values.elementAt(_selectedIndex)['title']} ${_isConfigured ? "Gruppe $group" : ""}')), body: Center( child: SingleChildScrollView( child: pages.values.elementAt(_selectedIndex)['page'])), @@ -45,9 +45,9 @@ class MyHomePageState extends State { selectedIndex: _selectedIndex, destinations: pages.keys.map((key) { return NavigationDestination( - icon: pages[key]!['icon'] ?? + icon: pages[key]?['icon'] ?? const Icon(Icons.disabled_by_default), - label: key); + label: pages[key]?['title']); }).toList()), ); } diff --git a/lib/providers/task_provider.dart b/lib/providers/task_provider.dart new file mode 100644 index 0000000..cf27964 --- /dev/null +++ b/lib/providers/task_provider.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:smoke_cess_app/models/sleep.dart'; +import 'package:smoke_cess_app/models/workout.dart'; +import 'package:smoke_cess_app/services/date_service.dart'; +import 'package:smoke_cess_app/services/pages_service.dart'; +import 'package:timezone/browser.dart'; +import '../globals.dart' as globals; +import '../models/mood.dart'; + +class TaskProvider extends ChangeNotifier { + TaskProvider() { + initTasks(); + } + + void setTaksDone(Pages taskName) { + pages[taskName]?['todo'] = false; + notifyListeners(); + } + + void initTasks() { + pages.forEach((key, value) async { + if (!value['todo']) { + switch (key) { + case Pages.mood: + TZDateTime? moodToday = await getTodayMood(); + if (moodToday != null) { + List moodList = + await globals.databaseService.getMoodRecords(); + Mood mood = moodList.last; + pages[key]?['todo'] = !isSameDay(moodToday, mood.date); + } + break; + case Pages.sleep: + TZDateTime? sleepToday = await getTodayMood(); + if (sleepToday != null) { + List sleepList = + await globals.databaseService.getSleepRecords(); + Sleep sleep = sleepList.last; + pages[key]?['todo'] = !isSameDay(sleepToday, sleep.date); + } + break; + case Pages.timer: + { + List workoutList = + await globals.databaseService.getWorkoutRecords(); + Workout mood = workoutList.last; + pages[key]?['todo'] = !isSameDay(DateTime.now(), mood.date); + break; + } + default: + } + } + }); + notifyListeners(); + } +} diff --git a/lib/services/database_service.dart b/lib/services/database_service.dart index 3996883..acc3ca0 100644 --- a/lib/services/database_service.dart +++ b/lib/services/database_service.dart @@ -63,6 +63,15 @@ class DatabaseService { return relapseList; } + Future> getWorkoutRecords() async { + Database db = await instance.database; + var workoutRecords = await db.query('workout'); + List workoutList = workoutRecords.isNotEmpty + ? workoutRecords.map((e) => Workout.fromDatabase(e)).toList() + : []; + return workoutList; + } + Future addMood(Mood mood) async { Database db = await instance.database; return await db.insert('mood', mood.toMap()); diff --git a/lib/services/date_service.dart b/lib/services/date_service.dart index 0fd108e..b5e254f 100644 --- a/lib/services/date_service.dart +++ b/lib/services/date_service.dart @@ -13,6 +13,12 @@ const weekDays = { "Sonntag": 7, }; +bool isSameDay(DateTime? dateA, DateTime? dateB) { + return dateA?.year == dateB?.year && + dateA?.month == dateB?.month && + dateA?.day == dateB?.day; +} + Future> getDatesforMood() async { final List? selectedDays = await getMoodQueryDaysCategories(); final int? selectedHours = await getMoodQueryHours(); @@ -27,6 +33,20 @@ Future> getDatesforSleep() async { return createTZDateTimes(selectedDays, selectedHours, selectedMinutes); } +Future getTodayMood() async { + List moodDates = await getDatesforMood(); + Iterable today = + moodDates.where((element) => isSameDay(element, DateTime.now())); + return today.isNotEmpty ? today.first : null; +} + +Future getTodaySleep() async { + List sleepDates = await getDatesforSleep(); + Iterable today = + sleepDates.where((element) => isSameDay(element, DateTime.now())); + return today.isNotEmpty ? today.first : null; +} + List createTZDateTimes( List? selectedDays, int? selectedHours, int? selectedMinutes) { final List tzDateTimes = []; diff --git a/lib/services/pages_service.dart b/lib/services/pages_service.dart index 8f3ab37..c29795a 100644 --- a/lib/services/pages_service.dart +++ b/lib/services/pages_service.dart @@ -5,25 +5,43 @@ import '../pages/relapse_page.dart'; import '../pages/scanner_page.dart'; import '../pages/sleep_page.dart'; -const pages = { - 'Stimmung': { +enum Pages { + mood, + sleep, + relapse, + timer, + settings, +} + +const Map> pages = { + Pages.mood: { + 'title': 'Stimmung', 'page': MoodPage(), - 'icon': Icon(Icons.mood_outlined, color: Colors.black) + 'icon': Icon(Icons.mood_outlined, color: Colors.black), + 'todo': false, }, - 'Schlaf': { + Pages.sleep: { + 'title': 'Schlaf', 'page': SleepPage(), - 'icon': Icon(Icons.bedtime_outlined, color: Colors.black) + 'icon': Icon(Icons.bedtime_outlined, color: Colors.black), + 'todo': false, }, - 'Timer': { + Pages.relapse: { + 'title': 'Timer', 'page': IntervalTimerPage(), - 'icon': Icon(Icons.timer_outlined, color: Colors.black) + 'icon': Icon(Icons.timer_outlined, color: Colors.black), + 'todo': false, }, - 'Rückfall': { + Pages.timer: { + 'title': 'Rückfall', 'page': RelapsePage(), 'icon': Icon(Icons.smoke_free_outlined, color: Colors.black), + 'todo': false, }, - 'Scanner': { + Pages.settings: { + 'title': 'Scanner', 'page': ScannerPage(), - 'icon': Icon(Icons.camera_alt_outlined, color: Colors.black) + 'icon': Icon(Icons.camera_alt_outlined, color: Colors.black), + 'todo': false, }, };