diff --git a/android/app/build.gradle b/android/app/build.gradle
index 5043ee5..9aa40ce 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion 30
+ compileSdkVersion 31
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@@ -43,9 +43,9 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.example.car_provider_app"
- minSdkVersion 16
- targetSdkVersion 30
+ applicationId "com.ejada.hmg"
+ minSdkVersion 23
+ targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
diff --git a/android/app/google-services.json b/android/app/google-services.json
new file mode 100644
index 0000000..dd4038c
--- /dev/null
+++ b/android/app/google-services.json
@@ -0,0 +1,42 @@
+{
+ "project_info": {
+ "project_number": "815750722565",
+ "firebase_url": "https://api-project-815750722565.firebaseio.com",
+ "project_id": "api-project-815750722565",
+ "storage_bucket": "api-project-815750722565.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063",
+ "android_client_info": {
+ "package_name": "com.ejada.hmg"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
+ }
+ ],
+ "services": {
+ "analytics_service": {
+ "status": 1
+ },
+ "appinvite_service": {
+ "status": 1,
+ "other_platform_oauth_client": []
+ },
+ "ads_service": {
+ "status": 2
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 0f28367..34c7045 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,7 +2,8 @@
package="com.example.car_provider_app">
-
+
+
@@ -17,6 +18,7 @@
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/icons/ic_close_account.svg b/assets/icons/ic_close_account.svg
new file mode 100644
index 0000000..93adb61
--- /dev/null
+++ b/assets/icons/ic_close_account.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/ic_provider.svg b/assets/icons/ic_provider.svg
new file mode 100644
index 0000000..e22c356
--- /dev/null
+++ b/assets/icons/ic_provider.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ic_services.svg b/assets/icons/ic_services.svg
new file mode 100644
index 0000000..b0d0606
--- /dev/null
+++ b/assets/icons/ic_services.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/icons/ic_settings.svg b/assets/icons/ic_settings.svg
new file mode 100644
index 0000000..6435135
--- /dev/null
+++ b/assets/icons/ic_settings.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_car.svg b/assets/images/ic_car.svg
new file mode 100644
index 0000000..804f607
--- /dev/null
+++ b/assets/images/ic_car.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/ic_edit.svg b/assets/images/ic_edit.svg
new file mode 100644
index 0000000..c14165f
--- /dev/null
+++ b/assets/images/ic_edit.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_lock.svg b/assets/images/ic_lock.svg
new file mode 100644
index 0000000..1273157
--- /dev/null
+++ b/assets/images/ic_lock.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/ic_logout.svg b/assets/images/ic_logout.svg
new file mode 100644
index 0000000..2be107f
--- /dev/null
+++ b/assets/images/ic_logout.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/ic_mobile.svg b/assets/images/ic_mobile.svg
new file mode 100644
index 0000000..068cf7a
--- /dev/null
+++ b/assets/images/ic_mobile.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/images/ic_notes.svg b/assets/images/ic_notes.svg
new file mode 100644
index 0000000..009cf17
--- /dev/null
+++ b/assets/images/ic_notes.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/images/ic_notification.svg b/assets/images/ic_notification.svg
new file mode 100644
index 0000000..e45bab2
--- /dev/null
+++ b/assets/images/ic_notification.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_settings.svg b/assets/images/ic_settings.svg
new file mode 100644
index 0000000..83b64c9
--- /dev/null
+++ b/assets/images/ic_settings.svg
@@ -0,0 +1,4 @@
+
diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart
index f6d65ea..2724eb2 100644
--- a/lib/api/api_client.dart
+++ b/lib/api/api_client.dart
@@ -68,12 +68,14 @@ class ApiClient {
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
- print("res:" + response.body);
+ print("res121:" + response.body);
+ print("res121:" + response.statusCode.toString());
}
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
- print("exception:" + response.body);
+ print(ex);
+ print("exception:" + ex.toString());
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
@@ -92,7 +94,14 @@ class ApiClient {
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
}
- Future _postForResponse(String url, requestBody, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async {
+ Future _postForResponse(
+ String url,
+ requestBody, {
+ String? token,
+ Map? queryParameters,
+ Map? headers,
+ int retryTimes = 0,
+ }) async {
try {
var _headers = {};
if (token != null) {
@@ -107,7 +116,11 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString;
}
- var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 100));
+
+ var response;
+
+ response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 100));
+
if (!kReleaseMode) {
print("Url:$url");
print("body:$requestBody");
@@ -144,6 +157,9 @@ class ApiClient {
} else {
throw APIException(APIException.OTHER, arguments: e);
}
+ }catch (ex) {
+ print("exception1:" + ex.toString());
+ throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
@@ -160,4 +176,93 @@ class ApiClient {
}
Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
+
+ Future getJsonForObject(FactoryConstructor factoryConstructor, String url,
+ {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async {
+ var _headers = {'Accept': 'application/json'};
+ if (headers != null && headers.isNotEmpty) {
+ _headers.addAll(headers);
+ }
+ var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
+ try {
+ if (!kReleaseMode) {
+ print("res:" + response.body);
+ }
+ var jsonData = jsonDecode(response.body);
+ return factoryConstructor(jsonData);
+ } catch (ex) {
+ print("exception:" + response.body);
+ throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
+ }
+ }
+
+ Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async {
+ if (headers == null) {
+ headers = {'Content-Type': 'application/json'};
+ } else {
+ headers['Content-Type'] = 'application/json';
+ }
+ return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
+ }
+
+ Future _getForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async {
+ try {
+ var _headers = {};
+ if (token != null) {
+ _headers['Authorization'] = 'Bearer $token';
+ }
+
+ if (headers != null && headers.isNotEmpty) {
+ _headers.addAll(headers);
+ }
+ if (queryParameters != null) {
+ String queryString = new Uri(queryParameters: queryParameters).query;
+ url = url + '?' + queryString.toString();
+ }
+
+ if (!kReleaseMode) {
+ print("Url:$url");
+ print("queryParameters:$queryParameters");
+ }
+ var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
+
+ if (!kReleaseMode) {
+ print("res: " + response.body.toString());
+ }
+ if (response.statusCode >= 200 && response.statusCode < 300) {
+ return response;
+ } else {
+ throw _throwAPIException(response);
+ }
+ } on SocketException catch (e) {
+ if (retryTimes > 0) {
+ print('will retry after 3 seconds...');
+ await Future.delayed(Duration(seconds: 3));
+ return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
+ } else {
+ throw APIException(APIException.OTHER, arguments: e);
+ }
+ } on HttpException catch (e) {
+ if (retryTimes > 0) {
+ print('will retry after 3 seconds...');
+ await Future.delayed(Duration(seconds: 3));
+ return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
+ } else {
+ throw APIException(APIException.OTHER, arguments: e);
+ }
+ } on TimeoutException catch (e) {
+ throw APIException(APIException.TIMEOUT, arguments: e);
+ } on ClientException catch (e) {
+ if (retryTimes > 0) {
+ await Future.delayed(Duration(seconds: 3));
+ return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
+ } else {
+ throw APIException(APIException.OTHER, arguments: e);
+ }
+ } catch (e) {
+ throw APIException(APIException.OTHER, arguments: e);
+ }
+ }
+
+ Future _get(url, {Map? headers}) => _withClient((client) => client.get(url, headers: headers));
}
diff --git a/lib/api/client/branch_api_client.dart b/lib/api/client/branch_api_client.dart
new file mode 100644
index 0000000..a56e93f
--- /dev/null
+++ b/lib/api/client/branch_api_client.dart
@@ -0,0 +1,69 @@
+import 'dart:async';
+import 'package:car_provider_app/classes/app_state.dart';
+import 'package:car_provider_app/models/m_response.dart';
+import 'package:car_provider_app/models/profile/branch.dart';
+import 'package:car_provider_app/models/profile/categroy.dart';
+import 'package:car_provider_app/models/profile/document.dart';
+import 'package:car_provider_app/models/profile/services.dart';
+import 'package:car_provider_app/models/user/country.dart';
+import 'package:car_provider_app/models/user/role.dart';
+import 'package:http/http.dart';
+import 'package:car_provider_app/classes/consts.dart';
+import 'package:car_provider_app/models/content_info_model.dart';
+import 'package:car_provider_app/models/member_model.dart';
+import 'package:car_provider_app/models/surah_model.dart';
+import 'package:car_provider_app/models/user/basic_otp.dart';
+import 'package:car_provider_app/models/user/register_user.dart';
+
+import '../api_client.dart';
+
+class BranchApiClent {
+ static final BranchApiClent _instance = BranchApiClent._internal();
+
+ BranchApiClent._internal();
+
+ factory BranchApiClent() => _instance;
+
+ Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
+ var postParams = {
+ // "id": 0,
+ "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
+ "branchName": branchName,
+ "branchDescription": branchDescription,
+ "cityID": cityId,
+ "address": address,
+ "latitude": latitude,
+ "longitude": longitude,
+ "isActive": true
+ };
+ String t = AppState().getUser.data!.accessToken ?? "";
+ print("tokeen " + t);
+ return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
+ }
+
+ Future fetchAllBranches() async {
+ var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
+ String t = AppState().getUser.data!.accessToken ?? "";
+ print("tokeen " + t);
+ return await ApiClient().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
+ }
+
+ Future fetchBranchCategory() async {
+ var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
+ String t = AppState().getUser.data!.accessToken ?? "";
+ print("tokeen " + t);
+ return await ApiClient().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
+ }
+
+ Future fetchServices(String serviceCategoryId) async {
+ var postParams = {"ServiceCategoryID": serviceCategoryId};
+ String t = AppState().getUser.data!.accessToken ?? "";
+ print("tokeen " + t);
+ return await ApiClient().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t);
+ }
+
+ Future createService(List