summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2022-11-07 17:49:36 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2022-11-07 17:49:36 +0100
commit40c13a4bb122ee36631a60f738f85fcdbfd233f3 (patch)
treeed45e71e2cc1b7cc7be95976275b9afd9d25f1d7
parente938da92fa92f6c7036934dd5e673c5b9df68f4f (diff)
work
-rw-r--r--lib/main.dart4
-rw-r--r--lib/models/login_request.dart36
-rw-r--r--lib/models/login_response.dart36
-rw-r--r--lib/models/route_list.dart119
-rw-r--r--lib/pages/all_routes_page.dart130
-rw-r--r--lib/pages/delivery_login_page.dart32
-rw-r--r--lib/pages/navigation_page.dart2
-rw-r--r--lib/services/authentication_service.dart6
-rw-r--r--lib/services/istoregear_api_service.dart9
-rw-r--r--lib/services/storegear_api_service.dart57
-rw-r--r--pubspec.yaml1
11 files changed, 424 insertions, 8 deletions
diff --git a/lib/main.dart b/lib/main.dart
index 5282c68..64e7162 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -8,12 +8,14 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:training_planner/services/authentication_service.dart';
import 'package:training_planner/services/iroute_provider_service.dart';
import 'package:training_planner/services/ishift_provider_service.dart';
+import 'package:training_planner/services/istoregear_api_service.dart';
import 'package:training_planner/services/log_service.dart';
import 'package:training_planner/services/messaging_service.dart';
import 'package:training_planner/services/mock_route_provider_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/services/storegear_api_service.dart';
import 'package:training_planner/style/style.dart';
import 'pages/home_page.dart';
import 'package:local_auth/local_auth.dart';
@@ -57,6 +59,8 @@ final LocalAuthentication localAuthService = LocalAuthentication();
final AuthenticationService remoteAuthService = AuthenticationService();
final MessagingService messageService = MessagingService();
final SettingsService settingsService = SettingsService();
+final IStoregearApiService apiService = StoregearApiService();
+
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
diff --git a/lib/models/login_request.dart b/lib/models/login_request.dart
new file mode 100644
index 0000000..811630d
--- /dev/null
+++ b/lib/models/login_request.dart
@@ -0,0 +1,36 @@
+class LoginRequest {
+ String? username;
+ String? password;
+ String? pdaSoftwareVersion;
+ String? deviceImei;
+ String? deviceName;
+ String? deviceIdentifier;
+
+ LoginRequest(
+ {this.username,
+ this.password,
+ this.pdaSoftwareVersion,
+ this.deviceImei,
+ this.deviceName,
+ this.deviceIdentifier});
+
+ LoginRequest.fromJson(Map<String, dynamic> json) {
+ username = json['username'];
+ password = json['password'];
+ pdaSoftwareVersion = json['pda_software_version'];
+ deviceImei = json['device_imei'];
+ deviceName = json['device_name'];
+ deviceIdentifier = json['device_identifier'];
+ }
+
+ Map<String, dynamic> toJson() {
+ final Map<String, dynamic> data = new Map<String, dynamic>();
+ data['username'] = this.username;
+ data['password'] = this.password;
+ data['pda_software_version'] = this.pdaSoftwareVersion;
+ data['device_imei'] = this.deviceImei;
+ data['device_name'] = this.deviceName;
+ data['device_identifier'] = this.deviceIdentifier;
+ return data;
+ }
+}
diff --git a/lib/models/login_response.dart b/lib/models/login_response.dart
new file mode 100644
index 0000000..aea6337
--- /dev/null
+++ b/lib/models/login_response.dart
@@ -0,0 +1,36 @@
+class LoginResponse {
+ String? apiKey;
+ String? username;
+ String? depotNumber;
+ String? dayCode;
+ String? envType;
+ String? vdrJwtToken;
+
+ LoginResponse(
+ {this.apiKey,
+ this.username,
+ this.depotNumber,
+ this.dayCode,
+ this.envType,
+ this.vdrJwtToken});
+
+ LoginResponse.fromJson(Map<String, dynamic> json) {
+ apiKey = json['api_key'];
+ username = json['username'];
+ depotNumber = json['depot_number'];
+ dayCode = json['day_code'];
+ envType = json['env_type'];
+ vdrJwtToken = json['vdr_jwt_token'];
+ }
+
+ Map<String, dynamic> toJson() {
+ final Map<String, dynamic> data = new Map<String, dynamic>();
+ data['api_key'] = this.apiKey;
+ data['username'] = this.username;
+ data['depot_number'] = this.depotNumber;
+ data['day_code'] = this.dayCode;
+ data['env_type'] = this.envType;
+ data['vdr_jwt_token'] = this.vdrJwtToken;
+ return data;
+ }
+}
diff --git a/lib/models/route_list.dart b/lib/models/route_list.dart
new file mode 100644
index 0000000..399212e
--- /dev/null
+++ b/lib/models/route_list.dart
@@ -0,0 +1,119 @@
+class RouteList {
+ List<RouteData>? routes;
+
+ RouteList({this.routes});
+
+ RouteList.fromJson(Map<String, dynamic> json) {
+ if (json['routes'] != null) {
+ routes = <RouteData>[];
+ json['routes'].forEach((v) {
+ routes!.add(new RouteData.fromJson(v));
+ });
+ }
+ }
+
+ Map<String, dynamic> toJson() {
+ final Map<String, dynamic> data = new Map<String, dynamic>();
+ if (this.routes != null) {
+ data['routes'] = this.routes!.map((v) => v.toJson()).toList();
+ }
+ return data;
+ }
+}
+
+class RouteData {
+ String? timeframeKey;
+ String? tripKey;
+ String? tripNumber;
+ String? tripPdaStatus;
+ String? tripPdaStatusDescription;
+ String? tripSequenceNumber;
+ String? numberInTrip;
+ String? plate;
+ bool? damageRegistration;
+ String? eva;
+ String? tripDate;
+ String? firstAddressLat;
+ String? firstAddressLng;
+ String? started;
+ String? allTasksFinished;
+ String? startKm;
+ Null? endKm;
+ String? tasksEnriched;
+ String? inTripScanFinished;
+ String? evaAdded;
+ String? tripStartRequestSent;
+
+ RouteData(
+ {this.timeframeKey,
+ this.tripKey,
+ this.tripNumber,
+ this.tripPdaStatus,
+ this.tripPdaStatusDescription,
+ this.tripSequenceNumber,
+ this.numberInTrip,
+ this.plate,
+ this.damageRegistration,
+ this.eva,
+ this.tripDate,
+ this.firstAddressLat,
+ this.firstAddressLng,
+ this.started,
+ this.allTasksFinished,
+ this.startKm,
+ this.endKm,
+ this.tasksEnriched,
+ this.inTripScanFinished,
+ this.evaAdded,
+ this.tripStartRequestSent});
+
+ RouteData.fromJson(Map<String, dynamic> json) {
+ timeframeKey = json['timeframe_key'];
+ tripKey = json['trip_key'];
+ tripNumber = json['trip_number'];
+ tripPdaStatus = json['trip_pda_status'];
+ tripPdaStatusDescription = json['trip_pda_status_description'];
+ tripSequenceNumber = json['trip_sequence_number'];
+ numberInTrip = json['number_in_trip'];
+ plate = json['plate'];
+ damageRegistration = json['damage_registration'];
+ eva = json['eva'];
+ tripDate = json['trip_date'];
+ firstAddressLat = json['first_address_lat'];
+ firstAddressLng = json['first_address_lng'];
+ started = json['started'];
+ allTasksFinished = json['all_tasks_finished'];
+ startKm = json['start_km'];
+ endKm = json['end_km'];
+ tasksEnriched = json['tasks_enriched'];
+ inTripScanFinished = json['in_trip_scan_finished'];
+ evaAdded = json['eva_added'];
+ tripStartRequestSent = json['trip_start_request_sent'];
+ }
+
+ Map<String, dynamic> toJson() {
+ final Map<String, dynamic> data = new Map<String, dynamic>();
+ data['timeframe_key'] = this.timeframeKey;
+ data['trip_key'] = this.tripKey;
+ data['trip_number'] = this.tripNumber;
+ data['trip_pda_status'] = this.tripPdaStatus;
+ data['trip_pda_status_description'] = this.tripPdaStatusDescription;
+ data['trip_sequence_number'] = this.tripSequenceNumber;
+ data['number_in_trip'] = this.numberInTrip;
+ data['plate'] = this.plate;
+ data['damage_registration'] = this.damageRegistration;
+ data['eva'] = this.eva;
+ data['trip_date'] = this.tripDate;
+ data['first_address_lat'] = this.firstAddressLat;
+ data['first_address_lng'] = this.firstAddressLng;
+ data['started'] = this.started;
+ data['all_tasks_finished'] = this.allTasksFinished;
+ data['start_km'] = this.startKm;
+ data['end_km'] = this.endKm;
+ data['tasks_enriched'] = this.tasksEnriched;
+ data['in_trip_scan_finished'] = this.inTripScanFinished;
+ data['eva_added'] = this.evaAdded;
+ data['trip_start_request_sent'] = this.tripStartRequestSent;
+ return data;
+ }
+}
diff --git a/lib/pages/all_routes_page.dart b/lib/pages/all_routes_page.dart
new file mode 100644
index 0000000..39b49c2
--- /dev/null
+++ b/lib/pages/all_routes_page.dart
@@ -0,0 +1,130 @@
+import 'package:carousel_slider/carousel_slider.dart';
+import 'package:flutter/material.dart';
+import 'package:in_date_utils/in_date_utils.dart' as DateUtilities;
+import 'package:loading_animation_widget/loading_animation_widget.dart';
+import 'package:training_planner/main.dart';
+import 'package:training_planner/models/route_list.dart';
+import 'package:training_planner/route.dart';
+import 'package:training_planner/shift.dart';
+import 'package:training_planner/style/style.dart';
+import 'package:training_planner/utils/date.dart';
+import 'package:training_planner/widgets/agenda_week.dart';
+import 'package:flutter_local_notifications/flutter_local_notifications.dart';
+
+class AllRoutesPage extends StatefulWidget {
+ @override
+ _AllRoutesPageState createState() => _AllRoutesPageState();
+
+ const AllRoutesPage({Key? key}) : super(key: key);
+}
+
+class _AllRoutesPageState extends State<AllRoutesPage> {
+ RouteList? routeInfo;
+ @override
+ initState() {
+ super.initState();
+ debugPrint('XDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD!!!');
+ apiService.getRoutes().then((value) => {
+ setState(() => {routeInfo = value})
+ });
+ }
+
+ List<Widget> createRoutesDataWidgets() {
+ List<Widget> result = [];
+
+ for (var route in routeInfo!.routes!) {
+ result.add(Padding(
+ padding: const EdgeInsets.only(bottom: 8, left: 10, right: 10),
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(color: Style.logbookEntryBorder),
+ color: Style.logbookEntryBackground,
+ borderRadius: BorderRadius.all(Radius.circular(8))),
+ child: Padding(
+ padding: const EdgeInsets.all(8),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ route.tripNumber.toString(),
+ style: TextStyle(
+ color: Colors.white, fontWeight: FontWeight.bold),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ));
+ }
+
+ return result;
+ }
+
+ Widget getDataList() {
+ var monthDataWidgets = createRoutesDataWidgets();
+ if (monthDataWidgets.isEmpty) {
+ return Center(
+ child: Text('Geen data beschikbaar'),
+ );
+ }
+
+ return SafeArea(
+ child: CustomScrollView(
+ physics: null,
+ slivers: [
+ SliverPadding(padding: EdgeInsets.only(top: 20)),
+ SliverList(
+ delegate: SliverChildBuilderDelegate(
+ (BuildContext context, int index) {
+ return monthDataWidgets[index];
+ },
+ childCount: monthDataWidgets.length,
+ )),
+ SliverPadding(padding: EdgeInsets.only(top: 20)),
+ ],
+ ),
+ );
+ }
+
+ Widget getLoadingScreen() {
+ return LoadingAnimationWidget.flickr(
+ leftDotColor: Style.titleColor,
+ rightDotColor: Style.background,
+ size: MediaQuery.of(context).size.width / 4,
+ );
+ }
+
+ Widget getLoadingScreenOrDataList() {
+ if (routeInfo != null) {
+ return getDataList();
+ } else {
+ return getLoadingScreen();
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return ShaderMask(
+ shaderCallback: (Rect rect) {
+ return LinearGradient(
+ begin: Alignment.topCenter,
+ end: Alignment.bottomCenter,
+ colors: [
+ Style.background,
+ Colors.transparent,
+ Colors.transparent,
+ Style.background
+ ],
+ stops: [
+ 0.0,
+ 0.05,
+ 0.95,
+ 1.0
+ ], // 10% purple, 80% transparent, 10% purple
+ ).createShader(rect);
+ },
+ blendMode: BlendMode.dstOut,
+ child: getLoadingScreenOrDataList(),
+ );
+ }
+}
diff --git a/lib/pages/delivery_login_page.dart b/lib/pages/delivery_login_page.dart
index bdf1b0e..15ab4b3 100644
--- a/lib/pages/delivery_login_page.dart
+++ b/lib/pages/delivery_login_page.dart
@@ -1,7 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:training_planner/events/RouteLoadedEvent.dart';
+import 'package:training_planner/models/login_request.dart';
+import 'package:training_planner/models/login_response.dart';
import 'package:training_planner/pages/agenda_page.dart';
+import 'package:training_planner/pages/all_routes_page.dart';
import 'package:training_planner/pages/developer_page.dart';
import 'package:training_planner/pages/logbook_page.dart';
import 'package:training_planner/pages/navigation_page.dart';
@@ -20,23 +23,33 @@ class DeliveryLoginPage extends StatefulWidget {
class _DeliveryLoginPageState extends State<DeliveryLoginPage> {
final pnumberController = TextEditingController();
final daycodeController = TextEditingController();
-
+ final versionController = TextEditingController();
@override
initState() {
super.initState();
pnumberController.text = remoteAuthService.storedPNumber;
daycodeController.text = remoteAuthService.storedDaycode;
+ versionController.text = "1.12.3-prod";
}
_attemptLogin() async {
- bool success = await remoteAuthService.authenticate(
- pnumberController.text, daycodeController.text);
- if (success) {
+ try {
+ LoginResponse res = await apiService.login(LoginRequest(
+ username: pnumberController.text,
+ password: daycodeController.text,
+ pdaSoftwareVersion: versionController.text,
+ deviceImei: "990010902435339",
+ deviceName: "Sussyamongus A11",
+ deviceIdentifier: "990010902435339"));
Navigator.push(
context,
- MaterialPageRoute(builder: (context) => NavigationPage()),
+ MaterialPageRoute(builder: (context) => AllRoutesPage()),
);
+ } catch (e) {
+ debugPrint(e.toString());
+ ScaffoldMessenger.of(context)
+ .showSnackBar(const SnackBar(content: Text('Gegevens kloppen niet')));
}
}
@@ -69,6 +82,15 @@ class _DeliveryLoginPageState extends State<DeliveryLoginPage> {
],
),
Padding(padding: EdgeInsets.all(10)),
+ TextField(
+ decoration: InputDecoration(labelText: "Versie"),
+ keyboardType: TextInputType.number,
+ controller: versionController,
+ inputFormatters: <TextInputFormatter>[
+ FilteringTextInputFormatter.digitsOnly
+ ],
+ ),
+ Padding(padding: EdgeInsets.all(10)),
OutlinedButton(
onPressed: () => _attemptLogin(), child: Text('Inloggen'))
],
diff --git a/lib/pages/navigation_page.dart b/lib/pages/navigation_page.dart
index 2d8c52b..3ab40fd 100644
--- a/lib/pages/navigation_page.dart
+++ b/lib/pages/navigation_page.dart
@@ -221,7 +221,7 @@ class _NavigationPageState extends State<NavigationPage> {
_routingExample!.activeTask.fullAddress,
style: TextStyle(
color: Color.fromARGB(255, 0, 0, 0),
- fontSize: 18,
+ fontSize: 15,
),
),
),
diff --git a/lib/services/authentication_service.dart b/lib/services/authentication_service.dart
index ede8808..ef9113e 100644
--- a/lib/services/authentication_service.dart
+++ b/lib/services/authentication_service.dart
@@ -1,8 +1,10 @@
+import 'package:training_planner/services/istoregear_api_service.dart';
+
class AuthenticationService {
bool isAuthenticated = false;
String apiKey = '';
- String storedPNumber = '';
- String storedDaycode = '';
+ String storedPNumber = '639174';
+ String storedDaycode = '424';
Future<bool> authenticate(String username, String password) async {
isAuthenticated = true;
diff --git a/lib/services/istoregear_api_service.dart b/lib/services/istoregear_api_service.dart
new file mode 100644
index 0000000..adc07e0
--- /dev/null
+++ b/lib/services/istoregear_api_service.dart
@@ -0,0 +1,9 @@
+import 'package:training_planner/models/login_request.dart';
+import 'package:training_planner/models/login_response.dart';
+import 'package:training_planner/models/route_list.dart';
+import 'package:training_planner/route.dart';
+
+abstract class IStoregearApiService {
+ Future<LoginResponse> login(LoginRequest req);
+ Future<RouteList> getRoutes();
+}
diff --git a/lib/services/storegear_api_service.dart b/lib/services/storegear_api_service.dart
new file mode 100644
index 0000000..b346292
--- /dev/null
+++ b/lib/services/storegear_api_service.dart
@@ -0,0 +1,57 @@
+import 'dart:convert';
+import 'package:flutter/cupertino.dart';
+import 'package:http/http.dart' as http;
+import 'package:training_planner/models/login_request.dart';
+import 'package:training_planner/models/login_response.dart';
+import 'package:training_planner/models/route_list.dart';
+import 'package:training_planner/route.dart';
+import 'package:training_planner/services/istoregear_api_service.dart';
+
+class StoregearApiService extends IStoregearApiService {
+ String apiKey = '';
+
+ @override
+ Future<LoginResponse> login(LoginRequest req) async {
+ final response = await http.post(
+ Uri.parse('http://dhlapis.com/delivery/v1/users/login?env_type=PROD'),
+ body: jsonEncode(req));
+ debugPrint(jsonEncode(req));
+ debugPrint(response.body);
+ if (response.statusCode == 200) {
+ // If the server did return a 200 OK response,
+ // then parse the JSON.
+ LoginResponse res = LoginResponse.fromJson(jsonDecode(response.body));
+ apiKey = res.apiKey!;
+ return res;
+ } else {
+ // If the server did not return a 200 OK response,
+ // then throw an exception.
+ throw Exception('Failed login');
+ }
+ }
+
+ @override
+ Future<RouteList> getRoutes() async {
+ debugPrint('WE GOT HERE!!! ' + apiKey);
+ final response = await http.get(
+ Uri.parse('http://dhlapis.com/delivery/v1/routes'),
+ headers: {'X-API-KEY': apiKey});
+
+ debugPrint(response.body);
+ if (response.statusCode == 200) {
+ // If the server did return a 200 OK response,
+ // then parse the JSON.
+
+ var content = jsonDecode(response.body);
+ if (content["message"] != null) {
+ content = jsonEncode(RouteList());
+ }
+
+ return RouteList.fromJson(content);
+ } else {
+ // If the server did not return a 200 OK response,
+ // then throw an exception.
+ throw Exception('Failed to load routes');
+ }
+ }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 629b476..950bf23 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -46,6 +46,7 @@ dependencies:
loading_animation_widget: ^1.1.0+5
geolocator: ^9.0.2
image: ^3.2.2
+ http: ^0.13.5
dev_dependencies:
flutter_test: