diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies
index 04cfffa..b78976d 100644
--- a/.flutter-plugins-dependencies
+++ b/.flutter-plugins-dependencies
@@ -1 +1 @@
-{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.2.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_ios","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_android-2.2.12/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_android-2.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.3/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_macos","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.2.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_macos","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/","native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.2/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"url_launcher_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications_windows-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.2/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"url_launcher_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"web":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.3.3/","dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.0/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_web-2.1.0/","dependencies":[],"dev_dependency":false},{"name":"url_launcher_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_web-2.3.3/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"app_badge_plus","dependencies":[]},{"name":"device_info_plus","dependencies":[]},{"name":"flutter_local_notifications","dependencies":["flutter_local_notifications_linux","flutter_local_notifications_windows"]},{"name":"flutter_local_notifications_linux","dependencies":[]},{"name":"flutter_local_notifications_windows","dependencies":[]},{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_linux","flutter_secure_storage_macos","flutter_secure_storage_web","flutter_secure_storage_windows"]},{"name":"flutter_secure_storage_linux","dependencies":[]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"flutter_secure_storage_windows","dependencies":["path_provider"]},{"name":"flutter_timezone","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2025-03-27 10:47:50.624739","version":"3.29.2","swift_package_manager_enabled":{"ios":false,"macos":false}}
\ No newline at end of file
+{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.2.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_ios","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_android-2.2.12/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_android-2.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_android","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.3/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"app_badge_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/app_badge_plus-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications-19.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_macos","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.2.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_macos","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/","native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.2/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"url_launcher_linux","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"flutter_local_notifications_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_local_notifications_windows-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.2/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"url_launcher_windows","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"web":[{"name":"device_info_plus","path":"/Users/anthony/.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/","dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false},{"name":"flutter_timezone","path":"/Users/anthony/.pub-cache/hosted/pub.dev/flutter_timezone-4.1.1/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/shared_preferences_web-2.1.0/","dependencies":[],"dev_dependency":false},{"name":"url_launcher_web","path":"/Users/anthony/.pub-cache/hosted/pub.dev/url_launcher_web-2.3.3/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"app_badge_plus","dependencies":[]},{"name":"device_info_plus","dependencies":[]},{"name":"flutter_local_notifications","dependencies":["flutter_local_notifications_linux","flutter_local_notifications_windows"]},{"name":"flutter_local_notifications_linux","dependencies":[]},{"name":"flutter_local_notifications_windows","dependencies":[]},{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_linux","flutter_secure_storage_macos","flutter_secure_storage_web","flutter_secure_storage_windows"]},{"name":"flutter_secure_storage_linux","dependencies":[]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"flutter_secure_storage_windows","dependencies":["path_provider"]},{"name":"flutter_timezone","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2025-05-23 15:00:48.065215","version":"3.32.0","swift_package_manager_enabled":{"ios":false,"macos":false}}
\ No newline at end of file
diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml
index be40440..61a0a4a 100644
--- a/.idea/caches/deviceStreaming.xml
+++ b/.idea/caches/deviceStreaming.xml
@@ -15,6 +15,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -41,25 +65,36 @@
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -112,6 +147,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -161,6 +208,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -294,6 +354,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -332,6 +404,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -368,6 +452,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -527,6 +623,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -540,6 +648,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index 5056846..dab2ef7 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -5,30 +5,30 @@
-
+
-
+
-
+
-
+
@@ -49,8 +49,8 @@
+
-
@@ -71,6 +71,7 @@
+
@@ -78,21 +79,28 @@
-
+
+
+
+
+
+
+
+
-
+
-
+
@@ -106,8 +114,8 @@
+
-
@@ -121,14 +129,14 @@
-
+
-
+
@@ -142,7 +150,7 @@
-
+
@@ -156,14 +164,14 @@
-
+
-
+
@@ -191,28 +199,28 @@
-
+
-
+
-
+
-
+
@@ -240,21 +248,28 @@
-
+
-
+
-
+
+
+
+
+
+
+
+
@@ -268,14 +283,14 @@
-
+
-
+
@@ -338,7 +353,7 @@
-
+
@@ -359,14 +374,14 @@
-
+
-
+
@@ -394,7 +409,7 @@
-
+
@@ -415,14 +430,14 @@
-
+
-
+
@@ -436,8 +451,8 @@
-
+
@@ -458,6 +473,7 @@
+
@@ -472,7 +488,7 @@
-
+
@@ -493,7 +509,7 @@
-
+
@@ -507,7 +523,7 @@
-
+
@@ -595,13 +611,6 @@
-
-
-
-
-
-
-
@@ -654,7 +663,7 @@
-
+
@@ -675,7 +684,7 @@
-
+
@@ -710,7 +719,7 @@
-
+
@@ -738,8 +747,8 @@
+
-
@@ -753,30 +762,31 @@
+
-
+
-
+
-
+
@@ -784,6 +794,7 @@
+
@@ -791,6 +802,7 @@
+
@@ -798,6 +810,7 @@
+
@@ -812,7 +825,7 @@
-
+
@@ -910,8 +923,8 @@
+
-
@@ -946,21 +959,21 @@
-
+
-
+
-
+
@@ -985,43 +998,46 @@
-
-
+
+
-
+
-
-
-
+
+
+
+
+
+
-
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
@@ -1029,31 +1045,32 @@
-
+
-
-
+
+
-
+
-
-
+
+
+
-
+
-
+
-
+
@@ -1066,7 +1083,6 @@
-
@@ -1074,32 +1090,36 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
-
+
@@ -1114,14 +1134,14 @@
-
+
-
-
-
+
+
+
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
index f3b7b1b..331e917 100644
--- a/.idea/libraries/Flutter_Plugins.xml
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -12,21 +12,22 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 69bfbe3..fc9ef1f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+## [4.2.0] - 2025-05-23
+
+* Add money formatter into library
+
+## [4.1.6] - 2025-05-23
+
+* Pubspec.yaml dependency updates.
+
+## [4.1.5] - 2025-04-09
+
+* Pubspec.yaml dependency updates.
+
## [4.1.4] - 2025-03-27
* Pubspec.yaml dependency updates.
diff --git a/README.md b/README.md
index 9ace4fa..7b23810 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ In your flutter project add the dependency:
``` dart
dependencies:
...
- woosignal: ^4.1.4
+ woosignal: ^4.2.0
```
### Usage example #
diff --git a/example/ios/Flutter/ephemeral/flutter_lldb_helper.py b/example/ios/Flutter/ephemeral/flutter_lldb_helper.py
new file mode 100644
index 0000000..a88caf9
--- /dev/null
+++ b/example/ios/Flutter/ephemeral/flutter_lldb_helper.py
@@ -0,0 +1,32 @@
+#
+# Generated file, do not edit.
+#
+
+import lldb
+
+def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):
+ """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages."""
+ base = frame.register["x0"].GetValueAsAddress()
+ page_len = frame.register["x1"].GetValueAsUnsigned()
+
+ # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the
+ # first page to see if handled it correctly. This makes diagnosing
+ # misconfiguration (e.g. missing breakpoint) easier.
+ data = bytearray(page_len)
+ data[0:8] = b'IHELPED!'
+
+ error = lldb.SBError()
+ frame.GetThread().GetProcess().WriteMemory(base, data, error)
+ if not error.Success():
+ print(f'Failed to write into {base}[+{page_len}]', error)
+ return
+
+def __lldb_init_module(debugger: lldb.SBDebugger, _):
+ target = debugger.GetDummyTarget()
+ # Caveat: must use BreakpointCreateByRegEx here and not
+ # BreakpointCreateByName. For some reasons callback function does not
+ # get carried over from dummy target for the later.
+ bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$")
+ bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))
+ bp.SetAutoContinue(True)
+ print("-- LLDB integration loaded --")
diff --git a/example/ios/Flutter/ephemeral/flutter_lldbinit b/example/ios/Flutter/ephemeral/flutter_lldbinit
new file mode 100644
index 0000000..e3ba6fb
--- /dev/null
+++ b/example/ios/Flutter/ephemeral/flutter_lldbinit
@@ -0,0 +1,5 @@
+#
+# Generated file, do not edit.
+#
+
+command script import --relative-to-command-file flutter_lldb_helper.py
diff --git a/lib/money_formatter/money_formatter.dart b/lib/money_formatter/money_formatter.dart
new file mode 100644
index 0000000..eb325a3
--- /dev/null
+++ b/lib/money_formatter/money_formatter.dart
@@ -0,0 +1,5 @@
+export 'src/utils/compact_format_type.dart';
+export 'src/utils/money_formatter_settings.dart';
+export 'src/utils/money_formatter_output.dart';
+export 'src/utils/money_formatter_compare.dart';
+export 'src/flutter_money_formatter_base.dart';
diff --git a/lib/money_formatter/src/flutter_money_formatter_base.dart b/lib/money_formatter/src/flutter_money_formatter_base.dart
new file mode 100644
index 0000000..cbb8817
--- /dev/null
+++ b/lib/money_formatter/src/flutter_money_formatter_base.dart
@@ -0,0 +1,133 @@
+import 'package:intl/intl.dart';
+
+import '/money_formatter/src/utils/compact_format_type.dart';
+import '/money_formatter/src/utils/money_formatter_settings.dart';
+import '/money_formatter/src/utils/money_formatter_output.dart';
+import '/money_formatter/src/utils/money_formatter_compare.dart';
+
+part 'utils/utilities.dart';
+
+/// [FlutterMoneyFormatter] instance
+class MoneyFormatter {
+ late _Utilities _utilities;
+
+ /// Init instance of [FlutterMoneyFormatter]
+ ///
+ /// [amount] (@required) the number that will be formatted
+ MoneyFormatter({required this.amount, this.settings}) {
+ settings = settings ?? MoneyFormatterSettings();
+ output = _getOutput();
+ comparator = MoneyFormatterCompare(amount: amount);
+ }
+
+ /// Amount number that will be formatted.
+ double amount;
+
+ /// The formatter settings
+ MoneyFormatterSettings? settings;
+
+ /// Returns compiled and formatted output in several formats.
+ late MoneyFormatterOutput output;
+
+ /// Comparator
+ late MoneyFormatterCompare comparator;
+
+ /// output builder
+ MoneyFormatterOutput _getOutput() {
+ _utilities = _Utilities(amount: amount, settings: settings);
+
+ String urs = _utilities.refineSeparator;
+ int decSepCharPos = urs.indexOf(settings?.decimalSeparator ?? '˘');
+
+ return MoneyFormatterOutput(
+ nonSymbol: urs,
+ symbolOnLeft: '${settings?.symbol ?? ''}${_utilities.spacer}$urs',
+ symbolOnRight: '$urs${_utilities.spacer}${settings?.symbol ?? ''}',
+ compactNonSymbol: _compactNonSymbol,
+ compactSymbolOnLeft:
+ '${settings?.symbol ?? ''}${_utilities.spacer}$_compactNonSymbol',
+ compactSymbolOnRight:
+ '$_compactNonSymbol${_utilities.spacer}${settings?.symbol ?? ''}',
+ fractionDigitsOnly:
+ urs.substring((-1 == decSepCharPos ? 0 : decSepCharPos + 1)),
+ withoutFractionDigits: urs.substring(
+ 0, -1 == decSepCharPos ? urs.length - 1 : decSepCharPos));
+ }
+
+ /// returns FlutterMoneyFormatter after calculating amount.
+ MoneyFormatter fastCalc(
+ {required FastCalcType type, required double amount}) {
+ switch (type) {
+ case FastCalcType.addition:
+ this.amount += amount;
+ break;
+
+ case FastCalcType.substraction:
+ this.amount -= amount;
+ break;
+
+ case FastCalcType.multiplication:
+ this.amount *= amount;
+ break;
+
+ case FastCalcType.division:
+ this.amount /= amount;
+ break;
+
+ case FastCalcType.percentageAddition:
+ this.amount += (amount / 100) * this.amount;
+ break;
+
+ case FastCalcType.percentageSubstraction:
+ this.amount -= (amount / 100) * this.amount;
+ break;
+ }
+
+ return this;
+ }
+
+ /// Copies current instance and change some values to the new instance.
+ MoneyFormatter copyWith(
+ {double? amount,
+ String? symbol,
+ String? thousandSeparator,
+ String? decimalSeparator,
+ int? fractionDigits,
+ String? symbolAndNumberSeparator,
+ CompactFormatType? compactFormatType}) {
+ MoneyFormatterSettings? ts = settings;
+
+ MoneyFormatterSettings mfs = MoneyFormatterSettings(
+ symbol: symbol ?? ts?.symbol,
+ thousandSeparator: thousandSeparator ?? ts?.thousandSeparator,
+ decimalSeparator: decimalSeparator ?? ts?.decimalSeparator,
+ symbolAndNumberSeparator:
+ symbolAndNumberSeparator ?? ts?.symbolAndNumberSeparator,
+ fractionDigits: fractionDigits ?? ts?.fractionDigits,
+ compactFormatType: compactFormatType ?? ts?.compactFormatType);
+
+ return MoneyFormatter(amount: amount ?? this.amount, settings: mfs);
+ }
+
+ /// Returns compact format number without currency symbol
+ String get _compactNonSymbol {
+ String compacted = _utilities.baseCompact.format(amount);
+ String numerics = RegExp(r'(\d+\.\d+)|(\d+)')
+ .allMatches(compacted)
+ // ignore: no_wildcard_variable_uses
+ .map((_) => _.group(0))
+ .toString()
+ .replaceAll('(', '')
+ .replaceAll(')', '');
+
+ String alphas = compacted.replaceAll(numerics, '');
+
+ String reformat = NumberFormat.currency(
+ symbol: '',
+ decimalDigits:
+ !numerics.contains('.') ? 0 : settings?.fractionDigits)
+ .format(num.parse(numerics));
+
+ return '$reformat$alphas';
+ }
+}
diff --git a/lib/money_formatter/src/utils/compact_format_type.dart b/lib/money_formatter/src/utils/compact_format_type.dart
new file mode 100644
index 0000000..e489055
--- /dev/null
+++ b/lib/money_formatter/src/utils/compact_format_type.dart
@@ -0,0 +1,2 @@
+/// An enum to be used on compact text format
+enum CompactFormatType { short, long }
diff --git a/lib/money_formatter/src/utils/money_formatter_compare.dart b/lib/money_formatter/src/utils/money_formatter_compare.dart
new file mode 100644
index 0000000..9f96fce
--- /dev/null
+++ b/lib/money_formatter/src/utils/money_formatter_compare.dart
@@ -0,0 +1,23 @@
+/// [MoneyFormatterCompare] instance.
+///
+/// This instance is used to hold utilities in comparing values held by [FlutterMoneyFormatter]
+class MoneyFormatterCompare {
+ MoneyFormatterCompare({required this.amount});
+
+ final double amount;
+
+ /// Check current instance amount is lower than [amount] or not
+ bool isLowerThan(double amount) => this.amount < amount;
+
+ /// Check current instance amount is greater than [amount] or not
+ bool isGreaterThan(double amount) => this.amount > amount;
+
+ /// Check current instance amount is equal than [amount] or not
+ bool isEqual(double amount) => this.amount == amount;
+
+ /// Check current instance amount is equal or lower than [amount] or not
+ bool isEqualOrLowerThan(double amount) => this.amount <= amount;
+
+ /// Check current instance amount is equal or greater than [amount] or not
+ bool isEqualOrGreaterThan(double amount) => this.amount >= amount;
+}
diff --git a/lib/money_formatter/src/utils/money_formatter_output.dart b/lib/money_formatter/src/utils/money_formatter_output.dart
new file mode 100644
index 0000000..814df62
--- /dev/null
+++ b/lib/money_formatter/src/utils/money_formatter_output.dart
@@ -0,0 +1,36 @@
+class MoneyFormatterOutput {
+ /// Init instance of [MoneyFormatterOutput]
+ MoneyFormatterOutput(
+ {required this.nonSymbol,
+ required this.symbolOnLeft,
+ required this.symbolOnRight,
+ required this.compactNonSymbol,
+ required this.compactSymbolOnLeft,
+ required this.compactSymbolOnRight,
+ required this.fractionDigitsOnly,
+ required this.withoutFractionDigits});
+
+ /// Returns formatted number without currency symbol
+ final String nonSymbol;
+
+ /// Returns formatted number with currency symbol on the left side.
+ final String symbolOnLeft;
+
+ /// Returns formatted number with currency symbol on the right side.
+ final String symbolOnRight;
+
+ /// Returns compact format number without currency symbol
+ final String compactNonSymbol;
+
+ /// Returns compact format number with currency symbol on the left side.
+ final String compactSymbolOnLeft;
+
+ /// Returns compact format number with currency symbol on the right side.
+ final String compactSymbolOnRight;
+
+ /// Returns decimal-only with length as specified on fractionDigits.
+ final String fractionDigitsOnly;
+
+ /// Returns formatted number without decimal.
+ final String withoutFractionDigits;
+}
diff --git a/lib/money_formatter/src/utils/money_formatter_settings.dart b/lib/money_formatter/src/utils/money_formatter_settings.dart
new file mode 100644
index 0000000..26f39c9
--- /dev/null
+++ b/lib/money_formatter/src/utils/money_formatter_settings.dart
@@ -0,0 +1,41 @@
+import '/money_formatter/src/utils/compact_format_type.dart';
+
+/// [MoneyFormatterSettings] instance.
+///
+/// This instance is used as a configurator for the [FlutterMoneyFormatter] instance.
+/// You can change the output of [FlutterMoneyFormatter] through this instance.
+class MoneyFormatterSettings {
+ /// Init instance of [MoneyFormatterSettings]
+ MoneyFormatterSettings(
+ {this.symbol,
+ this.thousandSeparator,
+ this.decimalSeparator,
+ this.symbolAndNumberSeparator,
+ this.fractionDigits,
+ this.compactFormatType}) {
+ symbol = symbol ?? '\$';
+ thousandSeparator = thousandSeparator ?? ',';
+ decimalSeparator = decimalSeparator ?? '.';
+ symbolAndNumberSeparator = symbolAndNumberSeparator ?? ' ';
+ fractionDigits = fractionDigits ?? 2;
+ compactFormatType = compactFormatType ?? CompactFormatType.short;
+ }
+
+ /// The [symbol] that will be used on formatted output, default value is $ (Dollar Sign)
+ String? symbol;
+
+ // The character that will be used as thousand separator on formatted output, default value is ',' (comma)
+ String? thousandSeparator;
+
+ /// The character that will be used as decimal separator on formatted output, default value is '.' (dot)
+ String? decimalSeparator;
+
+ /// The character that will be used as separator between the numbers and the symbol.
+ String? symbolAndNumberSeparator;
+
+ /// The fraction digits that will be used on formatted output, default value is 2.
+ int? fractionDigits;
+
+ /// Compact format type, for example using 'million' or 'M'
+ CompactFormatType? compactFormatType;
+}
diff --git a/lib/money_formatter/src/utils/utilities.dart b/lib/money_formatter/src/utils/utilities.dart
new file mode 100644
index 0000000..54087e9
--- /dev/null
+++ b/lib/money_formatter/src/utils/utilities.dart
@@ -0,0 +1,41 @@
+part of '../flutter_money_formatter_base.dart';
+
+enum FastCalcType {
+ addition,
+ substraction,
+ multiplication,
+ division,
+ percentageAddition,
+ percentageSubstraction
+}
+
+class _Utilities {
+ _Utilities({required this.amount, this.settings}) {
+ settings = settings ?? MoneyFormatterSettings();
+ }
+
+ final double amount;
+
+ MoneyFormatterSettings? settings;
+
+ /// Returns formatted number
+ String get baseFormat => NumberFormat.currency(
+ symbol: '', decimalDigits: settings?.fractionDigits, locale: 'en_US')
+ .format(amount);
+
+ /// Returns formatted number with refined separator chars
+ String get refineSeparator => baseFormat
+ .replaceAll(',', '(,)')
+ .replaceAll('.', '(.)')
+ .replaceAll('(,)', settings?.thousandSeparator ?? ' ')
+ .replaceAll('(.)', settings?.decimalSeparator ?? ' ');
+
+ /// Returns spacer as `spaceBetweenSymbolAndNumber` value
+ String get spacer => settings?.symbolAndNumberSeparator ?? ' ';
+
+ /// Returns base compact format
+ NumberFormat get baseCompact =>
+ settings?.compactFormatType == CompactFormatType.short
+ ? NumberFormat.compact()
+ : NumberFormat.compactLong();
+}
diff --git a/lib/woosignal.dart b/lib/woosignal.dart
index 43a54b0..4b77c1b 100644
--- a/lib/woosignal.dart
+++ b/lib/woosignal.dart
@@ -58,7 +58,7 @@ import 'package:encrypt/encrypt.dart' as enc;
import 'package:encrypt/encrypt.dart';
/// WooSignal Package version
-const String _wooSignalVersion = "4.1.4";
+const String _wooSignalVersion = "4.2.0";
class WooSignal {
WooSignal._privateConstructor();
diff --git a/pubspec.yaml b/pubspec.yaml
index c90c1f5..d53cedd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,6 @@
name: woosignal
description: WooCommerce REST API for dart, connect a WooCommerce store and start developing with our interface for their API endpoints.
-version: 4.1.4
+version: 4.2.0
homepage: https://woosignal.com
repository: https://github.com/woosignal/flutter-woocommerce-api
issue_tracker: https://github.com/woosignal/flutter-woocommerce-api/issues
@@ -11,8 +11,9 @@ environment:
dependencies:
dio: ^5.8.0+1
- device_meta: ^2.1.5
+ device_meta: ^2.1.7
encrypt: ^5.0.3
+ intl: ^0.20.2
flutter:
sdk: flutter