diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index 5440656..0f68575 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":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"geocoding_ios","path":"/home/vjrj/.pub-cache/hosted/pub.dev/geocoding_ios-2.3.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_ios","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_ios-6.4.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"geocoding_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/geocoding_android-3.3.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_android-2.2.22/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.21/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.28/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_macos","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":false,"dependencies":["url_launcher_linux"],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"url_launcher_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/","native_build":true,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":["url_launcher_windows"],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"url_launcher_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"web":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","dependencies":[],"dev_dependency":false},{"name":"firebase_core_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core_web-2.17.5/","dependencies":[],"dev_dependency":false},{"name":"firebase_messaging_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging_web-3.8.7/","dependencies":["firebase_core_web"],"dev_dependency":false},{"name":"location_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location_web-4.2.0/","dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","dependencies":["url_launcher_web"],"dev_dependency":false},{"name":"shared_preferences_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false},{"name":"url_launcher_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.2/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_messaging","dependencies":["firebase_core","firebase_messaging_web"]},{"name":"firebase_messaging_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"geocoding","dependencies":["geocoding_android","geocoding_ios"]},{"name":"geocoding_android","dependencies":[]},{"name":"geocoding_ios","dependencies":[]},{"name":"in_app_review","dependencies":[]},{"name":"location","dependencies":["location_web"]},{"name":"location_web","dependencies":[]},{"name":"package_info_plus","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":"sentry_flutter","dependencies":["package_info_plus"]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"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":"2026-03-06 22:54:35.211367","version":"3.41.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":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"geocoding_ios","path":"/home/vjrj/.pub-cache/hosted/pub.dev/geocoding_ios-2.3.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_ios","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_ios-6.4.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"geocoding_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/geocoding_android-3.3.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_android-2.2.22/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.21/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_android","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.28/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_messaging","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging-14.9.4/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"in_app_review","path":"/home/vjrj/.pub-cache/hosted/pub.dev/in_app_review-2.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"location","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location-5.0.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_macos","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":false,"dependencies":["url_launcher_linux"],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"url_launcher_linux","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/","native_build":true,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core-2.32.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","native_build":true,"dependencies":["url_launcher_windows"],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"url_launcher_windows","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/","native_build":true,"dependencies":[],"dev_dependency":false}],"web":[{"name":"connectivity_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/connectivity_plus-5.0.2/","dependencies":[],"dev_dependency":false},{"name":"firebase_core_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_core_web-2.17.5/","dependencies":[],"dev_dependency":false},{"name":"firebase_messaging_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/firebase_messaging_web-3.8.7/","dependencies":["firebase_core_web"],"dev_dependency":false},{"name":"location_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/location_web-4.2.0/","dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/package_info_plus-6.0.0/","dependencies":[],"dev_dependency":false},{"name":"sentry_flutter","path":"/home/vjrj/.pub-cache/hosted/pub.dev/sentry_flutter-7.20.2/","dependencies":["package_info_plus"],"dev_dependency":false},{"name":"share_plus","path":"/home/vjrj/.pub-cache/hosted/pub.dev/share_plus-7.2.2/","dependencies":["url_launcher_web"],"dev_dependency":false},{"name":"shared_preferences_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false},{"name":"url_launcher_web","path":"/home/vjrj/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.2/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_messaging","dependencies":["firebase_core","firebase_messaging_web"]},{"name":"firebase_messaging_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"geocoding","dependencies":["geocoding_android","geocoding_ios"]},{"name":"geocoding_android","dependencies":[]},{"name":"geocoding_ios","dependencies":[]},{"name":"in_app_review","dependencies":[]},{"name":"location","dependencies":["location_web"]},{"name":"location_web","dependencies":[]},{"name":"package_info_plus","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":"sentry_flutter","dependencies":["package_info_plus"]},{"name":"share_plus","dependencies":["url_launcher_web","url_launcher_windows","url_launcher_linux"]},{"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":"2026-03-07 18:15:40.315430","version":"3.41.2","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/lib/activeFires.dart b/lib/activeFires.dart index 5f7de45..b813a48 100644 --- a/lib/activeFires.dart +++ b/lib/activeFires.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; @@ -17,6 +16,7 @@ import 'models/appState.dart'; import 'models/yourLocation.dart'; import 'placesAutocompleteUtils.dart'; import 'redux/actions.dart'; +import 'widgets/rounded_btn.dart'; @immutable class _ViewModel { @@ -264,19 +264,21 @@ class _ActiveFiresPageState extends State { return completer.future; }) : Center( - child: CenteredColumn(children: [ - RoundedBtn( - icon: Icons.location_searching, - text: S.of(context).addYourCurrentPosition, - onPressed: () => onAddYourLocation(view.onAdd), - backColor: fires600), - const SizedBox(height: 26.0), - RoundedBtn( - icon: Icons.edit_location, - text: S.of(context).addSomePlace, - onPressed: () => onAddOtherLocation(view.onAdd), - backColor: fires600), - ])), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RoundedBtn( + icon: Icons.location_searching, + text: S.of(context).addYourCurrentPosition, + onPressed: () => onAddYourLocation(view.onAdd), + backColor: fires600), + const SizedBox(height: 26.0), + RoundedBtn( + icon: Icons.edit_location, + text: S.of(context).addSomePlace, + onPressed: () => onAddOtherLocation(view.onAdd), + backColor: fires600), + ])), ); }); } diff --git a/lib/compassMapPlugin.dart b/lib/compassMapPlugin.dart index 6d60866..4e0a6e6 100644 --- a/lib/compassMapPlugin.dart +++ b/lib/compassMapPlugin.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; @@ -78,7 +77,8 @@ class _CompassMapPluginWidgetState extends State { Positioned( top: 10.0, right: 10.0, - child: CenteredRow( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Column( children: [ diff --git a/lib/fireAlert.dart b/lib/fireAlert.dart index 1bbda56..463f14b 100644 --- a/lib/fireAlert.dart +++ b/lib/fireAlert.dart @@ -1,5 +1,4 @@ import 'package:community_material_icon/community_material_icon.dart'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -79,7 +78,7 @@ class _FireAlertState extends State { } List listWithoutNulls(List children) => - children.where(notNull).toList(); + children.whereType().toList(); @override Widget build(BuildContext context) { diff --git a/lib/fireNotificationList.dart b/lib/fireNotificationList.dart index 7112e3e..3ac57a6 100644 --- a/lib/fireNotificationList.dart +++ b/lib/fireNotificationList.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:redux/redux.dart'; @@ -209,20 +208,24 @@ class _FireNotificationListState extends State { child: Card( child: Padding( padding: const EdgeInsets.all(20.0), - child: CenteredColumn(children: [ - const Icon(Icons.notifications_none, - size: 150.0, color: Colors.black26), - const SizedBox(height: 20.0), - Text( - S - .of(context) - .fireNotificationsDescription, - textAlign: TextAlign.center, - textScaler: - const TextScaler.linear(1.1), - style: const TextStyle( - height: 1.3, color: Colors.black45)) - ])))) + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon(Icons.notifications_none, + size: 150.0, color: Colors.black26), + const SizedBox(height: 20.0), + Text( + S + .of(context) + .fireNotificationsDescription, + textAlign: TextAlign.center, + textScaler: + const TextScaler.linear(1.1), + style: const TextStyle( + height: 1.3, + color: Colors.black45)) + ])))) : _buildSavedFireNotifications( context, view.yourLocations, diff --git a/lib/firesApp.dart b/lib/firesApp.dart index ce205d6..95cd5b0 100644 --- a/lib/firesApp.dart +++ b/lib/firesApp.dart @@ -1,4 +1,3 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_redux/flutter_redux.dart'; @@ -18,6 +17,7 @@ import 'sandbox.dart'; import 'supportPage.dart'; import 'theme.dart'; import 'themeDev.dart'; +import 'widgets/material_app_with_intro.dart'; class FiresApp extends StatefulWidget { const FiresApp(this.store, {super.key}); diff --git a/lib/genericMap.dart b/lib/genericMap.dart index 1f320c8..0dae8ea 100644 --- a/lib/genericMap.dart +++ b/lib/genericMap.dart @@ -1,6 +1,5 @@ import 'dart:core'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_redux/flutter_redux.dart'; @@ -334,7 +333,8 @@ class GenericMapState extends State { top: constraints.maxHeight - 200, right: 10.0, left: 10.0, - child: CenteredRow( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, // Fit sample: // https://github.com/apptreesoftware/flutter_map/blob/master/flutter_map_example/lib/pages/map_controller.dart children: status == @@ -401,8 +401,11 @@ class GenericMapState extends State { // const calibrate = false; // useful when we change the fire icons size for (final dynamic falsePos in falsePosList) { try { - final List coords = - falsePos['geo']['coordinates'] as List; + final Map falsePosMap = + falsePos as Map; + final Map geo = + falsePosMap['geo'] as Map; + final List coords = geo['coordinates'] as List; // print('false pos: ${coords}'); final LatLng loc = LatLng( (coords[1] as num).toDouble(), (coords[0] as num).toDouble()); diff --git a/lib/genericMapBottom.dart b/lib/genericMapBottom.dart index 4e42ffb..248d2e1 100644 --- a/lib/genericMapBottom.dart +++ b/lib/genericMapBottom.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'colors.dart'; @@ -12,6 +11,7 @@ import 'models/falsePositiveTypes.dart'; import 'models/fireMapState.dart'; import 'models/fireNotification.dart'; import 'models/yourLocation.dart'; +import 'utils/widget_utils.dart'; typedef OnSave = void Function(); typedef OnCancel = void Function(); @@ -70,7 +70,7 @@ class GenericMapBottom extends StatelessWidget { padding: const EdgeInsets.all(10.0), child: Column( mainAxisSize: MainAxisSize.min, - children: listWithoutNulls([ + children: compactWidgets([ Text(notif.description), // TODOfire type (neighbout, NASA, etc) const SizedBox(height: 5.0), diff --git a/lib/homePage.dart b/lib/homePage.dart index 1c41f28..f748f01 100644 --- a/lib/homePage.dart +++ b/lib/homePage.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; @@ -170,40 +169,43 @@ class _HomePageState extends State { ? const FiresSpinner() : SafeArea( child: Center( - child: CenteredColumn(children: [ - Row(children: [ - IconButton( - onPressed: () { - _scaffoldKey.currentState?.openDrawer(); - }, - icon: const Icon(Icons.menu, - size: 30.0, color: Colors.black38)), - ]), - Expanded( - child: FractionallySizedBox( - alignment: FractionalOffset.center, - heightFactor: 0.7, - child: Image.asset('images/logo-200.png', - fit: BoxFit.fitHeight))), - Expanded( - child: FractionallySizedBox( - alignment: FractionalOffset.topCenter, - heightFactor: 1.0, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 10.0, horizontal: 20.0), - child: FittedBox( - fit: BoxFit.scaleDown, - child: Text(S.of(context).appName, - maxLines: 2, - textAlign: TextAlign.center, - style: _homeFont), - )), - ], - ))) - ])), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row(children: [ + IconButton( + onPressed: () { + _scaffoldKey.currentState?.openDrawer(); + }, + icon: const Icon(Icons.menu, + size: 30.0, color: Colors.black38)), + ]), + Expanded( + child: FractionallySizedBox( + alignment: FractionalOffset.center, + heightFactor: 0.7, + child: Image.asset('images/logo-200.png', + fit: BoxFit.fitHeight))), + Expanded( + child: FractionallySizedBox( + alignment: FractionalOffset.topCenter, + heightFactor: 1.0, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 20.0), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text(S.of(context).appName, + maxLines: 2, + textAlign: TextAlign.center, + style: _homeFont), + )), + ], + ))) + ])), )); }); } diff --git a/lib/introPage.dart b/lib/introPage.dart index 31df206..725d0df 100644 --- a/lib/introPage.dart +++ b/lib/introPage.dart @@ -1,8 +1,8 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'generated/i18n.dart'; import 'homePage.dart'; +import 'widgets/app_intro_page.dart'; class IntroPage extends AppIntroPage { IntroPage({super.key}) diff --git a/lib/layerSelectorMapPlugin.dart b/lib/layerSelectorMapPlugin.dart index eda11ab..d9d414e 100644 --- a/lib/layerSelectorMapPlugin.dart +++ b/lib/layerSelectorMapPlugin.dart @@ -1,4 +1,3 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:redux/redux.dart'; @@ -19,7 +18,8 @@ class LayerSelectorMapPluginWidget extends StatelessWidget { Positioned( top: constraints.maxHeight - 60, left: 10.0, - child: CenteredRow( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Column( children: [_LayerSelectorButton(store)], @@ -31,7 +31,8 @@ class LayerSelectorMapPluginWidget extends StatelessWidget { } Widget _LayerSelectorButton(Store store) { - final GlobalKey> key = GlobalKey>(); + final GlobalKey> key = + GlobalKey>(); return PopupMenuButton( key: key, diff --git a/lib/mainCommon.dart b/lib/mainCommon.dart index 66a1774..5bbb78c 100644 --- a/lib/mainCommon.dart +++ b/lib/mainCommon.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; @@ -14,6 +13,7 @@ import 'models/firesApi.dart'; import 'redux/fetchDataMiddleware.dart'; import 'redux/reducers.dart'; import 'sentryReport.dart'; +import 'utils/secret_loader.dart'; Future loadPackageInfo() async { final PackageInfo packageInfo = await PackageInfo.fromPlatform(); diff --git a/lib/mainProd.dart b/lib/mainProd.dart index a98ba41..2b9c152 100644 --- a/lib/mainProd.dart +++ b/lib/mainProd.dart @@ -1,10 +1,10 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:redux/src/store.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'globals.dart' as globals; import 'mainCommon.dart'; import 'models/appState.dart'; +import 'utils/secret_loader.dart'; Future main() async { globals.isDevelopment = false; diff --git a/lib/models/appState.dart b/lib/models/appState.dart index e85d2dc..954a05a 100644 --- a/lib/models/appState.dart +++ b/lib/models/appState.dart @@ -1,12 +1,12 @@ import 'dart:async'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:latlong2/latlong.dart'; import 'package:meta/meta.dart'; +import '../utils/widget_utils.dart'; import 'fireMapState.dart'; import 'fireNotification.dart'; import 'user.dart'; diff --git a/lib/models/appState.g.dart b/lib/models/appState.g.dart index 533912d..88aad69 100644 --- a/lib/models/appState.g.dart +++ b/lib/models/appState.g.dart @@ -1,5 +1,4 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint part of 'appState.dart'; diff --git a/lib/models/fireNotification.dart b/lib/models/fireNotification.dart index 1b317e9..6420828 100644 --- a/lib/models/fireNotification.dart +++ b/lib/models/fireNotification.dart @@ -1,9 +1,9 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:objectid/objectid.dart'; import '../objectIdUtils.dart'; +import '../utils/widget_utils.dart'; part 'fireNotification.g.dart'; diff --git a/lib/models/fireNotification.g.dart b/lib/models/fireNotification.g.dart index c4c99c2..3491be7 100644 --- a/lib/models/fireNotification.g.dart +++ b/lib/models/fireNotification.g.dart @@ -1,5 +1,4 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint part of 'fireNotification.dart'; diff --git a/lib/models/fireNotificationsPersist.dart b/lib/models/fireNotificationsPersist.dart index 64da81d..2770e73 100644 --- a/lib/models/fireNotificationsPersist.dart +++ b/lib/models/fireNotificationsPersist.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:shared_preferences/src/shared_preferences_legacy.dart'; import '../globals.dart' as globals; @@ -11,7 +10,8 @@ const String fireNotificationKey = 'fireNotifications'; Future> loadFireNotifications() async { return globals.prefs.then((SharedPreferences prefs) { - final List? FireNotifications = prefs.getStringList(fireNotificationKey); + final List? FireNotifications = + prefs.getStringList(fireNotificationKey); final List persistedList = []; for (final String notificationString in (FireNotifications ?? [])) { final Map notificationMap = @@ -26,7 +26,9 @@ void persistFireNotifications(List notif) { // print('Persisting $notif'); globals.prefs.then((SharedPreferences prefs) { final List notifAsString = []; - notif.where(notNull).toList().forEach((FireNotification notification) { + notif + .whereType() + .forEach((FireNotification notification) { notifAsString.add(json.encode(notification.toJson())); }); prefs.setStringList(fireNotificationKey, notifAsString); diff --git a/lib/models/firesApi.dart b/lib/models/firesApi.dart index e9f656d..83102f2 100644 --- a/lib/models/firesApi.dart +++ b/lib/models/firesApi.dart @@ -32,7 +32,9 @@ class FiresApi { await _dio.post>(url, data: params); if (response.statusCode == 200) { final Map data = response.data as Map; - return data['data']['userId'] as String; + final Map dataData = + data['data'] as Map; + return dataData['userId'] as String; } else { throw Exception('Unexpected error on create user'); } @@ -95,7 +97,9 @@ class FiresApi { await _dio.post>(url, data: params); if (response.statusCode == 200) { final Map data = response.data as Map; - return data['data']['subsId'] as String; + final Map dataData = + data['data'] as Map; + return dataData['subsId'] as String; } else { throw Exception('Unexpected error on subscribe'); } @@ -168,10 +172,14 @@ class FiresApi { final Map resultDecoded = response.data as Map; final List union = []; + final Map dataData = + resultDecoded['data'] as Map; + final Map unionData = + dataData['union'] as Map; + final String unionValue = unionData['value'] as String; final List multipolygon = - (json.decode(resultDecoded['data']['union']['value'] as String) - as Map)['geometry']['coordinates'] - as List; + (json.decode(unionValue) as Map)['geometry'] + ['coordinates'] as List; for (final dynamic polygonDynamic in multipolygon) { final List polygon = polygonDynamic as List; for (final dynamic holeDynamic in polygon) { @@ -206,7 +214,11 @@ class FiresApi { final Response response = await _dio.post(url, data: params); if (response.statusCode == 200) { if (globals.isDevelopment) { - print(response.data['data']['upsert']); + final Map data = + response.data as Map; + final Map dataData = + data['data'] as Map; + print(dataData['upsert']); } return true; } else { diff --git a/lib/models/user.dart b/lib/models/user.dart index d330a1b..4bd43c6 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,9 +1,9 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:meta/meta.dart'; +import '../utils/widget_utils.dart'; + @immutable class User { - const User({required this.userId, required this.lang, required this.token}); const User.initial() diff --git a/lib/models/yourLocation.g.dart b/lib/models/yourLocation.g.dart index 647bb85..db3acc2 100644 --- a/lib/models/yourLocation.g.dart +++ b/lib/models/yourLocation.g.dart @@ -1,5 +1,4 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint part of 'yourLocation.dart'; diff --git a/lib/models/yourLocationPersist.dart b/lib/models/yourLocationPersist.dart index 4193c91..2ae6bba 100644 --- a/lib/models/yourLocationPersist.dart +++ b/lib/models/yourLocationPersist.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:shared_preferences/src/shared_preferences_legacy.dart'; import '../globals.dart' as globals; @@ -26,7 +25,7 @@ void persistYourLocations(List yl) { // debugPrint('Persisting $yl'); globals.prefs.then((SharedPreferences prefs) { final List ylAsString = []; - yl.where(notNull).toList().forEach((YourLocation location) { + yl.whereType().forEach((YourLocation location) { ylAsString.add(json.encode(location.toJson())); }); prefs.setStringList(locationKey, ylAsString); diff --git a/lib/slider.dart b/lib/slider.dart index 1e4b721..c90c301 100644 --- a/lib/slider.dart +++ b/lib/slider.dart @@ -1,8 +1,8 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'colors.dart'; import 'generated/i18n.dart'; +import 'utils/widget_utils.dart'; typedef SlideCallback = void Function(int distance); @@ -55,7 +55,7 @@ class _FireDistanceSliderState extends State { ); return Column( mainAxisSize: MainAxisSize.min, - children: listWithoutNulls([ + children: compactWidgets([ const SizedBox(height: 50.0), Row(children: [slider]), // new SizedBox(height: 5.0), diff --git a/lib/supportPage.dart b/lib/supportPage.dart index 24cfd75..8d7f935 100644 --- a/lib/supportPage.dart +++ b/lib/supportPage.dart @@ -1,4 +1,3 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:in_app_review/in_app_review.dart'; import 'package:share_plus/share_plus.dart'; @@ -79,6 +78,7 @@ class _SupportPageState extends State { ); } + @override @override Widget build(BuildContext context) { return Scaffold( @@ -87,23 +87,29 @@ class _SupportPageState extends State { drawer: MainDrawer(context, SupportPage.routeName), body: Padding( padding: const EdgeInsets.all(8.0), - child: CenteredColumn(children: [ - Flexible( - child: CenteredColumn(children: [ - Text( - S.of(context).supportPageDescription, - textAlign: TextAlign.center, - ), - const SizedBox(height: 20.0), - buildSupportButton(), - const SizedBox(height: 20.0), - buildTranslateButton(), - const SizedBox(height: 20.0), - buildStarButton(), - const SizedBox(height: 20.0), - buildShareButton() - ])) - ]), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + S.of(context).supportPageDescription, + textAlign: TextAlign.center, + ), + const SizedBox(height: 20.0), + buildSupportButton(), + const SizedBox(height: 20.0), + buildTranslateButton(), + const SizedBox(height: 20.0), + buildStarButton(), + const SizedBox(height: 20.0), + buildShareButton() + ], + )) + ], + ), )); } } diff --git a/lib/utils/secret_loader.dart b/lib/utils/secret_loader.dart new file mode 100644 index 0000000..965742f --- /dev/null +++ b/lib/utils/secret_loader.dart @@ -0,0 +1,20 @@ +import 'dart:async' show Future; +import 'dart:convert' show json; +import 'package:flutter/services.dart' show rootBundle; + +/// Loads secret/config files from Flutter assets as JSON. +/// Used to load configuration files at app startup. +class SecretLoader { + final String secretPath; + + SecretLoader({required this.secretPath}); + + /// Load and parse JSON from asset bundle. + /// Returns a map of the parsed JSON content. + Future> load() { + return rootBundle.loadStructuredData>( + secretPath, + (jsonStr) async => json.decode(jsonStr) as Map, + ); + } +} diff --git a/lib/utils/widget_utils.dart b/lib/utils/widget_utils.dart new file mode 100644 index 0000000..a8f5f4b --- /dev/null +++ b/lib/utils/widget_utils.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +/// Modern null-safe widget list compaction. +/// Filters out null values from a list of nullable widgets. +/// Example: compactWidgets([widget1, null, widget2]) → [widget1, widget2] +List compactWidgets(List children) => + children.whereType().toList(); + +/// String truncation for debug output and logging. +/// Truncates a string to [end] characters and appends '...' +/// Example: ellipse('abcdefgh', 4) → 'abcd...' +String ellipse(String s, [int end = 4]) => + s.length > end ? '${s.substring(0, end)}...' : s; diff --git a/lib/widgets/app_intro_page.dart b/lib/widgets/app_intro_page.dart new file mode 100644 index 0000000..04ee386 --- /dev/null +++ b/lib/widgets/app_intro_page.dart @@ -0,0 +1,149 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import '../utils/widget_utils.dart'; + +class AppIntroItem { + final IconData icon; + final String title; + final String subTitle; + + AppIntroItem({required this.icon, required this.title, this.subTitle = ''}); +} + +typedef void OnIntroFinish(BuildContext context); +typedef List ListItems(BuildContext context); + +abstract class AppIntroPage extends StatelessWidget { + static const String routeName = '/appintro'; + final ListItems items; + final OnIntroFinish onIntroFinish; + + const AppIntroPage( + {Key? key, required this.items, required this.onIntroFinish}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: DefaultTabController( + length: items(context).length, + child: _AppIntroPageSelector(items: items, onFinish: onIntroFinish), + ), + ); + } +} + +class _AppIntroPageSelector extends StatelessWidget { + const _AppIntroPageSelector({required this.items, required this.onFinish}); + + final ListItems items; + final OnIntroFinish onFinish; + + void _handleArrowButtonPress(BuildContext context, int delta) { + final TabController controller = DefaultTabController.of(context)!; + if (!controller.indexIsChanging) + controller.animateTo( + (controller.index + delta).clamp(0, items(context).length - 1)); + } + + @override + Widget build(BuildContext context) { + final TabController controller = DefaultTabController.of(context)!; + final ThemeData theme = Theme.of(context); + final Color color = theme.colorScheme.secondary; + final TextStyle titleStyle = + (theme.textTheme.headlineSmall ?? const TextStyle()) + .copyWith(color: color); + final TextStyle subTitleStyle = + theme.textTheme.titleMedium ?? const TextStyle(); + + return SafeArea( + top: true, + bottom: false, + child: Column( + children: [ + Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + IconButton( + onPressed: () { + onFinish(context); + }, + icon: + const Icon(Icons.close, size: 30.0, color: Colors.black38)), + ]), + Expanded(child: OrientationBuilder(builder: (context, orientation) { + return IconTheme( + data: IconThemeData( + size: orientation == Orientation.portrait ? 200.0 : 100.0, + color: color, + ), + child: TabBarView( + children: items(context).map((AppIntroItem item) { + return Container( + padding: const EdgeInsets.all(12.0), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Icon( + item.icon, + semanticLabel: item.title, + ), + Padding( + padding: + const EdgeInsets.only(left: 16.0, right: 16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + item.title, + style: titleStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 20.0), + Text( + item.subTitle, + style: subTitleStyle, + textAlign: TextAlign.center, + ) + ], + )), + ], + ), + ), + ); + }).toList()), + ); + })), + Container( + margin: const EdgeInsets.only(top: 16.0), + child: Row( + children: compactWidgets([ + IconButton( + icon: const Icon(Icons.chevron_left), + color: color, + onPressed: () { + _handleArrowButtonPress(context, -1); + }, + tooltip: 'Page back'), + TabPageSelector(controller: controller), + IconButton( + icon: const Icon(Icons.chevron_right), + color: color, + onPressed: () { + _handleArrowButtonPress(context, 1); + if (!controller.indexIsChanging && + controller.index == items(context).length - 1) { + onFinish(context); + } + }, + tooltip: 'Page forward'), + ]), + mainAxisAlignment: MainAxisAlignment.spaceBetween)), + ], + ), + ); + } +} diff --git a/lib/widgets/material_app_with_intro.dart b/lib/widgets/material_app_with_intro.dart new file mode 100644 index 0000000..6d8a183 --- /dev/null +++ b/lib/widgets/material_app_with_intro.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:async'; + +abstract class MaterialAppWithIntro extends StatelessWidget { + final String name; + final ThemeData theme; + final Map routes; + final WidgetBuilder introWidget; + final WidgetBuilder continueWidget; + final String prefsKey; + + MaterialAppWithIntro(this.name, this.theme, this.routes, this.introWidget, + this.continueWidget, this.prefsKey); + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: MaterialAppWithIntroHome(introWidget, continueWidget, prefsKey), + title: name, + theme: theme, + routes: routes, + ); + } +} + +class MaterialAppWithIntroHome extends StatefulWidget { + final WidgetBuilder introWidget; + final WidgetBuilder continueWidget; + final String prefsKey; + + const MaterialAppWithIntroHome( + this.introWidget, this.continueWidget, this.prefsKey); + + @override + _MaterialAppWithIntroState createState() => + _MaterialAppWithIntroState(introWidget, continueWidget, prefsKey); +} + +class _MaterialAppWithIntroState extends State { + final WidgetBuilder introWidget; + final WidgetBuilder continueWidget; + final String prefsKey; + + _MaterialAppWithIntroState( + this.introWidget, this.continueWidget, this.prefsKey); + + @override + void initState() { + super.initState(); + Timer(const Duration(milliseconds: 1000), () { + checkFirstStart(); + }); + } + + // https://stackoverflow.com/questions/50654195/flutter-one-time-intro-screen + Future checkFirstStart() async { + final String initialWizardKey = prefsKey; + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final bool showInitialWizard = (prefs.getBool(initialWizardKey) ?? true); + + if (showInitialWizard) { + await prefs.setBool(initialWizardKey, false); + if (mounted) { + await Navigator.of(context) + .pushReplacement(MaterialPageRoute(builder: introWidget)); + } + } else { + if (mounted) { + await Navigator.of(context) + .pushReplacement(MaterialPageRoute(builder: continueWidget)); + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + } +} diff --git a/lib/widgets/rounded_btn.dart b/lib/widgets/rounded_btn.dart new file mode 100644 index 0000000..150eef7 --- /dev/null +++ b/lib/widgets/rounded_btn.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +/// Rounded button widget with icon and text. +/// Used primarily in the active fires page. +class RoundedBtn extends StatelessWidget { + static const btnRadius = Radius.circular(90.0); + + final IconData icon; + final String text; + final Color backColor; + final Color fontColor; + final TextStyle textStyle; + final VoidCallback onPressed; + + const RoundedBtn({ + required this.icon, + required this.text, + required this.onPressed, + required this.backColor, + this.textStyle = const TextStyle(fontSize: 20.0, color: Colors.white), + this.fontColor = Colors.white, + }); + + factory RoundedBtn.nav({ + required IconData icon, + required String text, + required BuildContext context, + required String route, + required Color backColor, + TextStyle textStyle = const TextStyle(fontSize: 20.0, color: Colors.white), + Color fontColor = Colors.white, + }) { + return RoundedBtn( + icon: icon, + text: text, + onPressed: () { + Navigator.pushNamed(context, route); + }, + backColor: backColor, + textStyle: textStyle, + fontColor: fontColor, + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + child: ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: backColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(btnRadius), + ), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 32.0, color: fontColor), + const SizedBox(width: 10.0), + Text(text, style: textStyle), + ], + ), + ), + ), + ); + } +} diff --git a/lib/zoomMapPlugin.dart b/lib/zoomMapPlugin.dart index d1ce3b5..430fde4 100644 --- a/lib/zoomMapPlugin.dart +++ b/lib/zoomMapPlugin.dart @@ -1,4 +1,3 @@ -import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; @@ -15,7 +14,8 @@ class ZoomMapPluginWidget extends StatelessWidget { Positioned( top: constraints.maxHeight - 100, right: 10.0, - child: CenteredRow( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Column( children: [ diff --git a/pubspec.yaml b/pubspec.yaml index d53e89c..ec98acc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,8 +30,6 @@ dependencies: json_annotation: ^4.9.0 shared_preferences: ^2.2.3 objectid: ^2.1.0 - comunes_flutter: - path: /home/vjrj/dev/comunes_flutter # redux redux: ^5.0.0