feat : new main page inspection

This commit is contained in:
2025-07-24 16:57:34 +03:30
parent e5142a258c
commit 42727c7eec
30 changed files with 1784 additions and 238 deletions

View File

@@ -0,0 +1,8 @@
<svg width="35" height="37" viewBox="0 0 35 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.216 8.33984C17.2056 8.33984 17.1941 8.33984 17.1836 8.33984C11.1574 8.33984 6.27197 13.3027 6.27197 19.4243C6.27197 25.5459 11.1574 30.5088 17.1836 30.5088C17.1941 30.5088 17.2056 30.5088 17.216 30.5088V8.33984Z" fill="white"/>
<path d="M24.8373 29.9813L27.9153 27.6753C26.7127 25.0143 25.3052 22.3932 23.4999 21.5L16.9999 24.5L16.9712 31.5187C18.4919 31.9282 20.1936 31.7111 22.0031 31.1153V26.8418C23.0895 27.3759 23.9937 28.5695 24.8373 29.9813Z" fill="#85A2FF"/>
<path d="M23.7122 21.6175C19.9341 18.5429 14.6154 18.6396 11.0591 21.6175C14.382 25.1728 19.5604 25.2201 23.7122 21.6175Z" fill="white"/>
<path d="M17.2319 8.33887C17.2319 8.33887 17.2256 8.33887 17.2235 8.33887C12.5443 8.33887 8.75146 11.9476 8.75146 16.398C8.75146 20.8485 12.5443 24.4572 17.2235 24.4572C17.2267 24.4572 17.2298 24.4572 17.2319 24.4572V8.33887Z" fill="#85A2FF"/>
<path d="M31.1534 32.8965L28.2093 29.1406C27.1303 30.0698 26.0199 30.963 24.8843 31.8243C24.8812 31.8274 24.8791 31.8294 24.876 31.8325L28.2805 36.1368C31.1 38.6631 33.6892 35.0605 31.1534 32.8975V32.8965Z" fill="white"/>
<path d="M17.3565 34.1301C7.78654 34.1301 0 26.4753 0 17.0651C0 7.65478 7.78654 0 17.3565 0C26.9264 0 34.7129 7.65581 34.7129 17.0651C34.7129 26.4743 26.9264 34.1301 17.3565 34.1301ZM17.3565 2.36672C9.1136 2.36672 2.40713 8.96059 2.40713 17.0651C2.40713 25.1695 9.1136 31.7634 17.3565 31.7634C25.5993 31.7634 32.3058 25.1695 32.3058 17.0651C32.3058 8.96059 25.6004 2.36672 17.3565 2.36672Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

14
assets/icons/people.svg Normal file
View File

@@ -0,0 +1,14 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.53 7.77C17.46 7.76 17.39 7.76 17.32 7.77C15.77 7.72 14.54 6.45 14.54 4.89C14.54 3.3 15.83 2 17.43 2C19.02 2 20.32 3.29 20.32 4.89C20.31 6.45 19.08 7.72 17.53 7.77Z"
fill="#444444"/>
<path d="M20.7901 14.7004C19.6701 15.4504 18.1001 15.7304 16.6501 15.5404C17.0301 14.7204 17.2301 13.8104 17.2401 12.8504C17.2401 11.8504 17.0201 10.9004 16.6001 10.0704C18.0801 9.8704 19.6501 10.1504 20.7801 10.9004C22.3601 11.9404 22.3601 13.6504 20.7901 14.7004Z"
fill="#444444"/>
<path d="M6.44016 7.77C6.51016 7.76 6.58016 7.76 6.65016 7.77C8.20016 7.72 9.43016 6.45 9.43016 4.89C9.43016 3.29 8.14016 2 6.54016 2C4.95016 2 3.66016 3.29 3.66016 4.89C3.66016 6.45 4.89016 7.72 6.44016 7.77Z"
fill="#444444"/>
<path d="M6.55012 12.8496C6.55012 13.8196 6.76012 14.7396 7.14012 15.5696C5.73012 15.7196 4.26012 15.4196 3.18012 14.7096C1.60012 13.6596 1.60012 11.9496 3.18012 10.8996C4.25012 10.1796 5.76012 9.88962 7.18012 10.0496C6.77012 10.8896 6.55012 11.8396 6.55012 12.8496Z"
fill="#444444"/>
<path d="M12.1198 15.87C12.0398 15.86 11.9498 15.86 11.8598 15.87C10.0198 15.81 8.5498 14.3 8.5498 12.44C8.5598 10.54 10.0898 9 11.9998 9C13.8998 9 15.4398 10.54 15.4398 12.44C15.4298 14.3 13.9698 15.81 12.1198 15.87Z"
fill="#444444"/>
<path d="M8.8698 17.9396C7.3598 18.9496 7.3598 20.6096 8.8698 21.6096C10.5898 22.7596 13.4098 22.7596 15.1298 21.6096C16.6398 20.5996 16.6398 18.9396 15.1298 17.9396C13.4198 16.7896 10.5998 16.7896 8.8698 17.9396Z"
fill="#444444"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

10
assets/icons/profile2.svg Normal file
View File

@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 2C6.38 2 4.25 4.13 4.25 6.75C4.25 9.32 6.26 11.4 8.88 11.49C8.96 11.48 9.04 11.48 9.1 11.49C9.12 11.49 9.13 11.49 9.15 11.49C9.16 11.49 9.16 11.49 9.17 11.49C11.73 11.4 13.74 9.32 13.75 6.75C13.75 4.13 11.62 2 9 2Z"
fill="#626366"/>
<path d="M14.08 14.1499C11.29 12.2899 6.73996 12.2899 3.92996 14.1499C2.65996 14.9999 1.95996 16.1499 1.95996 17.3799C1.95996 18.6099 2.65996 19.7499 3.91996 20.5899C5.31996 21.5299 7.15996 21.9999 8.99996 21.9999C10.84 21.9999 12.68 21.5299 14.08 20.5899C15.34 19.7399 16.04 18.5999 16.04 17.3599C16.03 16.1299 15.34 14.9899 14.08 14.1499Z"
fill="#626366"/>
<path d="M19.9899 7.3401C20.1499 9.2801 18.7699 10.9801 16.8599 11.2101C16.8499 11.2101 16.8499 11.2101 16.8399 11.2101H16.8099C16.7499 11.2101 16.6899 11.2101 16.6399 11.2301C15.6699 11.2801 14.7799 10.9701 14.1099 10.4001C15.1399 9.4801 15.7299 8.1001 15.6099 6.6001C15.5399 5.7901 15.2599 5.0501 14.8399 4.4201C15.2199 4.2301 15.6599 4.1101 16.1099 4.0701C18.0699 3.9001 19.8199 5.3601 19.9899 7.3401Z"
fill="#626366"/>
<path d="M21.9902 16.5904C21.9102 17.5604 21.2902 18.4004 20.2502 18.9704C19.2502 19.5204 17.9902 19.7804 16.7402 19.7504C17.4602 19.1004 17.8802 18.2904 17.9602 17.4304C18.0602 16.1904 17.4702 15.0004 16.2902 14.0504C15.6202 13.5204 14.8402 13.1004 13.9902 12.7904C16.2002 12.1504 18.9802 12.5804 20.6902 13.9604C21.6102 14.7004 22.0802 15.6304 21.9902 16.5904Z"
fill="#626366"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

5
assets/icons/shop.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.3601 8.27L22.0701 5.5C21.6501 2.48 20.2801 1.25 17.3501 1.25H14.9901H13.5101H10.4701H8.99014H6.59014C3.65014 1.25 2.29014 2.48 1.86014 5.53L1.59014 8.28C1.49014 9.35 1.78014 10.39 2.41014 11.2C3.17014 12.19 4.34014 12.75 5.64014 12.75C6.90014 12.75 8.11014 12.12 8.87014 11.11C9.55014 12.12 10.7101 12.75 12.0001 12.75C13.2901 12.75 14.4201 12.15 15.1101 11.15C15.8801 12.14 17.0701 12.75 18.3101 12.75C19.6401 12.75 20.8401 12.16 21.5901 11.12C22.1901 10.32 22.4601 9.31 22.3601 8.27Z" fill="#666666"/>
<path d="M11.3501 16.6602C10.0801 16.7902 9.12012 17.8702 9.12012 19.1502V21.8902C9.12012 22.1602 9.34012 22.3802 9.61012 22.3802H14.3801C14.6501 22.3802 14.8701 22.1602 14.8701 21.8902V19.5002C14.8801 17.4102 13.6501 16.4202 11.3501 16.6602Z" fill="#666666"/>
<path d="M21.3699 14.4001V17.3801C21.3699 20.1401 19.1299 22.3801 16.3699 22.3801C16.0999 22.3801 15.8799 22.1601 15.8799 21.8901V19.5001C15.8799 18.2201 15.4899 17.2201 14.7299 16.5401C14.0599 15.9301 13.1499 15.6301 12.0199 15.6301C11.7699 15.6301 11.5199 15.6401 11.2499 15.6701C9.46988 15.8501 8.11988 17.3501 8.11988 19.1501V21.8901C8.11988 22.1601 7.89988 22.3801 7.62988 22.3801C4.86988 22.3801 2.62988 20.1401 2.62988 17.3801V14.4201C2.62988 13.7201 3.31988 13.2501 3.96988 13.4801C4.23988 13.5701 4.50988 13.6401 4.78988 13.6801C4.90988 13.7001 5.03988 13.7201 5.15988 13.7201C5.31988 13.7401 5.47988 13.7501 5.63988 13.7501C6.79988 13.7501 7.93988 13.3201 8.83988 12.5801C9.69988 13.3201 10.8199 13.7501 11.9999 13.7501C13.1899 13.7501 14.2899 13.3401 15.1499 12.6001C16.0499 13.3301 17.1699 13.7501 18.3099 13.7501C18.4899 13.7501 18.6699 13.7401 18.8399 13.7201C18.9599 13.7101 19.0699 13.7001 19.1799 13.6801C19.4899 13.6401 19.7699 13.5501 20.0499 13.4601C20.6999 13.2401 21.3699 13.7201 21.3699 14.4001Z" fill="#666666"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

BIN
assets/vec/people.svg.vec Normal file

Binary file not shown.

BIN
assets/vec/profile2.svg.vec Normal file

Binary file not shown.

BIN
assets/vec/shop.svg.vec Normal file

Binary file not shown.

View File

@@ -6,6 +6,7 @@ import 'package:rasadyar_app/data/model/app_info_model.dart';
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_auth/data/services/token_storage_service.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/inspection.dart';
class SplashLogic extends GetxController with GetTickerProviderStateMixin {
late final AnimationController scaleController;
@@ -156,7 +157,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
final module = tokenService.appModule.value;
final target = getTargetPage(module);
Get.offAndToNamed(target);
Get.offAndToNamed(InspectionRoutes.init);
} catch (e, st) {
debugPrint("onReady error: $e\n$st");
}

View File

@@ -1,11 +1,9 @@
import 'package:rasadyar_app/presentation/pages/splash/logic.dart';
import 'package:rasadyar_app/presentation/pages/splash/view.dart';
import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart';
import 'package:rasadyar_auth/auth.dart';
import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart';
import 'package:rasadyar_auth/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/presentation/routes/pages.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/inspection.dart';
import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
@@ -36,12 +34,12 @@ sealed class AppPages {
String getTargetPage(Module? value) {
switch (value) {
case Module.inspection:
return InspectionRoutes.inspection;
return InspectionRoutes.init;
case Module.liveStocks:
return LiveStockRoutes.init;
case Module.chicken:
return ChickenRoutes.init;
default:
return ChickenRoutes.init;
return InspectionRoutes.init;
}
}

View File

@@ -133,7 +133,7 @@ class AuthLogic extends GetxController {
await safeCall<UserProfileModel?>(
call: () => authTmp.login(
authRequest: {
"username": phoneNumberController.value.text,
"username": usernameController.value.text,
"password": passwordController.value.text,
},
),

View File

@@ -102,13 +102,13 @@ class AuthPage extends GetView<AuthLogic> {
label: 'نام کاربری',
maxLength: 11,
maxLines: 1,
controller: controller.phoneNumberController.value,
controller: controller.usernameController.value,
keyboardType: TextInputType.number,
initText: controller.phoneNumberController.value.text,
initText: controller.usernameController.value.text,
autofillHints: [AutofillHints.username],
onChanged: (value) async {
controller.phoneNumberController.value.text = value;
controller.phoneNumberController.refresh();
controller.usernameController.value.text = value;
controller.usernameController.refresh();
if (value.length == 11) {
await controller.getUserInfo(value);
}
@@ -117,18 +117,18 @@ class AuthPage extends GetView<AuthLogic> {
padding: const EdgeInsets.fromLTRB(0, 8, 6, 8),
child: Assets.vec.callSvg.svg(width: 12, height: 12),
),
suffixIcon: controller.phoneNumberController.value.text.trim().isNotEmpty
suffixIcon: controller.usernameController.value.text.trim().isNotEmpty
? clearButton(() {
controller.phoneNumberController.value.clear();
controller.phoneNumberController.refresh();
controller.usernameController.value.clear();
controller.usernameController.refresh();
})
: null,
validator: (value) {
if (value == null || value.isEmpty) {
/* if (value == null || value.isEmpty) {
return '⚠️ شماره موبایل را وارد کنید';
} else if (value.length < 11) {
} else if (value.length < 10) {
return '⚠️ شماره موبایل باید 11 رقم باشد';
}
}*/
return null;
},
style: AppFonts.yekan13,

View File

@@ -160,7 +160,7 @@ class RootPage extends GetView<RootLogic> {
mainAxisAlignment: MainAxisAlignment.center,
spacing: 4,
children: [
Assets.icons.cubeScan.svg(width: 30, height: 30),
Assets.icons.cubeScan.svg(width: 30.w, height: 30),
Text(
'بارهای امروز',
textAlign: TextAlign.right,

View File

@@ -147,6 +147,9 @@ class AppColor {
static const Color redDarkActive = Color(0xFF6a2727); // #6a2727 rgb(106, 39, 39)
static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30)
static const Color redDarkerText = Color(0xFFD24E4E); // #D34E4E rgba(211, 78, 78, 1)
static const Color redLight2 = Color(0xFFEDDCE0); // #EDDCE0 rgb(237, 220, 224)
static const Color redLightActive2 = Color(0xFFE0BCC5); // #E0BCC5 rgb(224, 188, 197)
//endregion
//region --- Teal Colors ---
@@ -166,6 +169,8 @@ class AppColor {
static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64)
static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64)
static const Color textColorLight = Color(0xFFB2B2B2);
static const Color iconColor = Color(0xFF444444); // #444444 rgb(68, 68, 68)
static const Color borderColor = Color(0xFFC7CFCD); // #C7CFCD rgb(199, 207, 205)`
//endregion

View File

@@ -37,6 +37,9 @@ class $AssetsIconsGen {
/// File path: assets/icons/add.svg
SvgGenImage get add => const SvgGenImage('assets/icons/add.svg');
/// File path: assets/icons/app_bar_inspection.svg
SvgGenImage get appBarInspection => const SvgGenImage('assets/icons/app_bar_inspection.svg');
/// File path: assets/icons/arrow_left.svg
SvgGenImage get arrowLeft => const SvgGenImage('assets/icons/arrow_left.svg');
@@ -172,12 +175,18 @@ class $AssetsIconsGen {
/// File path: assets/icons/pdf_download.svg
SvgGenImage get pdfDownload => const SvgGenImage('assets/icons/pdf_download.svg');
/// File path: assets/icons/people.svg
SvgGenImage get people => const SvgGenImage('assets/icons/people.svg');
/// File path: assets/icons/picture_frame.svg
SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg');
/// File path: assets/icons/place_holder.svg
SvgGenImage get placeHolder => const SvgGenImage('assets/icons/place_holder.svg');
/// File path: assets/icons/profile2.svg
SvgGenImage get profile2 => const SvgGenImage('assets/icons/profile2.svg');
/// File path: assets/icons/profile_circle.svg
SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg');
@@ -205,6 +214,9 @@ class $AssetsIconsGen {
/// File path: assets/icons/setting.svg
SvgGenImage get setting => const SvgGenImage('assets/icons/setting.svg');
/// File path: assets/icons/shop.svg
SvgGenImage get shop => const SvgGenImage('assets/icons/shop.svg');
/// File path: assets/icons/shopping_basket.svg
SvgGenImage get shoppingBasket => const SvgGenImage('assets/icons/shopping_basket.svg');
@@ -251,6 +263,7 @@ class $AssetsIconsGen {
List<SvgGenImage> get values => [
a3dCubeSquare,
add,
appBarInspection,
arrowLeft,
arrowRight,
bgHeaderUserProfile,
@@ -296,8 +309,10 @@ class $AssetsIconsGen {
messageAdd,
outside,
pdfDownload,
people,
pictureFrame,
placeHolder,
profile2,
profileCircle,
profileUser,
receiptDiscount,
@@ -307,6 +322,7 @@ class $AssetsIconsGen {
search,
securityTime,
setting,
shop,
shoppingBasket,
tagLabel,
tagUser,
@@ -362,6 +378,9 @@ class $AssetsVecGen {
/// File path: assets/vec/add.svg.vec
SvgGenImage get addSvg => const SvgGenImage.vec('assets/vec/add.svg.vec');
/// File path: assets/vec/app_bar_inspection.svg.vec
SvgGenImage get appBarInspectionSvg => const SvgGenImage.vec('assets/vec/app_bar_inspection.svg.vec');
/// File path: assets/vec/arrow_left.svg.vec
SvgGenImage get arrowLeftSvg => const SvgGenImage.vec('assets/vec/arrow_left.svg.vec');
@@ -497,12 +516,18 @@ class $AssetsVecGen {
/// File path: assets/vec/pdf_download.svg.vec
SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec');
/// File path: assets/vec/people.svg.vec
SvgGenImage get peopleSvg => const SvgGenImage.vec('assets/vec/people.svg.vec');
/// File path: assets/vec/picture_frame.svg.vec
SvgGenImage get pictureFrameSvg => const SvgGenImage.vec('assets/vec/picture_frame.svg.vec');
/// File path: assets/vec/place_holder.svg.vec
SvgGenImage get placeHolderSvg => const SvgGenImage.vec('assets/vec/place_holder.svg.vec');
/// File path: assets/vec/profile2.svg.vec
SvgGenImage get profile2Svg => const SvgGenImage.vec('assets/vec/profile2.svg.vec');
/// File path: assets/vec/profile_circle.svg.vec
SvgGenImage get profileCircleSvg => const SvgGenImage.vec('assets/vec/profile_circle.svg.vec');
@@ -530,6 +555,9 @@ class $AssetsVecGen {
/// File path: assets/vec/setting.svg.vec
SvgGenImage get settingSvg => const SvgGenImage.vec('assets/vec/setting.svg.vec');
/// File path: assets/vec/shop.svg.vec
SvgGenImage get shopSvg => const SvgGenImage.vec('assets/vec/shop.svg.vec');
/// File path: assets/vec/shopping_basket.svg.vec
SvgGenImage get shoppingBasketSvg => const SvgGenImage.vec('assets/vec/shopping_basket.svg.vec');
@@ -576,6 +604,7 @@ class $AssetsVecGen {
List<SvgGenImage> get values => [
a3dCubeSquareSvg,
addSvg,
appBarInspectionSvg,
arrowLeftSvg,
arrowRightSvg,
bgHeaderUserProfileSvg,
@@ -621,8 +650,10 @@ class $AssetsVecGen {
messageAddSvg,
outsideSvg,
pdfDownloadSvg,
peopleSvg,
pictureFrameSvg,
placeHolderSvg,
profile2Svg,
profileCircleSvg,
profileUserSvg,
receiptDiscountSvg,
@@ -632,6 +663,7 @@ class $AssetsVecGen {
searchSvg,
securityTimeSvg,
settingSvg,
shopSvg,
shoppingBasketSvg,
tagLabelSvg,
tagUserSvg,

View File

@@ -53,7 +53,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget {
)
: null,
leadingWidth: leadingWidth?.toDouble(),
leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) : null,
leading: leading != null
? Padding(padding: const EdgeInsets.only(right: 6), child: leading)
: null,
titleSpacing: 8,
actions: [
if (additionalActions != null) ...additionalActions!,

View File

@@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
class RBottomNavigation extends StatefulWidget {
const RBottomNavigation({super.key, required this.items});
RBottomNavigation({super.key, required this.items,this.mainAxisAlignment});
final List<RBottomNavigationItem> items;
MainAxisAlignment? mainAxisAlignment;
@override
State<RBottomNavigation> createState() => _RBottomNavigationState();
@@ -18,9 +19,15 @@ class _RBottomNavigationState extends State<RBottomNavigation> {
padding: EdgeInsets.symmetric(horizontal: 11.w, vertical: 18.h),
decoration: BoxDecoration(
color: AppColor.blueNormal,
borderRadius: const BorderRadius.only(topLeft: Radius.circular(32), topRight: Radius.circular(32)),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(32),
topRight: Radius.circular(32),
),
),
child: Row(
mainAxisAlignment: widget.mainAxisAlignment??MainAxisAlignment.spaceBetween,
children: widget.items,
),
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: widget.items),
);
}
}
@@ -57,10 +64,18 @@ class RBottomNavigationItem extends StatelessWidget {
SvgGenImage.vec(icon).svg(
width: 40.w,
height: 40.h,
colorFilter: ColorFilter.mode(isSelected ? AppColor.blueNormal : Colors.white, BlendMode.srcIn),
colorFilter: ColorFilter.mode(
isSelected ? AppColor.blueNormal : Colors.white,
BlendMode.srcIn,
),
),
SizedBox(height: 5.h),
Text(label, style: AppFonts.yekan10.copyWith(color: isSelected ? AppColor.blueNormal : Colors.white)),
Text(
label,
style: AppFonts.yekan10.copyWith(
color: isSelected ? AppColor.blueNormal : Colors.white,
),
),
],
),
),

View File

@@ -11,7 +11,7 @@ class SupervisionFilterPage extends GetView<InspectorFilterLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: RAppBar.noBack(title: 'نقشه', additionalActions: [_searchButton(), _filterButton()]),
appBar: RAppBar(title: 'نقشه', additionalActions: [_searchButton(), _filterButton()]),
body: PopScope(
canPop: !controller.bottomSheetManager.isAnyVisible,
onPopInvokedWithResult: (didPop, result) {

View File

@@ -0,0 +1,151 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/data/utils/marker_generator.dart';
import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart';
import '../filter/view.dart';
class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin {
final BaseLogic baseLogic = Get.find<BaseLogic>();
Rx<LatLng> currentLocation = LatLng(35.824891, 50.948025).obs;
RxList<LatLng> allMarkers = <LatLng>[].obs;
RxList<LatLng> markers = <LatLng>[].obs;
Timer? _debounceTimer;
RxBool isLoading = false.obs;
RxInt filterIndex = 0.obs;
RxInt showIndex = 0.obs;
bool showSlideHint = true;
late Rx<SlidableController> slidController;
Rx<MapController> mapController = MapController().obs;
late final AnimatedMapController animatedMapController;
late DraggableBottomSheetController filterBottomSheetController;
late DraggableBottomSheetController selectedLocationBottomSheetController;
late DraggableBottomSheetController detailsLocationBottomSheetController;
late final BottomSheetManager bottomSheetManager;
Future<void> determineCurrentPosition() async {
isLoading.value = true;
final position = await Geolocator.getCurrentPosition(
locationSettings: AndroidSettings(accuracy: LocationAccuracy.best),
);
final latLng = LatLng(position.latitude, position.longitude);
currentLocation.value = latLng;
markers.add(latLng);
animatedMapController.animateTo(
dest: latLng,
zoom: 18,
curve: Curves.easeInOut,
duration: const Duration(seconds: 1),
);
isLoading.value = false;
}
void debouncedUpdateVisibleMarkers({required LatLng center}) {
_debounceTimer?.cancel();
_debounceTimer = Timer(const Duration(milliseconds: 300), () {
final filtered = filterNearbyMarkers({
'markers': allMarkers,
'centerLat': center.latitude,
'centerLng': center.longitude,
'radius': 2000.0,
});
markers.addAll(filtered);
});
}
List<LatLng> filterNearbyMarkers(Map<String, dynamic> args) {
final List<LatLng> rawMarkers = args['markers'];
final double centerLat = args['centerLat'];
final double centerLng = args['centerLng'];
final double radiusInMeters = args['radius'];
final center = LatLng(centerLat, centerLng);
final distance = Distance();
return rawMarkers
.where((marker) => distance(center, marker) <= radiusInMeters)
.toList();
}
Future<void> generatedMarkers() async {
final generatedMarkers = await generateLocationsUsingCompute(100000);
allMarkers.value = generatedMarkers;
}
@override
void onInit() {
super.onInit();
animatedMapController = AnimatedMapController(
vsync: this,
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
cancelPreviousAnimations: true,
);
filterBottomSheetController = DraggableBottomSheetController(
initialHeight: 350,
minHeight: 200,
maxHeight: Get.height * 0.5,
);
selectedLocationBottomSheetController = DraggableBottomSheetController(
initialHeight: 200,
minHeight: 100,
maxHeight: 200,
);
detailsLocationBottomSheetController = DraggableBottomSheetController(
initialHeight: Get.height * 0.5,
minHeight: Get.height * 0.37,
maxHeight: Get.height * 0.5,
);
slidController = SlidableController(this).obs;
bottomSheetManager = BottomSheetManager({
filterBottomSheetController:
() => filterWidget(filterIndex: filterIndex, showIndex: showIndex),
selectedLocationBottomSheetController:
() => selectedLocationWidget(
showHint:
selectedLocationBottomSheetController.isVisible.value &&
showSlideHint,
sliderController: slidController.value,
trigger: triggerSlidableAnimation,
toggle: selectedLocationBottomSheetController.toggle,
),
detailsLocationBottomSheetController: () => markerDetailsWidget(),
});
}
@override
void onReady() {
super.onReady();
determineCurrentPosition();
generatedMarkers();
}
Future<void> triggerSlidableAnimation() async {
await Future.delayed(Duration(milliseconds: 200));
await slidController.value.openEndActionPane();
await Future.delayed(Duration(milliseconds: 200));
await slidController.value.close();
showSlideHint = false;
}
@override
void onClose() {
slidController.close();
super.onClose();
}
}

View File

@@ -0,0 +1,650 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/presentation/routes/app_routes.dart';
import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart';
import 'package:rasadyar_inspection/presentation/widget/search.dart';
import 'logic.dart';
class InspectionMapPage extends GetView<InspectionMapLogic> {
const InspectionMapPage({super.key});
@override
Widget build(BuildContext context) {
return BasePage(
hasSearch: true,
hasFilter: true,
hasBack: false,
defaultSearch: false,
filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs),
onSearchTap: () {
controller.baseLogic.isSearchSelected.value = !controller.baseLogic.isSearchSelected.value;
},
widgets: [_buildMap()],
floatingActionButton: _buildGpsButton(),
);
}
Widget _buildMap() {
return Expanded(
child: Stack(
fit: StackFit.expand,
children: [
ObxValue((currentLocation) {
return FlutterMap(
mapController: controller.animatedMapController.mapController,
options: MapOptions(
initialCenter: currentLocation.value,
initialZoom: 18,
onPositionChanged: (camera, hasGesture) {
controller.debouncedUpdateVisibleMarkers(center: camera.center);
},
),
children: [
TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'),
ObxValue((markers) {
return MarkerLayer(
markers: markers
.map(
(e) => markerWidget(
marker: e,
onTap: () {
Get.bottomSheet(
selectedLocationWidget(
showHint: false,
sliderController: controller.slidController.value,
trigger: () {},
toggle: () {},
),
isScrollControlled: true,
enableDrag: true,
backgroundColor: Colors.transparent,
);
},
),
)
.toList(),
);
}, controller.markers),
],
);
}, controller.currentLocation),
Positioned(
top: 10,
left: 20,
right: 20,
child: ObxValue((data) {
if (data.value) {
return SearchWidget(
onSearchChanged: (data) {
controller.baseLogic.searchValue.value = data;
},
);
} else {
return SizedBox.shrink();
}
}, controller.baseLogic.isSearchSelected),
),
],
),
);
}
Widget _buildGpsButton() {
return ObxValue((data) {
return RFab(
backgroundColor: AppColor.greenNormal,
isLoading: data.value,
icon: Assets.vec.gpsSvg.svg(width: 40.w, height: 40.h),
onPressed: () async => await controller.determineCurrentPosition(),
);
}, controller.isLoading);
}
}
Marker markerWidget({required LatLng marker, required VoidCallback onTap}) {
return Marker(
point: marker,
child: GestureDetector(
onTap: onTap,
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: 36,
height: 36,
child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30),
),
),
);
}
Widget filterWidget({required RxInt filterIndex, required RxInt showIndex}) {
return BaseBottomSheet(
height: Get.height * 0.5,
child: Column(
spacing: 16,
children: [
SizedBox(height: 1),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
spacing: 16,
children: [
cardWithLabel(
title: 'اصناف',
count: 1234567,
icon: Assets.vec.shopSvg.svg(width: 24.w, height: 24.h),
backgroundColor: AppColor.greenLight,
backgroundBadgeColor: AppColor.greenLightActive,
),
cardWithLabel(
title: 'دامداران',
count: 1234567,
icon: Assets.vec.peopleSvg.svg(width: 24.w, height: 24.h),
backgroundColor: AppColor.blueLight,
backgroundBadgeColor: AppColor.blueLightActive,
),
cardWithLabel(
title: 'مرغداران',
count: 1234567,
icon: Assets.vec.profile2Svg.svg(width: 24.w, height: 24.h),
backgroundColor: AppColor.redLight,
backgroundBadgeColor: AppColor.redLightActive,
),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 12,
children: [
Text(
'فیلتر نمایش',
textAlign: TextAlign.center,
style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal),
),
ObxValue((data) {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
spacing: 8,
children: [
customChip(
isSelected: data.value == 0,
onTap: (data) {
filterIndex.value = data;
},
index: 0,
title: 'دامداران',
),
customChip(
isSelected: data.value == 1,
title: 'مرغداران',
onTap: (data) {
filterIndex.value = data;
},
index: 1,
),
customChip(
isSelected: data.value == 2,
title: 'اصناف',
onTap: (data) {
filterIndex.value = data;
},
index: 2,
),
],
);
}, filterIndex),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 12,
children: [
Text(
'نمایش',
textAlign: TextAlign.center,
style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal),
),
ObxValue((data) {
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
spacing: 8,
children: [
customChip(
isSelected: data.value == 0,
title: 'نمایش همه',
onTap: (data) {
showIndex.value = data;
},
index: 0,
),
customChip(
isSelected: data.value == 1,
title: 'دارای تراکنش',
onTap: (data) {
showIndex.value = data;
},
index: 1,
),
customChip(
isSelected: data.value == 2,
title: 'بازرسی شده ها',
onTap: (data) {
showIndex.value = data;
},
index: 2,
),
customChip(
isSelected: data.value == 3,
title: 'بازرسی نشده ها',
onTap: (data) {
showIndex.value = data;
},
index: 3,
),
customChip(
isSelected: data.value == 4,
title: 'متخلفین',
onTap: (data) {
showIndex.value = data;
},
index: 4,
),
],
),
);
}, showIndex),
],
),
],
),
);
}
Widget cardWithLabel({
required String title,
required int count,
String unit = 'عدد',
required Widget icon,
required Color backgroundColor,
required Color backgroundBadgeColor,
}) {
return SizedBox(
width: 114.w,
height: 115.h,
child: Stack(
clipBehavior: Clip.antiAlias,
alignment: Alignment.topCenter,
children: [
Positioned(
bottom: 0,
right: 0,
left: 0,
child: Container(
width: 114.w,
height: 91.h,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
color: backgroundColor,
borderRadius: BorderRadius.circular(8),
border: Border.all(width: 0.25, color: AppColor.blackLightHover),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
spacing: 6,
children: [
Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)),
Text(
count.separatedByComma,
style: AppFonts.yekan16.copyWith(color: AppColor.textColor),
),
Text(unit, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)),
],
),
),
),
Positioned(
top: 5.h,
child: Container(
width: 32.w,
height: 32.h,
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: backgroundBadgeColor,
borderRadius: BorderRadius.circular(50),
border: Border.all(color: AppColor.borderColor, width: 0.25),
),
child: Center(child: icon),
),
),
],
),
);
}
Widget markerDetailsWidget() {
return Container(
clipBehavior: Clip.antiAlias,
margin: EdgeInsets.all(35),
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Column(
spacing: 15,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
spacing: 12,
children: [
Text(
'داود خرم پور',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover),
),
Spacer(),
vecWidgetWithOnTap(
child: Assets.vec.mapSvg.svg(),
onTap: () {
Get.toNamed(InspectionRoutes.inspectionLocationDetails);
},
width: 24,
height: 24,
color: AppColor.blueNormal,
),
vecWidgetWithOnTap(
child: Assets.vec.messageAddSvg.svg(),
width: 24,
height: 24,
color: AppColor.greenNormal,
onTap: () {
Get.toNamed(InspectionRoutes.inspectionAddSupervision);
},
),
vecWidgetWithOnTap(
child: Assets.vec.securityTimeSvg.svg(),
color: AppColor.warning,
height: 24,
width: 24,
onTap: () {},
),
],
),
Container(
height: 32,
clipBehavior: Clip.antiAlias,
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: ShapeDecoration(
color: AppColor.blueLight,
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: AppColor.blueLightHover),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'باقی مانده',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
Text(
'0 کیلوگرم',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'شماره همراه',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
Text(
'0326598653',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'آخرین فعالیت',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
Text(
'1409/12/12',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'موجودی',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
Text(
'5کیلوگرم',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
...List.generate(
5,
(index) => Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'فروش رفته',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
Text(
'0 کیلوگرم',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
),
],
),
);
}
Widget customChip({
bool isSelected = false,
required String title,
required int index,
required Function(int) onTap,
}) {
return GestureDetector(
onTap: () {
onTap.call(index);
},
child: Container(
height: 32.h,
padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h),
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
color: AppColor.whiteGreyNormal,
borderRadius: BorderRadius.circular(8),
border: Border.all(
width: 1,
color: isSelected ? AppColor.blueNormal : AppColor.blackLightActive,
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
width: 12.w,
height: 12.h,
child: Transform.scale(
scale: 0.70,
child: Checkbox(
value: isSelected,
side: BorderSide(color: AppColor.whiteDarkHover, width: 1),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
visualDensity: VisualDensity.compact,
overlayColor: WidgetStateProperty.all<Color>(AppColor.blueNormal),
fillColor: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return AppColor.blueNormal;
} else {
return AppColor.whiteGreyNormal;
}
}),
onChanged: (value) {
onTap.call(index);
},
),
),
),
SizedBox(width: 8.w),
Text(
title,
textAlign: TextAlign.center,
style: AppFonts.yekan12.copyWith(
color: isSelected ? AppColor.blueNormal : AppColor.whiteDarkHover,
),
),
],
),
),
);
}
Widget selectedLocationWidget({
required bool showHint,
required SlidableController sliderController,
required VoidCallback trigger,
required VoidCallback toggle,
}) {
if (showHint) {
trigger.call();
}
return BaseBottomSheet(
height: 150.h,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20),
child: Slidable(
key: Key('selectedLocationWidget'),
controller: sliderController,
endActionPane: ActionPane(
motion: StretchMotion(),
children: [
CustomSlidableAction(
onPressed: (context) {
Get.toNamed(InspectionRoutes.inspectionLocationDetails);
},
backgroundColor: AppColor.blueNormal,
foregroundColor: Colors.white,
padding: EdgeInsets.all(16),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8),
topRight: Radius.circular(8),
),
child: Assets.vec.mapSvg.svg(width: 24, height: 24),
),
CustomSlidableAction(
onPressed: (context) {
Get.toNamed(InspectionRoutes.inspectionAddSupervision);
},
backgroundColor: AppColor.greenNormal,
padding: EdgeInsets.all(16),
child: Assets.vec.messageAddSvg.svg(),
),
CustomSlidableAction(
onPressed: (context) {},
backgroundColor: AppColor.warning,
padding: EdgeInsets.all(16),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(8),
topLeft: Radius.circular(8),
),
child: Assets.vec.securityTimeSvg.svg(),
),
],
),
child: GestureDetector(
onTap: toggle,
child: Container(
height: 58,
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
border: Border.all(width: 1, color: AppColor.blackLightHover),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Text(
'داود خرم مهری پور',
style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal),
),
Text(
'گوشت و مرغ',
style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
Column(
children: [
Text(
'باقی مانده',
style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal),
),
Text(
'0 کیلوگرم',
style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover),
),
],
),
Assets.vec.scanBarcodeSvg.svg(),
],
),
),
),
),
),
);
}

View File

@@ -2,13 +2,14 @@ import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart' ;
import 'package:rasadyar_inspection/presentation/action/view.dart';
import 'package:rasadyar_inspection/presentation/filter/view.dart';
import 'package:rasadyar_inspection/presentation/inspection_map/view.dart';
import 'package:rasadyar_inspection/presentation/profile/view.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class RootLogic extends GetxController {
RxInt currentIndex = 0.obs;
List<Widget> pages = [SupervisionFilterPage(), ActionPage(), ProfilePage()];
List<Widget> pages = [InspectionMapPage(), ActionPage(), ProfilePage()];
RxList<ErrorLocationType> errorLocationType = RxList();
Stream<bool> listenToLocationServiceStatus() {

View File

@@ -8,168 +8,49 @@ class RootPage extends GetView<RootLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
ObxValue((errorType) {
if (errorType.isNotEmpty) {
if (errorType.contains(ErrorLocationType.serviceDisabled)) {
Future.microtask(() {
Get.defaultDialog(
title: 'خطا',
content: const Text('سرویس مکان‌یابی غیرفعال است'),
cancel: ROutlinedElevated(
text: 'بررسی مجدد',
width: 120,
textStyle: AppFonts.yekan16,
onPressed: () async {
var service = await controller.locationServiceEnabled();
eLog(service);
if (service) {
controller.errorLocationType.remove(
ErrorLocationType.serviceDisabled,
);
Get.back();
}
// Don't call Get.back() if service is still disabled
},
),
confirm: RElevated(
text: 'روشن کردن',
textStyle: AppFonts.yekan16,
width: 120,
onPressed: () async {
var res = await Geolocator.openLocationSettings();
if (res) {
var service =
await controller.locationServiceEnabled();
if (service) {
controller.errorLocationType.remove(
ErrorLocationType.serviceDisabled,
);
Get.back();
}
}
},
),
return ObxValue((currentIndex) {
return Scaffold(
body: ObxValue(
(currentIndex) => IndexedStack(index: currentIndex.value, children: controller.pages),
controller.currentIndex,
),
bottomNavigationBar: RBottomNavigation(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
items: [
RBottomNavigationItem(
label: 'نقشه',
icon: Assets.vec.mapSvg.path,
isSelected: currentIndex.value == 0,
onTap: () {
Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
contentPadding: EdgeInsets.all(8),
onWillPop: () async {
return controller.errorLocationType.isEmpty;
},
barrierDismissible: false,
);
});
} else {
Future.microtask(() {
Get.defaultDialog(
title: 'خطا',
content: const Text(
' دسترسی به سرویس مکان‌یابی غیرفعال است',
),
cancel: ROutlinedElevated(
text: 'بررسی مجدد',
width: 120,
textStyle: AppFonts.yekan16,
onPressed: () async {
await controller.checkPermission();
},
),
confirm: RElevated(
text: 'اجازه دادن',
textStyle: AppFonts.yekan16,
width: 120,
onPressed: () async {
var res = await controller.checkPermission(
request: true,
);
if (res) {
controller.errorLocationType.remove(
ErrorLocationType.permissionDenied,
);
Get.back();
}
},
),
controller.changePage(0);
},
),
RBottomNavigationItem(
label: 'اقدام',
icon: Assets.vec.settingSvg.path,
isSelected: currentIndex.value == 1,
onTap: () {
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(1);
},
),
contentPadding: EdgeInsets.all(8),
onWillPop: () async {
return controller.errorLocationType.isEmpty;
},
barrierDismissible: false,
);
});
}
}
return const SizedBox.shrink();
}, controller.errorLocationType),
RBottomNavigationItem(
label: 'پروفایل',
icon: Assets.vec.profileCircleSvg.path,
isSelected: currentIndex.value == 4,
onTap: () {
Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);
ObxValue(
(currentIndex) => IndexedStack(
index: currentIndex.value,
children: controller.pages,
controller.changePage(4);
},
),
controller.currentIndex,
),
],
),
bottomNavigationBar: WaveBottomNavigation(
items: [
WaveBottomNavigationItem(title: 'خانه', icon: Assets.vec.mapSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
)),
WaveBottomNavigationItem(
title: 'عملیات',
icon: Assets.vec.userSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
WaveBottomNavigationItem(
title: 'افزودن',
icon: Assets.vec.addSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
WaveBottomNavigationItem(
title: 'آمار',
icon: Assets.vec.diagramSvg.svg(width: 32,height: 32,colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),),
),
WaveBottomNavigationItem(
title: 'تماس',
icon: Assets.vec.callSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
WaveBottomNavigationItem(
title: 'مکان ',
icon: Assets.vec.gpsSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
WaveBottomNavigationItem(
title: 'تاریخ',
icon: Assets.vec.calendarSvg.svg(
width: 32,
height: 32,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
],
onPageChanged: (index) {
controller.changePage(index);
},
),
);
],
),
);
}, controller.currentIndex);
}
}

View File

@@ -8,6 +8,7 @@ import 'package:rasadyar_inspection/presentation/add_supervision/view.dart';
import 'package:rasadyar_inspection/presentation/display_information/logic.dart';
import 'package:rasadyar_inspection/presentation/display_information/view.dart';
import 'package:rasadyar_inspection/presentation/filter/logic.dart';
import 'package:rasadyar_inspection/presentation/inspection_map/logic.dart';
import 'package:rasadyar_inspection/presentation/location_details/logic.dart';
import 'package:rasadyar_inspection/presentation/location_details/view.dart';
import 'package:rasadyar_inspection/presentation/profile/logic.dart';
@@ -17,18 +18,21 @@ import 'package:rasadyar_inspection/presentation/registration_of_violation/view.
import 'package:rasadyar_inspection/presentation/root/logic.dart';
import 'package:rasadyar_inspection/presentation/root/view.dart';
import 'package:rasadyar_inspection/presentation/routes/app_routes.dart';
import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart';
sealed class InspectionPages {
InspectionPages._();
static final pages = [
GetPage(
name: InspectionRoutes.inspection,
name: InspectionRoutes.init,
page: () => RootPage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.put(RootLogic());
Get.put(InspectorFilterLogic());
Get.lazyPut(()=>InspectionMapLogic());
Get.lazyPut(()=>BaseLogic());
Get.lazyPut(() => LocationDetailsLogic(), fenix: true);
Get.lazyPut(() => ActionLogic(), fenix: true);
Get.lazyPut(() => ProfileLogic(), fenix: true);

View File

@@ -1,10 +1,10 @@
sealed class InspectionRoutes {
InspectionRoutes._();
static const inspection = '/supervision';
static const inspectionAction = '$inspection/action';
static const inspectionUserProfile = '$inspection/userSettings';
static const inspectionLocationDetails = '$inspection/locationDetails';
static const init = '/supervision';
static const inspectionAction = '$init/action';
static const inspectionUserProfile = '$init/userSettings';
static const inspectionLocationDetails = '$init/locationDetails';
static const inspectionAddSupervision = '$inspectionLocationDetails/addSupervision';
static const inspectionAddMobileInspector = '$inspectionLocationDetails/addMobileInspector';
static const inspectionRegistrationOfViolation = '$inspectionAddSupervision/RegistrationOfViolation';

View File

@@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart';
RAppBar inspectionAppBar({
bool hasBack = true,
bool hasFilter = true,
bool hasSearch = true,
bool isBase = false,
VoidCallback? onBackPressed,
GestureTapCallback? onFilterTap,
GestureTapCallback? onSearchTap,
}) {
return RAppBar(
hasBack: isBase == true ? false : hasBack,
onBackPressed: onBackPressed,
leadingWidth: 155,
leading: Row(
mainAxisSize: MainAxisSize.min,
spacing: 6,
children: [
Text('رصدبان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)),
Assets.vec.appBarInspectionSvg.svg(width: 24, height: 24),
],
),
additionalActions: [
if (!isBase && hasSearch) searchWidget(onSearchTap),
SizedBox(width: 8),
if (!isBase && hasFilter) filterWidget(onFilterTap),
SizedBox(width: 8),
],
);
}
GestureDetector filterWidget(GestureTapCallback? onFilterTap) {
return GestureDetector(
onTap: onFilterTap,
child: Stack(
alignment: Alignment.topRight,
children: [
Assets.vec.filterOutlineSvg.svg(
width: 20,
height: 20,
colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
Obx(() {
final controller = Get.find<BaseLogic>();
return Visibility(
visible: controller.isFilterSelected.value,
child: Container(
width: 8,
height: 8,
decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle),
),
);
}),
],
),
);
}
GestureDetector searchWidget(GestureTapCallback? onSearchTap) {
return GestureDetector(
onTap: onSearchTap,
child: Stack(
alignment: Alignment.topRight,
children: [
Assets.vec.searchSvg.svg(
width: 24,
height: 24,
colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
Obx(() {
final controller = Get.find<BaseLogic>();
return Visibility(
visible: controller.searchValue.value != null,
child: Container(
width: 8,
height: 8,
decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle),
),
);
}),
],
),
);
}

View File

@@ -0,0 +1,23 @@
import 'package:rasadyar_core/core.dart';
class BaseLogic extends GetxController {
final RxBool isFilterSelected = false.obs;
final RxBool isSearchSelected = false.obs;
final RxnString searchValue = RxnString();
void setSearchCallback(void Function(String)? onSearchChanged) {
debounce<String?>(searchValue, (val) {
if (val != null && val.trim().isNotEmpty) {
onSearchChanged?.call(val);
}
}, time: const Duration(milliseconds: 600));
}
void toggleFilter() {
isFilterSelected.value = !isFilterSelected.value;
}
void toggleSearch() {
isSearchSelected.value = !isSearchSelected.value;
}
}

View File

@@ -0,0 +1,146 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/presentation/widget/app_bar/i_app_bar.dart';
import 'package:rasadyar_inspection/presentation/widget/search.dart';
import 'logic.dart';
class BasePage extends StatefulWidget {
const BasePage({
super.key,
this.routes,
required this.widgets,
this.routesWidget,
this.floatingActionButtonLocation,
this.floatingActionButton,
this.onSearchChanged,
this.hasBack = true,
this.hasFilter = true,
this.hasSearch = true,
this.isBase = false,
this.defaultSearch = true,
this.onBackPressed,
this.onFilterTap,
this.onSearchTap,
this.filteringWidget,
});
final List<String>? routes;
final Widget? routesWidget;
final bool defaultSearch;
final List<Widget> widgets;
final FloatingActionButtonLocation? floatingActionButtonLocation;
final Widget? floatingActionButton;
final Widget? filteringWidget;
final void Function(String?)? onSearchChanged;
final bool hasBack;
final bool hasFilter;
final bool hasSearch;
final bool isBase;
final VoidCallback? onBackPressed;
final GestureTapCallback? onFilterTap;
final GestureTapCallback? onSearchTap;
@override
State<BasePage> createState() => _BasePageState();
}
class _BasePageState extends State<BasePage> {
BaseLogic get controller => Get.find<BaseLogic>();
Worker? filterWorker;
bool _isBottomSheetOpen = false;
@override
void initState() {
super.initState();
/* filterWorker = ever(controller.isFilterSelected, (bool isSelected) {
if (!mounted) return;
if (isSelected && widget.filteringWidget != null) {
// بررسی اینکه آیا bottomSheet از قبل باز است یا نه
if (_isBottomSheetOpen) {
controller.isFilterSelected.value = false;
return;
}
// بررسی اینکه آیا route فعلی current است یا نه
if (ModalRoute.of(context)?.isCurrent != true) {
controller.isFilterSelected.value = false;
return;
}
_isBottomSheetOpen = true;
Get.bottomSheet(
widget.filteringWidget!,
isScrollControlled: true,
isDismissible: true,
enableDrag: true,
).then((_) {
// تنظیم مقدار به false بعد از بسته شدن bottomSheet
if (mounted) {
_isBottomSheetOpen = false;
controller.isFilterSelected.value = false;
}
});
}
});*/
}
@override
void dispose() {
filterWorker?.dispose();
super.dispose();
}
void _onFilterTap() {
if (widget.hasFilter && widget.filteringWidget != null) {
final currentRoute = ModalRoute.of(context);
if (currentRoute?.isCurrent != true) {
return;
}
Get.bottomSheet(
widget.filteringWidget!,
isScrollControlled: true,
isDismissible: true,
enableDrag: true,
);
}
}
@override
Widget build(BuildContext context) {
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) => widget.onBackPressed,
child: Scaffold(
backgroundColor: AppColor.bgLight,
appBar: inspectionAppBar(
hasBack: widget.isBase ? false : widget.hasBack,
onBackPressed: widget.onBackPressed,
hasFilter: widget.hasFilter,
hasSearch: widget.hasSearch,
isBase: widget.isBase,
onFilterTap: widget.hasFilter ? _onFilterTap : null,
onSearchTap: widget.hasSearch ? () => controller.toggleSearch() : null,
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!),
if (!widget.isBase && widget.hasSearch && widget.defaultSearch) ...{
SearchWidget(onSearchChanged: widget.onSearchChanged),
},
...widget.widgets,
],
),
floatingActionButtonLocation:
widget.floatingActionButtonLocation ?? FloatingActionButtonLocation.startFloat,
floatingActionButton: widget.floatingActionButton,
),
);
}
}

View File

@@ -0,0 +1,81 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart';
class SearchWidget extends StatefulWidget {
const SearchWidget({super.key, this.onSearchChanged});
final void Function(String?)? onSearchChanged;
@override
State<SearchWidget> createState() => _SearchWidgetState();
}
class _SearchWidgetState extends State<SearchWidget> {
late final BaseLogic controller;
final TextEditingController textEditingController = TextEditingController();
@override
void initState() {
super.initState();
controller = Get.find<BaseLogic>();
controller.setSearchCallback(widget.onSearchChanged);
}
@override
Widget build(BuildContext context) {
return ObxValue((data) {
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
height: data.value ? 40 : 0,
child: Visibility(
visible: data.value,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: RTextField(
height: 40,
borderColor: AppColor.blackLight,
suffixIcon: ObxValue(
(data) => Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: (data.value == null)
? Assets.vec.searchSvg.svg(
width: 10,
height: 10,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
)
: IconButton(
onPressed: () {
textEditingController.clear();
controller.searchValue.value = null;
controller.isSearchSelected.value = false;
widget.onSearchChanged?.call(null);
},
enableFeedback: true,
padding: EdgeInsets.zero,
iconSize: 24,
splashRadius: 50,
icon: Assets.vec.closeCircleSvg.svg(
width: 20,
height: 20,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
),
controller.searchValue,
),
hintText: 'جستجو کنید ...',
hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal),
filledColor: Colors.white,
filled: true,
controller: textEditingController,
onChanged: (val) => controller.searchValue.value = val,
),
),
),
);
}, controller.isSearchSelected);
}
}

View File

@@ -5,18 +5,26 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f
sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
url: "https://pub.dev"
source: hosted
version: "82.0.0"
version: "85.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0"
sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
url: "https://pub.dev"
source: hosted
version: "7.4.5"
version: "7.7.1"
android_intent_plus:
dependency: transitive
description:
name: android_intent_plus
sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3
url: "https://pub.dev"
source: hosted
version: "5.3.0"
archive:
dependency: transitive
description:
@@ -37,10 +45,10 @@ packages:
dependency: transitive
description:
name: asn1lib
sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623"
sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024"
url: "https://pub.dev"
source: hosted
version: "1.6.4"
version: "1.6.5"
async:
dependency: transitive
description:
@@ -49,14 +57,78 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.13.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
build:
dependency: transitive
description:
name: build
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
sha256: "7d95cbbb1526ab5ae977df9b4cc660963b9b27f6d1075c0b34653868911385e4"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "3.0.0"
build_config:
dependency: transitive
description:
name: build_config
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
build_daemon:
dependency: transitive
description:
name: build_daemon
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
url: "https://pub.dev"
source: hosted
version: "4.0.4"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "38c9c339333a09b090a638849a4c56e70a404c6bdd3b511493addfbc113b60c2"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
build_runner:
dependency: transitive
description:
name: build_runner
sha256: b971d4a1c789eba7be3e6fe6ce5e5b50fd3719e3cb485b3fad6d04358304351d
url: "https://pub.dev"
source: hosted
version: "2.6.0"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: c04e612ca801cd0928ccdb891c263a2b1391cb27940a5ea5afcf9ba894de5d62
url: "https://pub.dev"
source: hosted
version: "9.2.0"
built_collection:
dependency: transitive
description:
name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
sha256: "0b1b12a0a549605e5f04476031cd0bc91ead1d7c8e830773a18ee54179b3cb62"
url: "https://pub.dev"
source: hosted
version: "8.11.0"
characters:
dependency: transitive
description:
@@ -65,6 +137,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.0"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
url: "https://pub.dev"
source: hosted
version: "2.0.4"
clock:
dependency: transitive
description:
@@ -73,6 +153,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.2"
code_builder:
dependency: transitive
description:
name: code_builder
sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
url: "https://pub.dev"
source: hosted
version: "4.10.1"
collection:
dependency: transitive
description:
@@ -97,6 +185,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.2"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
crypto:
dependency: transitive
description:
@@ -121,14 +217,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
dart_polylabel2:
dependency: transitive
description:
name: dart_polylabel2
sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af"
sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.1.1"
dartx:
dependency: transitive
description:
@@ -137,6 +241,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
dbus:
dependency: transitive
description:
name: dbus
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
url: "https://pub.dev"
source: hosted
version: "0.7.11"
device_info_plus:
dependency: transitive
description:
name: device_info_plus
sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a"
url: "https://pub.dev"
source: hosted
version: "11.5.0"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
url: "https://pub.dev"
source: hosted
version: "7.0.3"
dio:
dependency: transitive
description:
@@ -177,6 +305,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.1"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711"
url: "https://pub.dev"
source: hosted
version: "0.9.4+3"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
url: "https://pub.dev"
source: hosted
version: "2.6.2"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
url: "https://pub.dev"
source: hosted
version: "0.9.3+4"
fixnum:
dependency: transitive
description:
@@ -194,18 +354,18 @@ packages:
dependency: transitive
description:
name: flutter_gen_core
sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc"
sha256: eda54fdc5de08e7eeea663eb8442aafc8660b5a13fda4e0c9e572c64e50195fb
url: "https://pub.dev"
source: hosted
version: "5.10.0"
version: "5.11.0"
flutter_gen_runner:
dependency: transitive
description:
name: flutter_gen_runner
sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9
sha256: "669bf8b7a9b4acbdcb7fcc5e12bf638aca19acedf43341714cbca3bf3a219521"
url: "https://pub.dev"
source: hosted
version: "5.10.0"
version: "5.11.0"
flutter_localizations:
dependency: transitive
description: flutter
@@ -215,10 +375,10 @@ packages:
dependency: transitive
description:
name: flutter_map
sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a
sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5
url: "https://pub.dev"
source: hosted
version: "8.1.1"
version: "8.2.1"
flutter_map_animations:
dependency: transitive
description:
@@ -227,6 +387,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.9.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e
url: "https://pub.dev"
source: hosted
version: "2.0.28"
flutter_rating_bar:
dependency: transitive
description:
@@ -235,6 +403,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.1"
flutter_screenutil:
dependency: transitive
description:
name: flutter_screenutil
sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de"
url: "https://pub.dev"
source: hosted
version: "5.9.3"
flutter_secure_storage:
dependency: transitive
description:
@@ -295,10 +471,10 @@ packages:
dependency: transitive
description:
name: flutter_svg
sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1
sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.2.0"
flutter_web_plugins:
dependency: transitive
description: flutter
@@ -316,26 +492,42 @@ packages:
dependency: transitive
description:
name: freezed_annotation
sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b
sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
version: "3.1.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev"
source: hosted
version: "4.0.0"
geoclue:
dependency: transitive
description:
name: geoclue
sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f
url: "https://pub.dev"
source: hosted
version: "0.1.1"
geolocator:
dependency: transitive
description:
name: geolocator
sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc
sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516"
url: "https://pub.dev"
source: hosted
version: "14.0.1"
version: "14.0.2"
geolocator_android:
dependency: transitive
description:
name: geolocator_android
sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4"
sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a"
url: "https://pub.dev"
source: hosted
version: "5.0.1+1"
version: "5.0.2"
geolocator_apple:
dependency: transitive
description:
@@ -344,6 +536,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.13"
geolocator_linux:
dependency: transitive
description:
name: geolocator_linux
sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3
url: "https://pub.dev"
source: hosted
version: "0.2.3"
geolocator_platform_interface:
dependency: transitive
description:
@@ -392,6 +592,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.3"
graphs:
dependency: transitive
description:
name: graphs
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
gsettings:
dependency: transitive
description:
name: gsettings
sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c"
url: "https://pub.dev"
source: hosted
version: "0.2.8"
hashcodes:
dependency: transitive
description:
@@ -420,10 +636,18 @@ packages:
dependency: transitive
description:
name: http
sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b"
sha256: "85ab0074f9bf2b24625906d8382bbec84d3d6919d285ba9c106b07b65791fb99"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.5.0-beta.2"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
url: "https://pub.dev"
source: hosted
version: "3.2.2"
http_parser:
dependency: transitive
description:
@@ -432,6 +656,78 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.1.2"
image:
dependency: transitive
description:
name: image
sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928"
url: "https://pub.dev"
source: hosted
version: "4.5.4"
image_picker:
dependency: transitive
description:
name: image_picker
sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "6fae381e6af2bbe0365a5e4ce1db3959462fa0c4d234facf070746024bb80c8d"
url: "https://pub.dev"
source: hosted
version: "0.8.12+24"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
url: "https://pub.dev"
source: hosted
version: "0.8.12+2"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
url: "https://pub.dev"
source: hosted
version: "2.10.1"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
image_size_getter:
dependency: transitive
description:
@@ -448,6 +744,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.20.2"
io:
dependency: transitive
description:
name: io
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
url: "https://pub.dev"
source: hosted
version: "1.0.5"
isolate_channel:
dependency: transitive
description:
@@ -492,10 +796,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c"
url: "https://pub.dev"
source: hosted
version: "2.5.0"
version: "2.6.1"
logging:
dependency: transitive
description:
@@ -504,6 +808,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.0"
lottie:
dependency: transitive
description:
name: lottie
sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
url: "https://pub.dev"
source: hosted
version: "3.3.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
@@ -544,6 +864,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
package_info_plus:
dependency: transitive
description:
name: package_info_plus
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
url: "https://pub.dev"
source: hosted
version: "8.3.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
path:
dependency: transitive
description:
@@ -612,10 +948,10 @@ packages:
dependency: transitive
description:
name: permission_handler
sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f"
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
url: "https://pub.dev"
source: hosted
version: "12.0.0+1"
version: "12.0.1"
permission_handler_android:
dependency: transitive
description:
@@ -696,22 +1032,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.9.1"
polylabel:
pool:
dependency: transitive
description:
name: polylabel
sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
version: "1.5.1"
posix:
dependency: transitive
description:
name: posix
sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
url: "https://pub.dev"
source: hosted
version: "6.0.2"
version: "6.0.3"
pretty_dio_logger:
dependency: transitive
description:
@@ -736,20 +1072,28 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev"
source: hosted
version: "1.5.0"
rasadyar_auth:
dependency: "direct main"
description:
path: "../auth"
relative: true
source: path
version: "0.0.1"
version: "1.0.3"
rasadyar_core:
dependency: "direct main"
description:
path: "../core"
relative: true
source: path
version: "1.0.0+1"
version: "1.2.0+2"
rxdart:
dependency: transitive
description:
@@ -762,10 +1106,34 @@ packages:
dependency: transitive
description:
name: shamsi_date
sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51
sha256: "0383fddc9bce91e9e08de0c909faf93c3ab3a0e532abd271fb0dcf5d0617487b"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.1.1"
shelf:
dependency: transitive
description:
name: shelf
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.dev"
source: hosted
version: "1.4.2"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
shimmer:
dependency: transitive
description:
name: shimmer
sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
sky_engine:
dependency: transitive
description: flutter
@@ -787,6 +1155,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
stream_transform:
dependency: transitive
description:
name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev"
source: hosted
version: "2.1.1"
string_scanner:
dependency: transitive
description:
@@ -803,6 +1195,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
source: hosted
version: "0.7.7"
time:
dependency: transitive
description:
@@ -811,6 +1211,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.5"
timing:
dependency: transitive
description:
name: timing
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
typed_data:
dependency: transitive
description:
@@ -839,10 +1247,10 @@ packages:
dependency: transitive
description:
name: vector_graphics
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6
url: "https://pub.dev"
source: hosted
version: "1.1.18"
version: "1.1.19"
vector_graphics_codec:
dependency: transitive
description:
@@ -871,10 +1279,10 @@ packages:
dependency: transitive
description:
name: watcher
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
web:
dependency: transitive
description:
@@ -883,14 +1291,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.1"
web_socket:
dependency: transitive
description:
name: web_socket
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.dev"
source: hosted
version: "3.0.3"
win32:
dependency: transitive
description:
name: win32
sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba"
sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03"
url: "https://pub.dev"
source: hosted
version: "5.13.0"
version: "5.14.0"
win32_registry:
dependency: transitive
description:
name: win32_registry
sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
wkt_parser:
dependency: transitive
description:
@@ -925,4 +1357,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.8.1 <4.0.0"
flutter: ">=3.27.0"
flutter: ">=3.29.0"

View File

@@ -1,7 +1,7 @@
name: rasadyar_inspection
description: "inspection module for rasadyar"
publish_to: 'none'
version: 1.0.1
version: 1.2.0
environment:
sdk: ^3.8.1