import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:miler/data/api_config.dart'; import 'package:flutter/foundation.dart'; // Combined Deliverylog providers: /// ── The SSL bypass is gone ── /// /// This file built its own `IOClient` with `onBadCertificate: (_) => true` and /// a hand-rolled `SecureSocket` upgrade, so **every certificate was accepted** /// — a delivery rider's position, his order ids and his session were readable /// and rewritable by anything on the path. The parcel line deleted the same /// code (see `providers/Riderlog/riderlog_provider.dart`); the delivery line /// kept it because nothing in `lib/` imported this file directly. /// /// It also sent **no `Authorization` header**. The URLs it posts to are v1 /// routes on `api.doormile.com` — resolved through the [DeliveryApi] facade — /// so every one of these calls could only ever have been answered with a 401. /// A plain client plus [ApiConfig.authHeaders] fixes both at once. Future> _headers() => ApiConfig.authHeaders(); class CreateDeliveryLogProvider { Future?> createDeliveryLog( String urldata, Map data, { bool wrapInArray = true, }) async { Map? result; final client = http.Client(); try { final url = Uri.parse(urldata); final body = json.encode(wrapInArray ? [data] : data); final response = await client .post(url, body: body, headers: await _headers()) .timeout(const Duration(seconds: 10)); debugPrint('createDeliveryLog url $urldata'); debugPrint(body); debugPrint('createDeliveryLog response ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { result = json.decode(response.body.toString()) as Map; debugPrint('createDeliveryLog parsed ${result.toString()}'); } else { debugPrint('createDeliveryLog failed: HTTP ${response.statusCode}'); } } on TimeoutException catch (e) { debugPrint('createDeliveryLog timeout: $e'); } catch (e) { debugPrint('createDeliveryLog error: $e'); } finally { client.close(); } return result; } } class UpdateDeliveryProvider { Future?> updateDelivery( Map data, String urldata, ) async { Map? updateDeliveryResponse; final client = http.Client(); try { final url = Uri.parse(urldata); final response = await client .put(url, body: json.encode(data), headers: await _headers()) .timeout(const Duration(seconds: 10)); debugPrint('updateDelivery url $urldata'); debugPrint('updateDelivery status ${response.statusCode}'); debugPrint('updateDelivery response ${response.body}'); debugPrint(json.encode(data)); if (response.statusCode >= 200 && response.statusCode < 300) { updateDeliveryResponse = json.decode(response.body) as Map; } else { debugPrint('updateDelivery failed: HTTP ${response.statusCode}'); } } on TimeoutException catch (e) { debugPrint('updateDelivery timeout: $e'); } catch (e) { debugPrint('updateDelivery error: $e'); } finally { client.close(); } return updateDeliveryResponse; } Future?> updateArrivedDelivery( Map data, String urldata, ) async { Map? updateDeliveryResponse; final client = http.Client(); try { final url = Uri.parse(urldata); final response = await client .put(url, body: json.encode(data), headers: await _headers()) .timeout(const Duration(seconds: 10)); debugPrint('updateArrived url $urldata'); debugPrint('updateArrived status ${response.statusCode}'); debugPrint(json.encode(data)); if (response.statusCode >= 200 && response.statusCode < 300) { updateDeliveryResponse = json.decode(response.body) as Map; } else { debugPrint('updateArrived failed: HTTP ${response.statusCode}'); } } on TimeoutException catch (e) { debugPrint('updateArrived timeout: $e'); } catch (e) { debugPrint('updateArrived error: $e'); } finally { client.close(); } return updateDeliveryResponse; } Future?> updatePickedDelivery( Map data, String urldata, ) async { Map? updateDeliveryResponse; final client = http.Client(); try { final url = Uri.parse(urldata); final response = await client .put(url, body: json.encode(data), headers: await _headers()) .timeout(const Duration(seconds: 10)); debugPrint('updatePicked url $urldata'); debugPrint('updatePicked status ${response.statusCode}'); debugPrint(json.encode(data)); if (response.statusCode >= 200 && response.statusCode < 300) { updateDeliveryResponse = json.decode(response.body) as Map; } else { debugPrint('updatePicked failed: HTTP ${response.statusCode}'); } } on TimeoutException catch (e) { debugPrint('updatePicked timeout: $e'); } catch (e) { debugPrint('updatePicked error: $e'); } finally { client.close(); } return updateDeliveryResponse; } Future?> updateActiveDelivery( Map data, String urldata, ) async { Map? updateDeliveryResponse; final client = http.Client(); try { final url = Uri.parse(urldata); final response = await client .put(url, body: json.encode(data), headers: await _headers()) .timeout(const Duration(seconds: 10)); debugPrint('updateActive url $urldata'); debugPrint('updateActive status ${response.statusCode}'); debugPrint(json.encode(data)); if (response.statusCode >= 200 && response.statusCode < 300) { updateDeliveryResponse = json.decode(response.body) as Map; } else { debugPrint('updateActive failed: HTTP ${response.statusCode}'); } } on TimeoutException catch (e) { debugPrint('updateActive timeout: $e'); } catch (e) { debugPrint('updateActive error: $e'); } finally { client.close(); } return updateDeliveryResponse; } } class GetDeliveryLogProvider { Future?> getDeliveryLog(String urldata) async { Map? result; final client = http.Client(); try { final url = Uri.parse(urldata); final response = await client.get( url, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, ); debugPrint('getDeliveryLog url $urldata'); debugPrint('getDeliveryLog response ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { result = json.decode(response.body.toString()) as Map; } } catch (e) { debugPrint('getDeliveryLog error: $e'); } finally { client.close(); } return result; } }