From 59e6d621cf3e0166a7ff945e77a8de799f37d97a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 5 Aug 2025 14:48:47 +0330 Subject: [PATCH] feat : request tagging --- .../widget/list_item/list_item2.dart | 51 ++++++++---- .../widget/list_view/list_view.dart | 1 + .../widget/list_view/r_list_view.dart | 5 +- packages/core/lib/utils/file_utils.dart | 10 +++ packages/core/lib/utils/utils.dart | 1 + packages/inspection/pubspec.lock | 24 ++++++ .../remote/livestock/livestock_remote.dart | 5 ++ .../livestock/livestock_remote_imp.dart | 29 +++++++ .../login_request/login_request_model.g.dart | 8 +- .../data/model/response/address/address.dart | 49 +++++++++++ .../response/auth/auth_response_model.g.dart | 4 +- .../captcha/captcha_response_model.g.dart | 16 ++-- .../user_profile/user_profile_model.g.dart | 40 ++++----- .../data/repository/auth/auth_repository.dart | 3 + .../repository/auth/auth_repository_imp.dart | 7 +- .../livestock/livestock_repository.dart | 11 +++ .../livestock/livestock_repository_imp.dart | 18 ++++ .../lib/injection/live_stock_di.dart | 20 ++++- .../page/request_tagging/logic.dart | 82 ++++++++++++++++--- 19 files changed, 318 insertions(+), 66 deletions(-) create mode 100644 packages/core/lib/utils/file_utils.dart create mode 100644 packages/livestock/lib/data/data_source/remote/livestock/livestock_remote.dart create mode 100644 packages/livestock/lib/data/data_source/remote/livestock/livestock_remote_imp.dart create mode 100644 packages/livestock/lib/data/model/response/address/address.dart create mode 100644 packages/livestock/lib/data/repository/livestock/livestock_repository.dart create mode 100644 packages/livestock/lib/data/repository/livestock/livestock_repository_imp.dart diff --git a/packages/core/lib/presentation/widget/list_item/list_item2.dart b/packages/core/lib/presentation/widget/list_item/list_item2.dart index cd62606..bfcc0c8 100644 --- a/packages/core/lib/presentation/widget/list_item/list_item2.dart +++ b/packages/core/lib/presentation/widget/list_item/list_item2.dart @@ -11,6 +11,7 @@ class ExpandableListItem2 extends StatelessWidget { required this.labelIcon, required this.onTap, required this.selected, + this.isTag = false, this.labelIconColor = AppColor.mediumGreyDarkHover, }); @@ -22,6 +23,7 @@ class ExpandableListItem2 extends StatelessWidget { final Color? labelIconColor; final VoidCallback onTap; final bool selected; + final bool isTag; @override Widget build(BuildContext context) { @@ -92,21 +94,40 @@ class ExpandableListItem2 extends StatelessWidget { Positioned( right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), + child: isTag + ? Container( + width: index < 999 ? 24 : 34, + height: index < 999 ? 34 : 34, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Assets.vec.tagLabelSvg.svg(), + Positioned( + top: 15, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan10.copyWith(color: Colors.black), + ), + ) + ], + ), + ) + : Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), ), ], ), diff --git a/packages/core/lib/presentation/widget/list_view/list_view.dart b/packages/core/lib/presentation/widget/list_view/list_view.dart index 5336777..fac1513 100644 --- a/packages/core/lib/presentation/widget/list_view/list_view.dart +++ b/packages/core/lib/presentation/widget/list_view/list_view.dart @@ -1,3 +1,4 @@ export 'r_shimmer_list.dart'; export 'r_paginated_list_view.dart'; +export 'r_list_view.dart'; diff --git a/packages/core/lib/presentation/widget/list_view/r_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_list_view.dart index 1e62589..b5a8298 100644 --- a/packages/core/lib/presentation/widget/list_view/r_list_view.dart +++ b/packages/core/lib/presentation/widget/list_view/r_list_view.dart @@ -1,12 +1,11 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:rasadyar_core/presentation/widget/list_view/r_paginated_list_view.dart'; import 'package:rasadyar_core/utils/network/resource.dart'; import 'r_shimmer_list.dart'; -enum ListType { builder, separated } - class RListView extends StatelessWidget { final ListType type; final Axis scrollDirection; @@ -68,7 +67,7 @@ class RListView extends StatelessWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.addSemanticIndexes = true, - this.loadingWidget = const RShimmerList(isSeparated: true), + this.loadingWidget = const RShimmerList(isSeparated: true), this.emptyWidget = const Center(child: Text("هیچ آیتمی یافت نشد")), this.errorWidget = const Center(child: CircularProgressIndicator()), required this.resource, diff --git a/packages/core/lib/utils/file_utils.dart b/packages/core/lib/utils/file_utils.dart new file mode 100644 index 0000000..3bb6cb3 --- /dev/null +++ b/packages/core/lib/utils/file_utils.dart @@ -0,0 +1,10 @@ +import 'dart:io'; + +import 'logger_utils.dart'; + +void getFileSizeInKB(String filePath, {String? tag}) { + final file = File(filePath); + final bytes = file.lengthSync(); + var size = (bytes / 1024).ceil(); + iLog('${tag ?? 'Picked'} image Size: $size'); +} \ No newline at end of file diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart index ba7f6b2..40b6ed5 100644 --- a/packages/core/lib/utils/utils.dart +++ b/packages/core/lib/utils/utils.dart @@ -2,6 +2,7 @@ export 'apk_updater.dart'; export 'extension/date_time_utils.dart'; export 'extension/num_utils.dart'; export 'extension/string_utils.dart'; +export 'file_utils.dart'; export 'local/local_utils.dart'; export 'logger_utils.dart'; export 'map_utils.dart'; diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index dda8513..126a3f1 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -741,6 +741,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.4" + image_cropper: + dependency: transitive + description: + name: image_cropper + sha256: "4e9c96c029eb5a23798da1b6af39787f964da6ffc78fd8447c140542a9f7c6fc" + url: "https://pub.dev" + source: hosted + version: "9.1.0" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: fd81ebe36f636576094377aab32673c4e5d1609b32dec16fad98d2b71f1250a9 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "6ca6b81769abff9a4dcc3bbd3d75f5dfa9de6b870ae9613c8cd237333a4283af" + url: "https://pub.dev" + source: hosted + version: "7.1.0" image_picker: dependency: transitive description: diff --git a/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote.dart b/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote.dart new file mode 100644 index 0000000..5534a7c --- /dev/null +++ b/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote.dart @@ -0,0 +1,5 @@ +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; + +abstract class LivestockRemoteDataSource { + Future getLocationDetailsByLatLng({required double latitude, required double longitude}); +} diff --git a/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote_imp.dart b/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote_imp.dart new file mode 100644 index 0000000..a9748ec --- /dev/null +++ b/packages/livestock/lib/data/data_source/remote/livestock/livestock_remote_imp.dart @@ -0,0 +1,29 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/data/data_source/remote/livestock/livestock_remote.dart'; +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; + +class LivestockRemoteDataSourceImp implements LivestockRemoteDataSource { + @override + Future getLocationDetailsByLatLng({ + required double latitude, + required double longitude, + }) async { + try { + Dio dio = Dio(); + dio.options.baseUrl = 'https://nominatim.openstreetmap.org/'; + dio.options.headers['User-Agent'] = 'RasadyarLivestock/2.0'; + final response = await dio.get( + 'reverse', + queryParameters: {'lat': latitude, 'lon': longitude, 'format': 'json'}, + ); + if (response.statusCode == 200) { + final data = response.data; + return LocationDetails.fromJson(data); + } else { + throw Exception('Failed to load address'); + } + } catch (e) { + rethrow; + } + } +} diff --git a/packages/livestock/lib/data/model/request/login_request/login_request_model.g.dart b/packages/livestock/lib/data/model/request/login_request/login_request_model.g.dart index 4504142..f10c8a6 100644 --- a/packages/livestock/lib/data/model/request/login_request/login_request_model.g.dart +++ b/packages/livestock/lib/data/model/request/login_request/login_request_model.g.dart @@ -10,14 +10,14 @@ _LoginRequestModel _$LoginRequestModelFromJson(Map json) => _LoginRequestModel( username: json['username'] as String?, password: json['password'] as String?, - captchaCode: json['captcha_code'] as String?, - captchaKey: json['captcha_key'] as String?, + captchaCode: json['captchaCode'] as String?, + captchaKey: json['captchaKey'] as String?, ); Map _$LoginRequestModelToJson(_LoginRequestModel instance) => { 'username': instance.username, 'password': instance.password, - 'captcha_code': instance.captchaCode, - 'captcha_key': instance.captchaKey, + 'captchaCode': instance.captchaCode, + 'captchaKey': instance.captchaKey, }; diff --git a/packages/livestock/lib/data/model/response/address/address.dart b/packages/livestock/lib/data/model/response/address/address.dart new file mode 100644 index 0000000..4a1737d --- /dev/null +++ b/packages/livestock/lib/data/model/response/address/address.dart @@ -0,0 +1,49 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'address.freezed.dart'; + +part 'address.g.dart'; + +@freezed +abstract class Address with _$Address { + const factory Address({ + String? road, + String? neighbourhood, + String? suburb, + String? state, + String? borough, + String? city, + String? district, + String? county, + String? province, + String? ISO3166_2_lvl4, + String? postcode, + String? country, + String? country_code, + }) = _Address; + + factory Address.fromJson(Map json) => _$AddressFromJson(json); +} + +@freezed +abstract class LocationDetails with _$LocationDetails { + const factory LocationDetails({ + int? place_id, + String? licence, + String? osm_type, + int? osm_id, + String? lat, + String? lon, + String? class_, + String? type, + int? place_rank, + double? importance, + String? addresstype, + String? name, + String? display_name, + Address? address, + List? boundingbox, + }) = _LocationDetails; + + factory LocationDetails.fromJson(Map json) => _$LocationDetailsFromJson(json); +} diff --git a/packages/livestock/lib/data/model/response/auth/auth_response_model.g.dart b/packages/livestock/lib/data/model/response/auth/auth_response_model.g.dart index dc5d66d..642fa02 100644 --- a/packages/livestock/lib/data/model/response/auth/auth_response_model.g.dart +++ b/packages/livestock/lib/data/model/response/auth/auth_response_model.g.dart @@ -10,12 +10,12 @@ _AuthResponseModel _$AuthResponseModelFromJson(Map json) => _AuthResponseModel( refresh: json['refresh'] as String?, access: json['access'] as String?, - otpStatus: json['otp_status'] as bool?, + otpStatus: json['otpStatus'] as bool?, ); Map _$AuthResponseModelToJson(_AuthResponseModel instance) => { 'refresh': instance.refresh, 'access': instance.access, - 'otp_status': instance.otpStatus, + 'otpStatus': instance.otpStatus, }; diff --git a/packages/livestock/lib/data/model/response/captcha/captcha_response_model.g.dart b/packages/livestock/lib/data/model/response/captcha/captcha_response_model.g.dart index 8d69248..a0ffdcb 100644 --- a/packages/livestock/lib/data/model/response/captcha/captcha_response_model.g.dart +++ b/packages/livestock/lib/data/model/response/captcha/captcha_response_model.g.dart @@ -9,17 +9,17 @@ part of 'captcha_response_model.dart'; _CaptchaResponseModel _$CaptchaResponseModelFromJson( Map json, ) => _CaptchaResponseModel( - captchaKey: json['captcha_key'] as String?, - captchaImage: json['captcha_image'] as String?, - imageType: json['image_type'] as String?, - imageDecode: json['image_decode'] as String?, + captchaKey: json['captchaKey'] as String?, + captchaImage: json['captchaImage'] as String?, + imageType: json['imageType'] as String?, + imageDecode: json['imageDecode'] as String?, ); Map _$CaptchaResponseModelToJson( _CaptchaResponseModel instance, ) => { - 'captcha_key': instance.captchaKey, - 'captcha_image': instance.captchaImage, - 'image_type': instance.imageType, - 'image_decode': instance.imageDecode, + 'captchaKey': instance.captchaKey, + 'captchaImage': instance.captchaImage, + 'imageType': instance.imageType, + 'imageDecode': instance.imageDecode, }; diff --git a/packages/livestock/lib/data/model/response/user_profile/user_profile_model.g.dart b/packages/livestock/lib/data/model/response/user_profile/user_profile_model.g.dart index 7bf5323..79560bd 100644 --- a/packages/livestock/lib/data/model/response/user_profile/user_profile_model.g.dart +++ b/packages/livestock/lib/data/model/response/user_profile/user_profile_model.g.dart @@ -26,12 +26,12 @@ _User _$UserFromJson(Map json) => _User( id: (json['id'] as num).toInt(), username: json['username'] as String, password: json['password'] as String, - firstName: json['first_name'] as String, - lastName: json['last_name'] as String, - isActive: json['is_active'] as bool, + firstName: json['firstName'] as String, + lastName: json['lastName'] as String, + isActive: json['isActive'] as bool, mobile: json['mobile'] as String, phone: json['phone'] as String, - nationalCode: json['national_code'] as String, + nationalCode: json['nationalCode'] as String, birthdate: DateTime.parse(json['birthdate'] as String), nationality: json['nationality'] as String, ownership: json['ownership'] as String, @@ -39,21 +39,21 @@ _User _$UserFromJson(Map json) => _User( photo: json['photo'] as String, province: (json['province'] as num).toInt(), city: (json['city'] as num).toInt(), - otpStatus: json['otp_status'] as bool, - cityName: json['city_name'] as String, - provinceName: json['province_name'] as String, + otpStatus: json['otpStatus'] as bool, + cityName: json['cityName'] as String, + provinceName: json['provinceName'] as String, ); Map _$UserToJson(_User instance) => { 'id': instance.id, 'username': instance.username, 'password': instance.password, - 'first_name': instance.firstName, - 'last_name': instance.lastName, - 'is_active': instance.isActive, + 'firstName': instance.firstName, + 'lastName': instance.lastName, + 'isActive': instance.isActive, 'mobile': instance.mobile, 'phone': instance.phone, - 'national_code': instance.nationalCode, + 'nationalCode': instance.nationalCode, 'birthdate': instance.birthdate.toIso8601String(), 'nationality': instance.nationality, 'ownership': instance.ownership, @@ -61,14 +61,14 @@ Map _$UserToJson(_User instance) => { 'photo': instance.photo, 'province': instance.province, 'city': instance.city, - 'otp_status': instance.otpStatus, - 'city_name': instance.cityName, - 'province_name': instance.provinceName, + 'otpStatus': instance.otpStatus, + 'cityName': instance.cityName, + 'provinceName': instance.provinceName, }; _Role _$RoleFromJson(Map json) => _Role( id: (json['id'] as num).toInt(), - roleName: json['role_name'] as String, + roleName: json['roleName'] as String, description: json['description'] as String, type: RoleType.fromJson(json['type'] as Map), permissions: json['permissions'] as List, @@ -76,7 +76,7 @@ _Role _$RoleFromJson(Map json) => _Role( Map _$RoleToJson(_Role instance) => { 'id': instance.id, - 'role_name': instance.roleName, + 'roleName': instance.roleName, 'description': instance.description, 'type': instance.type, 'permissions': instance.permissions, @@ -91,14 +91,14 @@ Map _$RoleTypeToJson(_RoleType instance) => { }; _Permission _$PermissionFromJson(Map json) => _Permission( - pageName: json['page_name'] as String, - pageAccess: (json['page_access'] as List) + pageName: json['pageName'] as String, + pageAccess: (json['pageAccess'] as List) .map((e) => e as String) .toList(), ); Map _$PermissionToJson(_Permission instance) => { - 'page_name': instance.pageName, - 'page_access': instance.pageAccess, + 'pageName': instance.pageName, + 'pageAccess': instance.pageAccess, }; diff --git a/packages/livestock/lib/data/repository/auth/auth_repository.dart b/packages/livestock/lib/data/repository/auth/auth_repository.dart index 0b58774..52fa9d5 100644 --- a/packages/livestock/lib/data/repository/auth/auth_repository.dart +++ b/packages/livestock/lib/data/repository/auth/auth_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; import 'package:rasadyar_livestock/data/model/response/auth/auth_response_model.dart'; import 'package:rasadyar_livestock/data/model/response/captcha/captcha_response_model.dart'; @@ -11,4 +12,6 @@ abstract class AuthRepository { Future hasAuthenticated(); Future loginWithRefreshToken({required Map authRequest}); + + } diff --git a/packages/livestock/lib/data/repository/auth/auth_repository_imp.dart b/packages/livestock/lib/data/repository/auth/auth_repository_imp.dart index d3ffcba..11a7c60 100644 --- a/packages/livestock/lib/data/repository/auth/auth_repository_imp.dart +++ b/packages/livestock/lib/data/repository/auth/auth_repository_imp.dart @@ -1,4 +1,6 @@ import 'package:rasadyar_livestock/data/data_source/remote/auth/auth_remote.dart'; +import 'package:rasadyar_livestock/data/data_source/remote/livestock/livestock_remote.dart'; +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; import 'package:rasadyar_livestock/data/model/response/auth/auth_response_model.dart'; import 'package:rasadyar_livestock/data/model/response/captcha/captcha_response_model.dart'; @@ -7,7 +9,8 @@ import 'auth_repository.dart'; class AuthRepositoryImp implements AuthRepository { final AuthRemoteDataSource authRemote; - AuthRepositoryImp(this.authRemote); + + AuthRepositoryImp({required this.authRemote}); @override Future login({required Map authRequest}) async => @@ -34,4 +37,6 @@ class AuthRepositoryImp implements AuthRepository { Future hasAuthenticated() async { return await authRemote.hasAuthenticated(); } + + } diff --git a/packages/livestock/lib/data/repository/livestock/livestock_repository.dart b/packages/livestock/lib/data/repository/livestock/livestock_repository.dart new file mode 100644 index 0000000..4b9b70a --- /dev/null +++ b/packages/livestock/lib/data/repository/livestock/livestock_repository.dart @@ -0,0 +1,11 @@ +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; +import 'package:rasadyar_livestock/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_livestock/data/model/response/captcha/captcha_response_model.dart'; + +abstract class LivestockRepository { + Future getLocationDetails({ + required double latitude, + required double longitude, + }); + +} diff --git a/packages/livestock/lib/data/repository/livestock/livestock_repository_imp.dart b/packages/livestock/lib/data/repository/livestock/livestock_repository_imp.dart new file mode 100644 index 0000000..5223f74 --- /dev/null +++ b/packages/livestock/lib/data/repository/livestock/livestock_repository_imp.dart @@ -0,0 +1,18 @@ +import 'package:rasadyar_livestock/data/data_source/remote/livestock/livestock_remote.dart'; +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; + +import 'livestock_repository.dart'; + +class LivestockRepositoryImp implements LivestockRepository { + final LivestockRemoteDataSource livestockRemote; + + LivestockRepositoryImp({required this.livestockRemote}); + + @override + Future getLocationDetails({required double latitude, required double longitude}) async { + return await livestockRemote.getLocationDetailsByLatLng( + latitude: latitude, + longitude: longitude, + ); + } +} diff --git a/packages/livestock/lib/injection/live_stock_di.dart b/packages/livestock/lib/injection/live_stock_di.dart index 954be4c..d374105 100644 --- a/packages/livestock/lib/injection/live_stock_di.dart +++ b/packages/livestock/lib/injection/live_stock_di.dart @@ -2,8 +2,12 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_livestock/data/common/dio_exception_handeler.dart'; import 'package:rasadyar_livestock/data/data_source/remote/auth/auth_remote.dart'; import 'package:rasadyar_livestock/data/data_source/remote/auth/auth_remote_imp.dart'; +import 'package:rasadyar_livestock/data/data_source/remote/livestock/livestock_remote.dart'; +import 'package:rasadyar_livestock/data/data_source/remote/livestock/livestock_remote_imp.dart'; import 'package:rasadyar_livestock/data/repository/auth/auth_repository.dart'; import 'package:rasadyar_livestock/data/repository/auth/auth_repository_imp.dart'; +import 'package:rasadyar_livestock/data/repository/livestock/livestock_repository.dart'; +import 'package:rasadyar_livestock/data/repository/livestock/livestock_repository_imp.dart'; import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; GetIt get diLiveStock => GetIt.instance; @@ -17,7 +21,7 @@ Future setupLiveStockDI() async { await tokenService.saveBaseUrl('https://api.dam.rasadyar.net/'); } - // First register AppInterceptor with lazy callbacks + // First register AppInterceptor with lazy callbacks diLiveStock.registerLazySingleton( () => AppInterceptor( refreshTokenCallback: () async { @@ -55,13 +59,25 @@ Future setupLiveStockDI() async { await diLiveStock.get().init(); // Now register the data source and repository + + //region Auth diLiveStock.registerLazySingleton( () => AuthRemoteDataSourceImp(diLiveStock.get()), ); diLiveStock.registerLazySingleton( - () => AuthRepositoryImp(diLiveStock.get()), + () => AuthRepositoryImp(authRemote: diLiveStock.get()), ); + //endregion + + //region Livestock + diLiveStock.registerLazySingleton( + () => LivestockRemoteDataSourceImp(), + ); + diLiveStock.registerLazySingleton( + () => LivestockRepositoryImp(livestockRemote: diLiveStock.get()), + ); + //endregion diLiveStock.registerLazySingleton(() => ImagePicker()); await diLiveStock.allReady(); diff --git a/packages/livestock/lib/presentation/page/request_tagging/logic.dart b/packages/livestock/lib/presentation/page/request_tagging/logic.dart index f8875fc..22bf9d3 100644 --- a/packages/livestock/lib/presentation/page/request_tagging/logic.dart +++ b/packages/livestock/lib/presentation/page/request_tagging/logic.dart @@ -1,22 +1,43 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/data/model/response/address/address.dart'; +import 'package:rasadyar_livestock/data/repository/livestock/livestock_repository.dart'; import 'package:rasadyar_livestock/injection/live_stock_di.dart'; class RequestTaggingLogic extends GetxController { RxInt currentIndex = 0.obs; - final int maxStep = 3; + final int maxStep = 2; RxBool nextButtonEnabled = true.obs; + LivestockRepository livestockRepository = diLiveStock.get(); + + //region First Step final TextEditingController phoneController = TextEditingController(); final TextEditingController fullNameController = TextEditingController(); final TextEditingController addressController = TextEditingController(); - ImagePicker imagePicker = diLiveStock.get(); Rxn rancherImage = Rxn(null); + //endregion + + //region Second Step + Rxn herdImage = Rxn(null); + Rx> addressDetails = Rx>(Resource.loading()); + RxnString addressDetailsValue = RxnString(null); + RxnString addressLocationValue = RxnString(null); + + RxInt selectedSegment = 0.obs; + RxBool searchIsSelected = false.obs; + RxBool filterIsSelected = false.obs; + RxList filterSelected = [].obs; + + RxList isExpandedList = [].obs; + + RxBool tst1 = false.obs; + + //endregion + @override void onInit() { super.onInit(); @@ -25,6 +46,8 @@ class RequestTaggingLogic extends GetxController { ever(rancherImage, (callback) { setUpNextButtonListeners(); }); + + determineCurrentPosition(); } @override @@ -52,11 +75,11 @@ class RequestTaggingLogic extends GetxController { void setUpNextButtonListeners() { if (currentIndex.value == 0) { - nextButtonEnabled.value = + /* nextButtonEnabled.value = phoneController.text.isNotEmpty && fullNameController.text.isNotEmpty && addressController.text.isNotEmpty && - rancherImage.value != null; + rancherImage.value != null;*/ return; } @@ -94,10 +117,47 @@ class RequestTaggingLogic extends GetxController { getFileSizeInKB(rancherImage.value?.path ?? '', tag: 'Cropped'); } - void getFileSizeInKB(String filePath, {String? tag}) { - final file = File(filePath); - final bytes = file.lengthSync(); - var size = (bytes / 1024).ceil(); - iLog('${tag ?? 'Picked'} image Size: $size'); + Future determineCurrentPosition() async { + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + + getLocationDetails(position.latitude, position.longitude); + } + + Future getLocationDetails(double latitude, double longitude) async { + safeCall( + call: () => livestockRepository.getLocationDetails(latitude: latitude, longitude: longitude), + onSuccess: (result) { + if (result != null) { + addressDetails.value = Resource.success(result); + buildAddressDetails(result); + addressLocationValue.value = '$latitude - $longitude'; + } else { + addressDetails.value = Resource.error('Failed to fetch address'); + } + }, + onError: (error, stackTrace) { + addressDetails.value = Resource.error('Error fetching address: ${error.toString()}'); + }, + ); + } + + void buildAddressDetails(LocationDetails result) { + final address = result.address; + if (address != null) { + final addressParts = [ + address.state, + address.county, + address.district, + address.city, + address.suburb, + address.neighbourhood, + address.road, + ].where((part) => part != null && part.isNotEmpty).join(', '); + addressDetailsValue.value = addressParts; + } else { + addressDetailsValue.value = 'Address not found'; + } } }