diff options
| author | Aldrik Ramaekers <aldrik@amftech.nl> | 2022-11-07 17:49:36 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@amftech.nl> | 2022-11-07 17:49:36 +0100 |
| commit | 40c13a4bb122ee36631a60f738f85fcdbfd233f3 (patch) | |
| tree | ed45e71e2cc1b7cc7be95976275b9afd9d25f1d7 /lib | |
| parent | e938da92fa92f6c7036934dd5e673c5b9df68f4f (diff) | |
work
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/main.dart | 4 | ||||
| -rw-r--r-- | lib/models/login_request.dart | 36 | ||||
| -rw-r--r-- | lib/models/login_response.dart | 36 | ||||
| -rw-r--r-- | lib/models/route_list.dart | 119 | ||||
| -rw-r--r-- | lib/pages/all_routes_page.dart | 130 | ||||
| -rw-r--r-- | lib/pages/delivery_login_page.dart | 32 | ||||
| -rw-r--r-- | lib/pages/navigation_page.dart | 2 | ||||
| -rw-r--r-- | lib/services/authentication_service.dart | 6 | ||||
| -rw-r--r-- | lib/services/istoregear_api_service.dart | 9 | ||||
| -rw-r--r-- | lib/services/storegear_api_service.dart | 57 |
10 files changed, 423 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'); + } + } +} |
