import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:flushbar/flushbar.dart'; import 'package:http/io_client.dart'; import '../main.dart'; import 'package:location/location.dart'; import 'package:permission_handler/permission_handler.dart' as pHandler; import 'Prefs.dart'; import 'package:oauth2/oauth2.dart' as oauth2; class Util{ bool tokenValidity = true; bool useLocal = false; getOauth2Client() async { bool resetClient = false; oauth2.Credentials restData = (prefs.getString(keyClass.rest_data)!=null&&prefs.getString(keyClass.rest_data).contains("accessToken"))?oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)):null; if(restData == null)resetClient = true; else{ if(DateTime.now().isAfter(restData.expiration))resetClient = true; } oauth2.Client client; if(resetClient||!tokenValidity){ final tokenEndpoint = Uri.parse(prefs.getString(keyClass.restTokenAddress)); if(prefs.getString(keyClass.client_credential)==null){ client = await initRest(); } else{ var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); client = await oauth2.clientCredentialsGrant(tokenEndpoint, clients["id"], clients["secret"],httpClient: http); prefs.setString(keyClass.rest_data, client.credentials.toJson()); } } else { if (prefs.getString(keyClass.client_credential) == null) { client = await initRest(); } else { var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); client = new oauth2.Client(restData, identifier: clients["id"], secret: clients["secret"], httpClient: http); } } return client; } JsonDataPostRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ var httpClient; const JsonDecoder decoder = const JsonDecoder(); var headers = {'Content-type': 'application/json'}; try { var response; if(secure) { httpClient = await getOauth2Client(); oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); headers["Authorization"] = "bearer ${tokenRestData.accessToken}"; } else { httpClient = http; } if (timeout) response = await httpClient.post( Uri.parse(url), headers: headers, body: json.encode(jsonData)).timeout( const Duration(seconds: 10)); else response = await httpClient.post( Uri.parse(url), headers: {'Content-type': 'application/json'}, body: json.encode(jsonData)); if(response.statusCode == 403) tokenValidity = false; if(htmlErrorTitle(response.body.toString())!=""){ return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; } final Map data = decoder.convert(response.body); try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} return data; } on TimeoutException catch(e){ return {"STATUS":0,"DATA":"Request Timeout"}; } on HandshakeException catch(e){ if(useLocal){ return {"STATUS":0,"DATA":"Not Connected to Server. $e"}; } else{ useLocal = true; http = IOClient(HttpClient(context: clientContext)); return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); } } on Exception catch(exception){ print(url); // Toast("Not Connected to Server", Colors.red); return {"STATUS":0,"DATA":"Not Connected to Server. $exception"}; } } JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ var httpClient; const JsonDecoder decoder = const JsonDecoder(); var headers = {'Content-type': 'application/json'}; try { var response; if(secure) { httpClient = await getOauth2Client(); oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); headers["Authorization"] = "bearer ${tokenRestData.accessToken}"; } else { httpClient = http; } if (timeout) response = await httpClient.put( Uri.parse(url), headers: headers, body: json.encode(jsonData)).timeout( const Duration(seconds: 10)); else response = await httpClient.put( Uri.parse(url), headers: {'Content-type': 'application/json'}, body: json.encode(jsonData)); if(response.statusCode == 403) tokenValidity = false; if(htmlErrorTitle(response.body.toString())!=""){ return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; } final Map data = decoder.convert(response.body); try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} return data; } on TimeoutException catch(e){ return {"STATUS":0,"DATA":"Request Timeout"}; } on HandshakeException catch(e){ if(useLocal){ return {"STATUS":0,"DATA":"Not Connected to Server. $e"}; } else{ useLocal = true; http = IOClient(HttpClient(context: clientContext)); return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); } } on Exception catch(exception){ print(url); // Toast("Not Connected to Server", Colors.red); return {"STATUS":0,"DATA":"Not Connected to Server. $exception"}; } } htmlErrorTitle(String html){ try{ if(html.contains('