Merge branch with resolved conflicts - restructured features and added new modules

This commit is contained in:
2025-12-17 10:26:39 +03:30
484 changed files with 55236 additions and 4255 deletions

View File

@@ -0,0 +1,15 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_core/core.dart';
abstract class JahadRemoteDataSource {
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
});
}

View File

@@ -0,0 +1,39 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_chicken/features/jahad/data/datasources/remote/jahad_remote_data_source.dart';
import 'package:rasadyar_core/core.dart';
class JahadRemoteDataSourceImpl implements JahadRemoteDataSource {
final DioRemote _httpClient;
JahadRemoteDataSourceImpl(this._httpClient);
@override
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
queryParameters: queryParameters,
fromJson: (json) => PaginationModel<PoultryScienceReport>.fromJson(
json,
(json) => PoultryScienceReport.fromJson(json as Map<String, dynamic>),
),
);
return res.data;
}
@override
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
}) async {
await _httpClient.post(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
data: request.toJson(),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:rasadyar_chicken/features/jahad/data/datasources/remote/jahad_remote_data_source.dart';
import 'package:rasadyar_chicken/features/jahad/data/datasources/remote/jahad_remote_data_source_impl.dart';
import 'package:rasadyar_chicken/features/jahad/data/repositories/jahad_repository.dart';
import 'package:rasadyar_chicken/features/jahad/data/repositories/jahad_repository_impl.dart';
import 'package:rasadyar_core/core.dart';
/// Setup dependency injection for jahad feature
Future<void> setupJahadDI(GetIt di, DioRemote dioRemote) async {
di.registerLazySingleton<JahadRemoteDataSource>(
() => JahadRemoteDataSourceImpl(dioRemote),
);
di.registerLazySingleton<JahadRepository>(
() => JahadRepositoryImpl(di.get<JahadRemoteDataSource>()),
);
}
/// Re-register jahad dependencies (used when base URL changes)
Future<void> reRegisterJahadDI(GetIt di, DioRemote dioRemote) async {
await reRegister(di, () => JahadRemoteDataSourceImpl(dioRemote));
await reRegister(
di,
() => JahadRepositoryImpl(di.get<JahadRemoteDataSource>()),
);
}
/// Helper function to re-register a dependency
Future<void> reRegister<T extends Object>(
GetIt di,
T Function() factory,
) async {
if (di.isRegistered<T>()) {
await di.unregister<T>();
}
di.registerLazySingleton<T>(factory);
}

View File

@@ -0,0 +1,15 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_core/core.dart';
abstract class JahadRepository {
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
});
}

View File

@@ -0,0 +1,30 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_chicken/features/jahad/data/datasources/remote/jahad_remote_data_source.dart';
import 'package:rasadyar_chicken/features/jahad/data/repositories/jahad_repository.dart';
import 'package:rasadyar_core/core.dart';
class JahadRepositoryImpl implements JahadRepository {
final JahadRemoteDataSource _remote;
JahadRepositoryImpl(this._remote);
@override
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await _remote.getSubmitInspectionList(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
}) async {
return await _remote.submitInspection(token: token, request: request);
}
}

View File

@@ -0,0 +1,3 @@
export 'data/di/jahad_di.dart';
export 'presentation/routes/routes.dart';
export 'presentation/routes/pages.dart';

View File

@@ -0,0 +1,95 @@
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/repositories/poultry_science_repository.dart';
import 'package:rasadyar_core/core.dart';
class ActiveHatchingLogic extends GetxController {
JahadRootLogic rootLogic = Get.find<JahadRootLogic>();
BaseLogic baseLogic = Get.find<BaseLogic>();
late PoultryScienceRepository poultryScienceRepository;
Rx<Resource<PaginationModel<HatchingModel>>> activeHatchingList =
Resource<PaginationModel<HatchingModel>>.loading().obs;
final RxBool isLoadingMoreList = false.obs;
RxInt currentPage = 1.obs;
RxInt expandedIndex = RxInt(-1);
List<String> routesName = ['اقدام', 'جوجه ریزی فعال'];
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
@override
void onInit() {
super.onInit();
poultryScienceRepository = diChicken.get<PoultryScienceRepository>();
}
@override
void onReady() {
super.onReady();
getHatchingList();
}
@override
void onClose() {
super.onClose();
baseLogic.clearSearch();
}
Future<void> getHatchingList([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreList.value = true;
} else {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.loading();
}
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}
safeCall(
call: () async => await poultryScienceRepository.getHatchingPoultry(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
queryParams: {'type': 'hatching'},
role: 'Jahad',
pageSize: 50,
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.empty();
} else {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.success(
PaginationModel<HatchingModel>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [
...(activeHatchingList.value.data?.results ?? []),
...(res?.results ?? []),
],
),
);
}
},
);
}
void toggleExpanded(int index) {
expandedIndex.value = expandedIndex.value == index ? -1 : index;
}
Future<void> onRefresh() async {
currentPage.value = 1;
await getHatchingList();
}
}

View File

@@ -0,0 +1,244 @@
import 'package:flutter/material.dart';
<<<<<<<< HEAD:packages/chicken/lib/features/poultry_science/active_hatching/view.dart
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/features/poultry_science/active_hatching/logic.dart';
========
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/active_hatching/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart';
>>>>>>>> develop:packages/chicken/lib/features/jahad/presentation/pages/active_hatching/view.dart
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
class ActiveHatchingPage extends GetView<ActiveHatchingLogic> {
const ActiveHatchingPage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
hasSearch: true,
hasFilter: false,
backId: jahadActionKey,
routes: controller.routesName,
onSearchChanged: (data) {
controller.searchedValue.value = data;
controller.getHatchingList();
},
child: hatchingWidget(),
/*widgets: [
hatchingWidget()
],*/
);
}
Widget hatchingWidget() {
return ObxValue((data) {
return RPaginatedListView(
listType: ListType.separated,
resource: data.value,
hasMore: data.value.data?.next != null,
padding: EdgeInsets.fromLTRB(8, 8, 8, 80),
itemBuilder: (context, index) {
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.value.isEqual(index),
onTap: () => controller.toggleExpanded(index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.activeFramSvg.path,
);
}, controller.expandedIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
onLoadMore: () async => controller.getHatchingList(true),
);
}, controller.activeHatchingList);
}
Container itemListExpandedWidget(HatchingModel item) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
),
child: Column(
spacing: 8,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
item.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.greenDark),
),
Spacer(),
Visibility(
child: Text(
item.violation == true ? 'پیگیری' : 'عادی',
textAlign: TextAlign.center,
style: AppFonts.yekan10.copyWith(color: AppColor.redDark),
),
),
],
),
Container(
height: 32,
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: ShapeDecoration(
color: AppColor.blueLight,
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: AppColor.blueLightHover),
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'نژاد:${item.breed?.first.breed ?? 'N/A'}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
Text(
' سن${item.age} (روز)',
style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
Text(
' دوره جوجه ریزی:${item.period}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
buildRow(
title: 'شماره مجوز جوجه ریزی',
value: item.licenceNumber ?? 'N/A',
),
buildUnitRow(
title: 'حجم جوجه ریزی',
value: item.quantity.separatedByCommaFa,
unit: '(قطعه)',
),
buildUnitRow(
title: 'مانده در سالن',
value: item.leftOver.separatedByCommaFa,
unit: '(قطعه)',
),
buildUnitRow(
title: 'تلفات',
value: item.losses.separatedByCommaFa,
unit: '(قطعه)',
),
buildRow(
title: 'دامپزشک فارم',
value:
'${item.vetFarm?.vetFarmFullName}(${item.vetFarm?.vetFarmMobile})',
),
buildRow(
title: 'شرح بازرسی',
value: item.reportInfo?.image == false
? 'ارسال تصویر جوجه ریزی فارم '
: 'تکمیل شده',
titleStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false)
? AppColor.greenNormal
: AppColor.redDark,
),
valueStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false)
? AppColor.greenNormal
: AppColor.redDark,
),
),
RElevated(
height: 40.h,
isFullWidth: true,
onPressed: () {
Get.find<CreateInspectionBottomSheetLogic>().setHatchingModel(
item,
);
Get.bottomSheet(
CreateInspectionBottomSheet(),
isScrollControlled: true,
ignoreSafeArea: false,
).then((value) {
if (Get.isRegistered<CreateInspectionBottomSheetLogic>()) {
Get.find<CreateInspectionBottomSheetLogic>().clearForm();
}
});
},
child: Text('ثبت بازرسی'),
),
],
),
);
}
Widget itemListWidget(HatchingModel item) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SizedBox(width: 20),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 3,
children: [
Text(
item.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
item.poultry?.user?.mobile ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark),
),
],
),
),
Expanded(
flex: 3,
child: Column(
spacing: 3,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
item.poultry?.unitName ?? 'N/Aaq',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.bgDark),
),
Text(
item.poultry?.licenceNumber ?? 'N/A',
textAlign: TextAlign.left,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
],
),
),
Expanded(
flex: 1,
child: Assets.vec.scanSvg.svg(
width: 32.w,
height: 32.h,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
],
);
}
}

View File

@@ -0,0 +1,29 @@
import 'package:rasadyar_chicken/features/jahad/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
class JahadActionItem {
final String title;
final String route;
final String icon;
JahadActionItem({
required this.title,
required this.route,
required this.icon,
});
}
class JahadHomeLogic extends GetxController {
RxList<JahadActionItem> items = [
JahadActionItem(
title: "جوجه ریزی فعال",
route: JahadRoutes.activeHatchingJahad,
icon: Assets.vec.activeFramSvg.path,
),
JahadActionItem(
title: "بازرسی مزارع طیور",
route: JahadRoutes.newInspectionJahad,
icon: Assets.vec.activeFramSvg.path,
),
].obs;
}

View File

@@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class JahadHomePage extends GetView<JahadHomeLogic> {
JahadHomePage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
isBase: true,
hasNews: true,
hasNotification: true,
child: gridWidget(),
);
}
Widget gridWidget() {
return ObxValue((data) {
return GridView.builder(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.symmetric(vertical: 18.h, horizontal: 32.w),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 24.h,
crossAxisSpacing: 24.w,
),
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
var item = data[index];
return GlassMorphismCardIcon(
title: item.title,
vecIcon: item.icon,
onTap: () async {
Get.toNamed(item.route, id: jahadActionKey);
},
);
},
);
}, controller.items);
}
}

View File

@@ -0,0 +1,159 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart';
import 'package:rasadyar_core/core.dart';
class NewInspectionLogic extends GetxController {
BaseLogic baseLogic = Get.find<BaseLogic>();
Rx<Resource<PaginationModel<PoultryScienceReport>>> submitInspectionList =
Resource<PaginationModel<PoultryScienceReport>>.loading().obs;
JahadRootLogic rootLogic = Get.find<JahadRootLogic>();
final RxBool isLoadingMoreAllocationsMade = false.obs;
RxInt currentPage = 1.obs;
RxInt expandedIndex = RxInt(-1);
RxList<XFile> pickedImages = <XFile>[].obs;
final List<MultipartFile> _multiPartPickedImages = <MultipartFile>[];
RxBool isOnUpload = false.obs;
RxDouble presentUpload = 0.0.obs;
RxList<String> routesName = RxList();
RxInt selectedSegmentIndex = 0.obs;
RxnString searchedValue = RxnString();
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
@override
void onInit() {
super.onInit();
routesName.value = ['اقدام'].toList();
ever(selectedSegmentIndex, (callback) {
routesName.removeLast();
routesName.add(callback == 0 ? 'بازرسی' : 'بایگانی');
});
}
@override
void onReady() {
super.onReady();
getReport();
}
@override
void onClose() {
super.onClose();
baseLogic.clearSearch();
}
Future<void> getReport([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreAllocationsMade.value = true;
} else {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.loading();
}
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}
safeCall(
call: () async => await rootLogic.jahadRepository.getSubmitInspectionList(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
role: 'Jahad',
pageSize: 50,
search: 'filter',
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.empty();
} else {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.success(
PaginationModel<PoultryScienceReport>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [
...(submitInspectionList.value.data?.results ?? []),
...(res?.results ?? []),
],
),
);
}
},
);
}
Future<void> pickImages() async {
determineCurrentPosition();
var tmp = await pickCameraImage();
if (tmp?.path != null && pickedImages.length < 7) {
pickedImages.add(tmp!);
}
}
void removeImage(int index) {
pickedImages.removeAt(index);
}
void closeBottomSheet() {
Get.back();
}
double calculateUploadProgress({required int sent, required int total}) {
if (total != 0) {
double progress = (sent * 100 / total) / 100;
return progress;
} else {
return 0.0;
}
}
void toggleExpanded(int index) {
expandedIndex.value = expandedIndex.value == index ? -1 : index;
}
void setSearchValue(String? data) {
dLog('Search Value: $data');
searchedValue.value = data?.trim();
getReport();
}
Future<void> onRefresh() async {
currentPage.value = 1;
await getReport();
}
String getStatus(PoultryScienceReport item) {
final status = item.reportInformation?.inspectionStatus ?? item.state;
if (status == null || status.isEmpty) {
return 'در حال بررسی';
}
return status;
}
Color getStatusColor(PoultryScienceReport item) {
final status = item.reportInformation?.inspectionStatus ?? item.state;
if (status == null || status.isEmpty) {
return AppColor.yellowNormal;
}
// می‌توانید منطق رنگ را بر اساس inspectionStatus تنظیم کنید
return AppColor.greenNormal;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/features/jahad/data/repositories/jahad_repository.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/home/view.dart';
import 'package:rasadyar_chicken/features/common/presentation/page/profile/view.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class JahadRootLogic extends GetxController {
var tokenService = Get.find<TokenStorageService>();
late JahadRepository jahadRepository;
RxList<ErrorLocationType> errorLocationType = RxList();
RxMap<int, dynamic> homeExpandedList = RxMap();
DateTime? _lastBackPressed;
RxInt currentPage = 0.obs;
final pages = [
Navigator(
key: Get.nestedKey(jahadActionKey),
onGenerateRoute: (settings) {
final page = JahadPages.pages.firstWhere(
(e) => e.name == settings.name,
orElse: () => JahadPages.pages.firstWhere(
(e) => e.name == JahadRoutes.homeJahad,
),
);
return buildRouteFromGetPage(page);
},
),
ProfilePage(),
];
@override
void onInit() {
super.onInit();
jahadRepository = diChicken.get<JahadRepository>();
}
void toggleExpanded(int index) {
if (homeExpandedList.keys.contains(index)) {
homeExpandedList.remove(index);
} else {
homeExpandedList[index] = false;
}
}
void rootErrorHandler(DioException error) {
handleGeneric(error, () {
tokenService.deleteModuleTokens(Module.chicken);
});
}
void changePage(int index) {
currentPage.value = index;
}
void popBackTaped() async {
final now = DateTime.now();
if (_lastBackPressed == null ||
now.difference(_lastBackPressed!) > Duration(seconds: 2)) {
_lastBackPressed = now;
Get.snackbar(
'خروج از برنامه',
'برای خروج دوباره بازگشت را بزنید',
snackPosition: SnackPosition.TOP,
duration: Duration(seconds: 2),
backgroundColor: AppColor.warning,
);
} else {
await SystemNavigator.pop();
}
}
}

View File

@@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class JahadRootPage extends GetView<JahadRootLogic> {
const JahadRootPage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
isFullScreen: true,
onPopScopTaped: controller.popBackTaped,
child: ObxValue((data) {
return Stack(
children: [
IndexedStack(children: controller.pages, index: data.value),
Positioned(
right: 0,
left: 0,
bottom: 0,
child: RBottomNavigation(
mainAxisAlignment: MainAxisAlignment.spaceAround,
items: [
RBottomNavigationItem(
label: 'خانه',
icon: Assets.vec.homeSvg.path,
isSelected: controller.currentPage.value == 0,
onTap: () {
Get.nestedKey(
jahadActionKey,
)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(0);
},
),
RBottomNavigationItem(
label: 'پروفایل',
icon: Assets.vec.profileCircleSvg.path,
isSelected: controller.currentPage.value == 1,
onTap: () {
Get.nestedKey(
jahadActionKey,
)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(1);
},
),
],
),
),
],
);
}, controller.currentPage),
);
}
}

View File

@@ -0,0 +1,66 @@
import 'package:rasadyar_chicken/features/jahad/presentation/pages/home/logic.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/home/view.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/root/view.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/active_hatching/logic.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/active_hatching/view.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/new_inspection/logic.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/pages/new_inspection/view.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart';
import 'package:rasadyar_chicken/presentation/routes/global_binding.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart';
import 'package:rasadyar_core/core.dart';
class JahadPages {
JahadPages._();
static List<GetPage> get pages => [
GetPage(
name: JahadRoutes.initJahad,
page: () => JahadRootPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => ChickenBaseLogic(), fenix: true);
Get.lazyPut(() => JahadRootLogic());
Get.lazyPut(() => JahadHomeLogic());
}),
],
),
GetPage(
name: JahadRoutes.homeJahad,
page: () => JahadHomePage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.put(JahadHomeLogic());
Get.lazyPut(() => ChickenBaseLogic());
}),
),
GetPage(
name: JahadRoutes.activeHatchingJahad,
page: () => ActiveHatchingPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => ActiveHatchingLogic());
Get.lazyPut(() => CreateInspectionBottomSheetLogic());
}),
],
),
GetPage(
name: JahadRoutes.newInspectionJahad,
page: () => NewInspectionPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => NewInspectionLogic());
}),
],
),
];
}

View File

@@ -0,0 +1,10 @@
sealed class JahadRoutes {
JahadRoutes._();
static const _base = '/chicken/jahad';
static const initJahad = '$_base/';
static const homeJahad = '$_base/home';
static const actionJahad = '$_base/action';
static const activeHatchingJahad = '$_base/activeHatching';
static const newInspectionJahad = '$_base/newInspection';
}