import 'dart:convert'; import 'dart:io' show Platform; import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/core/model/doctor/doctor_profile_model.dart'; import 'package:doctor_app_flutter/core/model/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/core/service/NavigationService.dart'; import 'package:doctor_app_flutter/core/viewModel/authentication_view_model.dart'; import 'package:doctor_app_flutter/utils/dr_app_shared_pref.dart'; import 'package:doctor_app_flutter/utils/dr_app_toast_msg.dart'; import 'package:doctor_app_flutter/utils/exception_report.dart'; import 'package:doctor_app_flutter/utils/utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; import '../locator.dart'; import '../routes.dart'; DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); Utils helpers = new Utils(); class BaseAppClient { //TODO change the post fun to nun static when you change all service post(String endPoint, {Map? body, required Function(dynamic response, int statusCode) onSuccess, required Function(String error, int statusCode) onFailure, bool isAllowAny = false, bool isLiveCare = false, bool isFallLanguage = false}) async { String url; if (isLiveCare) url = BASE_URL_LIVE_CARE + endPoint; else url = BASE_URL + endPoint; bool callLog = true; try { Map? profile = await sharedPref.getObj(DOCTOR_PROFILE); String? token = await sharedPref.getString(TOKEN); if (profile != null) { DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile); if (body == null || body['DoctorID'] == null) { body!['DoctorID'] = doctorProfile.doctorID.toString(); } if (body['DoctorID'] == "") body['DoctorID'] = doctorProfile.doctorID; // changed from null; because create update episode not working if (body['EditedBy'] == null) body['EditedBy'] = doctorProfile.doctorID.toString(); if (body['ProjectID'] == null) { body['ProjectID'] = doctorProfile.projectID.toString(); } if (body['ClinicID'] == null) body['ClinicID'] = doctorProfile.clinicID.toString(); } else { String? doctorID = await sharedPref.getString(DOCTOR_ID); if (body!['DoctorID'] == '') { body['DoctorID'] = null; } else if (doctorID != null) body['DoctorID'] = int.parse(doctorID); } body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] != null ? body['SetupID'] : await sharedPref.getString(DOCTOR_SETUP_ID) : await sharedPref.getString(DOCTOR_SETUP_ID); if (body['EditedBy'] == '') { body.remove("EditedBy"); } if (body['TokenID'] == null) { body['TokenID'] = token ?? ''; } if (!isFallLanguage) { String? lang = await sharedPref.getString(APP_Language); if (lang != null && lang == 'ar') body['LanguageID'] = '1'; else body['LanguageID'] = '2'; } body['stamp'] = DateTime.now().toIso8601String(); body['IPAdress'] = IP_ADDRESS.toString(); if (body['VersionID'] == null) { body['VersionID'] = VERSION_ID.toString(); } if (body['Channel'] == null) { body['Channel'] = CHANNEL.toString(); } body['SessionID'] = SESSION_ID.toString(); body['IsLoginForDoctorApp'] = IS_LOGIN_FOR_DOCTOR_APP.toString(); body['PatientOutSA'] = body['PatientOutSA'] ?? '0'; // PATIENT_OUT_SA; if (body['VidaAuthTokenID'] == null) { body['VidaAuthTokenID'] = await sharedPref.getString(VIDA_AUTH_TOKEN_ID); } if (body['VidaRefreshTokenID'] == null) { body['VidaRefreshTokenID'] = await sharedPref.getString(VIDA_REFRESH_TOKEN_ID); } int? projectID = await sharedPref.getInt(PROJECT_ID); if (projectID == 2 || projectID == 3) body['PatientOutSA'] = true; else if ((body.containsKey('facilityId') && body['facilityId'] == 2 || body['facilityId'] == 3) || body['ProjectID'] == 2 || body['ProjectID'] == 3) body['PatientOutSA'] = 'true'; else body['PatientOutSA'] = 'false'; // if (!body.containsKey('ProjectID')) { // if (projectID != null) { // body['ProjectID'] = projectID; // } else { // body['ProjectID'] = 0; // } // } body['DeviceTypeID'] = Platform.isAndroid ? '1' : '2'; // body['ClinicID'] = 501; // body['ProjectID'] = 12; // body['DoctorID'] = 1002; //3844083 // body['TokenID'] = "@dm!n"; // print("ProjectID :"); // print(body['ProjectID']); debugPrint("URL : $url"); debugPrint("Body : ${json.encode(body)}"); var asd = json.encode(body); var asd2; if (await Utils.checkConnection()) { final response = await http.post(Uri.parse(url), body: json.encode(body), headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}); final int statusCode = response.statusCode; if (statusCode < 200 || statusCode >= 400) { onFailure(Utils.generateContactAdminMsg(), statusCode); if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: "$statusCode"); } else { var parsed = json.decode(response.body.toString()); if (parsed['ErrorType'] == 4) { helpers.navigateToUpdatePage(parsed['ErrorEndUserMessage'], parsed['AndroidLink'], parsed['IOSLink']); } if (parsed['IsAuthenticated'] != null && !parsed['IsAuthenticated']) { if (body['OTP_SendType'] != null) { if (parsed['ErrorCode'] == '699') { onSuccess(parsed, statusCode); } else { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: getError(parsed)); onFailure(getError(parsed), statusCode); } } else if (!isAllowAny) { await Provider.of(AppGlobal.CONTEX, listen: false).logout(); //todo nofailure is placed here and but have to handle the response here as well Utils.showErrorToast('Your session expired Please login again'); locator().pushNamedAndRemoveUntil(ROOT); } if (isAllowAny) { onFailure(getError(parsed), statusCode); } } else if (parsed['MessageStatus'] == 1) { if (!parsed['IsAuthenticated']) { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: getError(parsed)); onFailure(getError(parsed), statusCode); } else onSuccess(parsed, statusCode); } else { final validations = parsed['ValidationErrorsCSI']?['errors']?['Validations']; if (validations is List && validations.isNotEmpty) { final error = validations.first['Error']; if (error != null) { onFailure(error, statusCode); return; } } if (body['DoctorID'] != null) { postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: getError(parsed)); } onFailure(getError(parsed), statusCode); } } } else { onFailure('Please Check The Internet Connection', -1); } } catch (e) { print(e); onFailure(e.toString(), -1); } } postPatient(String endPoint, {Map? body, required Function(dynamic response, int statusCode) onSuccess, required Function(String error, int statusCode) onFailure, PatiantInformtion? patient, bool isExternal = false}) async { String url = BASE_URL + endPoint; try { Map headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}; String? token = await sharedPref.getString(TOKEN); Map? profile = await sharedPref.getObj(DOCTOR_PROFILE); if (profile != null) { DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile); if (body!['DoctorID'] == null) { body['DoctorID'] = doctorProfile.doctorID; } } if (body!['DoctorID'] == 0) { body['DoctorID'] = null; } var languageID = await sharedPref.getStringWithDefaultValue(APP_Language, 'en'); body['SetupID'] = body!.containsKey('SetupID') ? body['SetupID'] != null ? body['SetupID'] : await sharedPref.getString(DOCTOR_SETUP_ID) : await sharedPref.getString(DOCTOR_SETUP_ID); body['VersionID'] = VERSION_ID; body['Channel'] = CHANNEL; body['LanguageID'] = languageID == 'ar' ? 1 : 2; body['IPAdress'] = "10.20.10.20"; body['generalid'] = GENERAL_ID; body['PatientOutSA'] = body.containsKey('PatientOutSA') ? body['PatientOutSA'] != null ? body['PatientOutSA'] : PATIENT_OUT_SA_PATIENT_REQ : PATIENT_OUT_SA_PATIENT_REQ; if (body.containsKey('isDentalAllowedBackend')) { body['isDentalAllowedBackend'] = body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] != null ? body['isDentalAllowedBackend'] : IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND; } body['DeviceTypeID'] = Platform.isAndroid ? 1 : 2; body['PatientType'] = body.containsKey('PatientType') ? body['PatientType'] != null ? body['PatientType'] : patient!.patientType != null ? patient.patientType : PATIENT_TYPE : PATIENT_TYPE; body['PatientTypeID'] = body.containsKey('PatientTypeID') ? body['PatientTypeID'] != null ? body['PatientTypeID'] : patient!.patientType != null ? patient.patientType : PATIENT_TYPE_ID : PATIENT_TYPE_ID; body['TokenID'] = body.containsKey('TokenID') ? body['TokenID'] ?? token : token; body['PatientID'] = body['PatientID'] != null ? body['PatientID'] : patient!.patientId ?? patient.patientMRN; body['PatientOutSA'] = 0; //user['OutSA']; //TODO change it body['SessionID'] = SESSION_ID; //getSe int? projectID = await sharedPref.getInt(PROJECT_ID); if (projectID == 2 || projectID == 3) body['PatientOutSA'] = true; else body['PatientOutSA'] = false; // if(!body.containsKey('ProjectID')) { // if (projectID != null) { // body['ProjectID'] = 313; // } else { // body['ProjectID'] = 0; // } // } // body['DoctorID'] = 24; //3844083 // body['TokenID'] = "@dm!n"; print("URL : $url"); print("Body : ${json.encode(body)}"); var asd = json.encode(body); var asd2; if (await Utils.checkConnection()) { final response = await http.post(Uri.parse(url.trim()), body: json.encode(body), headers: headers); final int statusCode = response.statusCode; print("statusCode :$statusCode"); if (statusCode < 200 || statusCode >= 400 || json == null) { onFailure('Error While Fetching data', statusCode); } else { // var parsed = json.decode(response.body.toString()); var parsed = json.decode(utf8.decode(response.bodyBytes)); if (parsed['Response_Message'] != null) { onSuccess(parsed, statusCode); } else { if (parsed['ErrorType'] == 4) { helpers.navigateToUpdatePage(parsed['ErrorEndUserMessage'], parsed['AndroidLink'], parsed['IOSLink']); } if (parsed['IsAuthenticated'] == null) { if (parsed['isSMSSent'] == true) { onSuccess(parsed, statusCode); } else if (parsed['MessageStatus'] == 1) { onSuccess(parsed, statusCode); } else if (parsed['Result'] == 'OK') { onSuccess(parsed, statusCode); } else { if (parsed != null) { onSuccess(parsed, statusCode); } else { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: getError(parsed)); onFailure(getError(parsed), statusCode); } } } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); } else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode); } else { if (parsed['message'] == null && parsed['ErrorEndUserMessage'] == null) { if (parsed['ErrorSearchMsg'] == null) { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: "Server Error found with no available message"); onFailure("Server Error found with no available message", statusCode); } else { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: parsed['ErrorSearchMsg']); onFailure(parsed['ErrorSearchMsg'], statusCode); } } else { if (body['DoctorID'] != null) postFailureResponse( doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); onFailure(parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); } } } else { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode); } else { if (parsed['message'] != null) { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: parsed['message']); onFailure(parsed['message'] ?? parsed['message'], statusCode); } else { if (body['DoctorID'] != null) postFailureResponse(doctorId: body['DoctorID'], url: url, request: json.encode(body), response: response.body, exception: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); onFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); } } } } } } else { onFailure('Please Check The Internet Connection', -1); } } catch (e) { print(e); onFailure(e.toString(), -1); } } String getError(parsed) { //TODO change this fun String? error = parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']; if (parsed["ValidationErrors"] != null) { error = parsed["ValidationErrors"]["StatusMessage"].toString() + "\n"; if (parsed["ValidationErrors"]["ValidationErrors"] != null && parsed["ValidationErrors"]["ValidationErrors"].length != 0) { for (var i = 0; i < parsed["ValidationErrors"]["ValidationErrors"].length; i++) { error = error! + parsed["ValidationErrors"]["ValidationErrors"][i]["Messages"][0] + "\n"; } } } if (error == null || error == "null" || error == "null\n") { return Utils.generateContactAdminMsg(); } return error; } get({required String endPoint, required Function(dynamic response, int statusCode) onSuccess, required Function(String error, int statusCode) onFailure}) async { String token = await sharedPref.getString(TOKEN); String url = DOCTOR_ROTATION + endPoint + '&token=' + token; print(url); final response = await http.get(Uri.parse(url)); final int statusCode = response.statusCode; if (statusCode < 200 || statusCode >= 400) { onFailure(Utils.generateContactAdminMsg(), statusCode); } else { var parsed = json.decode(response.body.toString()); onSuccess(parsed, statusCode); } } }