|
|
|
|
@ -1,7 +1,6 @@
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
import 'dart:developer';
|
|
|
|
|
import 'dart:io' show Platform;
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/api_consts.dart';
|
|
|
|
|
@ -9,7 +8,6 @@ import 'package:hmg_patient_app_new/core/app_state.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/dependencies.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/services/dialog_service.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/services/logger_service.dart';
|
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
|
|
|
|
|
|
@ -19,7 +17,7 @@ abstract class ApiClient {
|
|
|
|
|
Future<void> post(
|
|
|
|
|
String endPoint, {
|
|
|
|
|
required Map<String, dynamic> body,
|
|
|
|
|
required Function(dynamic response, int statusCode, {int? messageStatus}) onSuccess,
|
|
|
|
|
required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
|
|
|
|
|
required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
|
|
|
|
|
bool isAllowAny,
|
|
|
|
|
bool isExternal,
|
|
|
|
|
@ -77,29 +75,26 @@ abstract class ApiClient {
|
|
|
|
|
|
|
|
|
|
class ApiClientImp implements ApiClient {
|
|
|
|
|
final _analytics = getIt<GAnalytics>();
|
|
|
|
|
|
|
|
|
|
final LoggerService loggerService;
|
|
|
|
|
final AppState appState;
|
|
|
|
|
final DialogService dialogService;
|
|
|
|
|
final LoggerService _loggerService;
|
|
|
|
|
final AppState _appState;
|
|
|
|
|
|
|
|
|
|
ApiClientImp({
|
|
|
|
|
required this.loggerService,
|
|
|
|
|
required this.dialogService,
|
|
|
|
|
required this.appState,
|
|
|
|
|
});
|
|
|
|
|
required LoggerService loggerService,
|
|
|
|
|
required AppState appState,
|
|
|
|
|
}) : _appState = appState,
|
|
|
|
|
_loggerService = loggerService;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
post(
|
|
|
|
|
String endPoint, {
|
|
|
|
|
required Map<String, dynamic> body,
|
|
|
|
|
required Function(dynamic response, int statusCode, {int? messageStatus}) onSuccess,
|
|
|
|
|
required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
|
|
|
|
|
required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
|
|
|
|
|
bool isAllowAny = false,
|
|
|
|
|
bool isAllowAny = true,
|
|
|
|
|
bool isExternal = false,
|
|
|
|
|
bool isRCService = false,
|
|
|
|
|
bool bypassConnectionCheck = false,
|
|
|
|
|
}) async {
|
|
|
|
|
AppState appState = getIt.get<AppState>();
|
|
|
|
|
String url;
|
|
|
|
|
if (isExternal) {
|
|
|
|
|
url = endPoint;
|
|
|
|
|
@ -111,39 +106,19 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
var user = appState.getAuthenticatedUser;
|
|
|
|
|
var user = _appState.getAuthenticatedUser;
|
|
|
|
|
Map<String, String> headers = {'Content-Type': 'application/json', 'Accept': 'application/json'};
|
|
|
|
|
if (!isExternal) {
|
|
|
|
|
String? token = appState.appAuthToken;
|
|
|
|
|
String? languageID = (appState.postParamsObject?.languageID == 1 ? 'ar' : 'en');
|
|
|
|
|
if (endPoint == ApiConsts.sendActivationCode) {
|
|
|
|
|
languageID = 'en';
|
|
|
|
|
}
|
|
|
|
|
String? token = _appState.appAuthToken;
|
|
|
|
|
|
|
|
|
|
if (body.containsKey('SetupID')) {
|
|
|
|
|
body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] ?? body[''] : SETUP_ID;
|
|
|
|
|
} else {}
|
|
|
|
|
|
|
|
|
|
if (body.containsKey('LanguageID')) {
|
|
|
|
|
if (body['LanguageID'] != null) {
|
|
|
|
|
body['LanguageID'] = body['LanguageID'] == 'ar'
|
|
|
|
|
? 1
|
|
|
|
|
: body['LanguageID'] == 'en'
|
|
|
|
|
? 2
|
|
|
|
|
: body['LanguageID'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (body.containsKey('isDentalAllowedBackend')) {
|
|
|
|
|
body['isDentalAllowedBackend'] = body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] ?? IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Todo: I have converted it to string
|
|
|
|
|
body['DeviceTypeID'] = Platform.isIOS
|
|
|
|
|
? "1"
|
|
|
|
|
: await Utils.isGoogleServicesAvailable()
|
|
|
|
|
? "2"
|
|
|
|
|
: "3";
|
|
|
|
|
|
|
|
|
|
if (!body.containsKey('IsPublicRequest')) {
|
|
|
|
|
// if (!body.containsKey('PatientType')) {
|
|
|
|
|
if (user != null && user.patientType != null) {
|
|
|
|
|
@ -158,6 +133,7 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
body['PatientType'] = PATIENT_TYPE_ID.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO : These should be from the appState
|
|
|
|
|
if (user != null) {
|
|
|
|
|
body['TokenID'] = body['TokenID'] ?? token;
|
|
|
|
|
body['PatientID'] = body['PatientID'] ?? user.patientID;
|
|
|
|
|
@ -175,40 +151,49 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
// request.languageID = (languageID == 'ar' ? 1 : 2);
|
|
|
|
|
// request.patientOutSA = (request.zipCode == '966' || request.zipCode == '+966') ? 0 : 1;
|
|
|
|
|
|
|
|
|
|
// TODO : we will use all these from appState
|
|
|
|
|
body['LanguageID'] = body['LanguageID'] ?? "2";
|
|
|
|
|
body['VersionID'] = body['VersionID'] ?? "50.0";
|
|
|
|
|
body['Channel'] = body['Channel'] ?? "3";
|
|
|
|
|
body['IPAdress'] = body['IPAdress'] ?? "10.20.10.20";
|
|
|
|
|
body['generalid'] = body['generalid'] ?? "Cs2020@2016\$2958";
|
|
|
|
|
body['Latitude'] = body['Latitude'] ?? "0.0";
|
|
|
|
|
body['Longitude'] = body['Longitude'] ?? "0.0";
|
|
|
|
|
body['DeviceTypeID'] = body['DeviceTypeID'] ??
|
|
|
|
|
(Platform.isIOS
|
|
|
|
|
? "1"
|
|
|
|
|
: await Utils.isGoogleServicesAvailable()
|
|
|
|
|
? "2"
|
|
|
|
|
: "3");
|
|
|
|
|
body['TokenID'] = "@dm!n";
|
|
|
|
|
body['VersionID'] = ApiConsts.appVersionID.toString();
|
|
|
|
|
body['Channel'] = ApiConsts.appChannelId.toString();
|
|
|
|
|
body['IPAdress'] = ApiConsts.appIpAddress;
|
|
|
|
|
body['generalid'] = ApiConsts.appGeneralId;
|
|
|
|
|
|
|
|
|
|
body['LanguageID'] = _appState.getLanguageID().toString();
|
|
|
|
|
body['Latitude'] = _appState.userLat.toString();
|
|
|
|
|
body['Longitude'] = _appState.userLong.toString();
|
|
|
|
|
body['DeviceTypeID'] = _appState.deviceTypeID;
|
|
|
|
|
if (_appState.appLoginTokenID.isNotEmpty) {
|
|
|
|
|
body['LogInTokenID'] = _appState.appLoginTokenID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
body.removeWhere((key, value) => value == null);
|
|
|
|
|
log("body: ${json.encode(body)}");
|
|
|
|
|
log("uri: ${Uri.parse(url.trim())}");
|
|
|
|
|
|
|
|
|
|
if (await Utils.checkConnection(bypassConnectionCheck: bypassConnectionCheck)) {
|
|
|
|
|
final response = await http.post(Uri.parse(url.trim()), body: json.encode(body), headers: headers);
|
|
|
|
|
final bool networkStatus = await Utils.checkConnection(bypassConnectionCheck: bypassConnectionCheck);
|
|
|
|
|
|
|
|
|
|
if (!networkStatus) {
|
|
|
|
|
onFailure(
|
|
|
|
|
'Please Check The Internet Connection 1',
|
|
|
|
|
-1,
|
|
|
|
|
failureType: ConnectivityFailure("Please Check The Internet Connection 1"),
|
|
|
|
|
);
|
|
|
|
|
_analytics.errorTracking.log("internet_connectivity", error: "no internet available");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final response = await http.post(Uri.parse(url.trim()), body: json.encode(body), headers: headers);
|
|
|
|
|
final int statusCode = response.statusCode;
|
|
|
|
|
log("response.body: ${response.body}");
|
|
|
|
|
if (statusCode < 200 || statusCode >= 400) {
|
|
|
|
|
var parsed = json.decode(utf8.decode(response.bodyBytes));
|
|
|
|
|
onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data"));
|
|
|
|
|
logApiEndpointError(endPoint, 'Error While Fetching data', statusCode);
|
|
|
|
|
} else {
|
|
|
|
|
var parsed = json.decode(utf8.decode(response.bodyBytes));
|
|
|
|
|
log("parsed: ${jsonEncode(parsed)}");
|
|
|
|
|
if (isAllowAny) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else {
|
|
|
|
|
if (parsed['Response_Message'] != null) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else {
|
|
|
|
|
if (parsed['ErrorType'] == 4) {
|
|
|
|
|
//TODO : handle app update
|
|
|
|
|
@ -219,23 +204,27 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
logApiEndpointError(endPoint, "session logged out", statusCode);
|
|
|
|
|
}
|
|
|
|
|
if (isAllowAny) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else if (parsed['IsAuthenticated'] == null) {
|
|
|
|
|
if (parsed['isSMSSent'] == true) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else if (parsed['MessageStatus'] == 1) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else if (parsed['Result'] == 'OK') {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else {
|
|
|
|
|
onFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode, failureType: ServerFailure("Error While Fetching data"));
|
|
|
|
|
onFailure(
|
|
|
|
|
parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
|
|
|
|
|
statusCode,
|
|
|
|
|
failureType: MessageStatusFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']),
|
|
|
|
|
);
|
|
|
|
|
logApiEndpointError(endPoint, parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode);
|
|
|
|
|
}
|
|
|
|
|
} else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) {
|
|
|
|
|
if (parsed['SameClinicApptList'] != null) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else {
|
|
|
|
|
if (parsed['message'] == null && parsed['ErrorEndUserMessage'] == null) {
|
|
|
|
|
if (parsed['ErrorSearchMsg'] == null) {
|
|
|
|
|
@ -257,14 +246,14 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
onFailure(
|
|
|
|
|
parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
|
|
|
|
|
statusCode,
|
|
|
|
|
failureType: ServerFailure("Error While Fetching data"),
|
|
|
|
|
failureType: UserIntimationFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']),
|
|
|
|
|
);
|
|
|
|
|
logApiEndpointError(endPoint, parsed['message'] ?? parsed['message'], statusCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (parsed['SameClinicApptList'] != null) {
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus']);
|
|
|
|
|
onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']);
|
|
|
|
|
} else {
|
|
|
|
|
if (parsed['message'] != null) {
|
|
|
|
|
onFailure(
|
|
|
|
|
@ -286,18 +275,10 @@ class ApiClientImp implements ApiClient {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
onFailure(
|
|
|
|
|
'Please Check The Internet Connection 1',
|
|
|
|
|
-1,
|
|
|
|
|
failureType: ConnectivityFailure("Please Check The Internet Connection 1"),
|
|
|
|
|
);
|
|
|
|
|
_analytics.errorTracking.log("internet_connectivity", error: "no internet available");
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
loggerService.errorLogs(e.toString());
|
|
|
|
|
} catch (e, stackTrace) {
|
|
|
|
|
_loggerService.errorLogs(stackTrace.toString());
|
|
|
|
|
if (e.toString().contains("ClientException")) {
|
|
|
|
|
onFailure('Something went wrong, plase try again', -1, failureType: InvalidCredentials('Something went wrong, plase try again'));
|
|
|
|
|
onFailure('ClientException: Something went wrong, Please try again', -1, failureType: InvalidCredentials('ClientException: Something went wrong, plase try again'));
|
|
|
|
|
_analytics.errorTracking.log("internet_connectivity", error: "no internet available");
|
|
|
|
|
} else {
|
|
|
|
|
onFailure(e.toString(), -1);
|
|
|
|
|
|