2import 'package:dio/dio.dart';
3import '../services/analytics_service.dart';
5import '../error/exceptipns/server_exception.dart';
6import 'api_endpoints.dart';
7import 'auth_interceptor.dart';
14 Duration connectTimeout =
const Duration(seconds: 30),
15 Duration receiveTimeout =
const Duration(seconds: 30),
16 Duration sendTimeout =
const Duration(seconds: 30),
19 connectTimeout: connectTimeout,
20 receiveTimeout: receiveTimeout,
21 sendTimeout: sendTimeout,
26 required Duration connectTimeout,
27 required Duration receiveTimeout,
28 required Duration sendTimeout,
32 baseUrl: ApiEndpoints.hostname,
33 connectTimeout: connectTimeout,
34 receiveTimeout: receiveTimeout,
35 sendTimeout: sendTimeout,
36 contentType:
'application/json',
37 headers: {
'Accept':
'application/json'},
39 return status != null && status < 500;
44 dio.interceptors.add(AuthInterceptor(dio: dio));
50 final endpoint = url ?? ApiEndpoints.buildUrl(
path!);
51 final response = await
_dio.get(endpoint);
53 _analytics.captureEvent(
'api_call_success', properties: {
59 } on DioException
catch (e) {
60 _analytics.captureEvent(
'api_call_error', properties: {
62 'endpoint': (url ??
path) as Object,
63 'status_code': e.response?.statusCode as Object,
64 'error_message': e.
message as Object,
65 'response_data': e.response?.data as Object,
68 throw ServerException.fromStatus(e.response?.statusCode ?? 500);
70 throw ServerException.fromStatus(500);
74 Future<Map<String, dynamic>>
post({
77 required Map<String, dynamic> data,
80 final endpoint = url ?? ApiEndpoints.buildUrl(
path!);
81 final response = await
_dio.post(
83 data: jsonEncode(data),
86 _analytics.captureEvent(
'api_call_success', properties: {
89 'request_body': data.toString(),
93 if (result is Map<String, dynamic>) {
95 }
else if (result == null) {
98 return {
'data': result};
100 } on DioException
catch (e) {
101 _analytics.captureEvent(
'api_call_error', properties: {
103 'endpoint': (url ??
path) as Object,
104 'status_code': e.response?.statusCode as Object,
105 'error_message': e.
message as Object,
106 'response_data': e.response?.data as Object,
109 throw ServerException.fromStatus(e.response?.statusCode ?? 500);
114 final statusCode = response.statusCode ?? 500;
115 if (statusCode == 204 || response.data == null || response.data ==
'') {
118 if (statusCode == 200) {
119 if (response.data is Map) {
120 final statusCodeValue = response.data[
'statusCodeValue'];
121 if (statusCodeValue != null && statusCodeValue != 200) {
122 throw ServerException.fromStatus(statusCodeValue);
124 if (response.data[
'code'] == 400 && response.data[
'message'] ==
'NO Data Found') {
128 return response.data;
130 throw ServerException.fromStatus(statusCode);
static AnalyticsService get instance
Dio _createDioInstance({ required Duration connectTimeout, required Duration receiveTimeout, required Duration sendTimeout, })
dynamic _handleResponse(Response response)
Future< Map< String, dynamic > > post({ String? url, String? path, required Map< String, dynamic > data, }) async
Future< dynamic > get({String? path, String? url}) async
ApiClient({ Duration connectTimeout=const Duration(seconds:30), Duration receiveTimeout=const Duration(seconds:30), Duration sendTimeout=const Duration(seconds:30), })