summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2022-08-19 13:07:39 +0200
committerAldrik Ramaekers <aldrik@amftech.nl>2022-08-19 13:07:39 +0200
commitec7c6e4f7ebd4e096722c7cfd1e651867207ec07 (patch)
tree936aa3778aece0d86ee76a34327a5bd76577fe55
parent019adc4d685e81b658ac88d4f54a4aa151197c09 (diff)
v0.3
-rw-r--r--README4
-rw-r--r--lib/config/defaults.dart3
-rw-r--r--lib/main.dart20
-rw-r--r--lib/pages/developer_page.dart25
-rw-r--r--lib/pages/logbook_page.dart19
-rw-r--r--lib/services/local_shift_provider_service.dart20
-rw-r--r--lib/services/log_service.dart9
-rw-r--r--lib/services/settings_service.dart15
-rw-r--r--lib/style/style.dart12
-rw-r--r--lib/widgets/agenda_week_item.dart62
10 files changed, 132 insertions, 57 deletions
diff --git a/README b/README
index ae88807..9ae5888 100644
--- a/README
+++ b/README
@@ -1,11 +1,9 @@
# Aanpassingen
-- exceptions afhandelen binnen localShiftProvider en doorgeven aan ui
- optie om bepaalde features aan en uit te zetten on config/config.dart
-- verplaats style naar config/style.dart
-- verplaats hardcoded kleuren naar style.dart
# Nog te doen
- Laat gebruiker shift types aanpassen in instellingen pagina
+- notifications werken niet op mobiel
# Features
- Aanmelden van werktijden
diff --git a/lib/config/defaults.dart b/lib/config/defaults.dart
index d71df88..1010e90 100644
--- a/lib/config/defaults.dart
+++ b/lib/config/defaults.dart
@@ -1,3 +1,6 @@
+String program_version = '0.3.0';
+bool debug_output = false;
+
class ShiftType {
String name;
Duration startTime;
diff --git a/lib/main.dart b/lib/main.dart
index 476a36a..d0ff0d8 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,3 +1,5 @@
+import 'dart:async';
+
import 'package:event_bus/event_bus.dart';
import 'package:flutter/material.dart';
import 'package:training_planner/services/ishift_provider_service.dart';
@@ -5,11 +7,16 @@ import 'package:training_planner/services/messaging_service.dart';
import 'package:training_planner/services/mock_shift_provider_service.dart';
import 'package:training_planner/services/local_shift_provider_service.dart';
import 'package:training_planner/services/settings_service.dart';
+import 'package:training_planner/style/style.dart';
import 'pages/home_page.dart';
import 'package:local_auth/local_auth.dart';
void main() {
- runApp(const MyApp());
+ runZonedGuarded(() {
+ runApp(const MyApp());
+ }, (error, stack) {
+ // tja..
+ });
}
final IProgramProviderService shiftProvider = LocalShiftProviderService();
@@ -28,11 +35,20 @@ class MyApp extends StatelessWidget {
return MaterialApp(
title: 'DHL HourTracker',
theme: ThemeData(
- backgroundColor: Color.fromARGB(255, 255, 204, 0),
+ backgroundColor: Style.background,
),
home: HomePage(
agendaWeekNr: 0,
),
+ builder: (context, widget) {
+ Widget error = const Text('...rendering error...');
+ if (widget is Scaffold || widget is Navigator) {
+ error = Scaffold(body: Center(child: error));
+ }
+ ErrorWidget.builder = (errorDetails) => error;
+ if (widget != null) return widget;
+ throw ('widget is null');
+ },
);
}
}
diff --git a/lib/pages/developer_page.dart b/lib/pages/developer_page.dart
index 05a029a..13d3c5d 100644
--- a/lib/pages/developer_page.dart
+++ b/lib/pages/developer_page.dart
@@ -1,6 +1,7 @@
import 'dart:io';
import 'package:flutter/material.dart';
+import 'package:training_planner/config/defaults.dart';
import 'package:training_planner/events/RefreshWeekEvent.dart';
import 'package:training_planner/main.dart';
import 'package:training_planner/services/local_shift_provider_service.dart';
@@ -15,9 +16,17 @@ class DeveloperPage extends StatefulWidget {
}
class _DeveloperPageState extends State<DeveloperPage> {
+ bool canUseLocalAuth = false;
+
@override
initState() {
super.initState();
+
+ auth.canCheckBiometrics.then((bio) => {
+ auth
+ .isDeviceSupported()
+ .then((supported) => {canUseLocalAuth = bio && supported})
+ });
}
void clearLocalFiles() async {
@@ -47,8 +56,22 @@ class _DeveloperPageState extends State<DeveloperPage> {
padding: const EdgeInsets.all(50),
child: Column(
children: [
+ Text('Versie ' + program_version),
TextButton(
- onPressed: () async => clearLocalFiles(),
+ onPressed: () {
+ if (canUseLocalAuth) {
+ auth
+ .authenticate(
+ localizedReason:
+ 'Weet je zeker dat je alle locale bestanden wilt verwijderen?')
+ .then((value) => {
+ if (value) {clearLocalFiles()}
+ })
+ .catchError((f) => {});
+ } else {
+ clearLocalFiles();
+ }
+ },
child: Text('Bestanden verwijderen')),
],
),
diff --git a/lib/pages/logbook_page.dart b/lib/pages/logbook_page.dart
index be49ac8..5449d8f 100644
--- a/lib/pages/logbook_page.dart
+++ b/lib/pages/logbook_page.dart
@@ -72,12 +72,15 @@ class _LogbookPageState extends State<LogbookPage> {
super.initState();
shiftProvider.getPastShifts().then(
- (value) => setState(
- () {
- List<Shift> allShifts = value;
- sortShifts(allShifts);
- },
- ),
+ (value) => {
+ if (mounted)
+ setState(
+ () {
+ List<Shift> allShifts = value;
+ sortShifts(allShifts);
+ },
+ )
+ },
);
}
@@ -89,8 +92,8 @@ class _LogbookPageState extends State<LogbookPage> {
padding: const EdgeInsets.only(bottom: 8, left: 10, right: 10),
child: Container(
decoration: BoxDecoration(
- border: Border.all(color: Color.fromARGB(255, 140, 140, 180)),
- color: Color.fromARGB(255, 180, 180, 200),
+ border: Border.all(color: Style.logbookEntryBorder),
+ color: Style.logbookEntryBackground,
borderRadius: BorderRadius.all(Radius.circular(8))),
child: Padding(
padding: const EdgeInsets.all(8),
diff --git a/lib/services/local_shift_provider_service.dart b/lib/services/local_shift_provider_service.dart
index 9dc045b..fe4d466 100644
--- a/lib/services/local_shift_provider_service.dart
+++ b/lib/services/local_shift_provider_service.dart
@@ -4,6 +4,7 @@ import 'package:intl/intl.dart';
import 'package:training_planner/config/defaults.dart';
import 'package:training_planner/config/old_data.dart';
import 'package:training_planner/services/ishift_provider_service.dart';
+import 'package:training_planner/services/log_service.dart';
import 'package:training_planner/shift.dart';
import 'package:uuid/uuid.dart';
import 'package:in_date_utils/in_date_utils.dart' as DateUtilities;
@@ -30,7 +31,7 @@ class LocalShiftProviderService extends IProgramProviderService {
if (startDate.hour > 12 && startDate.hour < 15)
type = DefaultConfig.shiftTypes[2];
- print(startDate.toString() + ' -> ' + endDate.toString());
+ LogService.log(startDate.toString() + ' -> ' + endDate.toString());
await addShift(Shift(
start: startDate, type: type.name, end: endDate, payRate: 13.75));
}
@@ -73,7 +74,7 @@ class LocalShiftProviderService extends IProgramProviderService {
bool exists = await file.exists();
if (!exists) {
- print('creating ' + fullPath);
+ LogService.log('creating ' + fullPath);
await file.create();
await file.writeAsString(jsonEncode([]));
}
@@ -86,14 +87,15 @@ class LocalShiftProviderService extends IProgramProviderService {
for (var shift in shifts) {
final file = await _localFile(
DateUtilities.DateUtils.firstDayOfWeek(shift.start).toString());
- print(DateUtilities.DateUtils.firstDayOfWeek(shift.start).toString());
+ LogService.log(
+ DateUtilities.DateUtils.firstDayOfWeek(shift.start).toString());
String content = jsonEncode(shifts);
- print('writing content to ' + file.path + ' -- ' + content);
+ LogService.log('writing content to ' + file.path + ' -- ' + content);
await file.writeAsString(content);
}
} catch (e, stacktrace) {
- print(stacktrace);
- print(e);
+ LogService.log(stacktrace);
+ LogService.log(e);
}
}
@@ -107,8 +109,8 @@ class LocalShiftProviderService extends IProgramProviderService {
return data;
} catch (e, stacktrace) {
- print(stacktrace);
- print(e);
+ LogService.log(stacktrace);
+ LogService.log(e);
return [];
}
}
@@ -175,6 +177,8 @@ class LocalShiftProviderService extends IProgramProviderService {
}
}
+ result.sort((a, b) => a.start.compareTo(b.start));
+
return result;
}
diff --git a/lib/services/log_service.dart b/lib/services/log_service.dart
new file mode 100644
index 0000000..cf8ea0b
--- /dev/null
+++ b/lib/services/log_service.dart
@@ -0,0 +1,9 @@
+import 'package:training_planner/config/defaults.dart';
+
+class LogService {
+ static void log(dynamic data) {
+ if (debug_output) {
+ print(data);
+ }
+ }
+}
diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart
index 350d7bd..8f3ea61 100644
--- a/lib/services/settings_service.dart
+++ b/lib/services/settings_service.dart
@@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
+import 'package:training_planner/services/log_service.dart';
class Settings {
double salary;
@@ -42,7 +43,7 @@ class SettingsService {
bool exists = await file.exists();
if (!exists) {
- print('created settings.json');
+ LogService.log('created settings.json');
await file.create();
await file.writeAsString(jsonEncode(DefaultSettings()));
}
@@ -54,11 +55,11 @@ class SettingsService {
try {
final file = await _localFile;
String content = jsonEncode(settings);
- print('writing to file: ' + content);
+ LogService.log('writing to file: ' + content);
await file.writeAsString(content);
} catch (e, stacktrace) {
- print(stacktrace);
- print(e);
+ LogService.log(stacktrace);
+ LogService.log(e);
}
}
@@ -66,13 +67,13 @@ class SettingsService {
try {
final file = await _localFile;
final contents = await file.readAsString();
- print('read from file: ' + contents);
+ LogService.log('read from file: ' + contents);
var raw = await jsonDecode(contents);
var settings = Settings.fromJson(raw);
return settings;
} catch (e, stacktrace) {
- print(stacktrace);
- print(e);
+ LogService.log(stacktrace);
+ LogService.log(e);
writeSettingsToFile(DefaultSettings());
return DefaultSettings();
}
diff --git a/lib/style/style.dart b/lib/style/style.dart
index f14f607..8d82565 100644
--- a/lib/style/style.dart
+++ b/lib/style/style.dart
@@ -4,13 +4,13 @@ class Style {
static const Color background = Color.fromARGB(255, 255, 204, 0);
static const Color titleColor = Color.fromARGB(255, 212, 5, 17);
- static const TextStyle bodyNormal =
- TextStyle(color: Colors.white, fontSize: 14);
-
static const TextStyle listItemTitletextBold =
TextStyle(color: titleColor, fontSize: 16, fontWeight: FontWeight.bold);
- static const TextStyle listItemTitletext =
- TextStyle(color: Colors.red, fontSize: 16, fontWeight: FontWeight.w300);
-
static const Color listEntryBackground = background;
+ static const Color listEntryStandardColor = Colors.black;
+ static const Color listEntryTransparentColor = Color.fromARGB(80, 0, 0, 0);
+
+ static const Color logbookEntryBorder = Color.fromARGB(255, 140, 140, 180);
+ static const Color logbookEntryBackground =
+ Color.fromARGB(255, 180, 180, 200);
}
diff --git a/lib/widgets/agenda_week_item.dart b/lib/widgets/agenda_week_item.dart
index 7847030..fd61506 100644
--- a/lib/widgets/agenda_week_item.dart
+++ b/lib/widgets/agenda_week_item.dart
@@ -120,20 +120,28 @@ class _ExerciseEntryState extends State<AgendaWeekItem> {
Widget createStopShiftButton() {
return TextButton(
onPressed: () {
- auth
- .authenticate(
- localizedReason: 'Weet je zeker dat je wilt eindigen?')
- .then((value) => {
- if (value)
- {
- setState(() {
- widget.shift.setIsActive(false);
- shiftProvider.updateShift(widget.shift);
- stopNotificationForActiveSession();
- })
- }
- })
- .catchError((f) => {});
+ if (canUseLocalAuth) {
+ auth
+ .authenticate(
+ localizedReason: 'Weet je zeker dat je wilt eindigen?')
+ .then((value) => {
+ if (value && mounted)
+ {
+ setState(() {
+ widget.shift.setIsActive(false);
+ shiftProvider.updateShift(widget.shift);
+ stopNotificationForActiveSession();
+ })
+ }
+ })
+ .catchError((f) => {});
+ } else {
+ setState(() {
+ widget.shift.setIsActive(false);
+ shiftProvider.updateShift(widget.shift);
+ stopNotificationForActiveSession();
+ });
+ }
},
child: Text('Einde'));
}
@@ -253,10 +261,10 @@ class _ExerciseEntryState extends State<AgendaWeekItem> {
@override
Widget build(BuildContext context) {
Widget startShiftWidget = createShiftModifyButton();
- TextStyle endDateTextStyle = TextStyle(color: Colors.black);
+ TextStyle endDateTextStyle = TextStyle(color: Style.listEntryStandardColor);
if (!widget.shift.isDone()) {
- endDateTextStyle = TextStyle(color: Color.fromARGB(80, 0, 0, 0));
+ endDateTextStyle = TextStyle(color: Style.listEntryTransparentColor);
}
setStartAndEndTime();
@@ -323,22 +331,32 @@ class _ExerciseEntryState extends State<AgendaWeekItem> {
),
Container(
padding: const EdgeInsets.only(left: 10),
- child: Text(
- DateHelper.getWeekdayName(widget.shift.start.weekday),
- style: Style.listItemTitletextBold,
- textAlign: TextAlign.center,
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Text(
+ DateHelper.getWeekdayName(
+ widget.shift.start.weekday),
+ style: Style.listItemTitletextBold,
+ ),
+ Text(
+ "${widget.shift.start.day.toString().padLeft(2, '0')}e",
+ ),
+ ],
),
width: widthOfWeekday,
),
GestureDetector(
onLongPress: () {
requestStartAndEndTimeForShift()
- .then((e) => {setState(() {})});
+ .then((e) => {if (mounted) setState(() {})});
},
child: Container(
child: RichText(
text: TextSpan(
- style: TextStyle(color: Colors.black),
+ style: TextStyle(
+ color: Style.listEntryStandardColor),
children: [
TextSpan(text: ' | ' + shiftTime),
TextSpan(