diff --git a/.gitignore b/.gitignore
index 79c113f..3e463e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ migrate_working_dir/
*.iml
*.ipr
*.iws
+*.lock
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..ef3b4ee
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,28 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "rasadyar_app",
+ "request": "launch",
+ "type": "dart",
+ "program": "lib/main.dart",
+ },
+ {
+ "name": "rasadyar_app (profile mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "profile",
+ "program": "lib/main.dart",
+ },
+ {
+ "name": "rasadyar_app (release mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "release",
+ "program": "lib/main.dart",
+ }
+ ]
+}
\ No newline at end of file
diff --git a/android/.gitignore b/android/.gitignore
index be3943c..7bb85ee 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -3,12 +3,12 @@ gradle-wrapper.jar
/captures/
/gradlew
/gradlew.bat
-/local.properties
+/app/local.properties
GeneratedPluginRegistrant.java
.cxx/
# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
-key.properties
+app/key.properties
**/*.keystore
**/*.jks
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index 50bea74..d2212b6 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -1,13 +1,25 @@
+import org.gradle.kotlin.dsl.release
+import java.io.FileInputStream
+import java.util.Properties
+
plugins {
id("com.android.application")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
}
+val keystoreProperties = Properties()
+val keystorePropertiesFile = rootProject.file("key.properties")
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(FileInputStream(keystorePropertiesFile))
+}else{
+ println("key.properties not found")
+}
+
android {
namespace = "ir.mnpc.rasadyar"
compileSdk = flutter.compileSdkVersion
- ndkVersion = "27.0.12077973"
+ ndkVersion = "28.2.13676358"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_21
@@ -31,9 +43,30 @@ android {
excludes += "META-INF/DEPENDENCIES"
}
}
-
+ signingConfigs {
+ create("release") {
+ keyAlias = keystoreProperties["keyAlias"] as String?
+ keyPassword = keystoreProperties["keyPassword"] as String?
+ storeFile = keystoreProperties["storeFile"]?.let { file(it as String) }
+ storePassword = keystoreProperties["storePassword"] as String?
+ }
+ }
+/* buildTypes {
+ release {
+ signingConfig = signingConfigs.getByName("debug")
+ }
+ }*/
buildTypes {
release {
+ signingConfig = signingConfigs.getByName("release")
+ isMinifyEnabled = true
+ isShrinkResources = true
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ debug {
signingConfig = signingConfigs.getByName("debug")
}
}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 0000000..37e7234
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,8 @@
+# Suppress warnings for OkHttp classes
+-dontwarn okhttp3.Call
+-dontwarn okhttp3.Dispatcher
+-dontwarn okhttp3.OkHttpClient
+-dontwarn okhttp3.Request$Builder
+-dontwarn okhttp3.Request
+-dontwarn okhttp3.Response
+-dontwarn okhttp3.ResponseBody
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 96504e7..fbb47e0 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,63 +1,70 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ android:name="android.permission.READ_EXTERNAL_STORAGE"
+ android:maxSdkVersion="32"/>
+ android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+ android:maxSdkVersion="28"/>
+
+
+ android:largeHeap="true"
+ android:name="${applicationName}"
+ android:icon="@mipmap/launcher_icon"
+ android:label="رصــدیـار">
+ android:name=".MainActivity"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+ android:enableOnBackInvokedCallback="true"
+ android:exported="true"
+ android:hardwareAccelerated="true"
+ android:launchMode="singleTop"
+ android:requestLegacyExternalStorage="true"
+ android:taskAffinity=""
+ android:theme="@style/LaunchTheme"
+ android:windowSoftInputMode="adjustResize">
+ android:name="io.flutter.embedding.android.NormalTheme"
+ android:resource="@style/NormalTheme"/>
-
-
+
+
+
+
+
+ android:name="flutterEmbedding"
+ android:value="2"/>
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.fileprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths"/>
-
-
+
+
diff --git a/android/app/src/main/res/values-v35/styles.xml b/android/app/src/main/res/values-v35/styles.xml
new file mode 100644
index 0000000..20a1934
--- /dev/null
+++ b/android/app/src/main/res/values-v35/styles.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
new file mode 100644
index 0000000..06c5b2f
--- /dev/null
+++ b/android/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index afa1e8e..ac3b479 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
diff --git a/android/key.properties b/android/key.properties
new file mode 100644
index 0000000..2f417d4
--- /dev/null
+++ b/android/key.properties
@@ -0,0 +1,4 @@
+storePassword=yxSLrMwu65
+keyPassword=yxSLrMwu65
+keyAlias=key0
+storeFile=my_key.jks
\ No newline at end of file
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 0000000..018d846
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,5 @@
+sdk.dir=C:\\Users\\Housh11\\AppData\\Local\\Android\\sdk
+flutter.sdk=C:\\src\\flutter
+flutter.buildMode=release
+flutter.versionName=1.3.34
+flutter.versionCode=31
\ No newline at end of file
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
index a0fa520..43394ed 100644
--- a/android/settings.gradle.kts
+++ b/android/settings.gradle.kts
@@ -18,8 +18,8 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
- id("com.android.application") version "8.7.0" apply false
- id("org.jetbrains.kotlin.android") version "1.9.25" apply false
+ id("com.android.application") version "8.9.1" apply false
+ id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}
include(":app")
diff --git a/assets/icons/3d_cube_square.svg b/assets/icons/3d_cube_square.svg
deleted file mode 100644
index 4eb620a..0000000
--- a/assets/icons/3d_cube_square.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/assets/icons/active_fram.svg b/assets/icons/active_fram.svg
new file mode 100644
index 0000000..6ce9f47
--- /dev/null
+++ b/assets/icons/active_fram.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/box_remove.svg b/assets/icons/box_remove.svg
new file mode 100644
index 0000000..aa51b38
--- /dev/null
+++ b/assets/icons/box_remove.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/box_tick.svg b/assets/icons/box_tick.svg
new file mode 100644
index 0000000..887a08d
--- /dev/null
+++ b/assets/icons/box_tick.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/buy_out_province.svg b/assets/icons/buy_out_province.svg
new file mode 100644
index 0000000..8029c43
--- /dev/null
+++ b/assets/icons/buy_out_province.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/calendar_tick.svg b/assets/icons/calendar_tick.svg
new file mode 100644
index 0000000..ba30919
--- /dev/null
+++ b/assets/icons/calendar_tick.svg
@@ -0,0 +1,20 @@
+
diff --git a/assets/icons/car_allocation.svg b/assets/icons/car_allocation.svg
new file mode 100644
index 0000000..22b4a5c
--- /dev/null
+++ b/assets/icons/car_allocation.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/chicken2.svg b/assets/icons/chicken2.svg
new file mode 100644
index 0000000..65b5ea4
--- /dev/null
+++ b/assets/icons/chicken2.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/chicken_house.svg b/assets/icons/chicken_house.svg
new file mode 100644
index 0000000..a662966
--- /dev/null
+++ b/assets/icons/chicken_house.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/chicken_inspection.svg b/assets/icons/chicken_inspection.svg
new file mode 100644
index 0000000..4807d12
--- /dev/null
+++ b/assets/icons/chicken_inspection.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/chicken_pattern.svg b/assets/icons/chicken_pattern.svg
new file mode 100644
index 0000000..5392fa4
--- /dev/null
+++ b/assets/icons/chicken_pattern.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/close_square_filled.svg b/assets/icons/close_square_filled.svg
new file mode 100644
index 0000000..b4a4de1
--- /dev/null
+++ b/assets/icons/close_square_filled.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/cube_card_free.svg b/assets/icons/cube_card_free.svg
new file mode 100644
index 0000000..abbff61
--- /dev/null
+++ b/assets/icons/cube_card_free.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/cube_card_goverment.svg b/assets/icons/cube_card_goverment.svg
new file mode 100644
index 0000000..659ef52
--- /dev/null
+++ b/assets/icons/cube_card_goverment.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/cube_scan.svg b/assets/icons/cube_scan.svg
index 5d088f4..c8f72fe 100644
--- a/assets/icons/cube_scan.svg
+++ b/assets/icons/cube_scan.svg
@@ -1,8 +1,13 @@
diff --git a/assets/icons/cube_scan_with_label.svg b/assets/icons/cube_scan_with_label.svg
new file mode 100644
index 0000000..5d088f4
--- /dev/null
+++ b/assets/icons/cube_scan_with_label.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/direct_purchase.svg b/assets/icons/direct_purchase.svg
new file mode 100644
index 0000000..1c0c12d
--- /dev/null
+++ b/assets/icons/direct_purchase.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg
index 9d67b54..d39e1d0 100644
--- a/assets/icons/empty.svg
+++ b/assets/icons/empty.svg
@@ -1,55 +1,55 @@
diff --git a/assets/icons/enter_cargo_information.svg b/assets/icons/enter_cargo_information.svg
new file mode 100644
index 0000000..ac3243a
--- /dev/null
+++ b/assets/icons/enter_cargo_information.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/farm.svg b/assets/icons/farm.svg
new file mode 100644
index 0000000..97e350d
--- /dev/null
+++ b/assets/icons/farm.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/icons/farms.svg b/assets/icons/farms.svg
new file mode 100644
index 0000000..0c98468
--- /dev/null
+++ b/assets/icons/farms.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/icons/gallery_add.svg b/assets/icons/gallery_add.svg
new file mode 100644
index 0000000..adb97ee
--- /dev/null
+++ b/assets/icons/gallery_add.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/hashtag.svg b/assets/icons/hashtag.svg
new file mode 100644
index 0000000..f39493a
--- /dev/null
+++ b/assets/icons/hashtag.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/home_hashtag.svg b/assets/icons/home_hashtag.svg
new file mode 100644
index 0000000..7d6fe0e
--- /dev/null
+++ b/assets/icons/home_hashtag.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/home_trend_down.svg b/assets/icons/home_trend_down.svg
new file mode 100644
index 0000000..c397903
--- /dev/null
+++ b/assets/icons/home_trend_down.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/home_trend_up.svg b/assets/icons/home_trend_up.svg
new file mode 100644
index 0000000..0c78276
--- /dev/null
+++ b/assets/icons/home_trend_up.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/management_bars.svg b/assets/icons/management_bars.svg
new file mode 100644
index 0000000..a2a722e
--- /dev/null
+++ b/assets/icons/management_bars.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/map_1.svg b/assets/icons/map_1.svg
new file mode 100644
index 0000000..612dd26
--- /dev/null
+++ b/assets/icons/map_1.svg
@@ -0,0 +1,29 @@
+
diff --git a/assets/icons/map_2.svg b/assets/icons/map_2.svg
new file mode 100644
index 0000000..3740a20
--- /dev/null
+++ b/assets/icons/map_2.svg
@@ -0,0 +1,42 @@
+
diff --git a/assets/icons/note_remove.svg b/assets/icons/note_remove.svg
new file mode 100644
index 0000000..37e2ecc
--- /dev/null
+++ b/assets/icons/note_remove.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/orders_received.svg b/assets/icons/orders_received.svg
new file mode 100644
index 0000000..0088fd8
--- /dev/null
+++ b/assets/icons/orders_received.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/rasad_ban.svg b/assets/icons/rasad_ban.svg
new file mode 100644
index 0000000..fd781ec
--- /dev/null
+++ b/assets/icons/rasad_ban.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/rasad_bar.svg b/assets/icons/rasad_bar.svg
new file mode 100644
index 0000000..bc0a060
--- /dev/null
+++ b/assets/icons/rasad_bar.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/rasad_bot.svg b/assets/icons/rasad_bot.svg
new file mode 100644
index 0000000..19f27a2
--- /dev/null
+++ b/assets/icons/rasad_bot.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/rasad_dam.svg b/assets/icons/rasad_dam.svg
new file mode 100644
index 0000000..cf84209
--- /dev/null
+++ b/assets/icons/rasad_dam.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/rasad_nan.svg b/assets/icons/rasad_nan.svg
new file mode 100644
index 0000000..6fd8c7f
--- /dev/null
+++ b/assets/icons/rasad_nan.svg
@@ -0,0 +1,507 @@
+
diff --git a/assets/icons/rasad_toyor.svg b/assets/icons/rasad_toyor.svg
new file mode 100644
index 0000000..d98e848
--- /dev/null
+++ b/assets/icons/rasad_toyor.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/registerKill.svg b/assets/icons/registerKill.svg
new file mode 100644
index 0000000..deb6c49
--- /dev/null
+++ b/assets/icons/registerKill.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/sale_out_province.svg b/assets/icons/sale_out_province.svg
new file mode 100644
index 0000000..742f5b7
--- /dev/null
+++ b/assets/icons/sale_out_province.svg
@@ -0,0 +1,26 @@
+
diff --git a/assets/icons/submit_request.svg b/assets/icons/submit_request.svg
new file mode 100644
index 0000000..8adf75c
--- /dev/null
+++ b/assets/icons/submit_request.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/warehouse_distribution.svg b/assets/icons/warehouse_distribution.svg
new file mode 100644
index 0000000..b06ba65
--- /dev/null
+++ b/assets/icons/warehouse_distribution.svg
@@ -0,0 +1,25 @@
+
diff --git a/assets/images/pattern_chicken.webp b/assets/images/pattern_chicken.webp
new file mode 100644
index 0000000..d6f8257
Binary files /dev/null and b/assets/images/pattern_chicken.webp differ
diff --git a/assets/images/select_role.webp b/assets/images/select_role.webp
new file mode 100644
index 0000000..8f84f4f
Binary files /dev/null and b/assets/images/select_role.webp differ
diff --git a/assets/vec/3d_cube_square.svg.vec b/assets/vec/3d_cube_square.svg.vec
deleted file mode 100644
index a5b5704..0000000
Binary files a/assets/vec/3d_cube_square.svg.vec and /dev/null differ
diff --git a/assets/vec/active_fram.svg.vec b/assets/vec/active_fram.svg.vec
new file mode 100644
index 0000000..d420f34
Binary files /dev/null and b/assets/vec/active_fram.svg.vec differ
diff --git a/assets/vec/box_remove.svg.vec b/assets/vec/box_remove.svg.vec
new file mode 100644
index 0000000..d70cda0
Binary files /dev/null and b/assets/vec/box_remove.svg.vec differ
diff --git a/assets/vec/box_tick.svg.vec b/assets/vec/box_tick.svg.vec
new file mode 100644
index 0000000..d79de28
Binary files /dev/null and b/assets/vec/box_tick.svg.vec differ
diff --git a/assets/vec/buy_out_province.svg.vec b/assets/vec/buy_out_province.svg.vec
new file mode 100644
index 0000000..86930de
Binary files /dev/null and b/assets/vec/buy_out_province.svg.vec differ
diff --git a/assets/vec/calendar_tick.svg.vec b/assets/vec/calendar_tick.svg.vec
new file mode 100644
index 0000000..34ca6df
Binary files /dev/null and b/assets/vec/calendar_tick.svg.vec differ
diff --git a/assets/vec/car_allocation.svg.vec b/assets/vec/car_allocation.svg.vec
new file mode 100644
index 0000000..9beb3dc
Binary files /dev/null and b/assets/vec/car_allocation.svg.vec differ
diff --git a/assets/vec/chicken2.svg.vec b/assets/vec/chicken2.svg.vec
new file mode 100644
index 0000000..71a160a
Binary files /dev/null and b/assets/vec/chicken2.svg.vec differ
diff --git a/assets/vec/chicken_house.svg.vec b/assets/vec/chicken_house.svg.vec
new file mode 100644
index 0000000..803b5ef
Binary files /dev/null and b/assets/vec/chicken_house.svg.vec differ
diff --git a/assets/vec/chicken_inspection.svg.vec b/assets/vec/chicken_inspection.svg.vec
new file mode 100644
index 0000000..c52f8d2
Binary files /dev/null and b/assets/vec/chicken_inspection.svg.vec differ
diff --git a/assets/vec/chicken_pattern.svg.vec b/assets/vec/chicken_pattern.svg.vec
new file mode 100644
index 0000000..45ae488
Binary files /dev/null and b/assets/vec/chicken_pattern.svg.vec differ
diff --git a/assets/vec/close_square_filled.svg.vec b/assets/vec/close_square_filled.svg.vec
new file mode 100644
index 0000000..490075c
Binary files /dev/null and b/assets/vec/close_square_filled.svg.vec differ
diff --git a/assets/vec/cube_card_free.svg.vec b/assets/vec/cube_card_free.svg.vec
new file mode 100644
index 0000000..d633908
Binary files /dev/null and b/assets/vec/cube_card_free.svg.vec differ
diff --git a/assets/vec/cube_card_goverment.svg.vec b/assets/vec/cube_card_goverment.svg.vec
new file mode 100644
index 0000000..202cb6b
Binary files /dev/null and b/assets/vec/cube_card_goverment.svg.vec differ
diff --git a/assets/vec/cube_scan.svg.vec b/assets/vec/cube_scan.svg.vec
index 4c5c41d..c45b62f 100644
Binary files a/assets/vec/cube_scan.svg.vec and b/assets/vec/cube_scan.svg.vec differ
diff --git a/assets/vec/cube_scan_with_label.svg.vec b/assets/vec/cube_scan_with_label.svg.vec
new file mode 100644
index 0000000..4c5c41d
Binary files /dev/null and b/assets/vec/cube_scan_with_label.svg.vec differ
diff --git a/assets/vec/direct_purchase.svg.vec b/assets/vec/direct_purchase.svg.vec
new file mode 100644
index 0000000..ca44046
Binary files /dev/null and b/assets/vec/direct_purchase.svg.vec differ
diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec
index b60778f..3ce3d51 100644
Binary files a/assets/vec/empty.svg.vec and b/assets/vec/empty.svg.vec differ
diff --git a/assets/vec/enter_cargo_information.svg.vec b/assets/vec/enter_cargo_information.svg.vec
new file mode 100644
index 0000000..f5b57a5
Binary files /dev/null and b/assets/vec/enter_cargo_information.svg.vec differ
diff --git a/assets/vec/farm.svg.vec b/assets/vec/farm.svg.vec
new file mode 100644
index 0000000..6f178dd
Binary files /dev/null and b/assets/vec/farm.svg.vec differ
diff --git a/assets/vec/farms.svg.vec b/assets/vec/farms.svg.vec
new file mode 100644
index 0000000..b7054c2
Binary files /dev/null and b/assets/vec/farms.svg.vec differ
diff --git a/assets/vec/gallery_add.svg.vec b/assets/vec/gallery_add.svg.vec
new file mode 100644
index 0000000..cf57447
Binary files /dev/null and b/assets/vec/gallery_add.svg.vec differ
diff --git a/assets/vec/hashtag.svg.vec b/assets/vec/hashtag.svg.vec
new file mode 100644
index 0000000..72ac8d5
Binary files /dev/null and b/assets/vec/hashtag.svg.vec differ
diff --git a/assets/vec/home_hashtag.svg.vec b/assets/vec/home_hashtag.svg.vec
new file mode 100644
index 0000000..7d4a181
Binary files /dev/null and b/assets/vec/home_hashtag.svg.vec differ
diff --git a/assets/vec/home_trend_down.svg.vec b/assets/vec/home_trend_down.svg.vec
new file mode 100644
index 0000000..6282fbe
Binary files /dev/null and b/assets/vec/home_trend_down.svg.vec differ
diff --git a/assets/vec/home_trend_up.svg.vec b/assets/vec/home_trend_up.svg.vec
new file mode 100644
index 0000000..d12e2cc
Binary files /dev/null and b/assets/vec/home_trend_up.svg.vec differ
diff --git a/assets/vec/management_bars.svg.vec b/assets/vec/management_bars.svg.vec
new file mode 100644
index 0000000..11f72ad
Binary files /dev/null and b/assets/vec/management_bars.svg.vec differ
diff --git a/assets/vec/map_1.svg.vec b/assets/vec/map_1.svg.vec
new file mode 100644
index 0000000..fcd3f8e
Binary files /dev/null and b/assets/vec/map_1.svg.vec differ
diff --git a/assets/vec/map_2.svg.vec b/assets/vec/map_2.svg.vec
new file mode 100644
index 0000000..e1bfc89
Binary files /dev/null and b/assets/vec/map_2.svg.vec differ
diff --git a/assets/vec/note_remove.svg.vec b/assets/vec/note_remove.svg.vec
new file mode 100644
index 0000000..aeeebd0
Binary files /dev/null and b/assets/vec/note_remove.svg.vec differ
diff --git a/assets/vec/orders_received.svg.vec b/assets/vec/orders_received.svg.vec
new file mode 100644
index 0000000..f36169f
Binary files /dev/null and b/assets/vec/orders_received.svg.vec differ
diff --git a/assets/vec/rasad_ban.svg.vec b/assets/vec/rasad_ban.svg.vec
new file mode 100644
index 0000000..53a4631
Binary files /dev/null and b/assets/vec/rasad_ban.svg.vec differ
diff --git a/assets/vec/rasad_bar.svg.vec b/assets/vec/rasad_bar.svg.vec
new file mode 100644
index 0000000..fea5942
Binary files /dev/null and b/assets/vec/rasad_bar.svg.vec differ
diff --git a/assets/vec/rasad_bot.svg.vec b/assets/vec/rasad_bot.svg.vec
new file mode 100644
index 0000000..87222b8
Binary files /dev/null and b/assets/vec/rasad_bot.svg.vec differ
diff --git a/assets/vec/rasad_dam.svg.vec b/assets/vec/rasad_dam.svg.vec
new file mode 100644
index 0000000..d298a1c
Binary files /dev/null and b/assets/vec/rasad_dam.svg.vec differ
diff --git a/assets/vec/rasad_nan.svg.vec b/assets/vec/rasad_nan.svg.vec
new file mode 100644
index 0000000..0452acf
Binary files /dev/null and b/assets/vec/rasad_nan.svg.vec differ
diff --git a/assets/vec/rasad_toyor.svg.vec b/assets/vec/rasad_toyor.svg.vec
new file mode 100644
index 0000000..9bf1f96
Binary files /dev/null and b/assets/vec/rasad_toyor.svg.vec differ
diff --git a/assets/vec/registerKill.svg.vec b/assets/vec/registerKill.svg.vec
new file mode 100644
index 0000000..db8807f
Binary files /dev/null and b/assets/vec/registerKill.svg.vec differ
diff --git a/assets/vec/sale_out_province.svg.vec b/assets/vec/sale_out_province.svg.vec
new file mode 100644
index 0000000..37c37cb
Binary files /dev/null and b/assets/vec/sale_out_province.svg.vec differ
diff --git a/assets/vec/submit_request.svg.vec b/assets/vec/submit_request.svg.vec
new file mode 100644
index 0000000..c662259
Binary files /dev/null and b/assets/vec/submit_request.svg.vec differ
diff --git a/assets/vec/warehouse_distribution.svg.vec b/assets/vec/warehouse_distribution.svg.vec
new file mode 100644
index 0000000..a8e84ac
Binary files /dev/null and b/assets/vec/warehouse_distribution.svg.vec differ
diff --git a/devtools_options.yaml b/devtools_options.yaml
index fa0b357..ff5a421 100644
--- a/devtools_options.yaml
+++ b/devtools_options.yaml
@@ -1,3 +1,4 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
+ - hive_ce: true
\ No newline at end of file
diff --git a/doc/BuildRow.webp b/doc/BuildRow.webp
new file mode 100644
index 0000000..14caac1
Binary files /dev/null and b/doc/BuildRow.webp differ
diff --git a/doc/CoreLoadingIndicator.webp b/doc/CoreLoadingIndicator.webp
new file mode 100644
index 0000000..b9fe1d3
Binary files /dev/null and b/doc/CoreLoadingIndicator.webp differ
diff --git a/doc/EmptyWidget.webp b/doc/EmptyWidget.webp
new file mode 100644
index 0000000..f104722
Binary files /dev/null and b/doc/EmptyWidget.webp differ
diff --git a/doc/LogoWidget.webp b/doc/LogoWidget.webp
new file mode 100644
index 0000000..c8563d6
Binary files /dev/null and b/doc/LogoWidget.webp differ
diff --git a/doc/RErrorWidget.webp b/doc/RErrorWidget.webp
new file mode 100644
index 0000000..571839a
Binary files /dev/null and b/doc/RErrorWidget.webp differ
diff --git a/doc/RSegment.webp b/doc/RSegment.webp
new file mode 100644
index 0000000..0b046e7
Binary files /dev/null and b/doc/RSegment.webp differ
diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart
new file mode 100644
index 0000000..283d43f
--- /dev/null
+++ b/integration_test/app_test.dart
@@ -0,0 +1,75 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:rasadyar_app/main.dart' as app;
+import 'package:rasadyar_core/core.dart';
+
+class MockGService extends Mock implements GService {}
+class MockTokenStorageService extends Mock implements TokenStorageService {}
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ group('App Integration Tests', () {
+ late MockGService mockGService;
+ late MockTokenStorageService mockTokenService;
+
+ setUp(() {
+ mockGService = MockGService();
+ mockTokenService = MockTokenStorageService();
+
+ // Setup mock behaviors
+ when(() => mockGService.init()).thenAnswer((_) async {});
+ when(() => mockGService.isFirstTime()).thenReturn(false);
+ when(() => mockGService.setIsNotFirstTime()).thenAnswer((_) async {});
+ when(() => mockTokenService.init()).thenAnswer((_) async {});
+
+ // Put mocks in GetX
+ Get.put(mockGService);
+ Get.put(mockTokenService);
+ });
+
+ tearDown(() {
+ Get.reset();
+ });
+
+ testWidgets('should navigate through splash to modules page', (WidgetTester tester) async {
+ // Start the app
+ app.main();
+ await tester.pumpAndSettle();
+
+ // Verify splash screen is displayed
+ expect(find.byType(Scaffold), findsOneWidget);
+
+ // Wait for splash screen animations and navigation
+ await tester.pumpAndSettle(const Duration(seconds: 3));
+
+ // Should navigate to modules page or auth page based on authentication state
+ expect(find.byType(Scaffold), findsOneWidget);
+ });
+
+ testWidgets('should display correct app title and theme', (WidgetTester tester) async {
+ // Start the app
+ app.main();
+ await tester.pumpAndSettle();
+
+ // Verify app structure
+ final materialApp = tester.widget(find.byType(GetMaterialApp));
+ expect(materialApp.title, 'رصدیار');
+ expect(materialApp.locale, const Locale("fa", "IR"));
+ });
+
+ testWidgets('should handle navigation between pages', (WidgetTester tester) async {
+ // Start the app
+ app.main();
+ await tester.pumpAndSettle();
+
+ // Wait for initial navigation
+ await tester.pumpAndSettle(const Duration(seconds: 2));
+
+ // Verify that navigation works
+ expect(find.byType(Scaffold), findsOneWidget);
+ });
+ });
+}
diff --git a/integration_test/inspection_module_test.dart b/integration_test/inspection_module_test.dart
new file mode 100644
index 0000000..0ba0c7f
--- /dev/null
+++ b/integration_test/inspection_module_test.dart
@@ -0,0 +1,91 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:rasadyar_inspection/presentation/pages/auth/view.dart';
+import 'package:rasadyar_inspection/presentation/pages/auth/logic.dart';
+import 'package:rasadyar_core/core.dart';
+
+class MockAuthLogic extends GetxController with Mock implements AuthLogic {}
+class MockTokenStorageService extends Mock implements TokenStorageService {}
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ group('Inspection Module Integration Tests', () {
+ late MockAuthLogic mockAuthLogic;
+ late MockTokenStorageService mockTokenService;
+
+ setUp(() {
+ mockAuthLogic = MockAuthLogic();
+ mockTokenService = MockTokenStorageService();
+
+ // Setup mock behaviors
+ mockAuthLogic.textAnimation = AlwaysStoppedAnimation(1.0);
+ mockAuthLogic.isLoading = false.obs;
+ mockAuthLogic.usernameController = TextEditingController().obs;
+ mockAuthLogic.passwordController = TextEditingController().obs;
+
+ Get.put(mockAuthLogic);
+ Get.put(mockTokenService);
+ });
+
+ tearDown(() {
+ Get.reset();
+ });
+
+ testWidgets('should complete authentication flow', (WidgetTester tester) async {
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: AuthPage(),
+ ),
+ );
+
+ // Assert - Verify auth page loads correctly
+ expect(find.text('به سامانه رصدیار خوش آمدید!'), findsOneWidget);
+ expect(find.text('سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی'), findsOneWidget);
+
+ // Test page navigation and UI interactions
+ await tester.pumpAndSettle();
+ expect(find.byType(Scaffold), findsOneWidget);
+ expect(find.byType(FadeTransition), findsOneWidget);
+ });
+
+ testWidgets('should handle back navigation correctly', (WidgetTester tester) async {
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: AuthPage(),
+ ),
+ );
+
+ // Verify PopScope behavior
+ final popScope = tester.widget(find.byType(PopScope));
+ expect(popScope.canPop, false);
+
+ // Test that back button handling works
+ await tester.pump();
+ expect(find.byType(AuthPage), findsOneWidget);
+ });
+
+ testWidgets('should display welcome animation correctly', (WidgetTester tester) async {
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: AuthPage(),
+ ),
+ );
+
+ // Assert - Check animation components
+ expect(find.byType(FadeTransition), findsOneWidget);
+ expect(find.byType(Column), findsOneWidget);
+
+ // Verify text styling
+ final welcomeText = tester.widget(
+ find.text('به سامانه رصدیار خوش آمدید!')
+ );
+ expect(welcomeText.style?.color, Colors.white);
+ });
+ });
+}
diff --git a/integration_test/modules_integration_test.dart b/integration_test/modules_integration_test.dart
new file mode 100644
index 0000000..e433050
--- /dev/null
+++ b/integration_test/modules_integration_test.dart
@@ -0,0 +1,118 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:rasadyar_app/presentation/pages/modules/view.dart';
+import 'package:rasadyar_app/presentation/pages/modules/logic.dart';
+import 'package:rasadyar_core/core.dart';
+
+class MockModulesLogic extends GetxController with Mock implements ModulesLogic {}
+class MockTokenStorageService extends Mock implements TokenStorageService {}
+class MockSliderLogic extends GetxController with Mock implements SliderLogic {}
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ group('Modules Page Integration Tests', () {
+ late MockModulesLogic mockModulesLogic;
+ late MockTokenStorageService mockTokenService;
+ late MockSliderLogic mockUpSlider;
+ late MockSliderLogic mockDownSlider;
+
+ setUp(() {
+ mockModulesLogic = MockModulesLogic();
+ mockTokenService = MockTokenStorageService();
+ mockUpSlider = MockSliderLogic();
+ mockDownSlider = MockSliderLogic();
+
+ // Setup mock behaviors
+ mockModulesLogic.isLoading = false.obs;
+ mockModulesLogic.moduleList = [
+ ModuleModel(
+ title: 'رصدطیور',
+ icon: 'test_icon.svg',
+ module: Module.chicken,
+ borderColor: Color(0xFF4665AF),
+ backgroundColor: Color(0xFFECEEF2),
+ titleColor: Color(0xFF4665AF),
+ ),
+ ModuleModel(
+ title: 'رصدبان',
+ icon: 'test_icon2.svg',
+ module: Module.inspection,
+ borderColor: Color(0xFF014856),
+ backgroundColor: Color(0xFFE9EDED),
+ titleColor: Color(0xFF014856),
+ ),
+ ];
+
+ Get.put(mockModulesLogic);
+ Get.put(mockTokenService);
+ Get.put(mockUpSlider, tag: "up");
+ Get.put(mockDownSlider, tag: "down");
+ });
+
+ tearDown(() {
+ Get.reset();
+ });
+
+ testWidgets('should display modules grid and handle user interaction', (WidgetTester tester) async {
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: ModulesPage(),
+ ),
+ );
+ await tester.pumpAndSettle();
+
+ // Assert - Verify modules page loads correctly
+ expect(find.text('سامانه جامع رصدیار'), findsOneWidget);
+ expect(find.byType(AppBar), findsOneWidget);
+ expect(find.byType(GridView), findsOneWidget);
+
+ // Verify app bar styling
+ final appBar = tester.widget(find.byType(AppBar));
+ expect(appBar.backgroundColor, AppColor.blueNormal);
+ expect(appBar.centerTitle, true);
+ });
+
+ testWidgets('should show loading state correctly', (WidgetTester tester) async {
+ // Arrange
+ mockModulesLogic.isLoading.value = true;
+
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: ModulesPage(),
+ ),
+ );
+ await tester.pump();
+
+ // Assert - Should show loading indicator
+ expect(find.byType(Container), findsWidgets);
+
+ // Change to not loading
+ mockModulesLogic.isLoading.value = false;
+ await tester.pump();
+
+ // Should show main content
+ expect(find.byType(Column), findsWidgets);
+ });
+
+ testWidgets('should handle module selection', (WidgetTester tester) async {
+ // Act
+ await tester.pumpWidget(
+ MaterialApp(
+ home: ModulesPage(),
+ ),
+ );
+ await tester.pumpAndSettle();
+
+ // Assert - Grid should be present for module selection
+ expect(find.byType(GridView), findsOneWidget);
+
+ // Verify modules are accessible
+ expect(mockModulesLogic.moduleList.length, greaterThan(0));
+ });
+ });
+}
diff --git a/lib/data/model/app_info_model.dart b/lib/data/model/app_info_model.dart
index e6eb9f9..e7b6d15 100644
--- a/lib/data/model/app_info_model.dart
+++ b/lib/data/model/app_info_model.dart
@@ -5,14 +5,21 @@ part 'app_info_model.g.dart';
@freezed
abstract class AppInfoModel with _$AppInfoModel {
- const factory AppInfoModel({String? key, String? download_link, Info? info}) = _AppInfoModel;
+ const factory AppInfoModel({String? key, String? file, Info? info}) =
+ _AppInfoModel;
- factory AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json);
+ factory AppInfoModel.fromJson(Map json) =>
+ _$AppInfoModelFromJson(json);
}
@freezed
abstract class Info with _$Info {
- const factory Info({String? version, String? module, bool? required}) = _Info;
+ const factory Info({
+ String? version,
+ String? minVersion,
+ String? module,
+ bool? required,
+ }) = _Info;
factory Info.fromJson(Map json) => _$InfoFromJson(json);
}
diff --git a/lib/data/model/app_info_model.freezed.dart b/lib/data/model/app_info_model.freezed.dart
index dc05818..05bf09d 100644
--- a/lib/data/model/app_info_model.freezed.dart
+++ b/lib/data/model/app_info_model.freezed.dart
@@ -15,7 +15,7 @@ T _$identity(T value) => value;
/// @nodoc
mixin _$AppInfoModel {
- String? get key; String? get download_link; Info? get info;
+ String? get key; String? get file; Info? get info;
/// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -28,16 +28,16 @@ $AppInfoModelCopyWith get copyWith => _$AppInfoModelCopyWithImpl Object.hash(runtimeType,key,download_link,info);
+int get hashCode => Object.hash(runtimeType,key,file,info);
@override
String toString() {
- return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)';
+ return 'AppInfoModel(key: $key, file: $file, info: $info)';
}
@@ -48,7 +48,7 @@ abstract mixin class $AppInfoModelCopyWith<$Res> {
factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl;
@useResult
$Res call({
- String? key, String? download_link, Info? info
+ String? key, String? file, Info? info
});
@@ -65,10 +65,10 @@ class _$AppInfoModelCopyWithImpl<$Res>
/// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values.
-@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) {
+@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? file = freezed,Object? info = freezed,}) {
return _then(_self.copyWith(
key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
-as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable
+as String?,file: freezed == file ? _self.file : file // ignore: cast_nullable_to_non_nullable
as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
as Info?,
));
@@ -167,10 +167,10 @@ return $default(_that);case _:
/// }
/// ```
-@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? download_link, Info? info)? $default,{required TResult orElse(),}) {final _that = this;
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? file, Info? info)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _AppInfoModel() when $default != null:
-return $default(_that.key,_that.download_link,_that.info);case _:
+return $default(_that.key,_that.file,_that.info);case _:
return orElse();
}
@@ -188,10 +188,10 @@ return $default(_that.key,_that.download_link,_that.info);case _:
/// }
/// ```
-@optionalTypeArgs TResult when(TResult Function( String? key, String? download_link, Info? info) $default,) {final _that = this;
+@optionalTypeArgs TResult when(TResult Function( String? key, String? file, Info? info) $default,) {final _that = this;
switch (_that) {
case _AppInfoModel():
-return $default(_that.key,_that.download_link,_that.info);case _:
+return $default(_that.key,_that.file,_that.info);case _:
throw StateError('Unexpected subclass');
}
@@ -208,10 +208,10 @@ return $default(_that.key,_that.download_link,_that.info);case _:
/// }
/// ```
-@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? download_link, Info? info)? $default,) {final _that = this;
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? file, Info? info)? $default,) {final _that = this;
switch (_that) {
case _AppInfoModel() when $default != null:
-return $default(_that.key,_that.download_link,_that.info);case _:
+return $default(_that.key,_that.file,_that.info);case _:
return null;
}
@@ -223,11 +223,11 @@ return $default(_that.key,_that.download_link,_that.info);case _:
@JsonSerializable()
class _AppInfoModel implements AppInfoModel {
- const _AppInfoModel({this.key, this.download_link, this.info});
+ const _AppInfoModel({this.key, this.file, this.info});
factory _AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json);
@override final String? key;
-@override final String? download_link;
+@override final String? file;
@override final Info? info;
/// Create a copy of AppInfoModel
@@ -243,16 +243,16 @@ Map toJson() {
@override
bool operator ==(Object other) {
- return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info));
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.file, file) || other.file == file)&&(identical(other.info, info) || other.info == info));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
-int get hashCode => Object.hash(runtimeType,key,download_link,info);
+int get hashCode => Object.hash(runtimeType,key,file,info);
@override
String toString() {
- return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)';
+ return 'AppInfoModel(key: $key, file: $file, info: $info)';
}
@@ -263,7 +263,7 @@ abstract mixin class _$AppInfoModelCopyWith<$Res> implements $AppInfoModelCopyWi
factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl;
@override @useResult
$Res call({
- String? key, String? download_link, Info? info
+ String? key, String? file, Info? info
});
@@ -280,10 +280,10 @@ class __$AppInfoModelCopyWithImpl<$Res>
/// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values.
-@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) {
+@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? file = freezed,Object? info = freezed,}) {
return _then(_AppInfoModel(
key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
-as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable
+as String?,file: freezed == file ? _self.file : file // ignore: cast_nullable_to_non_nullable
as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
as Info?,
));
@@ -308,7 +308,7 @@ $InfoCopyWith<$Res>? get info {
/// @nodoc
mixin _$Info {
- String? get version; String? get module; bool? get required;
+ String? get version; String? get minVersion; String? get module; bool? get required;
/// Create a copy of Info
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -321,16 +321,16 @@ $InfoCopyWith get copyWith => _$InfoCopyWithImpl(this as Info, _$ide
@override
bool operator ==(Object other) {
- return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.minVersion, minVersion) || other.minVersion == minVersion)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
-int get hashCode => Object.hash(runtimeType,version,module,required);
+int get hashCode => Object.hash(runtimeType,version,minVersion,module,required);
@override
String toString() {
- return 'Info(version: $version, module: $module, required: $required)';
+ return 'Info(version: $version, minVersion: $minVersion, module: $module, required: $required)';
}
@@ -341,7 +341,7 @@ abstract mixin class $InfoCopyWith<$Res> {
factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl;
@useResult
$Res call({
- String? version, String? module, bool? required
+ String? version, String? minVersion, String? module, bool? required
});
@@ -358,9 +358,10 @@ class _$InfoCopyWithImpl<$Res>
/// Create a copy of Info
/// with the given fields replaced by the non-null parameter values.
-@pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) {
+@pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? minVersion = freezed,Object? module = freezed,Object? required = freezed,}) {
return _then(_self.copyWith(
version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
+as String?,minVersion: freezed == minVersion ? _self.minVersion : minVersion // ignore: cast_nullable_to_non_nullable
as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
as bool?,
@@ -448,10 +449,10 @@ return $default(_that);case _:
/// }
/// ```
-@optionalTypeArgs TResult maybeWhen(TResult Function( String? version, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this;
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? version, String? minVersion, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _Info() when $default != null:
-return $default(_that.version,_that.module,_that.required);case _:
+return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
return orElse();
}
@@ -469,10 +470,10 @@ return $default(_that.version,_that.module,_that.required);case _:
/// }
/// ```
-@optionalTypeArgs TResult when(TResult Function( String? version, String? module, bool? required) $default,) {final _that = this;
+@optionalTypeArgs TResult when(TResult Function( String? version, String? minVersion, String? module, bool? required) $default,) {final _that = this;
switch (_that) {
case _Info():
-return $default(_that.version,_that.module,_that.required);case _:
+return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
throw StateError('Unexpected subclass');
}
@@ -489,10 +490,10 @@ return $default(_that.version,_that.module,_that.required);case _:
/// }
/// ```
-@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? version, String? module, bool? required)? $default,) {final _that = this;
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? version, String? minVersion, String? module, bool? required)? $default,) {final _that = this;
switch (_that) {
case _Info() when $default != null:
-return $default(_that.version,_that.module,_that.required);case _:
+return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
return null;
}
@@ -504,10 +505,11 @@ return $default(_that.version,_that.module,_that.required);case _:
@JsonSerializable()
class _Info implements Info {
- const _Info({this.version, this.module, this.required});
+ const _Info({this.version, this.minVersion, this.module, this.required});
factory _Info.fromJson(Map json) => _$InfoFromJson(json);
@override final String? version;
+@override final String? minVersion;
@override final String? module;
@override final bool? required;
@@ -524,16 +526,16 @@ Map toJson() {
@override
bool operator ==(Object other) {
- return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.minVersion, minVersion) || other.minVersion == minVersion)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
-int get hashCode => Object.hash(runtimeType,version,module,required);
+int get hashCode => Object.hash(runtimeType,version,minVersion,module,required);
@override
String toString() {
- return 'Info(version: $version, module: $module, required: $required)';
+ return 'Info(version: $version, minVersion: $minVersion, module: $module, required: $required)';
}
@@ -544,7 +546,7 @@ abstract mixin class _$InfoCopyWith<$Res> implements $InfoCopyWith<$Res> {
factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl;
@override @useResult
$Res call({
- String? version, String? module, bool? required
+ String? version, String? minVersion, String? module, bool? required
});
@@ -561,9 +563,10 @@ class __$InfoCopyWithImpl<$Res>
/// Create a copy of Info
/// with the given fields replaced by the non-null parameter values.
-@override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) {
+@override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? minVersion = freezed,Object? module = freezed,Object? required = freezed,}) {
return _then(_Info(
version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
+as String?,minVersion: freezed == minVersion ? _self.minVersion : minVersion // ignore: cast_nullable_to_non_nullable
as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
as bool?,
diff --git a/lib/data/model/app_info_model.g.dart b/lib/data/model/app_info_model.g.dart
index 90cd6a5..3619ebe 100644
--- a/lib/data/model/app_info_model.g.dart
+++ b/lib/data/model/app_info_model.g.dart
@@ -9,7 +9,7 @@ part of 'app_info_model.dart';
_AppInfoModel _$AppInfoModelFromJson(Map json) =>
_AppInfoModel(
key: json['key'] as String?,
- download_link: json['download_link'] as String?,
+ file: json['file'] as String?,
info: json['info'] == null
? null
: Info.fromJson(json['info'] as Map),
@@ -18,18 +18,20 @@ _AppInfoModel _$AppInfoModelFromJson(Map json) =>
Map _$AppInfoModelToJson(_AppInfoModel instance) =>
{
'key': instance.key,
- 'download_link': instance.download_link,
+ 'file': instance.file,
'info': instance.info,
};
_Info _$InfoFromJson(Map json) => _Info(
version: json['version'] as String?,
+ minVersion: json['minVersion'] as String?,
module: json['module'] as String?,
required: json['required'] as bool?,
);
Map _$InfoToJson(_Info instance) => {
'version': instance.version,
+ 'minVersion': instance.minVersion,
'module': instance.module,
'required': instance.required,
};
diff --git a/lib/data/model/response/slider/slider_model.dart b/lib/data/model/response/slider/slider_model.dart
new file mode 100644
index 0000000..da64c8c
--- /dev/null
+++ b/lib/data/model/response/slider/slider_model.dart
@@ -0,0 +1,11 @@
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'slider_model.freezed.dart';
+part 'slider_model.g.dart';
+
+@freezed
+abstract class SliderModel with _$SliderModel {
+ const factory SliderModel({List? up, List? down, String? middle}) = _SliderModel;
+
+ factory SliderModel.fromJson(Map json) => _$SliderModelFromJson(json);
+}
diff --git a/lib/data/model/response/slider/slider_model.freezed.dart b/lib/data/model/response/slider/slider_model.freezed.dart
new file mode 100644
index 0000000..225749e
--- /dev/null
+++ b/lib/data/model/response/slider/slider_model.freezed.dart
@@ -0,0 +1,299 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// coverage:ignore-file
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
+
+part of 'slider_model.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+// dart format off
+T _$identity(T value) => value;
+
+/// @nodoc
+mixin _$SliderModel {
+
+ List? get up; List? get down; String? get middle;
+/// Create a copy of SliderModel
+/// with the given fields replaced by the non-null parameter values.
+@JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+$SliderModelCopyWith get copyWith => _$SliderModelCopyWithImpl(this as SliderModel, _$identity);
+
+ /// Serializes this SliderModel to a JSON map.
+ Map toJson();
+
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is SliderModel&&const DeepCollectionEquality().equals(other.up, up)&&const DeepCollectionEquality().equals(other.down, down)&&(identical(other.middle, middle) || other.middle == middle));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(up),const DeepCollectionEquality().hash(down),middle);
+
+@override
+String toString() {
+ return 'SliderModel(up: $up, down: $down, middle: $middle)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class $SliderModelCopyWith<$Res> {
+ factory $SliderModelCopyWith(SliderModel value, $Res Function(SliderModel) _then) = _$SliderModelCopyWithImpl;
+@useResult
+$Res call({
+ List? up, List? down, String? middle
+});
+
+
+
+
+}
+/// @nodoc
+class _$SliderModelCopyWithImpl<$Res>
+ implements $SliderModelCopyWith<$Res> {
+ _$SliderModelCopyWithImpl(this._self, this._then);
+
+ final SliderModel _self;
+ final $Res Function(SliderModel) _then;
+
+/// Create a copy of SliderModel
+/// with the given fields replaced by the non-null parameter values.
+@pragma('vm:prefer-inline') @override $Res call({Object? up = freezed,Object? down = freezed,Object? middle = freezed,}) {
+ return _then(_self.copyWith(
+up: freezed == up ? _self.up : up // ignore: cast_nullable_to_non_nullable
+as List?,down: freezed == down ? _self.down : down // ignore: cast_nullable_to_non_nullable
+as List?,middle: freezed == middle ? _self.middle : middle // ignore: cast_nullable_to_non_nullable
+as String?,
+ ));
+}
+
+}
+
+
+/// Adds pattern-matching-related methods to [SliderModel].
+extension SliderModelPatterns on SliderModel {
+/// A variant of `map` that fallback to returning `orElse`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeMap(TResult Function( _SliderModel value)? $default,{required TResult orElse(),}){
+final _that = this;
+switch (_that) {
+case _SliderModel() when $default != null:
+return $default(_that);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// Callbacks receives the raw object, upcasted.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case final Subclass2 value:
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult map(TResult Function( _SliderModel value) $default,){
+final _that = this;
+switch (_that) {
+case _SliderModel():
+return $default(_that);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `map` that fallback to returning `null`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? mapOrNull(TResult? Function( _SliderModel value)? $default,){
+final _that = this;
+switch (_that) {
+case _SliderModel() when $default != null:
+return $default(_that);case _:
+ return null;
+
+}
+}
+/// A variant of `when` that fallback to an `orElse` callback.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeWhen(TResult Function( List? up, List? down, String? middle)? $default,{required TResult orElse(),}) {final _that = this;
+switch (_that) {
+case _SliderModel() when $default != null:
+return $default(_that.up,_that.down,_that.middle);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// As opposed to `map`, this offers destructuring.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case Subclass2(:final field2):
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult when(TResult Function( List? up, List? down, String? middle) $default,) {final _that = this;
+switch (_that) {
+case _SliderModel():
+return $default(_that.up,_that.down,_that.middle);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `when` that fallback to returning `null`
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( List? up, List? down, String? middle)? $default,) {final _that = this;
+switch (_that) {
+case _SliderModel() when $default != null:
+return $default(_that.up,_that.down,_that.middle);case _:
+ return null;
+
+}
+}
+
+}
+
+/// @nodoc
+@JsonSerializable()
+
+class _SliderModel implements SliderModel {
+ const _SliderModel({final List? up, final List? down, this.middle}): _up = up,_down = down;
+ factory _SliderModel.fromJson(Map json) => _$SliderModelFromJson(json);
+
+ final List? _up;
+@override List? get up {
+ final value = _up;
+ if (value == null) return null;
+ if (_up is EqualUnmodifiableListView) return _up;
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(value);
+}
+
+ final List? _down;
+@override List? get down {
+ final value = _down;
+ if (value == null) return null;
+ if (_down is EqualUnmodifiableListView) return _down;
+ // ignore: implicit_dynamic_type
+ return EqualUnmodifiableListView(value);
+}
+
+@override final String? middle;
+
+/// Create a copy of SliderModel
+/// with the given fields replaced by the non-null parameter values.
+@override @JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+_$SliderModelCopyWith<_SliderModel> get copyWith => __$SliderModelCopyWithImpl<_SliderModel>(this, _$identity);
+
+@override
+Map toJson() {
+ return _$SliderModelToJson(this, );
+}
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _SliderModel&&const DeepCollectionEquality().equals(other._up, _up)&&const DeepCollectionEquality().equals(other._down, _down)&&(identical(other.middle, middle) || other.middle == middle));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_up),const DeepCollectionEquality().hash(_down),middle);
+
+@override
+String toString() {
+ return 'SliderModel(up: $up, down: $down, middle: $middle)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class _$SliderModelCopyWith<$Res> implements $SliderModelCopyWith<$Res> {
+ factory _$SliderModelCopyWith(_SliderModel value, $Res Function(_SliderModel) _then) = __$SliderModelCopyWithImpl;
+@override @useResult
+$Res call({
+ List? up, List? down, String? middle
+});
+
+
+
+
+}
+/// @nodoc
+class __$SliderModelCopyWithImpl<$Res>
+ implements _$SliderModelCopyWith<$Res> {
+ __$SliderModelCopyWithImpl(this._self, this._then);
+
+ final _SliderModel _self;
+ final $Res Function(_SliderModel) _then;
+
+/// Create a copy of SliderModel
+/// with the given fields replaced by the non-null parameter values.
+@override @pragma('vm:prefer-inline') $Res call({Object? up = freezed,Object? down = freezed,Object? middle = freezed,}) {
+ return _then(_SliderModel(
+up: freezed == up ? _self._up : up // ignore: cast_nullable_to_non_nullable
+as List?,down: freezed == down ? _self._down : down // ignore: cast_nullable_to_non_nullable
+as List?,middle: freezed == middle ? _self.middle : middle // ignore: cast_nullable_to_non_nullable
+as String?,
+ ));
+}
+
+
+}
+
+// dart format on
diff --git a/lib/data/model/response/slider/slider_model.g.dart b/lib/data/model/response/slider/slider_model.g.dart
new file mode 100644
index 0000000..3fb67f0
--- /dev/null
+++ b/lib/data/model/response/slider/slider_model.g.dart
@@ -0,0 +1,20 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'slider_model.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+_SliderModel _$SliderModelFromJson(Map json) => _SliderModel(
+ up: (json['up'] as List?)?.map((e) => e as String).toList(),
+ down: (json['down'] as List?)?.map((e) => e as String).toList(),
+ middle: json['middle'] as String?,
+);
+
+Map _$SliderModelToJson(_SliderModel instance) =>
+ {
+ 'up': instance.up,
+ 'down': instance.down,
+ 'middle': instance.middle,
+ };
diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart
index 6438add..475fa44 100644
--- a/lib/infrastructure/service/app_navigation_observer.dart
+++ b/lib/infrastructure/service/app_navigation_observer.dart
@@ -1,31 +1,14 @@
import 'package:flutter/material.dart';
-import 'package:rasadyar_chicken/chicken.dart';
-import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_core/core.dart';
-import 'package:rasadyar_inspection/injection/inspection_di.dart';
-import 'package:rasadyar_inspection/inspection.dart';
class CustomNavigationObserver extends NavigatorObserver {
- bool _isWorkDone = false;
-
- void setInjectionDone() {
- _isWorkDone = true;
- }
@override
void didPush(Route route, Route? previousRoute) async {
- super.didPush(route, previousRoute);
final routeName = route.settings.name;
- if (!_isWorkDone &&( routeName == ChickenRoutes.init || routeName == ChickenRoutes.auth)) {
- _isWorkDone = true;
- await setupChickenDI();
- } else if (!_isWorkDone &&
- (routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) {
- _isWorkDone = true;
- await setupInspectionDI();
- }
- tLog('CustomNavigationObserver: didPush - $routeName');
+ super.didPush(route, previousRoute);
+ tLog('CustomNavigationObserver: didPush - $routeName');
}
@override
@@ -37,12 +20,12 @@ class CustomNavigationObserver extends NavigatorObserver {
@override
void didPop(Route route, Route? previousRoute) {
super.didPop(route, previousRoute);
- tLog('CustomNavigationObserver: didPop - ${route.settings.name}');
+ tLog('CustomNavigationObserver: didPop - ${route.settings.name}');
}
@override
void didRemove(Route route, Route? previousRoute) {
super.didRemove(route, previousRoute);
- tLog('CustomNavigationObserver: didRemove - ${route.settings.name}');
+ tLog('CustomNavigationObserver: didRemove - ${route.settings.name}');
}
}
diff --git a/lib/infrastructure/service/token_storage_service.dart b/lib/infrastructure/service/token_storage_service.dart
deleted file mode 100644
index e69de29..0000000
diff --git a/lib/infrastructure/utils/local_storage_utils.dart b/lib/infrastructure/utils/local_storage_utils.dart
new file mode 100644
index 0000000..8df0853
--- /dev/null
+++ b/lib/infrastructure/utils/local_storage_utils.dart
@@ -0,0 +1,51 @@
+import 'package:rasadyar_app/presentation/routes/app_pages.dart';
+import 'package:rasadyar_chicken/data/di/chicken_di.dart';
+import 'package:rasadyar_chicken/presentation/routes/routes.dart';
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/injection/inspection_di.dart';
+import 'package:rasadyar_inspection/inspection.dart';
+import 'package:rasadyar_livestock/injection/live_stock_di.dart';
+import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
+
+Future seedTargetPage() async {
+ var box = Hive.box("appBox");
+ AppModel appModel = AppModel(
+ targetPages: [
+ TargetPage(
+ route: InspectionRoutes.init,
+ module: Module.inspection,
+ functions: ["setupInspectionDI"],
+ ),
+ TargetPage(
+ route: LiveStockRoutes.init,
+ module: Module.liveStocks,
+ functions: ["setupLiveStockDI"],
+ ),
+ TargetPage(
+ route: ChickenRoutes.initSteward,
+ module: Module.chicken,
+ functions: ["setupChickenDI"],
+ ),
+ TargetPage(route: AppPaths.moduleList),
+ ],
+ );
+
+ box.add(appModel);
+}
+
+Iterable? getFunctionsList(List? functions) {
+ return functions?.map((e) async => getFunctionByName(e));
+}
+
+Future? getFunctionByName(String? name) {
+ switch (name) {
+ case "setupInspectionDI":
+ return setupInspectionDI();
+ case "setupLiveStockDI":
+ return setupLiveStockDI();
+ case "setupChickenDI":
+ return setupChickenDI();
+ default:
+ return null;
+ }
+}
diff --git a/lib/main.dart b/lib/main.dart
index 09db360..58196ae 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,15 +1,23 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart';
+import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_core/core.dart';
+
import 'infrastructure/di/di.dart';
import 'presentation/routes/auth_route_resolver_impl.dart';
-
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
-
+ await Hive.initFlutter();
await setupPreInjection();
+ Get.put(GService());
+ var gService = Get.find();
+ await gService.init();
+ if (gService.isFirstTime()) {
+ await seedTargetPage();
+ await gService.setIsNotFirstTime();
+ }
Get.put(TokenStorageService());
await Get.find().init();
Get.put(AppAuthRouteResolver());
@@ -17,28 +25,40 @@ Future main() async {
runApp(MyApp());
- // runApp(DevicePreview(builder: (context) => ForDevicePreview(),));
+ //runApp(DevicePreview(builder: (context) => ForDevicePreview(),));
}
-/*class ForDevicePreview extends StatelessWidget {
+class ForDevicePreview extends StatelessWidget {
const ForDevicePreview({super.key});
@override
Widget build(BuildContext context) {
- return GetMaterialApp(
- useInheritedMediaQuery: true,
- locale: DevicePreview.locale(context),
- builder: DevicePreview.appBuilder,
- title: 'رصدیار',
- theme: ThemeData(
- colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal),
+ return ScreenUtilInit(
+ designSize: const Size(412, 917),
+ minTextAdapt: true,
+ splitScreenMode: true,
+ child: GetMaterialApp(
+ title: 'رصدیار',
+ theme: ThemeData(
+ fontFamily: 'yekan',
+ colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal),
+ ),
+ initialRoute: AppPages.initRoutes,
+ getPages: AppPages.pages,
+ locale: const Locale("fa", "IR"),
+ supportedLocales: const [Locale("fa", "IR")],
+ navigatorObservers: [CustomNavigationObserver()],
+ localizationsDelegates: [
+ PersianMaterialLocalizations.delegate,
+ PersianCupertinoLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
),
- initialRoute: AppPages.initRoutes,
- initialBinding: BindingsBuilder.put(() => UserService()),
- getPages: AppPages.pages,
);
}
-}*/
+}
class MyApp extends StatelessWidget {
const MyApp({super.key});
diff --git a/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart
index e73eefe..2b65c7b 100644
--- a/lib/presentation/pages/modules/logic.dart
+++ b/lib/presentation/pages/modules/logic.dart
@@ -1,28 +1,139 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_app/data/model/response/slider/slider_model.dart';
+import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_core/core.dart';
class ModulesLogic extends GetxController {
TokenStorageService tokenService = Get.find();
+ SliderLogic upSlider = Get.find(tag: "up");
+ SliderLogic downSlider = Get.find(tag: "down");
+ RxnString latestNews = RxnString();
+ RxBool isLoading = false.obs;
List moduleList = [
- ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection),
-// ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks),
- ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken),
+ ModuleModel(
+ title: 'رصدطیور',
+ icon: Assets.icons.rasadToyor.path,
+ module: Module.chicken,
+ borderColor: Color(0xFF4665AF),
+ backgroundColor: Color(0xFFECEEF2),
+ titleColor: Color(0xFF4665AF),
+ ),
+ ModuleModel(
+ title: 'رصدام',
+ icon: Assets.icons.rasadDam.path,
+ module: Module.liveStocks,
+ borderColor: Color(0xFFD7A972),
+ backgroundColor: Color(0xFFF4F1EF),
+ titleColor: Color(0xFF7F7F7F),
+ ),
+ ModuleModel(
+ title: 'رصدبان',
+ icon: Assets.icons.rasadBan.path,
+ module: Module.inspection,
+ borderColor: Color(0xFF014856),
+ backgroundColor: Color(0xFFE9EDED),
+ titleColor: Color(0xFF014856),
+ ),
+ ModuleModel(
+ title: 'رصدبار',
+ icon: Assets.icons.rasadBar.path,
+ borderColor: Color(0xFFF37021),
+ backgroundColor: Color(0xFFFFECE1),
+ titleColor: Color(0xFFF37021),
+ ),
+ ModuleModel(
+ title: 'رصدبات',
+ icon: Assets.icons.rasadBot.path,
+ borderColor: Color(0xFF4A148C),
+ backgroundColor: Color(0xFFEDEAF0),
+ titleColor: Color(0xFF4A148C),
+ ),
+ ModuleModel(
+ title: 'رصدنان',
+ icon: Assets.icons.rasadNan.path,
+ borderColor: Color(0xFFD7A972),
+ backgroundColor: Color(0xFFF4F2EA),
+ titleColor: Color(0xFF8E8E8E),
+ ),
];
RxnInt selectedIndex = RxnInt(null);
@override
- void onReady() {
- super.onReady();
+ void onInit() {
+ super.onInit();
+ getSliders();
}
+
@override
- void onClose() {
- super.onClose();
+ void dispose() {
+ eLog("ModulesLogic disposed");
+ super.dispose();
}
void saveModule(Module module) {
tokenService.saveModule(module);
tokenService.appModule.value = module;
}
+
+ void onTapCard(Module? module, int index) async {
+ if (module == null) {
+ if (Get.isSnackbarOpen) return;
+ Get.snackbar(
+ "در حال توسعه",
+ "این ماژول به زودی اضافه میشود",
+ snackPosition: SnackPosition.BOTTOM,
+ backgroundColor: AppColor.yellowDark,
+ );
+ } else {
+ _goToModule(module, index);
+ }
+ }
+
+ void _goToModule(Module module, int index) async {
+ selectedIndex.value = index;
+ await Future.delayed(Duration(milliseconds: 300));
+ selectedIndex.value = null;
+ // saveModule(module);
+ await navigateToModule(module);
+ }
+
+ Future navigateToModule(Module module) async {
+ var target = getAuthTargetPage(module).entries.first;
+
+ if (target.value?[0] != null) {
+ isLoading.value = !isLoading.value;
+ await target.value?[0]?.call();
+ isLoading.value = !isLoading.value;
+ }
+
+ var res = await Get.toNamed(target.key, arguments: module);
+
+ if (target.value?[1] != null && res == -1) {
+ await target.value?[1]?.call();
+ }
+ }
+
+ Future getSliders() async {
+ var dio = Dio();
+ dio.interceptors.add(
+ PrettyDioLogger(
+ request: true,
+ enabled: true,
+ requestHeader: true,
+ responseHeader: true,
+ requestBody: true,
+ responseBody: true,
+ ),
+ );
+ var res = await dio.get("https://miran.storage.c2.liara.space/app/urllapp.json");
+ if (res.statusCode == 200) {
+ SliderModel sliderModel = SliderModel.fromJson(res.data);
+ upSlider.onSuccess(sliderModel.up ?? []);
+ downSlider.onSuccess(sliderModel.down ?? []);
+ latestNews.value = sliderModel.middle;
+ }
+ }
}
diff --git a/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart
index 880050a..3f56c85 100644
--- a/lib/presentation/pages/modules/view.dart
+++ b/lib/presentation/pages/modules/view.dart
@@ -1,7 +1,6 @@
+import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_core/core.dart';
-import 'package:rasadyar_inspection/inspection.dart';
import 'logic.dart';
@@ -12,44 +11,134 @@ class ModulesPage extends GetView {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
- title: Text('انتخاب سامانه', style: AppFonts.yekan18.copyWith(color: Colors.white)),
+ title: Row(
+ spacing: 5.w,
+ children: [
+ Text('سامانه جامع رصدیار', style: AppFonts.yekan18Bold.copyWith(color: Colors.white)),
+ Assets.logos.finalLogo.image(width: 40.w, height: 40.h),
+ ],
+ ),
centerTitle: true,
backgroundColor: AppColor.blueNormal,
),
- body: GridView.builder(
- padding: EdgeInsets.symmetric(horizontal: 10, vertical: 20),
-
- itemBuilder: (context, index) {
- final module = controller.moduleList[index];
- return CardIcon(
- title: module.title,
- icon: module.icon,
- onTap: () {
- controller.selectedIndex.value = index;
- controller.saveModule(module.module);
-
- // Navigate to the appropriate route based on the selected module
- switch (module.module) {
- case Module.inspection:
- Get.toNamed(InspectionRoutes.init);
- break;
- case Module.liveStocks:
- //TODO: Implement liveStocks module navigation
- case Module.chicken:
- Get.toNamed(ChickenRoutes.init);
- break;
- }
- },
- );
- },
- gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
- crossAxisCount: 3,
- mainAxisSpacing: 10,
- crossAxisSpacing: 10,
- ),
- physics: BouncingScrollPhysics(),
- itemCount: controller.moduleList.length,
- ),
+ body: ObxValue((loading) {
+ if (!controller.isLoading.value) {
+ return buildMainWidget();
+ }
+ return buildLoading();
+ }, controller.isLoading),
);
}
+
+ Container buildLoading() {
+ return Container(
+ color: Colors.grey.withValues(alpha: 0.5),
+ child: Center(child: CupertinoActivityIndicator(color: AppColor.greenNormal, radius: 30)),
+ );
+ }
+
+ Column buildMainWidget() {
+ return Column(
+ children: [
+ SizedBox(height: 12.h,),
+ SliderWidget(widgetTag: "up"),
+ SizedBox(height: 12.h,),
+ SizedBox(
+ height: 278.h,
+ child: GridView.builder(
+ padding: EdgeInsetsGeometry.symmetric(horizontal: 16.w),
+ itemBuilder: (context, index) {
+ final module = controller.moduleList[index];
+ return CardIcon(
+ title: module.title,
+ svgIcon: module.icon,
+ borderColor: module.borderColor,
+ backgroundColor: module.backgroundColor,
+ titleColor: module.titleColor,
+ onTap: () => controller.onTapCard(module.module, index),
+ );
+ },
+ gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 3,
+ mainAxisSpacing: 22.h,
+ crossAxisSpacing: 16.w,
+ ),
+ physics: NeverScrollableScrollPhysics(),
+ itemCount: controller.moduleList.length,
+ ),
+ ),
+ Container(
+ height: 107.h,
+ margin: EdgeInsets.symmetric(horizontal: 16.w),
+ padding: EdgeInsets.fromLTRB(11.w, 8.h, 8.w, 12.h),
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment(0.00, 0.50),
+ end: Alignment(1.00, 0.50),
+ colors: [const Color(0xFFC9D5FF), Colors.white],
+ ),
+ borderRadius: BorderRadius.circular(8),
+ border: Border.all(width: 1.w, color: const Color(0xFFD3D3D3)),
+ ),
+ child: Row(
+ spacing: 11.w,
+ children: [
+ Expanded(
+ flex: 2,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'آخرین اخبار ',
+ textAlign: TextAlign.right,
+ style: AppFonts.yekan16.copyWith(
+ color: Color(0xFF5B5B5B),
+ height: 1.90,
+ ),
+ ),
+ ObxValue(
+ (data) => Text(
+ data.value ??
+ 'اخبار مربوط به جوجه ریزی استان از آخرین روند مطلع شوید...',
+ maxLines: 2,
+ style: AppFonts.yekan12.copyWith(
+ color: Color(0xFF5B5B5B),
+ height: 1.5,
+ overflow: TextOverflow.ellipsis,
+ ),
+ ),
+ controller.latestNews,
+ ),
+ ],
+ ),
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Container(
+ width: 103.w,
+ height: 24.h,
+ alignment: Alignment.center,
+ decoration: ShapeDecoration(
+ color: Colors.white,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(50.r),
+ ),
+ ),
+ child: Text(
+ 'اطلاعات بیشتر',
+ textAlign: TextAlign.right,
+ style: AppFonts.yekan14,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ SizedBox(height: 12.h,),
+ SliderWidget(height: 160, widgetTag: "down"),
+ ],
+ );
+ }
}
diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart
index a9f1a8d..d088dfc 100644
--- a/lib/presentation/pages/splash/logic.dart
+++ b/lib/presentation/pages/splash/logic.dart
@@ -3,7 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_app/data/model/app_info_model.dart';
-import 'package:rasadyar_app/presentation/routes/app_pages.dart';
+import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
import 'package:rasadyar_core/core.dart';
class SplashLogic extends GetxController with GetTickerProviderStateMixin {
@@ -17,7 +17,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
final RxnString _updateFilePath = RxnString();
final platform = MethodChannel('apk_installer');
final Dio _dio = Dio();
+ var gService = Get.find();
var tokenService = Get.find();
+
AppInfoModel? appInfoModel;
@override
@@ -152,12 +154,22 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
try {
final isUpdateNeeded = await checkVersion();
if (isUpdateNeeded) return;
- tokenService.getModule();
- final module = tokenService.appModule.value;
- final target = getTargetPage(module);
- Get.offAndToNamed(target);
+
+ final module = gService.getSelectedModule();
+ final target = gService.getTargetPage(module);
+ if (module != null) {
+ tokenService.setGlobalTokenAndRefToken(module);
+ }
+
+ if (target != null) {
+ var mFuns = getFunctionsList(target.functions);
+ await Future.wait(mFuns ?? []);
+
+ iLog("target.route ===>${target.route!}");
+ Get.offAndToNamed(target.route!);
+ }
} catch (e, st) {
- debugPrint("onReady error: $e\n$st");
+ eLog("onReady error: $e\n$st");
}
});
}
@@ -173,7 +185,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
try {
final info = await PackageInfo.fromPlatform();
int version = info.version.versionNumber;
- var res = await _dio.get("https://rsibackend.rasadyaar.ir/app/apk-info/");
+ var res = await _dio.get("https://rsibackend.rasadyar.com/app/rasadyar-app-info/");
appInfoModel = AppInfoModel.fromJson(res.data);
@@ -202,7 +214,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
while (attempts < retryCount && !success) {
try {
await _dio.download(
- appInfoModel?.download_link ?? '',
+ appInfoModel?.file ?? '',
filePath,
onReceiveProgress: (count, total) {
if (total != -1 && total > 0) {
@@ -232,11 +244,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
Future installApk() async {
try {
eLog(_updateFilePath.value);
-
- final dir = await getApplicationDocumentsDirectory();
await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value});
} catch (e) {
- print("خطا در نصب: $e");
+ eLog(e);
}
}
}
diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart
index bacf390..95d329a 100644
--- a/lib/presentation/pages/system_design/system_design.dart
+++ b/lib/presentation/pages/system_design/system_design.dart
@@ -10,19 +10,8 @@ class SystemDesignPage extends StatefulWidget {
}
class _SystemDesignPageState extends State {
- List _isOpen = [false, false, false, false, false, false];
+ final List _isOpen = [false, false, false, false, false, false];
- void _handleAdd() {
- print("Add FAB pressed");
- }
-
- void _handleEdit() {
- print("Edit FAB pressed");
- }
-
- void _handleDelete() {
- print("Delete FAB pressed");
- }
@override
Widget build(BuildContext context) {
diff --git a/lib/presentation/pages/test/logic.dart b/lib/presentation/pages/test/logic.dart
new file mode 100644
index 0000000..2961539
--- /dev/null
+++ b/lib/presentation/pages/test/logic.dart
@@ -0,0 +1,15 @@
+import 'package:get/get.dart';
+
+class TestLogic extends GetxController {
+ @override
+ void onReady() {
+ // TODO: implement onReady
+ super.onReady();
+ }
+
+ @override
+ void onClose() {
+ // TODO: implement onClose
+ super.onClose();
+ }
+}
diff --git a/lib/presentation/pages/test/view.dart b/lib/presentation/pages/test/view.dart
new file mode 100644
index 0000000..e1a7aad
--- /dev/null
+++ b/lib/presentation/pages/test/view.dart
@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_core/core.dart';
+
+import 'logic.dart';
+
+class TestPage extends StatelessWidget {
+ const TestPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ // ignore: unused_local_variable
+ final TestLogic logic = Get.put(TestLogic());
+
+ return Scaffold(
+ body: SafeArea(
+ child: Padding(
+ padding: const EdgeInsets.all(18.0),
+ child: Column(
+ spacing: 8,
+ children: [
+
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart
index 44675f4..ffc9cca 100644
--- a/lib/presentation/routes/app_pages.dart
+++ b/lib/presentation/routes/app_pages.dart
@@ -3,9 +3,14 @@ import 'package:rasadyar_app/presentation/pages/modules/view.dart';
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_app/presentation/pages/test/logic.dart';
+import 'package:rasadyar_app/presentation/pages/test/view.dart';
import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/injection/inspection_di.dart';
import 'package:rasadyar_inspection/inspection.dart';
+import 'package:rasadyar_livestock/injection/live_stock_di.dart';
import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
part 'app_paths.dart';
@@ -14,6 +19,7 @@ sealed class AppPages {
AppPages._();
static const String initRoutes = AppPaths.splash;
+ // static const String initRoutes = AppPaths.test;
static const String initDesignSystem = AppPaths.systemDesignPage;
static List pages = [
@@ -22,7 +28,11 @@ sealed class AppPages {
GetPage(
name: AppPaths.moduleList,
page: () => ModulesPage(),
- binding: BindingsBuilder.put(() => ModulesLogic()),
+ binding: BindingsBuilder(() {
+ Get.lazyPut(() => SliderLogic(), tag: "up");
+ Get.lazyPut(() => SliderLogic(), tag: "down");
+ Get.put(ModulesLogic());
+ }),
),
GetPage(
@@ -31,22 +41,33 @@ sealed class AppPages {
binding: BindingsBuilder.put(() => SplashLogic()),
),
- ...InspectionPages.pages,
+ GetPage(
+ name: AppPaths.test,
+ page: () => TestPage(),
+ binding: BindingsBuilder.put(() => TestLogic()),
+ ),
+ ...InspectionPages.pages,
...LiveStockPages.pages,
...ChickenPages.pages,
];
}
-String getTargetPage(Module? value) {
+Map Function()?>?> getAuthTargetPage(Module? value) {
switch (value) {
case Module.inspection:
- return InspectionRoutes.init;
+ return {
+ InspectionRoutes.auth: [setupInspectionDI, removeInspectionDI],
+ };
case Module.liveStocks:
- return LiveStockRoutes.init;
+ return {
+ LiveStockRoutes.auth: [setupLiveStockDI, removeLiveStockDI],
+ };
case Module.chicken:
- return ChickenRoutes.init;
+ return {
+ ChickenRoutes.auth: [setupChickenDI, removeChickenDI],
+ };
default:
- return AppPaths.moduleList;
+ return {AppPaths.moduleList: null};
}
}
diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart
index 2003dcd..10de0c4 100644
--- a/lib/presentation/routes/app_paths.dart
+++ b/lib/presentation/routes/app_paths.dart
@@ -6,4 +6,5 @@ sealed class AppPaths {
static const String splash = '/splash';
static const String moduleList = '/moduleList';
static const String systemDesignPage = '/systemDesignPage';
+ static const String test = '/test';
}
diff --git a/lib/presentation/routes/auth_route_resolver_impl.dart b/lib/presentation/routes/auth_route_resolver_impl.dart
index c932919..6f77831 100644
--- a/lib/presentation/routes/auth_route_resolver_impl.dart
+++ b/lib/presentation/routes/auth_route_resolver_impl.dart
@@ -14,9 +14,7 @@ class AppAuthRouteResolver implements AuthRouteResolver {
return LiveStockRoutes.auth;
case Module.chicken:
return ChickenRoutes.auth;
- default:
- throw UnimplementedError('No auth route for module: $module');
- }
+ }
}
@override
diff --git a/packages/chicken/.gitignore b/packages/chicken/.gitignore
index 3cceda5..c40e34e 100644
--- a/packages/chicken/.gitignore
+++ b/packages/chicken/.gitignore
@@ -1,7 +1,4 @@
-# https://dart.dev/guides/libraries/private-files
-# Created by `dart pub`
-.dart_tool/
-
-# Avoid committing pubspec.lock for library packages; see
-# https://dart.dev/guides/libraries/private-files#pubspeclock.
-pubspec.lock
+.dart_tool
+*.lock
+.flutter-plugins-dependencies
+.flutter-plugins
\ No newline at end of file
diff --git a/packages/chicken/build/native_assets/windows/native_assets.json b/packages/chicken/build/native_assets/windows/native_assets.json
new file mode 100644
index 0000000..523bfc7
--- /dev/null
+++ b/packages/chicken/build/native_assets/windows/native_assets.json
@@ -0,0 +1 @@
+{"format-version":[1,0,0],"native-assets":{}}
\ No newline at end of file
diff --git a/packages/chicken/build/test_cache/build/210bad4901163cba762d02a4a1c86c00.cache.dill.track.dill b/packages/chicken/build/test_cache/build/210bad4901163cba762d02a4a1c86c00.cache.dill.track.dill
new file mode 100644
index 0000000..14a16a8
Binary files /dev/null and b/packages/chicken/build/test_cache/build/210bad4901163cba762d02a4a1c86c00.cache.dill.track.dill differ
diff --git a/packages/chicken/build/test_cache/build/7e4aebe516b998635f34742713e086a8.cache.dill.track.dill b/packages/chicken/build/test_cache/build/7e4aebe516b998635f34742713e086a8.cache.dill.track.dill
new file mode 100644
index 0000000..ce89ca3
Binary files /dev/null and b/packages/chicken/build/test_cache/build/7e4aebe516b998635f34742713e086a8.cache.dill.track.dill differ
diff --git a/packages/chicken/build/unit_test_assets/AssetManifest.bin b/packages/chicken/build/unit_test_assets/AssetManifest.bin
new file mode 100644
index 0000000..1dbd5dc
--- /dev/null
+++ b/packages/chicken/build/unit_test_assets/AssetManifest.bin
@@ -0,0 +1 @@
+
2packages/cupertino_icons/assets/CupertinoIcons.ttf
asset2packages/cupertino_icons/assets/CupertinoIcons.ttf4packages/flutter_map/lib/assets/flutter_map_logo.png
asset4packages/flutter_map/lib/assets/flutter_map_logo.png
\ No newline at end of file
diff --git a/packages/chicken/build/unit_test_assets/AssetManifest.json b/packages/chicken/build/unit_test_assets/AssetManifest.json
new file mode 100644
index 0000000..1bdca23
--- /dev/null
+++ b/packages/chicken/build/unit_test_assets/AssetManifest.json
@@ -0,0 +1 @@
+{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"packages/flutter_map/lib/assets/flutter_map_logo.png":["packages/flutter_map/lib/assets/flutter_map_logo.png"]}
\ No newline at end of file
diff --git a/packages/chicken/build/unit_test_assets/FontManifest.json b/packages/chicken/build/unit_test_assets/FontManifest.json
new file mode 100644
index 0000000..7bea289
--- /dev/null
+++ b/packages/chicken/build/unit_test_assets/FontManifest.json
@@ -0,0 +1 @@
+[{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]
\ No newline at end of file
diff --git a/packages/chicken/build/unit_test_assets/NOTICES.Z b/packages/chicken/build/unit_test_assets/NOTICES.Z
new file mode 100644
index 0000000..e8201f5
Binary files /dev/null and b/packages/chicken/build/unit_test_assets/NOTICES.Z differ
diff --git a/packages/chicken/build/unit_test_assets/NativeAssetsManifest.json b/packages/chicken/build/unit_test_assets/NativeAssetsManifest.json
new file mode 100644
index 0000000..523bfc7
--- /dev/null
+++ b/packages/chicken/build/unit_test_assets/NativeAssetsManifest.json
@@ -0,0 +1 @@
+{"format-version":[1,0,0],"native-assets":{}}
\ No newline at end of file
diff --git a/packages/chicken/build/unit_test_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf b/packages/chicken/build/unit_test_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf
new file mode 100644
index 0000000..d580ce7
Binary files /dev/null and b/packages/chicken/build/unit_test_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf differ
diff --git a/packages/core/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png b/packages/chicken/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png
similarity index 100%
rename from packages/core/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png
rename to packages/chicken/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png
diff --git a/packages/chicken/build/unit_test_assets/shaders/ink_sparkle.frag b/packages/chicken/build/unit_test_assets/shaders/ink_sparkle.frag
new file mode 100644
index 0000000..85fc357
Binary files /dev/null and b/packages/chicken/build/unit_test_assets/shaders/ink_sparkle.frag differ
diff --git a/packages/chicken/devtools_options.yaml b/packages/chicken/devtools_options.yaml
new file mode 100644
index 0000000..ff5a421
--- /dev/null
+++ b/packages/chicken/devtools_options.yaml
@@ -0,0 +1,4 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:
+ - hive_ce: true
\ No newline at end of file
diff --git a/packages/chicken/lib/chicken.dart b/packages/chicken/lib/chicken.dart
index 7f7bfe9..2e40370 100644
--- a/packages/chicken/lib/chicken.dart
+++ b/packages/chicken/lib/chicken.dart
@@ -5,5 +5,4 @@ library;
export 'presentation/routes/pages.dart';
export 'presentation/routes/routes.dart';
-export 'presentation/pages/root/view.dart';
-export 'presentation/pages/root/logic.dart';
+
diff --git a/packages/chicken/lib/data/common/dio_error_handler.dart b/packages/chicken/lib/data/common/dio_error_handler.dart
index 57f29bc..ffb4d44 100644
--- a/packages/chicken/lib/data/common/dio_error_handler.dart
+++ b/packages/chicken/lib/data/common/dio_error_handler.dart
@@ -25,6 +25,7 @@ class DioErrorHandler {
}
//wrong captcha => "detail": "Captcha code is incorrect" - 403
+ // ignore: unused_element
void _handle403() {}
void _handleGeneric(DioException error) {
diff --git a/packages/chicken/lib/data/common/fa_user_role.dart b/packages/chicken/lib/data/common/fa_user_role.dart
new file mode 100644
index 0000000..fa616dd
--- /dev/null
+++ b/packages/chicken/lib/data/common/fa_user_role.dart
@@ -0,0 +1,159 @@
+import 'package:rasadyar_chicken/presentation/routes/routes.dart';
+
+String getFaUserRole(String? role) {
+ switch (role) {
+ case "Admin":
+ return "ادمین استان";
+ case "CityOperator":
+ return "تعاونی";
+ case "Poultry":
+ return "مرغدار";
+ case "ProvinceOperator":
+ return "مدیر اجرایی";
+ case "ProvinceFinancial":
+ return "مالی اتحادیه";
+ case "KillHouse":
+ return "کشتارگاه";
+ case "KillHouseVet":
+ return "دامپزشک کشتارگاه";
+ case "VetFarm":
+ return "دامپزشک فارم";
+ case "Driver":
+ return "راننده";
+ case "ProvinceInspector":
+ return "بازرس اتحادیه ";
+ case "VetSupervisor":
+ return "دامپزشک کل";
+ case "Jahad":
+ return "جهاد کشاورزی استان";
+ case "CityJahad":
+ return "جهاد کشاورزی شهرستان";
+ case "ProvincialGovernment":
+ return "استانداری";
+ case "Guilds":
+ return "صنف";
+ case "Steward":
+ return "مباشر";
+ case "Commerce":
+ return "معاونت بازرگانی استان";
+ case "CityCommerce":
+ return "بازرگانی شهرستان";
+ case "UnitWindow":
+ return "پنجره واحد";
+ case "CityVet":
+ return "دامپزشک شهرستان";
+ case "Observatory":
+ return "رصدخانه";
+ case "ProvinceSupervisor":
+ return "ناظر استان";
+ case "GuildRoom":
+ return "اتاق اصناف";
+ case "PosCompany":
+ return "شرکت psp";
+ case "LiveStockSupport":
+ return "پشتیبانی امور دام";
+ case "SuperAdmin":
+ return "ادمین کل";
+ case "ChainCompany":
+ return "شرکت زنجیره";
+ case "AdminX":
+ return "ادمین ایکس";
+ case "Supporter":
+ return "پشتیبان سامانه";
+ case "Dispenser":
+ return "پخش کننده";
+ case "CityPoultry":
+ return "طیور شهرستان";
+ case "ParentCompany":
+ return "شرکت مادر";
+ case "ColdHouseSteward":
+ return "مباشر سردخانه";
+ case "CityGuild":
+ return "اتحادیه پروتئینی";
+ case "LiveStockProvinceJahad":
+ return "جهاد استان";
+ case "PoultryScience":
+ return "کارشناس طیور";
+ default:
+ return "نامشخص";
+ }
+}
+
+Map getFaUserRoleWithOnTap(String? role) {
+ switch (role) {
+ case "Admin":
+ return {"ادمین استان": null};
+ case "CityOperator":
+ return {"تعاونی": null};
+ case "Poultry":
+ return {"مرغدار": null};
+ case "ProvinceOperator":
+ return {"مدیر اجرایی": null};
+ case "ProvinceFinancial":
+ return {"مالی اتحادیه": null};
+ case "KillHouse":
+ return {"کشتارگاه": ChickenRoutes.initKillHouse};
+ case "KillHouseVet":
+ return {"دامپزشک کشتارگاه": null};
+ case "VetFarm":
+ return {"دامپزشک فارم": null};
+ case "Driver":
+ return {"راننده": null};
+ case "ProvinceInspector":
+ return {"بازرس اتحادیه": null};
+ case "VetSupervisor":
+ return {"دامپزشک کل": null};
+ case "Jahad":
+ return {"جهاد کشاورزی استان": null};
+ case "CityJahad":
+ return {"جهاد کشاورزی شهرستان": null};
+ case "ProvincialGovernment":
+ return {"استانداری": null};
+ case "Guilds":
+ return {"صنف": null};
+ case "Commerce":
+ return {"معاونت بازرگانی استان": null};
+ case "CityCommerce":
+ return {"بازرگانی شهرستان": null};
+ case "UnitWindow":
+ return {"پنجره واحد": null};
+ case "CityVet":
+ return {"دامپزشک شهرستان": null};
+ case "Observatory":
+ return {"رصدخانه": null};
+ case "ProvinceSupervisor":
+ return {"ناظر استان": null};
+ case "GuildRoom":
+ return {"اتاق اصناف": null};
+ case "PosCompany":
+ return {"شرکت psp": null};
+ case "LiveStockSupport":
+ return {"پشتیبانی امور دام": null};
+ case "SuperAdmin":
+ return {"ادمین کل": null};
+ case "ChainCompany":
+ return {"شرکت زنجیره": null};
+ case "AdminX":
+ return {"ادمین ایکس": null};
+ case "Supporter":
+ return {"پشتیبان سامانه": null};
+ case "Dispenser":
+ return {"پخش کننده": null};
+ case "CityPoultry":
+ return {"طیور شهرستان": null};
+ case "ParentCompany":
+ return {"شرکت مادر": null};
+ case "ColdHouseSteward":
+ return {"مباشر سردخانه": null};
+ case "CityGuild":
+ return {"اتحادیه پروتئینی": null};
+ case "LiveStockProvinceJahad":
+ return {"جهاد استان": null};
+ case "Steward":
+ return {"مباشر": ChickenRoutes.initSteward};
+ case "PoultryScience":
+ return {"کارشناس طیور": ChickenRoutes.initPoultryScience};
+ default:
+ return {"نامشخص": null};
+ }
+}
diff --git a/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart
index a8f2055..f66c786 100644
--- a/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart
+++ b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart
@@ -1,4 +1,3 @@
-import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
import 'package:rasadyar_core/core.dart';
@@ -15,7 +14,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
@override
Future initWidleyUsed() async {
- List tmpList = [
+ /* List tmpList = [
WidelyUsedLocalItem(
index: 0,
pathId: 0,
@@ -23,7 +22,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.greenLightActive.toARGB32(),
iconColor: AppColor.greenNormal.toARGB32(),
iconPath: Assets.vec.cubeSearchSvg.path,
- path: ChickenRoutes.buysInProvince,
+ path: ChickenRoutes.buysInProvinceSteward,
),
WidelyUsedLocalItem(
index: 1,
@@ -32,7 +31,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.blueLightActive.toARGB32(),
iconColor: AppColor.blueNormal.toARGB32(),
iconPath: Assets.vec.cubeSvg.path,
- path: ChickenRoutes.salesInProvince,
+ path: ChickenRoutes.salesInProvinceSteward,
),
WidelyUsedLocalItem(
@@ -41,18 +40,14 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.blueLightActive.toARGB32(),
iconColor: AppColor.blueNormal.toARGB32(),
iconPath: Assets.vec.cubeRotateSvg.path,
- path: ChickenRoutes.buysInProvince,
+ path: ChickenRoutes.buysInProvinceSteward,
),
- ];
- await local.add(
- boxName: boxName,
- value: WidelyUsedLocalModel(hasInit: true, items: tmpList),
- );
+ ]; */
}
@override
WidelyUsedLocalModel? getAllWidely() {
var res = local.readBox(boxName: boxName);
- return res?.first;
+ return res?.isNotEmpty == true ? res!.first : null;
}
}
diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart
index 1705dcf..c42add7 100644
--- a/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart
+++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart
@@ -1,4 +1,4 @@
-import 'package:rasadyar_chicken/data/models/response/captcha/captcha_response_model.dart';
+
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
@@ -10,4 +10,7 @@ abstract class AuthRemoteDataSource {
Future hasAuthenticated();
Future getUserInfo(String phoneNumber);
+
+ /// Calls `/steward-app-login/` endpoint with required token and `server` as query param, plus optional extra query parameters.
+ Future stewardAppLogin({required String token, Map? queryParameters});
}
diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart
index f25e8c2..a0b85f8 100644
--- a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart
+++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart
@@ -11,7 +11,9 @@ class AuthRemoteDataSourceImp extends AuthRemoteDataSource {
AuthRemoteDataSourceImp(this._httpClient);
@override
- Future login({required Map authRequest}) async {
+ Future login({
+ required Map authRequest,
+ }) async {
var res = await _httpClient.post(
'/api/login/',
data: authRequest,
@@ -40,11 +42,26 @@ class AuthRemoteDataSourceImp extends AuthRemoteDataSource {
@override
Future getUserInfo(String phoneNumber) async {
var res = await _httpClient.post(
- 'https://userbackend.rasadyaar.ir/api/send_otp/',
+ 'https://userbackend.rasadyar.com/api/send_otp/',
data: {"mobile": phoneNumber, "state": ""},
fromJson: UserInfoModel.fromJson,
headers: {'Content-Type': 'application/json'},
);
return res.data;
}
+
+ @override
+ Future stewardAppLogin({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ await _httpClient.post(
+ '/steward-app-login/',
+ data: queryParameters,
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ );
+ }
}
diff --git a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart
index e6f04b8..33eb7be 100644
--- a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart
+++ b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart
@@ -5,6 +5,7 @@ import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/stewa
import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart';
import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart';
import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart';
+import 'package:rasadyar_chicken/data/models/response/broadcast_price/broadcast_price.dart';
import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart';
import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart';
import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart';
@@ -18,6 +19,8 @@ import 'package:rasadyar_chicken/data/models/response/segmentation_model/segment
import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart';
import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart';
import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_remain_weight/steward_remain_weight.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_sales_info_dashboard/steward_sales_info_dashboard.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart';
import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'
hide ProductModel;
@@ -104,9 +107,15 @@ abstract class ChickenRemoteDatasource {
Future deleteStewardPurchasesOutSideOfTheProvince({
required String token,
- required String stewardFreeBarKey,
+ Map? queryParameters,
});
+ Future editStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ Map? queryParameters,
+ });
+
+
Future?> getOutProvinceCarcassesBuyer({
required String token,
Map? queryParameters,
@@ -136,6 +145,13 @@ abstract class ChickenRemoteDatasource {
required StewardFreeSaleBarRequest body,
});
+
+ Future deleteOutProvinceStewardFreeBar({
+ required String token,
+ required String key
+ });
+
+
Future getUserProfile({required String token});
Future updateUserProfile({required String token, required UserProfile userProfile});
@@ -152,4 +168,13 @@ abstract class ChickenRemoteDatasource {
Future editSegmentation({required String token, required SegmentationModel model});
Future deleteSegmentation({required String token, required String key});
+
+ Future getBroadcastPrice({required String token});
+
+ Future getStewardSalesInfoDashboard({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future getStewardRemainWeight({required String token});
}
diff --git a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart
index 57df1fa..f9e6741 100644
--- a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart
+++ b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart
@@ -1,4 +1,3 @@
-
import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart';
import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart';
import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart';
@@ -6,6 +5,7 @@ import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/stewa
import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart';
import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart';
import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart';
+import 'package:rasadyar_chicken/data/models/response/broadcast_price/broadcast_price.dart';
import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart';
import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart';
import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart';
@@ -19,6 +19,8 @@ import 'package:rasadyar_chicken/data/models/response/segmentation_model/segment
import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart';
import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart';
import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_remain_weight/steward_remain_weight.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_sales_info_dashboard/steward_sales_info_dashboard.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart';
import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'
hide ProductModel;
@@ -36,7 +38,6 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
required String token,
CancelToken? cancelToken,
}) async {
- eLog(_httpClient.baseUrl);
var res = await _httpClient.get(
'/roles-products/?role=Steward',
headers: {'Authorization': 'Bearer $token'},
@@ -141,7 +142,7 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
required String token,
required Map allocation,
}) async {
- var res = await _httpClient.put(
+ await _httpClient.put(
'/steward-allocation/0/',
headers: {'Authorization': 'Bearer $token'},
data: allocation,
@@ -236,7 +237,7 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
await _httpClient.put(
'/steward-allocation/0/',
headers: {'Authorization': 'Bearer $token'},
- queryParameters: request.toJson(),
+ data: request.toJson(),
);
}
@@ -311,22 +312,36 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
required String token,
required CreateStewardFreeBar body,
}) async {
- var res = await _httpClient.post(
+ await _httpClient.post(
'/steward_free_bar/',
headers: {'Authorization': 'Bearer $token'},
- data: body.toJson(),
+ data: body.toJson()..removeWhere((key, value) => value==null,),
);
}
+ @override
+ Future editStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var data = await _httpClient.put(
+ '/steward_free_bar/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: queryParameters,
+ fromJson: CreateStewardFreeBar.fromJson,
+ );
+ return data.data;
+ }
+
@override
Future deleteStewardPurchasesOutSideOfTheProvince({
required String token,
- required String stewardFreeBarKey,
+ Map? queryParameters,
}) async {
await _httpClient.delete(
'/steward_free_bar/0/',
headers: {'Authorization': 'Bearer $token'},
- queryParameters: {'key': stewardFreeBarKey},
+ queryParameters: queryParameters,
);
}
@@ -402,6 +417,15 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
);
}
+ @override
+ Future deleteOutProvinceStewardFreeBar({required String token, required String key}) async {
+ await _httpClient.delete(
+ '/steward_free_sale_bar/0/',
+ queryParameters: {'key': key},
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
@override
Future getUserProfile({required String token}) async {
var res = await _httpClient.get(
@@ -483,4 +507,42 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
return res.data;
}
+
+ @override
+ Future getBroadcastPrice({required String token}) async {
+ var res = await _httpClient.get(
+ '/broadcast-price/',
+ headers: {'Authorization': 'Bearer $token'},
+
+ fromJson: (json) => BroadcastPrice.fromJson(json),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future getStewardSalesInfoDashboard({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward-sales-info-dashboard/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => StewardSalesInfoDashboard.fromJson(json),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future getStewardRemainWeight({required String token}) async {
+ var res = await _httpClient.get(
+ '/steward-remain-weight/',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: StewardRemainWeight.fromJson,
+ );
+
+ return res.data;
+ }
}
diff --git a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart b/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart
new file mode 100644
index 0000000..facd2c9
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart
@@ -0,0 +1,25 @@
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart';
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart';
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart'
+ as listModel;
+
+abstract class KillHouseRemoteDataSource {
+ Future?> getKillHouseList({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future getCommissionPrice({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future submitKillHouseRequest({required String token, required Map data});
+
+ Future?> getListKillRequest({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future deleteKillRequest({required String token, required int requestId});
+}
diff --git a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart b/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart
new file mode 100644
index 0000000..0a7649d
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart
@@ -0,0 +1,80 @@
+import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart';
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart';
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart';
+import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart'
+ as listModel;
+import 'package:rasadyar_core/core.dart';
+
+class KillHouseRemoteDataSourceImpl extends KillHouseRemoteDataSource {
+ final DioRemote _httpClient;
+
+ KillHouseRemoteDataSourceImpl(this._httpClient);
+
+ @override
+ Future getCommissionPrice({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/chicken-commission-prices/',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) {
+ var data = json['results'] as List;
+ return ChickenCommissionPrices.fromJson(data.first as Map);
+ },
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future?> getKillHouseList({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/kill_house/?kill_house',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJsonList: (json) =>
+ json.map((e) => KillHouseResponse.fromJson(e as Map)).toList(),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future submitKillHouseRequest({
+ required String token,
+ required Map data,
+ }) async {
+ await _httpClient.post(
+ '/kill_request/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: data,
+ );
+ }
+
+ @override
+ Future?> getListKillRequest({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/kill_request/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJsonList: (json) =>
+ json.map((e) => listModel.KillRequestList.fromJson(e as Map)).toList(),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future deleteKillRequest({required String token, required int requestId}) async {
+ await _httpClient.delete(
+ '/kill_request/$requestId/',
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+}
diff --git a/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote.dart b/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote.dart
new file mode 100644
index 0000000..3a892c4
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote.dart
@@ -0,0 +1,94 @@
+import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
+import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
+import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
+import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
+import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
+import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
+import 'package:rasadyar_core/core.dart';
+
+abstract class PoultryScienceRemoteDatasource {
+ Future getHomePoultryScience({
+ required String token,
+ required String type,
+ });
+
+ Future?> getHatchingPoultry({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future submitPoultryScienceReport({
+ required String token,
+ required FormData data,
+ ProgressCallback? onSendProgress,
+ });
+
+ Future?> getPoultryScienceReport({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future?> getPoultryScienceFarmList({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future getApprovedPrice({ required String token,
+ Map? queryParameters,});
+
+ Future?> getAllPoultry({
+ required String token,
+ Map? queryParameters,
+ });
+
+
+ Future getSellForFreezing({
+ required String token,
+ Map? queryParameters,
+ });
+
+
+ Future getPoultryExport({
+ required String token,
+ Map? queryParameters,
+ });
+
+
+ Future?> getUserPoultry({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future?> getPoultryHatching({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future?> getKillHouseList({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future submitKillRegistration({
+ required String token,
+ required KillRegistrationRequest request,
+ });
+
+
+ Future?> getPoultryOderList({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future deletePoultryOder({
+ required String token,
+ required String orderId,
+ });
+}
diff --git a/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote_imp.dart
new file mode 100644
index 0000000..a201d6f
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/poultry_science/poultry_science_remote_imp.dart
@@ -0,0 +1,242 @@
+import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
+import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
+import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
+import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
+import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
+import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
+import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
+import 'package:rasadyar_core/core.dart';
+
+import 'poultry_science_remote.dart';
+
+class PoultryScienceRemoteDatasourceImp implements PoultryScienceRemoteDatasource {
+ final DioRemote _httpClient;
+
+ PoultryScienceRemoteDatasourceImp(this._httpClient);
+
+ @override
+ Future getHomePoultryScience({
+ required String token,
+ required String type,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry_and_hatching_for_poultry_science/',
+ queryParameters: {'type': type},
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => HomePoultryScienceModel.fromJson(json),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future?> getHatchingPoultry({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry_and_hatching_for_poultry_science/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => HatchingModel.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future submitPoultryScienceReport({
+ required String token,
+ required FormData data,
+ ProgressCallback? onSendProgress,
+ }) async {
+ await _httpClient.post(
+ '/poultry_science_report/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: data,
+ onSendProgress: onSendProgress,
+ );
+ }
+
+ @override
+ Future?> getPoultryScienceReport({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry_science_report/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => HatchingReport.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getPoultryScienceFarmList({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry_and_hatching_for_poultry_science/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => PoultryFarm.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ //region kill Registration
+ @override
+ Future getApprovedPrice({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/approved-price/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => ApprovedPrice.fromJson(json),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getAllPoultry({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/get-all-poultry/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJsonList: (json) =>
+ json.map((e) => AllPoultry.fromJson(e as Map)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future getPoultryExport({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry-export/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PoultryExport.fromJson(json),
+ );
+ return res.data;
+ }
+
+ @override
+ Future getSellForFreezing({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/sell-for-freezing/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => SellForFreezing.fromJson(json),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getUserPoultry({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/Poultry/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJsonList: (json) => json.map((e) => KillRequestPoultry.fromJson(e)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getPoultryHatching({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/poultry_hatching/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJsonList: (json) => json.map((e) => PoultryHatching.fromJson(e)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getKillHouseList({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/kill_house_list/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJsonList: (json) => json.map((e) => KillHousePoultry.fromJson(e)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future submitKillRegistration({
+ required String token,
+ required KillRegistrationRequest request,
+ }) async {
+ await _httpClient.post(
+ '/Poultry_Request/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: request.toJson(),
+ );
+ }
+
+ @override
+ Future?> getPoultryOderList({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/Poultry_Request/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (data) => PoultryOrder.fromJson(data as Map),
+ ),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future deletePoultryOder({required String token, required String orderId}) async {
+ await _httpClient.delete(
+ '/Poultry_Request/$orderId/',
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ //endregion
+}
diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart
index d85f410..f8e4ad3 100644
--- a/packages/chicken/lib/data/di/chicken_di.dart
+++ b/packages/chicken/lib/data/di/chicken_di.dart
@@ -1,74 +1,164 @@
import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
+import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart';
+import 'package:rasadyar_chicken/data/data_source/local/chicken_local_imp.dart';
import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart';
import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote_imp.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote_imp.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote_impl.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote_imp.dart';
+import 'package:rasadyar_chicken/data/repositories/auth/auth_repository.dart';
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart';
+import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository.dart';
+import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository_imp.dart';
+import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart';
+import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository_impl.dart';
+import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart';
+import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository_imp.dart';
import 'package:rasadyar_core/core.dart';
-GetIt diChicken = GetIt.instance;
+GetIt diChicken = GetIt.asNewInstance();
Future setupChickenDI() async {
+ if (diChicken.isRegistered()) {
+ await diChicken.unregister();
+ }
diChicken.registerSingleton(DioErrorHandler());
+
var tokenService = Get.find();
+ tokenService.getBaseUrl(Module.chicken);
diChicken.registerLazySingleton(
() => AppInterceptor(
- //فعلا سامانه مرغ برای رفرش توکن چیزی ندارد
+ // سامانه مرغ فعلاً رفرش توکن ندارد
refreshTokenCallback: () async => null,
saveTokenCallback: (String newToken) async {
- await tokenService.saveAccessToken(newToken);
+ await tokenService.saveAccessToken(Module.chicken, newToken);
},
clearTokenCallback: () async {
- await tokenService.deleteTokens();
+ await tokenService.deleteModuleTokens(Module.chicken);
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
},
),
instanceName: 'chickenInterceptor',
);
+ var baseUrl = tokenService.baseurl.value;
+
diChicken.registerLazySingleton(
- () =>
- DioRemote(interceptors: diChicken.get(instanceName: 'chickenInterceptor')),
+ () => DioRemote(
+ baseUrl: baseUrl,
+ interceptors: diChicken.get(instanceName: 'chickenInterceptor'),
+ ),
);
final dioRemote = diChicken.get();
await dioRemote.init();
- diChicken.registerLazySingleton(
- () => AuthRemoteDataSourceImp(diChicken.get()),
+ diChicken.registerLazySingleton(() => AuthRemoteDataSourceImp(dioRemote));
+
+ diChicken.registerLazySingleton(
+ () => AuthRepositoryImpl(diChicken.get()),
);
- diChicken.registerLazySingleton(
- () => AuthRepositoryImpl(diChicken.get()),
+ diChicken.registerLazySingleton