diff --git a/.github/workflows/azure-static-web-apps-zealous-mushroom-0d31a3303.yml b/.github/workflows/azure-static-web-apps-zealous-mushroom-0d31a3303.yml
new file mode 100644
index 00000000..b8d576b9
--- /dev/null
+++ b/.github/workflows/azure-static-web-apps-zealous-mushroom-0d31a3303.yml
@@ -0,0 +1,60 @@
+name: Azure Static Web Apps CI/CD
+
+on:
+ push:
+ branches:
+ - dev
+ pull_request:
+ types: [opened, synchronize, reopened, closed]
+ branches:
+ - dev
+
+jobs:
+ build_and_deploy_job:
+ if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
+ runs-on: ubuntu-latest
+ name: Build and Deploy Job
+ steps:
+
+ - name: Checkout Code
+ uses: actions/checkout@v3
+ with:
+ submodules: true
+ lfs: false
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.22.2' # Specify the Flutter version you want to use
+
+ - name: Install dependencies
+ run: flutter pub get
+
+ - name: Build Flutter Web App
+ run: flutter build web
+
+ - name: Build And Deploy
+ id: builddeploy
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ZEALOUS_MUSHROOM_0D31A3303 }}
+ repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
+ action: "upload"
+ ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
+ # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
+ app_location: "/build/web" # App source code path
+ api_location: "" # Api source code path - optional
+ output_location: "/build/web" # Built app content directory - optional
+ ###### End of Repository/Build Configurations ######
+
+ close_pull_request_job:
+ if: github.event_name == 'pull_request' && github.event.action == 'closed'
+ runs-on: ubuntu-latest
+ name: Close Pull Request Job
+ steps:
+ - name: Close Pull Request
+ id: closepullrequest
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ZEALOUS_MUSHROOM_0D31A3303 }}
+ action: "close"
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 0d290213..2e349a87 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -7,6 +7,9 @@
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
+analyzer:
+ errors:
+ constant_identifier_names: ignore
include: package:flutter_lints/flutter.yaml
linter:
diff --git a/assets/fonts/fonnts.com-AftikaBlack.ttf b/assets/fonts/fonnts.com-AftikaBlack.ttf
new file mode 100644
index 00000000..538c917d
Binary files /dev/null and b/assets/fonts/fonnts.com-AftikaBlack.ttf differ
diff --git a/assets/fonts/fonnts.com-AftikaBold.ttf b/assets/fonts/fonnts.com-AftikaBold.ttf
new file mode 100644
index 00000000..2ff73322
Binary files /dev/null and b/assets/fonts/fonnts.com-AftikaBold.ttf differ
diff --git a/assets/fonts/fonnts.com-AftikaRegular.ttf b/assets/fonts/fonnts.com-AftikaRegular.ttf
new file mode 100644
index 00000000..5ca4dc50
Binary files /dev/null and b/assets/fonts/fonnts.com-AftikaRegular.ttf differ
diff --git a/assets/icons/3GangSwitch.svg b/assets/icons/3GangSwitch.svg
new file mode 100644
index 00000000..ecb9992b
--- /dev/null
+++ b/assets/icons/3GangSwitch.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/icons/AC.svg b/assets/icons/AC.svg
new file mode 100644
index 00000000..92f6fc59
--- /dev/null
+++ b/assets/icons/AC.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/Curtain.svg b/assets/icons/Curtain.svg
new file mode 100644
index 00000000..a2e4f235
--- /dev/null
+++ b/assets/icons/Curtain.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/icons/Gateway.svg b/assets/icons/Gateway.svg
new file mode 100644
index 00000000..e293999e
--- /dev/null
+++ b/assets/icons/Gateway.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/icons/Light.svg b/assets/icons/Light.svg
new file mode 100644
index 00000000..c8cfff59
--- /dev/null
+++ b/assets/icons/Light.svg
@@ -0,0 +1,15 @@
+
diff --git a/assets/icons/ac_air.svg b/assets/icons/ac_air.svg
new file mode 100644
index 00000000..3c4fff0d
--- /dev/null
+++ b/assets/icons/ac_air.svg
@@ -0,0 +1,67 @@
+
diff --git a/assets/icons/ac_cooling.svg b/assets/icons/ac_cooling.svg
new file mode 100644
index 00000000..e95c0d4e
--- /dev/null
+++ b/assets/icons/ac_cooling.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/ac_device.svg b/assets/icons/ac_device.svg
new file mode 100644
index 00000000..d5fbe2a6
--- /dev/null
+++ b/assets/icons/ac_device.svg
@@ -0,0 +1,15 @@
+
diff --git a/assets/icons/ac_fan_auto.svg b/assets/icons/ac_fan_auto.svg
new file mode 100644
index 00000000..0acacfef
--- /dev/null
+++ b/assets/icons/ac_fan_auto.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/icons/ac_fan_high.svg b/assets/icons/ac_fan_high.svg
new file mode 100644
index 00000000..d6131531
--- /dev/null
+++ b/assets/icons/ac_fan_high.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/ac_fan_low.svg b/assets/icons/ac_fan_low.svg
new file mode 100644
index 00000000..f4bf56b7
--- /dev/null
+++ b/assets/icons/ac_fan_low.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/ac_fan_middle.svg b/assets/icons/ac_fan_middle.svg
new file mode 100644
index 00000000..ee940238
--- /dev/null
+++ b/assets/icons/ac_fan_middle.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/ac_heating.svg b/assets/icons/ac_heating.svg
new file mode 100644
index 00000000..47a160c8
--- /dev/null
+++ b/assets/icons/ac_heating.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/ac_power.svg b/assets/icons/ac_power.svg
new file mode 100644
index 00000000..cc2127f0
--- /dev/null
+++ b/assets/icons/ac_power.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/ac_power_off.svg b/assets/icons/ac_power_off.svg
new file mode 100644
index 00000000..70f7f9aa
--- /dev/null
+++ b/assets/icons/ac_power_off.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/ac_sun.svg b/assets/icons/ac_sun.svg
new file mode 100644
index 00000000..33c7e01a
--- /dev/null
+++ b/assets/icons/ac_sun.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/automation_functions/card_unlock.svg b/assets/icons/automation_functions/card_unlock.svg
new file mode 100644
index 00000000..dd77680a
--- /dev/null
+++ b/assets/icons/automation_functions/card_unlock.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/automation_functions/current_temp.svg b/assets/icons/automation_functions/current_temp.svg
new file mode 100644
index 00000000..42cceb23
--- /dev/null
+++ b/assets/icons/automation_functions/current_temp.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/automation_functions/doorbell.svg b/assets/icons/automation_functions/doorbell.svg
new file mode 100644
index 00000000..1dc515a9
--- /dev/null
+++ b/assets/icons/automation_functions/doorbell.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/icons/automation_functions/doorlock_normal_open.svg b/assets/icons/automation_functions/doorlock_normal_open.svg
new file mode 100644
index 00000000..8f4a5901
--- /dev/null
+++ b/assets/icons/automation_functions/doorlock_normal_open.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/automation_functions/double_lock.svg b/assets/icons/automation_functions/double_lock.svg
new file mode 100644
index 00000000..d8ad971d
--- /dev/null
+++ b/assets/icons/automation_functions/double_lock.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/automation_functions/fingerprint_unlock.svg b/assets/icons/automation_functions/fingerprint_unlock.svg
new file mode 100644
index 00000000..f9f5b84c
--- /dev/null
+++ b/assets/icons/automation_functions/fingerprint_unlock.svg
@@ -0,0 +1,79 @@
+
diff --git a/assets/icons/automation_functions/hijack_alarm.svg b/assets/icons/automation_functions/hijack_alarm.svg
new file mode 100644
index 00000000..e32997fb
--- /dev/null
+++ b/assets/icons/automation_functions/hijack_alarm.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/icons/automation_functions/lock_alarm.svg b/assets/icons/automation_functions/lock_alarm.svg
new file mode 100644
index 00000000..8bd2deeb
--- /dev/null
+++ b/assets/icons/automation_functions/lock_alarm.svg
@@ -0,0 +1,149 @@
+
diff --git a/assets/icons/automation_functions/motion.svg b/assets/icons/automation_functions/motion.svg
new file mode 100644
index 00000000..8d69463b
--- /dev/null
+++ b/assets/icons/automation_functions/motion.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/automation_functions/password_unlock.svg b/assets/icons/automation_functions/password_unlock.svg
new file mode 100644
index 00000000..1920b69f
--- /dev/null
+++ b/assets/icons/automation_functions/password_unlock.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/automation_functions/presence.svg b/assets/icons/automation_functions/presence.svg
new file mode 100644
index 00000000..d71a474d
--- /dev/null
+++ b/assets/icons/automation_functions/presence.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/automation_functions/presence_state.svg b/assets/icons/automation_functions/presence_state.svg
new file mode 100644
index 00000000..d5de48e1
--- /dev/null
+++ b/assets/icons/automation_functions/presence_state.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/automation_functions/remote_unlock_req.svg b/assets/icons/automation_functions/remote_unlock_req.svg
new file mode 100644
index 00000000..da128ff7
--- /dev/null
+++ b/assets/icons/automation_functions/remote_unlock_req.svg
@@ -0,0 +1,15 @@
+
diff --git a/assets/icons/automation_functions/remote_unlock_via_app.svg b/assets/icons/automation_functions/remote_unlock_via_app.svg
new file mode 100644
index 00000000..39fc859b
--- /dev/null
+++ b/assets/icons/automation_functions/remote_unlock_via_app.svg
@@ -0,0 +1,40 @@
+
diff --git a/assets/icons/automation_functions/residual_electricity.svg b/assets/icons/automation_functions/residual_electricity.svg
new file mode 100644
index 00000000..6a5b6127
--- /dev/null
+++ b/assets/icons/automation_functions/residual_electricity.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/automation_functions/self_test_result.svg b/assets/icons/automation_functions/self_test_result.svg
new file mode 100644
index 00000000..8739327b
--- /dev/null
+++ b/assets/icons/automation_functions/self_test_result.svg
@@ -0,0 +1,23 @@
+
diff --git a/assets/icons/automation_functions/temp_password_unlock.svg b/assets/icons/automation_functions/temp_password_unlock.svg
new file mode 100644
index 00000000..98d7573c
--- /dev/null
+++ b/assets/icons/automation_functions/temp_password_unlock.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/bathroom.svg b/assets/icons/bathroom.svg
new file mode 100644
index 00000000..51fc8b6a
--- /dev/null
+++ b/assets/icons/bathroom.svg
@@ -0,0 +1,29 @@
+
diff --git a/assets/icons/bedroom.svg b/assets/icons/bedroom.svg
new file mode 100644
index 00000000..d579b003
--- /dev/null
+++ b/assets/icons/bedroom.svg
@@ -0,0 +1,34 @@
+
diff --git a/assets/icons/celsius_degrees.svg b/assets/icons/celsius_degrees.svg
new file mode 100644
index 00000000..7acbd6e7
--- /dev/null
+++ b/assets/icons/celsius_degrees.svg
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/assets/icons/child_lock.svg b/assets/icons/child_lock.svg
new file mode 100644
index 00000000..6b0138bf
--- /dev/null
+++ b/assets/icons/child_lock.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/doorLock.svg b/assets/icons/doorLock.svg
new file mode 100644
index 00000000..6f27673f
--- /dev/null
+++ b/assets/icons/doorLock.svg
@@ -0,0 +1,24 @@
+
diff --git a/assets/icons/door_un_look_ic.svg b/assets/icons/door_un_look_ic.svg
new file mode 100644
index 00000000..b647ec84
--- /dev/null
+++ b/assets/icons/door_un_look_ic.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/icons/dyi.svg b/assets/icons/dyi.svg
new file mode 100644
index 00000000..7da61e8e
--- /dev/null
+++ b/assets/icons/dyi.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/factory_reset.svg b/assets/icons/factory_reset.svg
new file mode 100644
index 00000000..7a47f24b
--- /dev/null
+++ b/assets/icons/factory_reset.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/fan_speed.svg b/assets/icons/fan_speed.svg
new file mode 100644
index 00000000..07a48834
--- /dev/null
+++ b/assets/icons/fan_speed.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/far_detection.svg b/assets/icons/far_detection.svg
new file mode 100644
index 00000000..2827d94a
--- /dev/null
+++ b/assets/icons/far_detection.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/far_detection_function.svg b/assets/icons/far_detection_function.svg
new file mode 100644
index 00000000..894b84ed
--- /dev/null
+++ b/assets/icons/far_detection_function.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/icons/freezing.svg b/assets/icons/freezing.svg
new file mode 100644
index 00000000..6c02f2e4
--- /dev/null
+++ b/assets/icons/freezing.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/help_description_ic.svg b/assets/icons/help_description_ic.svg
new file mode 100644
index 00000000..5f86b69b
--- /dev/null
+++ b/assets/icons/help_description_ic.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/icons/illuminance_record_ic.svg b/assets/icons/illuminance_record_ic.svg
new file mode 100644
index 00000000..a92935ff
--- /dev/null
+++ b/assets/icons/illuminance_record_ic.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/indicator.svg b/assets/icons/indicator.svg
new file mode 100644
index 00000000..b58a976e
--- /dev/null
+++ b/assets/icons/indicator.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/light_countdown.svg b/assets/icons/light_countdown.svg
new file mode 100644
index 00000000..94f65b9a
--- /dev/null
+++ b/assets/icons/light_countdown.svg
@@ -0,0 +1,42 @@
+
diff --git a/assets/icons/light_pulb.svg b/assets/icons/light_pulb.svg
new file mode 100644
index 00000000..c442fdaf
--- /dev/null
+++ b/assets/icons/light_pulb.svg
@@ -0,0 +1,37 @@
+
diff --git a/assets/icons/lockIcon.svg b/assets/icons/lockIcon.svg
new file mode 100644
index 00000000..a78161ca
--- /dev/null
+++ b/assets/icons/lockIcon.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/icons/master_state.svg b/assets/icons/master_state.svg
new file mode 100644
index 00000000..0aafae1a
--- /dev/null
+++ b/assets/icons/master_state.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/motion_detection.svg b/assets/icons/motion_detection.svg
new file mode 100644
index 00000000..a9b2d685
--- /dev/null
+++ b/assets/icons/motion_detection.svg
@@ -0,0 +1,21 @@
+
diff --git a/assets/icons/motionless_detection.svg b/assets/icons/motionless_detection.svg
new file mode 100644
index 00000000..25a767c1
--- /dev/null
+++ b/assets/icons/motionless_detection.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/nobody_time.svg b/assets/icons/nobody_time.svg
new file mode 100644
index 00000000..df80b517
--- /dev/null
+++ b/assets/icons/nobody_time.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/office.svg b/assets/icons/office.svg
new file mode 100644
index 00000000..03a2badd
--- /dev/null
+++ b/assets/icons/office.svg
@@ -0,0 +1,40 @@
+
diff --git a/assets/icons/parlour.svg b/assets/icons/parlour.svg
new file mode 100644
index 00000000..3298393a
--- /dev/null
+++ b/assets/icons/parlour.svg
@@ -0,0 +1,30 @@
+
diff --git a/assets/icons/presence_record_ic.svg b/assets/icons/presence_record_ic.svg
new file mode 100644
index 00000000..0bc133f7
--- /dev/null
+++ b/assets/icons/presence_record_ic.svg
@@ -0,0 +1,22 @@
+
diff --git a/assets/icons/reset_off.svg b/assets/icons/reset_off.svg
new file mode 100644
index 00000000..eac88f2b
--- /dev/null
+++ b/assets/icons/reset_off.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/scene_child_lock.svg b/assets/icons/scene_child_lock.svg
new file mode 100644
index 00000000..7e56164a
--- /dev/null
+++ b/assets/icons/scene_child_lock.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/scene_child_unlock.svg b/assets/icons/scene_child_unlock.svg
new file mode 100644
index 00000000..4eafbdea
--- /dev/null
+++ b/assets/icons/scene_child_unlock.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/icons/scene_refresh.svg b/assets/icons/scene_refresh.svg
new file mode 100644
index 00000000..c54ffb04
--- /dev/null
+++ b/assets/icons/scene_refresh.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/sensitivity.svg b/assets/icons/sensitivity.svg
new file mode 100644
index 00000000..b75ebd3e
--- /dev/null
+++ b/assets/icons/sensitivity.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/sensor_motion_ic.svg b/assets/icons/sensor_motion_ic.svg
new file mode 100644
index 00000000..ceb4080a
--- /dev/null
+++ b/assets/icons/sensor_motion_ic.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/sensor_presence_ic.svg b/assets/icons/sensor_presence_ic.svg
new file mode 100644
index 00000000..e30b109c
--- /dev/null
+++ b/assets/icons/sensor_presence_ic.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/icons/sensor_vacant_ic.svg b/assets/icons/sensor_vacant_ic.svg
new file mode 100644
index 00000000..8ee00e79
--- /dev/null
+++ b/assets/icons/sensor_vacant_ic.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/sensors.svg b/assets/icons/sensors.svg
new file mode 100644
index 00000000..7fbb1506
--- /dev/null
+++ b/assets/icons/sensors.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/icons/sesitivity_operation_icon.svg b/assets/icons/sesitivity_operation_icon.svg
new file mode 100644
index 00000000..612148c5
--- /dev/null
+++ b/assets/icons/sesitivity_operation_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/switch_alarm_sound.svg b/assets/icons/switch_alarm_sound.svg
new file mode 100644
index 00000000..db645338
--- /dev/null
+++ b/assets/icons/switch_alarm_sound.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/tempreture.svg b/assets/icons/tempreture.svg
new file mode 100644
index 00000000..448083a7
--- /dev/null
+++ b/assets/icons/tempreture.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/Background.png b/assets/images/Background.png
new file mode 100644
index 00000000..02529ba3
Binary files /dev/null and b/assets/images/Background.png differ
diff --git a/assets/images/Integrations_icon.svg b/assets/images/Integrations_icon.svg
new file mode 100644
index 00000000..e3ef7e16
--- /dev/null
+++ b/assets/images/Integrations_icon.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/Logo.svg b/assets/images/Logo.svg
new file mode 100644
index 00000000..0a592c03
--- /dev/null
+++ b/assets/images/Logo.svg
@@ -0,0 +1,38 @@
+
diff --git a/assets/images/Password_invisible.svg b/assets/images/Password_invisible.svg
new file mode 100644
index 00000000..bb190eb3
--- /dev/null
+++ b/assets/images/Password_invisible.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/Vector.png b/assets/images/Vector.png
new file mode 100644
index 00000000..c105e7e3
Binary files /dev/null and b/assets/images/Vector.png differ
diff --git a/assets/images/access_icon.svg b/assets/images/access_icon.svg
new file mode 100644
index 00000000..d04fa641
--- /dev/null
+++ b/assets/images/access_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/asset_icon.svg b/assets/images/asset_icon.svg
new file mode 100644
index 00000000..b7649b97
--- /dev/null
+++ b/assets/images/asset_icon.svg
@@ -0,0 +1,32 @@
+
diff --git a/assets/images/black-logo.png b/assets/images/black-logo.png
new file mode 100644
index 00000000..0d42805c
Binary files /dev/null and b/assets/images/black-logo.png differ
diff --git a/assets/images/calendar_icon.svg b/assets/images/calendar_icon.svg
new file mode 100644
index 00000000..bdf23bee
--- /dev/null
+++ b/assets/images/calendar_icon.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/images/construction_Icon.svg b/assets/images/construction_Icon.svg
new file mode 100644
index 00000000..7efad965
--- /dev/null
+++ b/assets/images/construction_Icon.svg
@@ -0,0 +1,31 @@
+
diff --git a/assets/images/device_note.svg b/assets/images/device_note.svg
new file mode 100644
index 00000000..f0b94043
--- /dev/null
+++ b/assets/images/device_note.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/devices_icon.svg b/assets/images/devices_icon.svg
new file mode 100644
index 00000000..fbe784d1
--- /dev/null
+++ b/assets/images/devices_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/empty_table.svg b/assets/images/empty_table.svg
new file mode 100644
index 00000000..24ac359d
--- /dev/null
+++ b/assets/images/empty_table.svg
@@ -0,0 +1,23 @@
+
diff --git a/assets/images/energy_icon.svg b/assets/images/energy_icon.svg
new file mode 100644
index 00000000..cd4ebbf9
--- /dev/null
+++ b/assets/images/energy_icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/facebook.svg b/assets/images/facebook.svg
new file mode 100644
index 00000000..929d3861
--- /dev/null
+++ b/assets/images/facebook.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/google.svg b/assets/images/google.svg
new file mode 100644
index 00000000..27788e84
--- /dev/null
+++ b/assets/images/google.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/images/grid.svg b/assets/images/grid.svg
new file mode 100644
index 00000000..f3e41133
--- /dev/null
+++ b/assets/images/grid.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/images/lift_line.png b/assets/images/lift_line.png
new file mode 100644
index 00000000..8dacf6d7
Binary files /dev/null and b/assets/images/lift_line.png differ
diff --git a/assets/images/login_logo.svg b/assets/images/login_logo.svg
new file mode 100644
index 00000000..0e5f7681
--- /dev/null
+++ b/assets/images/login_logo.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/images/logo_horizontal.png b/assets/images/logo_horizontal.png
new file mode 100644
index 00000000..2d29681a
Binary files /dev/null and b/assets/images/logo_horizontal.png differ
diff --git a/assets/images/movein_icon.svg b/assets/images/movein_icon.svg
new file mode 100644
index 00000000..7cf319bc
--- /dev/null
+++ b/assets/images/movein_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/password_visible.svg b/assets/images/password_visible.svg
new file mode 100644
index 00000000..25c55434
--- /dev/null
+++ b/assets/images/password_visible.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/right_line.png b/assets/images/right_line.png
new file mode 100644
index 00000000..805d1c0a
Binary files /dev/null and b/assets/images/right_line.png differ
diff --git a/assets/images/spase_management_icon.svg b/assets/images/spase_management_icon.svg
new file mode 100644
index 00000000..0a52816c
--- /dev/null
+++ b/assets/images/spase_management_icon.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/time_icon.svg b/assets/images/time_icon.svg
new file mode 100644
index 00000000..a8f06677
--- /dev/null
+++ b/assets/images/time_icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/web_Background.svg b/assets/images/web_Background.svg
new file mode 100644
index 00000000..11c967e0
--- /dev/null
+++ b/assets/images/web_Background.svg
@@ -0,0 +1,323 @@
+
diff --git a/assets/images/white-logo.png b/assets/images/white-logo.png
new file mode 100644
index 00000000..2e73e35b
Binary files /dev/null and b/assets/images/white-logo.png differ
diff --git a/devtools_options.yaml b/devtools_options.yaml
new file mode 100644
index 00000000..6ee932ce
--- /dev/null
+++ b/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:
+ - provider: true
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee8..ec97fc6f 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 592ceee8..c4855bfe 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 00000000..d97f17e2
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 00000000..85fd7a99
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,36 @@
+PODS:
+ - Flutter (1.0.0)
+ - flutter_secure_storage (6.0.0):
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+
+DEPENDENCIES:
+ - Flutter (from `Flutter`)
+ - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+
+EXTERNAL SOURCES:
+ Flutter:
+ :path: Flutter
+ flutter_secure_storage:
+ :path: ".symlinks/plugins/flutter_secure_storage/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+
+SPEC CHECKSUMS:
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+
+PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
+
+COCOAPODS: 1.15.2
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 6094b4c6..dffe452f 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -14,6 +14,8 @@
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ E44A9405B1EB1B638DD05A58 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ABF0EC746A2D686A0ED574F /* Pods_RunnerTests.framework */; };
+ FF49F60EC38658783D8D66DA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AFAE479A87ECDEBD5D6EB30 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -42,12 +44,19 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 22428D486F110EE0B969469D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 253C5EA6840355311DB030EA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 2AFAE479A87ECDEBD5D6EB30 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2C0D722D2ED971BF672D18D5 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 544621C7727C798253BAB2C8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7ABF0EC746A2D686A0ED574F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 877FDC97D8B87080E35B3EB7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -55,19 +64,52 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D3AD250AADBF93406007C9EB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
+ 759A57780A409ED209817654 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44A9405B1EB1B638DD05A58 /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ FF49F60EC38658783D8D66DA /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 1454C118FFCECEEDF59152D2 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 253C5EA6840355311DB030EA /* Pods-Runner.debug.xcconfig */,
+ 22428D486F110EE0B969469D /* Pods-Runner.release.xcconfig */,
+ D3AD250AADBF93406007C9EB /* Pods-Runner.profile.xcconfig */,
+ 2C0D722D2ED971BF672D18D5 /* Pods-RunnerTests.debug.xcconfig */,
+ 877FDC97D8B87080E35B3EB7 /* Pods-RunnerTests.release.xcconfig */,
+ 544621C7727C798253BAB2C8 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ name = Pods;
+ path = Pods;
+ sourceTree = "";
+ };
+ 20A3C64D2B1CFED5A81C3251 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 2AFAE479A87ECDEBD5D6EB30 /* Pods_Runner.framework */,
+ 7ABF0EC746A2D686A0ED574F /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
@@ -94,6 +136,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
+ 1454C118FFCECEEDF59152D2 /* Pods */,
+ 20A3C64D2B1CFED5A81C3251 /* Frameworks */,
);
sourceTree = "";
};
@@ -128,8 +172,10 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
+ B9A66CAAF434B6A1BD8C4E09 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
+ 759A57780A409ED209817654 /* Frameworks */,
);
buildRules = (
);
@@ -145,12 +191,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ C1C48B0232C0B26BFF405512 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 33590C9CD073D3D5EBA02CDE /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -222,6 +270,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 33590C9CD073D3D5EBA02CDE /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -253,6 +318,50 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ B9A66CAAF434B6A1BD8C4E09 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ C1C48B0232C0B26BFF405512 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -378,6 +487,7 @@
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 2C0D722D2ED971BF672D18D5 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -395,6 +505,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 877FDC97D8B87080E35B3EB7 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -410,6 +521,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 544621C7727C798253BAB2C8 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
index 1d526a16..21a3cc14 100644
--- a/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -4,4 +4,7 @@
+
+
diff --git a/lib/core/extension/build_context_x.dart b/lib/core/extension/build_context_x.dart
new file mode 100644
index 00000000..50bc5972
--- /dev/null
+++ b/lib/core/extension/build_context_x.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+
+extension BuildContextExt on BuildContext {
+ ThemeData get theme => Theme.of(this);
+
+ TextTheme get textTheme => Theme.of(this).textTheme;
+
+ AppBarTheme get appBarTheme => Theme.of(this).appBarTheme;
+
+ Size get screenSize => MediaQuery.of(this).size;
+
+ double get screenWidth => MediaQuery.of(this).size.width;
+
+ double get screenHeight => MediaQuery.of(this).size.height;
+
+ double get textScale => MediaQuery.textScalerOf(this).scale(1);
+}
diff --git a/lib/core/theme/app_theme.dart b/lib/core/theme/app_theme.dart
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/lib/core/theme/app_theme.dart
@@ -0,0 +1 @@
+
diff --git a/lib/main.dart b/lib/main.dart
index ace34de6..90c643cc 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,126 +1,74 @@
+import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
-import 'package:syncrow_web/pages/auth/view/login_page.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart';
+import 'package:syncrow_web/pages/home/bloc/home_bloc.dart';
+import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart';
+import 'package:go_router/go_router.dart';
+import 'package:syncrow_web/services/locator.dart';
+import 'package:syncrow_web/utils/app_routes.dart';
+import 'package:syncrow_web/utils/color_manager.dart';
+import 'package:syncrow_web/utils/constants/routes_const.dart';
-void main() {
- runApp(const MyApp());
+Future main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ initialSetup();
+ String checkToken = await AuthBloc.getTokenAndValidate();
+ GoRouter router = GoRouter(
+ initialLocation: checkToken == 'Success' ? RoutesConst.home : RoutesConst.auth,
+ routes: AppRoutes.getRoutes(),
+ );
+ runApp(MyApp(
+ router: router,
+ ));
}
class MyApp extends StatelessWidget {
- const MyApp({super.key});
-
- // This widget is the root of your application.
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- title: 'Flutter Demo',
- theme: ThemeData(
- // This is the theme of your application.
- //
- // TRY THIS: Try running your application with "flutter run". You'll see
- // the application has a purple toolbar. Then, without quitting the app,
- // try changing the seedColor in the colorScheme below to Colors.green
- // and then invoke "hot reload" (save your changes or press the "hot
- // reload" button in a Flutter-supported IDE, or press "r" if you used
- // the command line to start the app).
- //
- // Notice that the counter didn't reset back to zero; the application
- // state is not lost during the reload. To reset the state, use hot
- // restart instead.
- //
- // This works for code too, not just values: Most code changes can be
- // tested with just a hot reload.
- colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
- useMaterial3: true,
- ),
- home: LoginPage(),
- );
- }
-}
-
-class MyHomePage extends StatefulWidget {
- const MyHomePage({super.key, required this.title});
-
- // This widget is the home page of your application. It is stateful, meaning
- // that it has a State object (defined below) that contains fields that affect
- // how it looks.
-
- // This class is the configuration for the state. It holds the values (in this
- // case the title) provided by the parent (in this case the App widget) and
- // used by the build method of the State. Fields in a Widget subclass are
- // always marked "final".
-
- final String title;
-
- @override
- State createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State {
- int _counter = 0;
-
- void _incrementCounter() {
- setState(() {
- // This call to setState tells the Flutter framework that something has
- // changed in this State, which causes it to rerun the build method below
- // so that the display can reflect the updated values. If we changed
- // _counter without calling setState(), then the build method would not be
- // called again, and so nothing would appear to happen.
- _counter++;
- });
- }
+ final GoRouter router;
+ const MyApp({
+ super.key,
+ required this.router,
+ });
@override
Widget build(BuildContext context) {
- // This method is rerun every time setState is called, for instance as done
- // by the _incrementCounter method above.
- //
- // The Flutter framework has been optimized to make rerunning build methods
- // fast, so that you can just rebuild anything that needs updating rather
- // than having to individually change instances of widgets.
- return Scaffold(
- appBar: AppBar(
- // TRY THIS: Try changing the color here to a specific color (to
- // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
- // change color while the other colors stay the same.
- backgroundColor: Theme.of(context).colorScheme.inversePrimary,
- // Here we take the value from the MyHomePage object that was created by
- // the App.build method, and use it to set our appbar title.
- title: Text(widget.title),
- ),
- body: Center(
- // Center is a layout widget. It takes a single child and positions it
- // in the middle of the parent.
- child: Column(
- // Column is also a layout widget. It takes a list of children and
- // arranges them vertically. By default, it sizes itself to fit its
- // children horizontally, and tries to be as tall as its parent.
- //
- // Column has various properties to control how it sizes itself and
- // how it positions its children. Here we use mainAxisAlignment to
- // center the children vertically; the main axis here is the vertical
- // axis because Columns are vertical (the cross axis would be
- // horizontal).
- //
- // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
- // action in the IDE, or press "p" in the console), to see the
- // wireframe for each widget.
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- const Text(
- 'You have pushed the button this many times:',
+ return MultiBlocProvider(
+ providers: [
+ BlocProvider(create: (context) => HomeBloc()),
+ BlocProvider(
+ create: (context) => VisitorPasswordBloc(),
+ )
+ ],
+ child: MaterialApp.router(
+ debugShowCheckedModeBanner: false, // Hide debug banner
+ scrollBehavior: const MaterialScrollBehavior().copyWith(
+ dragDevices: {
+ PointerDeviceKind.mouse,
+ PointerDeviceKind.touch,
+ PointerDeviceKind.stylus,
+ PointerDeviceKind.unknown,
+ },
+ ),
+
+ theme: ThemeData(
+ fontFamily: 'Aftika',
+ textTheme: const TextTheme(
+ bodySmall: TextStyle(
+ fontSize: 13, color: ColorsManager.whiteColors, fontWeight: FontWeight.bold),
+ bodyMedium: TextStyle(color: Colors.black87, fontSize: 14),
+ bodyLarge: TextStyle(fontSize: 16, color: Colors.white),
+ headlineSmall: TextStyle(color: Colors.black87, fontSize: 18),
+ headlineMedium: TextStyle(color: Colors.black87, fontSize: 20),
+ headlineLarge: TextStyle(
+ color: Colors.white,
+ fontSize: 24,
+ fontWeight: FontWeight.bold,
+ ),
),
- Text(
- '$_counter',
- style: Theme.of(context).textTheme.headlineMedium,
- ),
- ],
- ),
- ),
- floatingActionButton: FloatingActionButton(
- onPressed: _incrementCounter,
- tooltip: 'Increment',
- child: const Icon(Icons.add),
- ), // This trailing comma makes auto-formatting nicer for build methods.
- );
+ ),
+ routeInformationProvider: router.routeInformationProvider,
+ routerDelegate: router.routerDelegate,
+ routeInformationParser: router.routeInformationParser,
+ ));
}
}
diff --git a/lib/pages/access_management/bloc/access_bloc.dart b/lib/pages/access_management/bloc/access_bloc.dart
new file mode 100644
index 00000000..473d19bd
--- /dev/null
+++ b/lib/pages/access_management/bloc/access_bloc.dart
@@ -0,0 +1,234 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:syncrow_web/pages/access_management/bloc/access_event.dart';
+import 'package:syncrow_web/pages/access_management/bloc/access_state.dart';
+import 'package:syncrow_web/pages/access_management/model/password_model.dart';
+import 'package:syncrow_web/services/access_mang_api.dart';
+import 'package:syncrow_web/utils/color_manager.dart';
+import 'package:syncrow_web/utils/constants/app_enum.dart';
+import 'package:syncrow_web/utils/snack_bar.dart';
+
+class AccessBloc extends Bloc {
+ AccessBloc() : super((AccessInitial())) {
+ on(_onFetchTableData);
+ // on(selectFilterTap);
+ on(selectTime);
+ on(_filterData);
+ on(resetSearch);
+ on(onTabChanged);
+ }
+ String startTime = 'Start Date';
+ String endTime = 'End Date';
+
+ int? effectiveTimeTimeStamp;
+ int? expirationTimeTimeStamp;
+ TextEditingController passwordName = TextEditingController();
+ List filteredData = [];
+ List data = [];
+
+ Future _onFetchTableData(FetchTableData event, Emitter emit) async {
+ try {
+ emit(AccessLoaded());
+ data = await AccessMangApi().fetchVisitorPassword();
+ filteredData = data;
+ updateTabsCount();
+ emit(TableLoaded(data));
+ } catch (e) {
+ emit(FailedState(e.toString()));
+ }
+ }
+
+ void updateTabsCount() {
+ int toBeEffectiveCount =
+ data.where((item) => item.passwordStatus.value == 'To be effective').length;
+ int effectiveCount = data.where((item) => item.passwordStatus.value == 'Effective').length;
+ int expiredCount = data.where((item) => item.passwordStatus.value == 'Expired').length;
+ tabs[1] = 'To Be Effective ($toBeEffectiveCount)';
+ tabs[2] = 'Effective ($effectiveCount)';
+ tabs[3] = 'Expired ($expiredCount)';
+ }
+
+ int selectedIndex = 0;
+ final List tabs = ['All', 'To Be Effective (0)', 'Effective (0)', 'Expired'];
+
+ Future selectFilterTap(TabChangedEvent event, Emitter emit) async {
+ try {
+ emit(AccessLoaded());
+ selectedIndex = event.selectedIndex;
+ emit(AccessInitial());
+ emit(TableLoaded(data));
+ } catch (e) {
+ emit(FailedState(e.toString()));
+ return;
+ }
+ }
+
+ Future selectTime(SelectTime event, Emitter emit) async {
+ emit(AccessLoaded());
+ final DateTime? picked = await showDatePicker(
+ context: event.context,
+ initialDate: DateTime.now(),
+ firstDate: DateTime(2015, 8),
+ lastDate: DateTime(2101),
+ );
+ if (picked != null) {
+ final selectedDateTime = DateTime(
+ picked.year,
+ picked.month,
+ picked.day,
+ );
+ final selectedTimestamp = DateTime(
+ selectedDateTime.year,
+ selectedDateTime.month,
+ selectedDateTime.day,
+ selectedDateTime.hour,
+ selectedDateTime.minute,
+ ).millisecondsSinceEpoch ~/
+ 1000; // Divide by 1000 to remove milliseconds
+ if (event.isStart) {
+ if (expirationTimeTimeStamp != null && selectedTimestamp > expirationTimeTimeStamp!) {
+ CustomSnackBar.displaySnackBar('Effective Time cannot be later than Expiration Time.');
+ } else {
+ startTime =
+ selectedDateTime.toString().split('.').first; // Remove seconds and milliseconds
+ effectiveTimeTimeStamp = selectedTimestamp;
+ }
+ } else {
+ if (effectiveTimeTimeStamp != null && selectedTimestamp < effectiveTimeTimeStamp!) {
+ CustomSnackBar.displaySnackBar('Expiration Time cannot be earlier than Effective Time.');
+ } else {
+ endTime = selectedDateTime.toString().split('.').first; // Remove seconds and milliseconds
+ expirationTimeTimeStamp = selectedTimestamp;
+ }
+ }
+ }
+ emit(ChangeTimeState());
+ }
+
+ Future _filterData(FilterDataEvent event, Emitter emit) async {
+ emit(AccessLoaded());
+ try {
+ filteredData = data.where((item) {
+ bool matchesCriteria = true;
+
+ // Convert timestamp to DateTime and extract date component
+ DateTime effectiveDate =
+ DateTime.fromMillisecondsSinceEpoch(int.parse(item.effectiveTime.toString()) * 1000)
+ .toUtc()
+ .toLocal();
+ DateTime invalidDate =
+ DateTime.fromMillisecondsSinceEpoch(int.parse(item.invalidTime.toString()) * 1000)
+ .toUtc()
+ .toLocal();
+ DateTime effectiveDateOnly =
+ DateTime(effectiveDate.year, effectiveDate.month, effectiveDate.day);
+ DateTime invalidDateOnly = DateTime(invalidDate.year, invalidDate.month, invalidDate.day);
+
+ // Filter by password name
+ if (event.passwordName != null && event.passwordName!.isNotEmpty) {
+ final bool matchesName =
+ item.passwordName != null && item.passwordName.contains(event.passwordName);
+ if (!matchesName) {
+ matchesCriteria = false;
+ }
+ }
+
+ // Filter by start date only
+ if (event.startTime != null && event.endTime == null) {
+ DateTime startDateOnly =
+ DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal();
+ startDateOnly = DateTime(startDateOnly.year, startDateOnly.month, startDateOnly.day);
+ if (effectiveDateOnly.isBefore(startDateOnly)) {
+ matchesCriteria = false;
+ }
+ }
+
+ // Filter by end date only
+ if (event.endTime != null && event.startTime == null) {
+ DateTime endDateOnly =
+ DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal();
+ endDateOnly = DateTime(endDateOnly.year, endDateOnly.month, endDateOnly.day);
+ if (invalidDateOnly.isAfter(endDateOnly)) {
+ matchesCriteria = false;
+ }
+ }
+
+ // Filter by both start date and end date
+ if (event.startTime != null && event.endTime != null) {
+ DateTime startDateOnly =
+ DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal();
+ DateTime endDateOnly =
+ DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal();
+ startDateOnly = DateTime(startDateOnly.year, startDateOnly.month, startDateOnly.day);
+ endDateOnly = DateTime(endDateOnly.year, endDateOnly.month, endDateOnly.day);
+ if (effectiveDateOnly.isBefore(startDateOnly) || invalidDateOnly.isAfter(endDateOnly)) {
+ matchesCriteria = false;
+ }
+ }
+
+ // Filter by selected tab index
+ if (event.selectedTabIndex == 1 && item.passwordStatus.value != 'To be effective') {
+ matchesCriteria = false;
+ } else if (event.selectedTabIndex == 2 && item.passwordStatus.value != 'Effective') {
+ matchesCriteria = false;
+ } else if (event.selectedTabIndex == 3 && item.passwordStatus.value != 'Expired') {
+ matchesCriteria = false;
+ }
+
+ return matchesCriteria;
+ }).toList();
+
+ emit(TableLoaded(filteredData));
+ } catch (e) {
+ emit(FailedState(e.toString()));
+ }
+ }
+
+ resetSearch(ResetSearch event, Emitter emit) async {
+ emit(AccessLoaded());
+ startTime = 'Start Time';
+ endTime = 'End Time';
+ passwordName.clear();
+ selectedIndex = 0;
+ effectiveTimeTimeStamp = null;
+ expirationTimeTimeStamp = null;
+ add(FetchTableData());
+ }
+
+ String timestampToDate(dynamic timestamp) {
+ DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(int.parse(timestamp) * 1000);
+ return "${dateTime.year}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.day.toString().padLeft(2, '0')}";
+ }
+
+ Future onTabChanged(TabChangedEvent event, Emitter emit) async {
+ try {
+ emit(AccessLoaded());
+ selectedIndex = event.selectedIndex;
+ switch (selectedIndex) {
+ case 0: // All
+ filteredData = data;
+ break;
+ case 1: // To Be Effective
+ filteredData =
+ data.where((item) => item.passwordStatus.value == "To Be Effective").toList();
+ break;
+ case 2: // Effective
+ filteredData = data.where((item) => item.passwordStatus.value == "Effective").toList();
+ break;
+ case 3: // Expired
+ filteredData = data.where((item) => item.passwordStatus.value == "Expired").toList();
+ break;
+ default:
+ filteredData = data;
+ }
+ add(FilterDataEvent(
+ selectedTabIndex: selectedIndex,
+ passwordName: passwordName.text.toLowerCase(),
+ startTime: effectiveTimeTimeStamp,
+ endTime: expirationTimeTimeStamp));
+ emit(TableLoaded(filteredData));
+ } catch (e) {
+ emit(FailedState(e.toString()));
+ }
+ }
+}
diff --git a/lib/pages/access_management/bloc/access_event.dart b/lib/pages/access_management/bloc/access_event.dart
new file mode 100644
index 00000000..1bd7dbd3
--- /dev/null
+++ b/lib/pages/access_management/bloc/access_event.dart
@@ -0,0 +1,41 @@
+import 'package:equatable/equatable.dart';
+import 'package:flutter/material.dart';
+
+abstract class AccessEvent extends Equatable {
+ const AccessEvent();
+
+ @override
+ List