diff --git a/covas_mobile/.gitignore b/covas_mobile_new/.gitignore
similarity index 100%
rename from covas_mobile/.gitignore
rename to covas_mobile_new/.gitignore
diff --git a/covas_mobile_new/.metadata b/covas_mobile_new/.metadata
new file mode 100644
index 0000000..05a8ab4
--- /dev/null
+++ b/covas_mobile_new/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "05db9689081f091050f01aed79f04dce0c750154"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: android
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: ios
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: linux
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: macos
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: web
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+ - platform: windows
+ create_revision: 05db9689081f091050f01aed79f04dce0c750154
+ base_revision: 05db9689081f091050f01aed79f04dce0c750154
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/covas_mobile_new/README.md b/covas_mobile_new/README.md
new file mode 100644
index 0000000..5d96d02
--- /dev/null
+++ b/covas_mobile_new/README.md
@@ -0,0 +1,16 @@
+# covas_mobile_new
+
+A new Flutter project.
+
+## Getting Started
+
+This project is a starting point for a Flutter application.
+
+A few resources to get you started if this is your first Flutter project:
+
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+
+For help getting started with Flutter development, view the
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/covas_mobile_new/analysis_options.yaml b/covas_mobile_new/analysis_options.yaml
new file mode 100644
index 0000000..0d29021
--- /dev/null
+++ b/covas_mobile_new/analysis_options.yaml
@@ -0,0 +1,28 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at https://dart.dev/lints.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/covas_mobile_new/android/.gitignore b/covas_mobile_new/android/.gitignore
new file mode 100644
index 0000000..be3943c
--- /dev/null
+++ b/covas_mobile_new/android/.gitignore
@@ -0,0 +1,14 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+.cxx/
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/to/reference-keystore
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/covas_mobile_new/android/app/build.gradle.kts b/covas_mobile_new/android/app/build.gradle.kts
new file mode 100644
index 0000000..110fc0e
--- /dev/null
+++ b/covas_mobile_new/android/app/build.gradle.kts
@@ -0,0 +1,49 @@
+plugins {
+ id("com.android.application")
+ id("kotlin-android")
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id("dev.flutter.flutter-gradle-plugin")
+}
+
+android {
+ namespace = "com.example.covas_mobile_new"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ isCoreLibraryDesugaringEnabled = true
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11.toString()
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "com.example.covas_mobile_new"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://flutter.dev/to/review-gradle-config.
+ minSdk = flutter.minSdkVersion
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig = signingConfigs.getByName("debug")
+ }
+ }
+}
+
+dependencies {
+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/covas_mobile_new/android/app/src/debug/AndroidManifest.xml b/covas_mobile_new/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/covas_mobile_new/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/covas_mobile_new/android/app/src/main/AndroidManifest.xml b/covas_mobile_new/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e132fdf
--- /dev/null
+++ b/covas_mobile_new/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/covas_mobile_new/android/app/src/main/kotlin/com/example/covas_mobile_new/MainActivity.kt b/covas_mobile_new/android/app/src/main/kotlin/com/example/covas_mobile_new/MainActivity.kt
new file mode 100644
index 0000000..d1df550
--- /dev/null
+++ b/covas_mobile_new/android/app/src/main/kotlin/com/example/covas_mobile_new/MainActivity.kt
@@ -0,0 +1,5 @@
+package com.example.covas_mobile_new
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity : FlutterActivity()
diff --git a/covas_mobile/android/app/src/main/res/drawable-v21/launch_background.xml b/covas_mobile_new/android/app/src/main/res/drawable-v21/launch_background.xml
similarity index 100%
rename from covas_mobile/android/app/src/main/res/drawable-v21/launch_background.xml
rename to covas_mobile_new/android/app/src/main/res/drawable-v21/launch_background.xml
diff --git a/covas_mobile/android/app/src/main/res/drawable/launch_background.xml b/covas_mobile_new/android/app/src/main/res/drawable/launch_background.xml
similarity index 100%
rename from covas_mobile/android/app/src/main/res/drawable/launch_background.xml
rename to covas_mobile_new/android/app/src/main/res/drawable/launch_background.xml
diff --git a/covas_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/covas_mobile_new/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from covas_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to covas_mobile_new/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/covas_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/covas_mobile_new/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from covas_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to covas_mobile_new/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/covas_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/covas_mobile_new/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from covas_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to covas_mobile_new/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/covas_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/covas_mobile_new/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from covas_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to covas_mobile_new/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/covas_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/covas_mobile_new/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from covas_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to covas_mobile_new/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/covas_mobile/android/app/src/main/res/values-night/styles.xml b/covas_mobile_new/android/app/src/main/res/values-night/styles.xml
similarity index 100%
rename from covas_mobile/android/app/src/main/res/values-night/styles.xml
rename to covas_mobile_new/android/app/src/main/res/values-night/styles.xml
diff --git a/covas_mobile/android/app/src/main/res/values/styles.xml b/covas_mobile_new/android/app/src/main/res/values/styles.xml
similarity index 100%
rename from covas_mobile/android/app/src/main/res/values/styles.xml
rename to covas_mobile_new/android/app/src/main/res/values/styles.xml
diff --git a/covas_mobile_new/android/app/src/profile/AndroidManifest.xml b/covas_mobile_new/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/covas_mobile_new/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/covas_mobile_new/android/build.gradle.kts b/covas_mobile_new/android/build.gradle.kts
new file mode 100644
index 0000000..dbee657
--- /dev/null
+++ b/covas_mobile_new/android/build.gradle.kts
@@ -0,0 +1,24 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+val newBuildDir: Directory =
+ rootProject.layout.buildDirectory
+ .dir("../../build")
+ .get()
+rootProject.layout.buildDirectory.value(newBuildDir)
+
+subprojects {
+ val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
+ project.layout.buildDirectory.value(newSubprojectBuildDir)
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean") {
+ delete(rootProject.layout.buildDirectory)
+}
diff --git a/covas_mobile_new/android/build/reports/problems/problems-report.html b/covas_mobile_new/android/build/reports/problems/problems-report.html
new file mode 100644
index 0000000..24fcec2
--- /dev/null
+++ b/covas_mobile_new/android/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/covas_mobile_new/android/gradle.properties b/covas_mobile_new/android/gradle.properties
new file mode 100644
index 0000000..f018a61
--- /dev/null
+++ b/covas_mobile_new/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/covas_mobile_new/android/gradle/wrapper/gradle-wrapper.properties b/covas_mobile_new/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..ac3b479
--- /dev/null
+++ b/covas_mobile_new/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
diff --git a/covas_mobile_new/android/settings.gradle.kts b/covas_mobile_new/android/settings.gradle.kts
new file mode 100644
index 0000000..fb605bc
--- /dev/null
+++ b/covas_mobile_new/android/settings.gradle.kts
@@ -0,0 +1,26 @@
+pluginManagement {
+ val flutterSdkPath =
+ run {
+ val properties = java.util.Properties()
+ file("local.properties").inputStream().use { properties.load(it) }
+ val flutterSdkPath = properties.getProperty("flutter.sdk")
+ require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
+ flutterSdkPath
+ }
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id("dev.flutter.flutter-plugin-loader") version "1.0.0"
+ id("com.android.application") version "8.9.1" apply false
+ id("org.jetbrains.kotlin.android") version "2.1.0" apply false
+}
+
+include(":app")
diff --git a/covas_mobile/images/flutter.png b/covas_mobile_new/images/flutter.png
similarity index 100%
rename from covas_mobile/images/flutter.png
rename to covas_mobile_new/images/flutter.png
diff --git a/covas_mobile/images/marker-red.png b/covas_mobile_new/images/marker-red.png
similarity index 100%
rename from covas_mobile/images/marker-red.png
rename to covas_mobile_new/images/marker-red.png
diff --git a/covas_mobile/images/marker.png b/covas_mobile_new/images/marker.png
similarity index 100%
rename from covas_mobile/images/marker.png
rename to covas_mobile_new/images/marker.png
diff --git a/covas_mobile/images/search.png b/covas_mobile_new/images/search.png
similarity index 100%
rename from covas_mobile/images/search.png
rename to covas_mobile_new/images/search.png
diff --git a/covas_mobile/ios/.gitignore b/covas_mobile_new/ios/.gitignore
similarity index 100%
rename from covas_mobile/ios/.gitignore
rename to covas_mobile_new/ios/.gitignore
diff --git a/covas_mobile_new/ios/Flutter/AppFrameworkInfo.plist b/covas_mobile_new/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..1dc6cf7
--- /dev/null
+++ b/covas_mobile_new/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 13.0
+
+
diff --git a/covas_mobile/ios/Flutter/Debug.xcconfig b/covas_mobile_new/ios/Flutter/Debug.xcconfig
similarity index 100%
rename from covas_mobile/ios/Flutter/Debug.xcconfig
rename to covas_mobile_new/ios/Flutter/Debug.xcconfig
diff --git a/covas_mobile/ios/Flutter/Release.xcconfig b/covas_mobile_new/ios/Flutter/Release.xcconfig
similarity index 100%
rename from covas_mobile/ios/Flutter/Release.xcconfig
rename to covas_mobile_new/ios/Flutter/Release.xcconfig
diff --git a/covas_mobile_new/ios/Runner.xcodeproj/project.pbxproj b/covas_mobile_new/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..f6be446
--- /dev/null
+++ b/covas_mobile_new/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,616 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 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 */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* 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 = ""; };
+ 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 = ""; };
+ 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 = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/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; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 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 = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.covasMobileNew;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from covas_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to covas_mobile_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/covas_mobile_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/covas_mobile_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..e3773d4
--- /dev/null
+++ b/covas_mobile_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/covas_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata b/covas_mobile_new/ios/Runner.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from covas_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata
rename to covas_mobile_new/ios/Runner.xcworkspace/contents.xcworkspacedata
diff --git a/covas_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/covas_mobile_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from covas_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to covas_mobile_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/covas_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/covas_mobile_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from covas_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to covas_mobile_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/covas_mobile_new/ios/Runner/AppDelegate.swift b/covas_mobile_new/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..6266644
--- /dev/null
+++ b/covas_mobile_new/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import Flutter
+import UIKit
+
+@main
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
rename to covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..7353c41
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..797d452
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..6ed2d93
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cd7b00
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..fe73094
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..321773c
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..797d452
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..502f463
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..0ec3034
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..0ec3034
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..e9f5fea
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..84ac32a
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..8953cba
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..0467bf1
Binary files /dev/null and b/covas_mobile_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
rename to covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
rename to covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
rename to covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
rename to covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
diff --git a/covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
similarity index 100%
rename from covas_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
rename to covas_mobile_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
diff --git a/covas_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard b/covas_mobile_new/ios/Runner/Base.lproj/LaunchScreen.storyboard
similarity index 100%
rename from covas_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard
rename to covas_mobile_new/ios/Runner/Base.lproj/LaunchScreen.storyboard
diff --git a/covas_mobile/ios/Runner/Base.lproj/Main.storyboard b/covas_mobile_new/ios/Runner/Base.lproj/Main.storyboard
similarity index 100%
rename from covas_mobile/ios/Runner/Base.lproj/Main.storyboard
rename to covas_mobile_new/ios/Runner/Base.lproj/Main.storyboard
diff --git a/covas_mobile_new/ios/Runner/Info.plist b/covas_mobile_new/ios/Runner/Info.plist
new file mode 100644
index 0000000..55b44c4
--- /dev/null
+++ b/covas_mobile_new/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Covas Mobile New
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ covas_mobile_new
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/covas_mobile/ios/Runner/Runner-Bridging-Header.h b/covas_mobile_new/ios/Runner/Runner-Bridging-Header.h
similarity index 100%
rename from covas_mobile/ios/Runner/Runner-Bridging-Header.h
rename to covas_mobile_new/ios/Runner/Runner-Bridging-Header.h
diff --git a/covas_mobile_new/ios/RunnerTests/RunnerTests.swift b/covas_mobile_new/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000..86a7c3b
--- /dev/null
+++ b/covas_mobile_new/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/covas_mobile_new/l10n.yaml b/covas_mobile_new/l10n.yaml
new file mode 100644
index 0000000..614c53b
--- /dev/null
+++ b/covas_mobile_new/l10n.yaml
@@ -0,0 +1,5 @@
+arb-dir: lib/l10n
+template-arb-file: app_en.arb
+output-localization-file: app_localizations.dart
+output-class: AppLocalizations
+output-dir: lib/gen_l10n
diff --git a/covas_mobile_new/lib/classes/MyDrawer.dart b/covas_mobile_new/lib/classes/MyDrawer.dart
new file mode 100644
index 0000000..e1b95ce
--- /dev/null
+++ b/covas_mobile_new/lib/classes/MyDrawer.dart
@@ -0,0 +1,209 @@
+import 'package:flutter/material.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import 'package:http/http.dart' as http;
+import 'dart:io';
+import '../pages/EditProfile.dart';
+import '../pages/EditSettings.dart';
+import '../pages/ListItemMenu.dart';
+import 'alert.dart';
+
+import '../variable/globals.dart' as globals;
+
+import '../pages/LoginDemo.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart'; // Import dotenv
+import 'package:encrypt_shared_preferences/provider.dart';
+
+import 'package:provider/provider.dart';
+import '../locale_provider.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+
+class MyDrawer extends StatelessWidget with ShowAlertDialog {
+ Future logout(BuildContext context) async {
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ var accessToken = prefs.getString("access_token") ?? "";
+
+ if (accessToken.isNotEmpty) {
+ var url = Uri.parse("${globals.api}/token");
+
+ try {
+ var response = await http.delete(url, headers: {
+ "Content-Type": "application/json",
+ HttpHeaders.cookieHeader: "access_token=${accessToken}"
+ });
+
+ print("Status code logout ${response.statusCode}");
+
+ if (response.statusCode == 200) {
+ await prefs.remove("access_token");
+ await dotenv.load(fileName: ".env"); // Load .env file
+
+ final keyEncrypt = dotenv.env['KEY_ENCRYPT'] ?? '';
+ if (keyEncrypt.isNotEmpty) {
+ await EncryptedSharedPreferences.initialize(keyEncrypt);
+ var sharedPref = EncryptedSharedPreferences.getInstance();
+ String username = sharedPref.getString("username") ?? "";
+ String password = sharedPref.getString("password") ?? "";
+ if ((username.isEmpty) || (password.isEmpty)) {
+ sharedPref.remove("username");
+ sharedPref.remove("password");
+ }
+ }
+ Navigator.pushAndRemoveUntil(
+ context,
+ MaterialPageRoute(builder: (_) => LoginDemo()),
+ (route) => false, // Remove all previous routes
+ );
+ } else {
+ String errorMessage;
+ switch (response.statusCode) {
+ case 400:
+ errorMessage = "Bad Request: Please check your input.";
+ break;
+ case 401:
+ errorMessage = "Unauthorized: Invalid credentials.";
+ break;
+ case 403:
+ errorMessage = "Forbidden: You don't have permission.";
+ break;
+ case 404:
+ errorMessage = "Not Found: The resource was not found.";
+ break;
+ case 500:
+ errorMessage =
+ "Server Error: Something went wrong on the server.";
+ break;
+ default:
+ errorMessage = "Unexpected Error: ${response.statusCode}";
+ break;
+ }
+ print(errorMessage);
+ showAlertDialog(context, "Error", errorMessage);
+ }
+ } catch (e) {
+ print("Error: $e");
+ showAlertDialog(
+ context, "Error", "An error occurred. Please try again.");
+ }
+ } else {
+ showAlertDialog(context, "Error", "Invalid token.");
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final loc = AppLocalizations.of(context);
+ final localeProvider = Provider.of(context);
+ return Drawer(
+ child: ListView(
+ padding: EdgeInsets.zero,
+ children: [
+ // Drawer Header
+ DrawerHeader(
+ decoration: BoxDecoration(
+ color: Colors.blue,
+ ),
+ child: Text(
+ 'Menu',
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: 24,
+ ),
+ ),
+ ),
+ // Drawer Items
+ ListTile(
+ leading: Icon(Icons.home),
+ title: Text(loc?.home ?? "Home"),
+ onTap: () {
+ Navigator.pushReplacement(
+ context, MaterialPageRoute(builder: (_) => ListItemMenu()));
+
+ /// Close the drawer
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.settings),
+ title: Text(loc?.settings ?? 'Settings'),
+ onTap: () {
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (_) => EditSettings())); // Close the drawer
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.account_circle),
+ title: Text(loc?.update_profile ?? 'Update profile'),
+ onTap: () {
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (_) => EditProfile())); // Close the drawer
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.language),
+ title: Text(loc?.language ?? 'Language'),
+ onTap: () {
+ showDialog(
+ context: context,
+ builder: (_) => AlertDialog(
+ title: Text(loc?.select_language ?? 'Select Language'),
+ content: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ ListTile(
+ leading: Icon(Icons.flag),
+ title: Text(loc?.french ?? 'Français'),
+ onTap: () {
+ Provider.of(context, listen: false)
+ .setLocale(const Locale('fr'));
+ Navigator.of(context).pop();
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.flag_outlined),
+ title: Text(loc?.english ?? 'English'),
+ onTap: () {
+ Provider.of(context, listen: false)
+ .setLocale(const Locale('en'));
+ Navigator.of(context).pop();
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.flag_outlined),
+ title: Text(loc?.german ?? 'German'),
+ onTap: () {
+ Provider.of(context, listen: false)
+ .setLocale(const Locale('de'));
+ Navigator.of(context).pop();
+ },
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ ),
+
+ ListTile(
+ leading: Icon(Icons.info),
+ title: Text(loc?.about ?? 'About'),
+ onTap: () {
+ showAlertDialog(context, loc?.about ?? 'About',
+ "Version 0.0.1"); // Close the drawer
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.logout),
+ title: Text(loc?.log_out ?? 'Log out'),
+ onTap: () async {
+ logout(context);
+// Close the drawer
+ },
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/covas_mobile/lib/classes/ad_helper.dart b/covas_mobile_new/lib/classes/ad_helper.dart
similarity index 100%
rename from covas_mobile/lib/classes/ad_helper.dart
rename to covas_mobile_new/lib/classes/ad_helper.dart
diff --git a/covas_mobile/lib/classes/addEventImage.dart b/covas_mobile_new/lib/classes/addEventImage.dart
similarity index 100%
rename from covas_mobile/lib/classes/addEventImage.dart
rename to covas_mobile_new/lib/classes/addEventImage.dart
diff --git a/covas_mobile/lib/classes/alert.dart b/covas_mobile_new/lib/classes/alert.dart
similarity index 100%
rename from covas_mobile/lib/classes/alert.dart
rename to covas_mobile_new/lib/classes/alert.dart
diff --git a/covas_mobile/lib/classes/auth_service.dart b/covas_mobile_new/lib/classes/auth_service.dart
similarity index 100%
rename from covas_mobile/lib/classes/auth_service.dart
rename to covas_mobile_new/lib/classes/auth_service.dart
diff --git a/covas_mobile/lib/classes/eventAdded.dart b/covas_mobile_new/lib/classes/eventAdded.dart
similarity index 100%
rename from covas_mobile/lib/classes/eventAdded.dart
rename to covas_mobile_new/lib/classes/eventAdded.dart
diff --git a/covas_mobile/lib/classes/events.dart b/covas_mobile_new/lib/classes/events.dart
similarity index 100%
rename from covas_mobile/lib/classes/events.dart
rename to covas_mobile_new/lib/classes/events.dart
diff --git a/covas_mobile/lib/classes/getEventImage.dart b/covas_mobile_new/lib/classes/getEventImage.dart
similarity index 100%
rename from covas_mobile/lib/classes/getEventImage.dart
rename to covas_mobile_new/lib/classes/getEventImage.dart
diff --git a/covas_mobile_new/lib/classes/notification_service.dart b/covas_mobile_new/lib/classes/notification_service.dart
new file mode 100644
index 0000000..4784e0e
--- /dev/null
+++ b/covas_mobile_new/lib/classes/notification_service.dart
@@ -0,0 +1,89 @@
+import 'package:flutter_local_notifications/flutter_local_notifications.dart';
+import 'package:timezone/timezone.dart' as tz;
+import 'package:timezone/data/latest_all.dart' as tz;
+
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+
+class NotificationService {
+ static final FlutterLocalNotificationsPlugin _notificationsPlugin =
+ FlutterLocalNotificationsPlugin();
+
+ /// Initialisation (à appeler dans main())
+ static Future initialize() async {
+ tz.initializeTimeZones();
+
+ const AndroidInitializationSettings androidInitSettings =
+ AndroidInitializationSettings('@mipmap/ic_launcher');
+
+ const InitializationSettings initSettings = InitializationSettings(
+ android: androidInitSettings,
+ iOS: DarwinInitializationSettings(),
+ );
+
+ await _notificationsPlugin.initialize(initSettings);
+
+ // Demande les permissions au lancement
+ await requestPermissions();
+ }
+
+ /// Demander les permissions (Android 13+ et iOS)
+ static Future requestPermissions() async {
+ // Android 13+
+ final androidImplementation =
+ _notificationsPlugin.resolvePlatformSpecificImplementation<
+ AndroidFlutterLocalNotificationsPlugin>();
+ await androidImplementation?.requestNotificationsPermission();
+
+ // iOS
+ final iosImplementation =
+ _notificationsPlugin.resolvePlatformSpecificImplementation<
+ IOSFlutterLocalNotificationsPlugin>();
+ await iosImplementation?.requestPermissions(
+ alert: true,
+ badge: true,
+ sound: true,
+ );
+ }
+
+ /// Planifie une notification 1h avant l’évènement
+ static Future scheduleEventNotification({
+ required String eventId,
+ required String title,
+ required String body,
+ required DateTime eventDate,
+ }) async {
+ final scheduledDate = eventDate.subtract(const Duration(hours: 1));
+
+ if (scheduledDate.isBefore(DateTime.now())) {
+ // Trop tard pour notifier
+ return;
+ }
+
+ await _notificationsPlugin.zonedSchedule(
+ eventId.hashCode, // identifiant unique pour l’évènement
+ title,
+ body,
+ tz.TZDateTime.from(scheduledDate, tz.local),
+ const NotificationDetails(
+ android: AndroidNotificationDetails(
+ 'events_channel',
+ 'Events',
+ channelDescription: 'Favorite event notifications ',
+ importance: Importance.high,
+ priority: Priority.high,
+ ),
+ iOS: DarwinNotificationDetails(),
+ ),
+ androidScheduleMode: AndroidScheduleMode
+ .inexactAllowWhileIdle, // évite l'erreur Exact Alarm
+ matchDateTimeComponents: DateTimeComponents.dateAndTime,
+ );
+ }
+
+ /// Annule une notification planifiée
+ static Future cancel(String eventId) async {
+ await _notificationsPlugin.cancel(eventId.hashCode);
+ }
+}
diff --git a/covas_mobile_new/lib/gen_l10n/app_localizations.dart b/covas_mobile_new/lib/gen_l10n/app_localizations.dart
new file mode 100644
index 0000000..3335313
--- /dev/null
+++ b/covas_mobile_new/lib/gen_l10n/app_localizations.dart
@@ -0,0 +1,977 @@
+import 'dart:async';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:intl/intl.dart' as intl;
+
+import 'app_localizations_de.dart';
+import 'app_localizations_en.dart';
+import 'app_localizations_fr.dart';
+
+// ignore_for_file: type=lint
+
+/// Callers can lookup localized strings with an instance of AppLocalizations
+/// returned by `AppLocalizations.of(context)`.
+///
+/// Applications need to include `AppLocalizations.delegate()` in their app's
+/// `localizationDelegates` list, and the locales they support in the app's
+/// `supportedLocales` list. For example:
+///
+/// ```dart
+/// import 'gen_l10n/app_localizations.dart';
+///
+/// return MaterialApp(
+/// localizationsDelegates: AppLocalizations.localizationsDelegates,
+/// supportedLocales: AppLocalizations.supportedLocales,
+/// home: MyApplicationHome(),
+/// );
+/// ```
+///
+/// ## Update pubspec.yaml
+///
+/// Please make sure to update your pubspec.yaml to include the following
+/// packages:
+///
+/// ```yaml
+/// dependencies:
+/// # Internationalization support.
+/// flutter_localizations:
+/// sdk: flutter
+/// intl: any # Use the pinned version from flutter_localizations
+///
+/// # Rest of dependencies
+/// ```
+///
+/// ## iOS Applications
+///
+/// iOS applications define key application metadata, including supported
+/// locales, in an Info.plist file that is built into the application bundle.
+/// To configure the locales supported by your app, you’ll need to edit this
+/// file.
+///
+/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
+/// Then, in the Project Navigator, open the Info.plist file under the Runner
+/// project’s Runner folder.
+///
+/// Next, select the Information Property List item, select Add Item from the
+/// Editor menu, then select Localizations from the pop-up menu.
+///
+/// Select and expand the newly-created Localizations item then, for each
+/// locale your application supports, add a new item and select the locale
+/// you wish to add from the pop-up menu in the Value field. This list should
+/// be consistent with the languages listed in the AppLocalizations.supportedLocales
+/// property.
+abstract class AppLocalizations {
+ AppLocalizations(String locale)
+ : localeName = intl.Intl.canonicalizedLocale(locale.toString());
+
+ final String localeName;
+
+ static AppLocalizations? of(BuildContext context) {
+ return Localizations.of(context, AppLocalizations);
+ }
+
+ static const LocalizationsDelegate delegate =
+ _AppLocalizationsDelegate();
+
+ /// A list of this localizations delegate along with the default localizations
+ /// delegates.
+ ///
+ /// Returns a list of localizations delegates containing this delegate along with
+ /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
+ /// and GlobalWidgetsLocalizations.delegate.
+ ///
+ /// Additional delegates can be added by appending to this list in
+ /// MaterialApp. This list does not have to be used at all if a custom list
+ /// of delegates is preferred or required.
+ static const List> localizationsDelegates =
+ >[
+ delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ ];
+
+ /// A list of this localizations delegate's supported locales.
+ static const List supportedLocales = [
+ Locale('de'),
+ Locale('en'),
+ Locale('fr')
+ ];
+
+ /// No description provided for @menu_list.
+ ///
+ /// In en, this message translates to:
+ /// **'Event list menu'**
+ String get menu_list;
+
+ /// No description provided for @language.
+ ///
+ /// In en, this message translates to:
+ /// **'Language'**
+ String get language;
+
+ /// No description provided for @home.
+ ///
+ /// In en, this message translates to:
+ /// **'Home'**
+ String get home;
+
+ /// No description provided for @settings.
+ ///
+ /// In en, this message translates to:
+ /// **'Settings'**
+ String get settings;
+
+ /// No description provided for @update_profile.
+ ///
+ /// In en, this message translates to:
+ /// **'Update profile'**
+ String get update_profile;
+
+ /// No description provided for @about.
+ ///
+ /// In en, this message translates to:
+ /// **'About'**
+ String get about;
+
+ /// No description provided for @log_out.
+ ///
+ /// In en, this message translates to:
+ /// **'Log out'**
+ String get log_out;
+
+ /// No description provided for @french.
+ ///
+ /// In en, this message translates to:
+ /// **'French'**
+ String get french;
+
+ /// No description provided for @english.
+ ///
+ /// In en, this message translates to:
+ /// **'English'**
+ String get english;
+
+ /// No description provided for @german.
+ ///
+ /// In en, this message translates to:
+ /// **'German'**
+ String get german;
+
+ /// No description provided for @select_language.
+ ///
+ /// In en, this message translates to:
+ /// **'Select language'**
+ String get select_language;
+
+ /// No description provided for @search_item.
+ ///
+ /// In en, this message translates to:
+ /// **'Search by item'**
+ String get search_item;
+
+ /// No description provided for @search_tag.
+ ///
+ /// In en, this message translates to:
+ /// **'Search by tags'**
+ String get search_tag;
+
+ /// No description provided for @search_geographical.
+ ///
+ /// In en, this message translates to:
+ /// **'Search by geographical zone'**
+ String get search_geographical;
+
+ /// No description provided for @show_date_field.
+ ///
+ /// In en, this message translates to:
+ /// **'Show Date Fields'**
+ String get show_date_field;
+
+ /// No description provided for @hide_date_field.
+ ///
+ /// In en, this message translates to:
+ /// **'Hide Date Fields'**
+ String get hide_date_field;
+
+ /// No description provided for @no_data.
+ ///
+ /// In en, this message translates to:
+ /// **'No data available'**
+ String get no_data;
+
+ /// No description provided for @search.
+ ///
+ /// In en, this message translates to:
+ /// **'Search'**
+ String get search;
+
+ /// No description provided for @no_events.
+ ///
+ /// In en, this message translates to:
+ /// **'No events available for this location.'**
+ String get no_events;
+
+ /// No description provided for @start_date.
+ ///
+ /// In en, this message translates to:
+ /// **'Start date'**
+ String get start_date;
+
+ /// No description provided for @end_date.
+ ///
+ /// In en, this message translates to:
+ /// **'End date'**
+ String get end_date;
+
+ /// No description provided for @failed_suggestions.
+ ///
+ /// In en, this message translates to:
+ /// **'Failed to load suggestions'**
+ String get failed_suggestions;
+
+ /// No description provided for @error.
+ ///
+ /// In en, this message translates to:
+ /// **'Error'**
+ String get error;
+
+ /// No description provided for @password_different.
+ ///
+ /// In en, this message translates to:
+ /// **'Must write a different password'**
+ String get password_different;
+
+ /// No description provided for @create.
+ ///
+ /// In en, this message translates to:
+ /// **'Creation'**
+ String get create;
+
+ /// No description provided for @user_create.
+ ///
+ /// In en, this message translates to:
+ /// **'Your user created'**
+ String get user_create;
+
+ /// No description provided for @user_update.
+ ///
+ /// In en, this message translates to:
+ /// **'Your user updated'**
+ String get user_update;
+
+ /// No description provided for @request_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Poorly constructed query'**
+ String get request_error;
+
+ /// No description provided for @incorrect_password.
+ ///
+ /// In en, this message translates to:
+ /// **'Incorrect password'**
+ String get incorrect_password;
+
+ /// No description provided for @unknown_user.
+ ///
+ /// In en, this message translates to:
+ /// **'Unknown user'**
+ String get unknown_user;
+
+ /// No description provided for @disabled_user.
+ ///
+ /// In en, this message translates to:
+ /// **'User disabled'**
+ String get disabled_user;
+
+ /// No description provided for @invalid_token.
+ ///
+ /// In en, this message translates to:
+ /// **'Invalid token'**
+ String get invalid_token;
+
+ /// No description provided for @internal_error_server.
+ ///
+ /// In en, this message translates to:
+ /// **'Internal error server'**
+ String get internal_error_server;
+
+ /// No description provided for @unknown_error_auth.
+ ///
+ /// In en, this message translates to:
+ /// **'Unknown error authentification'**
+ String get unknown_error_auth;
+
+ /// No description provided for @required_input.
+ ///
+ /// In en, this message translates to:
+ /// **'Required input'**
+ String get required_input;
+
+ /// No description provided for @create_profile.
+ ///
+ /// In en, this message translates to:
+ /// **'Create profile'**
+ String get create_profile;
+
+ /// No description provided for @edit_pseudo.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit pseudo'**
+ String get edit_pseudo;
+
+ /// No description provided for @password.
+ ///
+ /// In en, this message translates to:
+ /// **'Password'**
+ String get password;
+
+ /// No description provided for @enter_password.
+ ///
+ /// In en, this message translates to:
+ /// **'Enter the passord'**
+ String get enter_password;
+
+ /// No description provided for @password_confirmed.
+ ///
+ /// In en, this message translates to:
+ /// **'Password confirmed'**
+ String get password_confirmed;
+
+ /// No description provided for @last_name.
+ ///
+ /// In en, this message translates to:
+ /// **'Last name'**
+ String get last_name;
+
+ /// No description provided for @first_name.
+ ///
+ /// In en, this message translates to:
+ /// **'First name'**
+ String get first_name;
+
+ /// No description provided for @email.
+ ///
+ /// In en, this message translates to:
+ /// **'Mail'**
+ String get email;
+
+ /// No description provided for @edit_last_name.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit name'**
+ String get edit_last_name;
+
+ /// No description provided for @edit_first_name.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit first name'**
+ String get edit_first_name;
+
+ /// No description provided for @edit_email.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit email address'**
+ String get edit_email;
+
+ /// No description provided for @birth_date.
+ ///
+ /// In en, this message translates to:
+ /// **'Birth date'**
+ String get birth_date;
+
+ /// No description provided for @edit_birth.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit birth date'**
+ String get edit_birth;
+
+ /// No description provided for @create_profile_button.
+ ///
+ /// In en, this message translates to:
+ /// **'Create profile'**
+ String get create_profile_button;
+
+ /// No description provided for @take_picture.
+ ///
+ /// In en, this message translates to:
+ /// **'Take a picture'**
+ String get take_picture;
+
+ /// No description provided for @error_ia.
+ ///
+ /// In en, this message translates to:
+ /// **'Google AI failed to analyze picture. Retry with another one'**
+ String get error_ia;
+
+ /// No description provided for @no_data_geo.
+ ///
+ /// In en, this message translates to:
+ /// **'No geographical data'**
+ String get no_data_geo;
+
+ /// No description provided for @response_status_update.
+ ///
+ /// In en, this message translates to:
+ /// **'response status code update'**
+ String get response_status_update;
+
+ /// No description provided for @error_token.
+ ///
+ /// In en, this message translates to:
+ /// **'Token error'**
+ String get error_token;
+
+ /// No description provided for @error_format.
+ ///
+ /// In en, this message translates to:
+ /// **'Data format error given by AI'**
+ String get error_format;
+
+ /// No description provided for @display_picture.
+ ///
+ /// In en, this message translates to:
+ /// **'Display the Picture'**
+ String get display_picture;
+
+ /// No description provided for @analyze_image.
+ ///
+ /// In en, this message translates to:
+ /// **'Image Analyze in progress'**
+ String get analyze_image;
+
+ /// No description provided for @loading_progress.
+ ///
+ /// In en, this message translates to:
+ /// **'Loading progress'**
+ String get loading_progress;
+
+ /// No description provided for @error_event.
+ ///
+ /// In en, this message translates to:
+ /// **'Event error'**
+ String get error_event;
+
+ /// No description provided for @no_future_event.
+ ///
+ /// In en, this message translates to:
+ /// **'No future event'**
+ String get no_future_event;
+
+ /// No description provided for @error_user.
+ ///
+ /// In en, this message translates to:
+ /// **'Error user'**
+ String get error_user;
+
+ /// No description provided for @empty_input.
+ ///
+ /// In en, this message translates to:
+ /// **'Empty input'**
+ String get empty_input;
+
+ /// No description provided for @info_event.
+ ///
+ /// In en, this message translates to:
+ /// **'Event info'**
+ String get info_event;
+
+ /// No description provided for @event_already.
+ ///
+ /// In en, this message translates to:
+ /// **'Event already exists'**
+ String get event_already;
+
+ /// No description provided for @picture_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Picture error'**
+ String get picture_error;
+
+ /// No description provided for @no_picture_published.
+ ///
+ /// In en, this message translates to:
+ /// **'No picture published'**
+ String get no_picture_published;
+
+ /// No description provided for @event_update.
+ ///
+ /// In en, this message translates to:
+ /// **'Event updated'**
+ String get event_update;
+
+ /// No description provided for @location.
+ ///
+ /// In en, this message translates to:
+ /// **'Location'**
+ String get location;
+
+ /// No description provided for @add_event.
+ ///
+ /// In en, this message translates to:
+ /// **'Add or Update a event'**
+ String get add_event;
+
+ /// No description provided for @edit_image.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit pictures'**
+ String get edit_image;
+
+ /// No description provided for @name.
+ ///
+ /// In en, this message translates to:
+ /// **'Name'**
+ String get name;
+
+ /// No description provided for @edit_event_name.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit event name'**
+ String get edit_event_name;
+
+ /// No description provided for @start_time.
+ ///
+ /// In en, this message translates to:
+ /// **'Start time'**
+ String get start_time;
+
+ /// No description provided for @end_time.
+ ///
+ /// In en, this message translates to:
+ /// **'End time'**
+ String get end_time;
+
+ /// No description provided for @select_date.
+ ///
+ /// In en, this message translates to:
+ /// **'Click to select a date'**
+ String get select_date;
+
+ /// No description provided for @select_time.
+ ///
+ /// In en, this message translates to:
+ /// **'Click to select a time'**
+ String get select_time;
+
+ /// No description provided for @tag.
+ ///
+ /// In en, this message translates to:
+ /// **'Tags'**
+ String get tag;
+
+ /// No description provided for @already_tag.
+ ///
+ /// In en, this message translates to:
+ /// **'You have already this tags'**
+ String get already_tag;
+
+ /// No description provided for @enter_tag.
+ ///
+ /// In en, this message translates to:
+ /// **'Enter a tag'**
+ String get enter_tag;
+
+ /// No description provided for @organizer.
+ ///
+ /// In en, this message translates to:
+ /// **'Organizer'**
+ String get organizer;
+
+ /// No description provided for @already_organiser.
+ ///
+ /// In en, this message translates to:
+ /// **'You have already a organizer'**
+ String get already_organiser;
+
+ /// No description provided for @enter_organizer.
+ ///
+ /// In en, this message translates to:
+ /// **'Enter a organizer'**
+ String get enter_organizer;
+
+ /// No description provided for @description.
+ ///
+ /// In en, this message translates to:
+ /// **'Description'**
+ String get description;
+
+ /// No description provided for @describe_event.
+ ///
+ /// In en, this message translates to:
+ /// **'Describe event'**
+ String get describe_event;
+
+ /// No description provided for @add.
+ ///
+ /// In en, this message translates to:
+ /// **'Add'**
+ String get add;
+
+ /// No description provided for @different_password_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Different password'**
+ String get different_password_error;
+
+ /// No description provided for @update.
+ ///
+ /// In en, this message translates to:
+ /// **'Update'**
+ String get update;
+
+ /// No description provided for @updated.
+ ///
+ /// In en, this message translates to:
+ /// **'Updated'**
+ String get updated;
+
+ /// No description provided for @settings_updated.
+ ///
+ /// In en, this message translates to:
+ /// **'Settings updated'**
+ String get settings_updated;
+
+ /// No description provided for @define_kilometer.
+ ///
+ /// In en, this message translates to:
+ /// **'Define Kilometer'**
+ String get define_kilometer;
+
+ /// No description provided for @email_sent.
+ ///
+ /// In en, this message translates to:
+ /// **'Email has been sent'**
+ String get email_sent;
+
+ /// No description provided for @forgot_password.
+ ///
+ /// In en, this message translates to:
+ /// **'Forgot password'**
+ String get forgot_password;
+
+ /// No description provided for @enter_email.
+ ///
+ /// In en, this message translates to:
+ /// **'Enter the email'**
+ String get enter_email;
+
+ /// No description provided for @send_email.
+ ///
+ /// In en, this message translates to:
+ /// **'Send email'**
+ String get send_email;
+
+ /// No description provided for @invalid_cache.
+ ///
+ /// In en, this message translates to:
+ /// **'Invalid cache'**
+ String get invalid_cache;
+
+ /// No description provided for @item_date.
+ ///
+ /// In en, this message translates to:
+ /// **'Date : '**
+ String get item_date;
+
+ /// No description provided for @item_maps.
+ ///
+ /// In en, this message translates to:
+ /// **'Maps : '**
+ String get item_maps;
+
+ /// No description provided for @item_organizer.
+ ///
+ /// In en, this message translates to:
+ /// **'Organizer : '**
+ String get item_organizer;
+
+ /// No description provided for @item_description.
+ ///
+ /// In en, this message translates to:
+ /// **'Description : '**
+ String get item_description;
+
+ /// No description provided for @item_tags.
+ ///
+ /// In en, this message translates to:
+ /// **'Tags : '**
+ String get item_tags;
+
+ /// No description provided for @failed_auth.
+ ///
+ /// In en, this message translates to:
+ /// **'Authentification failed'**
+ String get failed_auth;
+
+ /// No description provided for @login_page.
+ ///
+ /// In en, this message translates to:
+ /// **'Login page'**
+ String get login_page;
+
+ /// No description provided for @pseudo.
+ ///
+ /// In en, this message translates to:
+ /// **'Pseudo'**
+ String get pseudo;
+
+ /// No description provided for @enter_existing_pseudo.
+ ///
+ /// In en, this message translates to:
+ /// **'Enter a existing pseudo'**
+ String get enter_existing_pseudo;
+
+ /// No description provided for @remembr_me.
+ ///
+ /// In en, this message translates to:
+ /// **'Remember me'**
+ String get remembr_me;
+
+ /// No description provided for @new_user.
+ ///
+ /// In en, this message translates to:
+ /// **'New User? Create Account'**
+ String get new_user;
+
+ /// No description provided for @sign_in.
+ ///
+ /// In en, this message translates to:
+ /// **'Sign in'**
+ String get sign_in;
+
+ /// No description provided for @map_token.
+ ///
+ /// In en, this message translates to:
+ /// **'Mapbox Access Token is not available'**
+ String get map_token;
+
+ /// No description provided for @geo_disabled.
+ ///
+ /// In en, this message translates to:
+ /// **'Location services are disabled.'**
+ String get geo_disabled;
+
+ /// No description provided for @permission_denied.
+ ///
+ /// In en, this message translates to:
+ /// **'Location permissions are denied.'**
+ String get permission_denied;
+
+ /// No description provided for @enable_permission.
+ ///
+ /// In en, this message translates to:
+ /// **'Location permissions are permanently denied. Enable them in settings.'**
+ String get enable_permission;
+
+ /// No description provided for @no_last_position.
+ ///
+ /// In en, this message translates to:
+ /// **'No last known position available.'**
+ String get no_last_position;
+
+ /// No description provided for @failed_location.
+ ///
+ /// In en, this message translates to:
+ /// **'Failed to get user location'**
+ String get failed_location;
+
+ /// No description provided for @failed_fetch.
+ ///
+ /// In en, this message translates to:
+ /// **'Failed to fetch the route'**
+ String get failed_fetch;
+
+ /// No description provided for @invalid_coordinates_symbol.
+ ///
+ /// In en, this message translates to:
+ /// **'Invalid coordinates, cannot add symbol.'**
+ String get invalid_coordinates_symbol;
+
+ /// No description provided for @error_symbol.
+ ///
+ /// In en, this message translates to:
+ /// **'Error when adding symbol.'**
+ String get error_symbol;
+
+ /// No description provided for @position_not_init.
+ ///
+ /// In en, this message translates to:
+ /// **'User position is not yet initialized. Try again.'**
+ String get position_not_init;
+
+ /// No description provided for @invalid_coordinates.
+ ///
+ /// In en, this message translates to:
+ /// **'Invalid coordinates.'**
+ String get invalid_coordinates;
+
+ /// No description provided for @walking.
+ ///
+ /// In en, this message translates to:
+ /// **'Walking'**
+ String get walking;
+
+ /// No description provided for @cycling.
+ ///
+ /// In en, this message translates to:
+ /// **'Cycling'**
+ String get cycling;
+
+ /// No description provided for @driving.
+ ///
+ /// In en, this message translates to:
+ /// **'Driving'**
+ String get driving;
+
+ /// No description provided for @get_direction.
+ ///
+ /// In en, this message translates to:
+ /// **'Get Directions and Markers'**
+ String get get_direction;
+
+ /// No description provided for @missing_token.
+ ///
+ /// In en, this message translates to:
+ /// **'Missing access token'**
+ String get missing_token;
+
+ /// No description provided for @geocoding_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Error when geocoding'**
+ String get geocoding_error;
+
+ /// No description provided for @no_found_place.
+ ///
+ /// In en, this message translates to:
+ /// **'No found place'**
+ String get no_found_place;
+
+ /// No description provided for @upload_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Error when image uploading'**
+ String get upload_error;
+
+ /// No description provided for @event_added.
+ ///
+ /// In en, this message translates to:
+ /// **'Event added'**
+ String get event_added;
+
+ /// No description provided for @unknown_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Unknown error'**
+ String get unknown_error;
+
+ /// No description provided for @app_error.
+ ///
+ /// In en, this message translates to:
+ /// **'Application error'**
+ String get app_error;
+
+ /// No description provided for @at.
+ ///
+ /// In en, this message translates to:
+ /// **'at'**
+ String get at;
+
+ /// No description provided for @to_date.
+ ///
+ /// In en, this message translates to:
+ /// **'to'**
+ String get to_date;
+
+ /// No description provided for @item_link.
+ ///
+ /// In en, this message translates to:
+ /// **'Link : '**
+ String get item_link;
+
+ /// No description provided for @item_ticket.
+ ///
+ /// In en, this message translates to:
+ /// **'Ticket : '**
+ String get item_ticket;
+
+ /// No description provided for @link.
+ ///
+ /// In en, this message translates to:
+ /// **'Link'**
+ String get link;
+
+ /// No description provided for @edit_link.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit link name'**
+ String get edit_link;
+
+ /// No description provided for @ticket.
+ ///
+ /// In en, this message translates to:
+ /// **'Ticket'**
+ String get ticket;
+
+ /// No description provided for @edit_ticket.
+ ///
+ /// In en, this message translates to:
+ /// **'Edit ticket link'**
+ String get edit_ticket;
+
+ /// No description provided for @toogle_interest.
+ ///
+ /// In en, this message translates to:
+ /// **'Error toggle interest'**
+ String get toogle_interest;
+
+ /// No description provided for @error_update.
+ ///
+ /// In en, this message translates to:
+ /// **'Error when updating'**
+ String get error_update;
+
+ /// No description provided for @count_interested.
+ ///
+ /// In en, this message translates to:
+ /// **'Interested people number'**
+ String get count_interested;
+}
+
+class _AppLocalizationsDelegate
+ extends LocalizationsDelegate {
+ const _AppLocalizationsDelegate();
+
+ @override
+ Future load(Locale locale) {
+ return SynchronousFuture(lookupAppLocalizations(locale));
+ }
+
+ @override
+ bool isSupported(Locale locale) =>
+ ['de', 'en', 'fr'].contains(locale.languageCode);
+
+ @override
+ bool shouldReload(_AppLocalizationsDelegate old) => false;
+}
+
+AppLocalizations lookupAppLocalizations(Locale locale) {
+ // Lookup logic when only language code is specified.
+ switch (locale.languageCode) {
+ case 'de':
+ return AppLocalizationsDe();
+ case 'en':
+ return AppLocalizationsEn();
+ case 'fr':
+ return AppLocalizationsFr();
+ }
+
+ throw FlutterError(
+ 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
+ 'an issue with the localizations generation tool. Please file an issue '
+ 'on GitHub with a reproducible sample app and the gen-l10n configuration '
+ 'that was used.');
+}
diff --git a/covas_mobile_new/lib/gen_l10n/app_localizations_de.dart b/covas_mobile_new/lib/gen_l10n/app_localizations_de.dart
new file mode 100644
index 0000000..46d179a
--- /dev/null
+++ b/covas_mobile_new/lib/gen_l10n/app_localizations_de.dart
@@ -0,0 +1,434 @@
+// ignore: unused_import
+import 'package:intl/intl.dart' as intl;
+import 'app_localizations.dart';
+
+// ignore_for_file: type=lint
+
+/// The translations for German (`de`).
+class AppLocalizationsDe extends AppLocalizations {
+ AppLocalizationsDe([String locale = 'de']) : super(locale);
+
+ @override
+ String get menu_list => 'Veranstaltungsmenü';
+
+ @override
+ String get language => 'Sprache';
+
+ @override
+ String get home => 'Startseite';
+
+ @override
+ String get settings => 'Einstellungen';
+
+ @override
+ String get update_profile => 'Profil aktualisieren';
+
+ @override
+ String get about => 'Über';
+
+ @override
+ String get log_out => 'Abmelden';
+
+ @override
+ String get french => 'Französisch';
+
+ @override
+ String get english => 'Englisch';
+
+ @override
+ String get german => 'Deutsch';
+
+ @override
+ String get select_language => 'Sprache auswählen';
+
+ @override
+ String get search_item => 'Nach Element suchen';
+
+ @override
+ String get search_tag => 'Nach Schlagwörtern suchen';
+
+ @override
+ String get search_geographical => 'Nach geografischer Zone suchen';
+
+ @override
+ String get show_date_field => 'Datumsfelder anzeigen';
+
+ @override
+ String get hide_date_field => 'Datumsfelder ausblenden';
+
+ @override
+ String get no_data => 'Keine Daten verfügbar';
+
+ @override
+ String get search => 'Suchen';
+
+ @override
+ String get no_events => 'Keine Veranstaltungen für diesen Ort verfügbar.';
+
+ @override
+ String get start_date => 'Anfangsdatum';
+
+ @override
+ String get end_date => 'Enddatum';
+
+ @override
+ String get failed_suggestions => 'Vorschläge konnten nicht geladen werden';
+
+ @override
+ String get error => 'Fehler';
+
+ @override
+ String get password_different => 'Ein anderes Passwort eingeben';
+
+ @override
+ String get create => 'Erstellung';
+
+ @override
+ String get user_create => 'Benutzer wurde erstellt';
+
+ @override
+ String get user_update => 'Benutzer wurde aktualisiert';
+
+ @override
+ String get request_error => 'Fehlerhafte Anfrage';
+
+ @override
+ String get incorrect_password => 'Falsches Passwort';
+
+ @override
+ String get unknown_user => 'Unbekannter Benutzer';
+
+ @override
+ String get disabled_user => 'Benutzer deaktiviert';
+
+ @override
+ String get invalid_token => 'Ungültiger Token';
+
+ @override
+ String get internal_error_server => 'Interner Serverfehler';
+
+ @override
+ String get unknown_error_auth => 'Unbekannter Authentifizierungsfehler';
+
+ @override
+ String get required_input => 'Pflichtfeld';
+
+ @override
+ String get create_profile => 'Profil erstellen';
+
+ @override
+ String get edit_pseudo => 'Benutzernamen bearbeiten';
+
+ @override
+ String get password => 'Passwort';
+
+ @override
+ String get enter_password => 'Passwort eingeben';
+
+ @override
+ String get password_confirmed => 'Passwort bestätigt';
+
+ @override
+ String get last_name => 'Nachname';
+
+ @override
+ String get first_name => 'Vorname';
+
+ @override
+ String get email => 'E-Mail';
+
+ @override
+ String get edit_last_name => 'Nachnamen bearbeiten';
+
+ @override
+ String get edit_first_name => 'Vornamen bearbeiten';
+
+ @override
+ String get edit_email => 'E-Mail-Adresse bearbeiten';
+
+ @override
+ String get birth_date => 'Geburtsdatum';
+
+ @override
+ String get edit_birth => 'Geburtsdatum bearbeiten';
+
+ @override
+ String get create_profile_button => 'Profil erstellen';
+
+ @override
+ String get take_picture => 'Foto aufnehmen';
+
+ @override
+ String get error_ia =>
+ 'Google KI konnte das Bild nicht analysieren. Bitte ein anderes versuchen.';
+
+ @override
+ String get no_data_geo => 'Keine geografischen Daten';
+
+ @override
+ String get response_status_update => 'Statuscode-Antwort aktualisieren';
+
+ @override
+ String get error_token => 'Token-Fehler';
+
+ @override
+ String get error_format => 'Vom KI geliefertes Datenformat ist fehlerhaft';
+
+ @override
+ String get display_picture => 'Bild anzeigen';
+
+ @override
+ String get analyze_image => 'Bildanalyse läuft';
+
+ @override
+ String get loading_progress => 'Ladefortschritt';
+
+ @override
+ String get error_event => 'Veranstaltungsfehler';
+
+ @override
+ String get no_future_event => 'Keine zukünftigen Veranstaltungen';
+
+ @override
+ String get error_user => 'Benutzerfehler';
+
+ @override
+ String get empty_input => 'Eingabefeld leer';
+
+ @override
+ String get info_event => 'Veranstaltungsinfo';
+
+ @override
+ String get event_already => 'Veranstaltung existiert bereits';
+
+ @override
+ String get picture_error => 'Bildfehler';
+
+ @override
+ String get no_picture_published => 'Kein Bild veröffentlicht';
+
+ @override
+ String get event_update => 'Veranstaltung aktualisiert';
+
+ @override
+ String get location => 'Ort';
+
+ @override
+ String get add_event => 'Veranstaltung hinzufügen oder aktualisieren';
+
+ @override
+ String get edit_image => 'Bilder bearbeiten';
+
+ @override
+ String get name => 'Name';
+
+ @override
+ String get edit_event_name => 'Veranstaltungsname bearbeiten';
+
+ @override
+ String get start_time => 'Startzeit';
+
+ @override
+ String get end_time => 'Endzeit';
+
+ @override
+ String get select_date => 'Zum Auswählen eines Datums klicken';
+
+ @override
+ String get select_time => 'Zum Auswählen einer Uhrzeit klicken';
+
+ @override
+ String get tag => 'Schlagwörter';
+
+ @override
+ String get already_tag => 'Dieses Schlagwort ist bereits vorhanden';
+
+ @override
+ String get enter_tag => 'Ein Schlagwort eingeben';
+
+ @override
+ String get organizer => 'Veranstalter';
+
+ @override
+ String get already_organiser => 'Veranstalter bereits vorhanden';
+
+ @override
+ String get enter_organizer => 'Veranstalter eingeben';
+
+ @override
+ String get description => 'Beschreibung';
+
+ @override
+ String get describe_event => 'Veranstaltung beschreiben';
+
+ @override
+ String get add => 'Hinzufügen';
+
+ @override
+ String get different_password_error => 'Passwörter stimmen nicht überein';
+
+ @override
+ String get update => 'Aktualisieren';
+
+ @override
+ String get updated => 'Aktualisiert';
+
+ @override
+ String get settings_updated => 'Einstellungen aktualisiert';
+
+ @override
+ String get define_kilometer => 'Kilometer definieren';
+
+ @override
+ String get email_sent => 'E-Mail wurde gesendet';
+
+ @override
+ String get forgot_password => 'Passwort vergessen';
+
+ @override
+ String get enter_email => 'E-Mail eingeben';
+
+ @override
+ String get send_email => 'E-Mail senden';
+
+ @override
+ String get invalid_cache => 'Ungültiger Cache';
+
+ @override
+ String get item_date => 'Datum : ';
+
+ @override
+ String get item_maps => 'Karte : ';
+
+ @override
+ String get item_organizer => 'Veranstalter : ';
+
+ @override
+ String get item_description => 'Beschreibung : ';
+
+ @override
+ String get item_tags => 'Schlagwörter : ';
+
+ @override
+ String get failed_auth => 'Authentifizierung fehlgeschlagen';
+
+ @override
+ String get login_page => 'Anmeldeseite';
+
+ @override
+ String get pseudo => 'Benutzername';
+
+ @override
+ String get enter_existing_pseudo => 'Vorhandenen Benutzernamen eingeben';
+
+ @override
+ String get remembr_me => 'Angemeldet bleiben';
+
+ @override
+ String get new_user => 'Neuer Benutzer? Konto erstellen';
+
+ @override
+ String get sign_in => 'Anmelden';
+
+ @override
+ String get map_token => 'Mapbox-Zugangstoken ist nicht verfügbar';
+
+ @override
+ String get geo_disabled => 'Standortdienste sind deaktiviert.';
+
+ @override
+ String get permission_denied => 'Standortberechtigungen wurden verweigert.';
+
+ @override
+ String get enable_permission =>
+ 'Standortberechtigungen dauerhaft verweigert. Bitte in den Einstellungen aktivieren.';
+
+ @override
+ String get no_last_position => 'Keine letzte bekannte Position verfügbar.';
+
+ @override
+ String get failed_location => 'Standort konnte nicht ermittelt werden';
+
+ @override
+ String get failed_fetch => 'Route konnte nicht abgerufen werden';
+
+ @override
+ String get invalid_coordinates_symbol =>
+ 'Ungültige Koordinaten, Symbol kann nicht hinzugefügt werden.';
+
+ @override
+ String get error_symbol => 'Fehler beim Hinzufügen des Symbols.';
+
+ @override
+ String get position_not_init =>
+ 'Benutzerposition noch nicht initialisiert. Erneut versuchen.';
+
+ @override
+ String get invalid_coordinates => 'Ungültige Koordinaten.';
+
+ @override
+ String get walking => 'Zu Fuß';
+
+ @override
+ String get cycling => 'Mit dem Fahrrad';
+
+ @override
+ String get driving => 'Mit dem Auto';
+
+ @override
+ String get get_direction => 'Wegbeschreibung und Markierungen anzeigen';
+
+ @override
+ String get missing_token => 'Zugangstoken fehlt';
+
+ @override
+ String get geocoding_error => 'Fehler bei der Geokodierung';
+
+ @override
+ String get no_found_place => 'Kein Ort gefunden';
+
+ @override
+ String get upload_error => 'Fehler beim Hochladen des Bildes';
+
+ @override
+ String get event_added => 'Veranstaltung hinzugefügt';
+
+ @override
+ String get unknown_error => 'Unbekannter Fehler';
+
+ @override
+ String get app_error => 'Anwendungsfehler';
+
+ @override
+ String get at => 'um';
+
+ @override
+ String get to_date => 'bis';
+
+ @override
+ String get item_link => 'Link : ';
+
+ @override
+ String get item_ticket => 'Abendkarte : ';
+
+ @override
+ String get link => 'Link';
+
+ @override
+ String get edit_link => 'Linkereignis bearbeiten';
+
+ @override
+ String get ticket => 'Abendkarte';
+
+ @override
+ String get edit_ticket => 'Ticketlink bearbeiten';
+
+ @override
+ String get toogle_interest => 'Fehler beim Umschalten des Interesses';
+
+ @override
+ String get error_update => 'Fehler beim Update';
+
+ @override
+ String get count_interested => 'Anzahl der Interessenten';
+}
diff --git a/covas_mobile_new/lib/gen_l10n/app_localizations_en.dart b/covas_mobile_new/lib/gen_l10n/app_localizations_en.dart
new file mode 100644
index 0000000..59d7a22
--- /dev/null
+++ b/covas_mobile_new/lib/gen_l10n/app_localizations_en.dart
@@ -0,0 +1,434 @@
+// ignore: unused_import
+import 'package:intl/intl.dart' as intl;
+import 'app_localizations.dart';
+
+// ignore_for_file: type=lint
+
+/// The translations for English (`en`).
+class AppLocalizationsEn extends AppLocalizations {
+ AppLocalizationsEn([String locale = 'en']) : super(locale);
+
+ @override
+ String get menu_list => 'Event list menu';
+
+ @override
+ String get language => 'Language';
+
+ @override
+ String get home => 'Home';
+
+ @override
+ String get settings => 'Settings';
+
+ @override
+ String get update_profile => 'Update profile';
+
+ @override
+ String get about => 'About';
+
+ @override
+ String get log_out => 'Log out';
+
+ @override
+ String get french => 'French';
+
+ @override
+ String get english => 'English';
+
+ @override
+ String get german => 'German';
+
+ @override
+ String get select_language => 'Select language';
+
+ @override
+ String get search_item => 'Search by item';
+
+ @override
+ String get search_tag => 'Search by tags';
+
+ @override
+ String get search_geographical => 'Search by geographical zone';
+
+ @override
+ String get show_date_field => 'Show Date Fields';
+
+ @override
+ String get hide_date_field => 'Hide Date Fields';
+
+ @override
+ String get no_data => 'No data available';
+
+ @override
+ String get search => 'Search';
+
+ @override
+ String get no_events => 'No events available for this location.';
+
+ @override
+ String get start_date => 'Start date';
+
+ @override
+ String get end_date => 'End date';
+
+ @override
+ String get failed_suggestions => 'Failed to load suggestions';
+
+ @override
+ String get error => 'Error';
+
+ @override
+ String get password_different => 'Must write a different password';
+
+ @override
+ String get create => 'Creation';
+
+ @override
+ String get user_create => 'Your user created';
+
+ @override
+ String get user_update => 'Your user updated';
+
+ @override
+ String get request_error => 'Poorly constructed query';
+
+ @override
+ String get incorrect_password => 'Incorrect password';
+
+ @override
+ String get unknown_user => 'Unknown user';
+
+ @override
+ String get disabled_user => 'User disabled';
+
+ @override
+ String get invalid_token => 'Invalid token';
+
+ @override
+ String get internal_error_server => 'Internal error server';
+
+ @override
+ String get unknown_error_auth => 'Unknown error authentification';
+
+ @override
+ String get required_input => 'Required input';
+
+ @override
+ String get create_profile => 'Create profile';
+
+ @override
+ String get edit_pseudo => 'Edit pseudo';
+
+ @override
+ String get password => 'Password';
+
+ @override
+ String get enter_password => 'Enter the passord';
+
+ @override
+ String get password_confirmed => 'Password confirmed';
+
+ @override
+ String get last_name => 'Last name';
+
+ @override
+ String get first_name => 'First name';
+
+ @override
+ String get email => 'Mail';
+
+ @override
+ String get edit_last_name => 'Edit name';
+
+ @override
+ String get edit_first_name => 'Edit first name';
+
+ @override
+ String get edit_email => 'Edit email address';
+
+ @override
+ String get birth_date => 'Birth date';
+
+ @override
+ String get edit_birth => 'Edit birth date';
+
+ @override
+ String get create_profile_button => 'Create profile';
+
+ @override
+ String get take_picture => 'Take a picture';
+
+ @override
+ String get error_ia =>
+ 'Google AI failed to analyze picture. Retry with another one';
+
+ @override
+ String get no_data_geo => 'No geographical data';
+
+ @override
+ String get response_status_update => 'response status code update';
+
+ @override
+ String get error_token => 'Token error';
+
+ @override
+ String get error_format => 'Data format error given by AI';
+
+ @override
+ String get display_picture => 'Display the Picture';
+
+ @override
+ String get analyze_image => 'Image Analyze in progress';
+
+ @override
+ String get loading_progress => 'Loading progress';
+
+ @override
+ String get error_event => 'Event error';
+
+ @override
+ String get no_future_event => 'No future event';
+
+ @override
+ String get error_user => 'Error user';
+
+ @override
+ String get empty_input => 'Empty input';
+
+ @override
+ String get info_event => 'Event info';
+
+ @override
+ String get event_already => 'Event already exists';
+
+ @override
+ String get picture_error => 'Picture error';
+
+ @override
+ String get no_picture_published => 'No picture published';
+
+ @override
+ String get event_update => 'Event updated';
+
+ @override
+ String get location => 'Location';
+
+ @override
+ String get add_event => 'Add or Update a event';
+
+ @override
+ String get edit_image => 'Edit pictures';
+
+ @override
+ String get name => 'Name';
+
+ @override
+ String get edit_event_name => 'Edit event name';
+
+ @override
+ String get start_time => 'Start time';
+
+ @override
+ String get end_time => 'End time';
+
+ @override
+ String get select_date => 'Click to select a date';
+
+ @override
+ String get select_time => 'Click to select a time';
+
+ @override
+ String get tag => 'Tags';
+
+ @override
+ String get already_tag => 'You have already this tags';
+
+ @override
+ String get enter_tag => 'Enter a tag';
+
+ @override
+ String get organizer => 'Organizer';
+
+ @override
+ String get already_organiser => 'You have already a organizer';
+
+ @override
+ String get enter_organizer => 'Enter a organizer';
+
+ @override
+ String get description => 'Description';
+
+ @override
+ String get describe_event => 'Describe event';
+
+ @override
+ String get add => 'Add';
+
+ @override
+ String get different_password_error => 'Different password';
+
+ @override
+ String get update => 'Update';
+
+ @override
+ String get updated => 'Updated';
+
+ @override
+ String get settings_updated => 'Settings updated';
+
+ @override
+ String get define_kilometer => 'Define Kilometer';
+
+ @override
+ String get email_sent => 'Email has been sent';
+
+ @override
+ String get forgot_password => 'Forgot password';
+
+ @override
+ String get enter_email => 'Enter the email';
+
+ @override
+ String get send_email => 'Send email';
+
+ @override
+ String get invalid_cache => 'Invalid cache';
+
+ @override
+ String get item_date => 'Date : ';
+
+ @override
+ String get item_maps => 'Maps : ';
+
+ @override
+ String get item_organizer => 'Organizer : ';
+
+ @override
+ String get item_description => 'Description : ';
+
+ @override
+ String get item_tags => 'Tags : ';
+
+ @override
+ String get failed_auth => 'Authentification failed';
+
+ @override
+ String get login_page => 'Login page';
+
+ @override
+ String get pseudo => 'Pseudo';
+
+ @override
+ String get enter_existing_pseudo => 'Enter a existing pseudo';
+
+ @override
+ String get remembr_me => 'Remember me';
+
+ @override
+ String get new_user => 'New User? Create Account';
+
+ @override
+ String get sign_in => 'Sign in';
+
+ @override
+ String get map_token => 'Mapbox Access Token is not available';
+
+ @override
+ String get geo_disabled => 'Location services are disabled.';
+
+ @override
+ String get permission_denied => 'Location permissions are denied.';
+
+ @override
+ String get enable_permission =>
+ 'Location permissions are permanently denied. Enable them in settings.';
+
+ @override
+ String get no_last_position => 'No last known position available.';
+
+ @override
+ String get failed_location => 'Failed to get user location';
+
+ @override
+ String get failed_fetch => 'Failed to fetch the route';
+
+ @override
+ String get invalid_coordinates_symbol =>
+ 'Invalid coordinates, cannot add symbol.';
+
+ @override
+ String get error_symbol => 'Error when adding symbol.';
+
+ @override
+ String get position_not_init =>
+ 'User position is not yet initialized. Try again.';
+
+ @override
+ String get invalid_coordinates => 'Invalid coordinates.';
+
+ @override
+ String get walking => 'Walking';
+
+ @override
+ String get cycling => 'Cycling';
+
+ @override
+ String get driving => 'Driving';
+
+ @override
+ String get get_direction => 'Get Directions and Markers';
+
+ @override
+ String get missing_token => 'Missing access token';
+
+ @override
+ String get geocoding_error => 'Error when geocoding';
+
+ @override
+ String get no_found_place => 'No found place';
+
+ @override
+ String get upload_error => 'Error when image uploading';
+
+ @override
+ String get event_added => 'Event added';
+
+ @override
+ String get unknown_error => 'Unknown error';
+
+ @override
+ String get app_error => 'Application error';
+
+ @override
+ String get at => 'at';
+
+ @override
+ String get to_date => 'to';
+
+ @override
+ String get item_link => 'Link : ';
+
+ @override
+ String get item_ticket => 'Ticket : ';
+
+ @override
+ String get link => 'Link';
+
+ @override
+ String get edit_link => 'Edit link name';
+
+ @override
+ String get ticket => 'Ticket';
+
+ @override
+ String get edit_ticket => 'Edit ticket link';
+
+ @override
+ String get toogle_interest => 'Error toggle interest';
+
+ @override
+ String get error_update => 'Error when updating';
+
+ @override
+ String get count_interested => 'Interested people number';
+}
diff --git a/covas_mobile_new/lib/gen_l10n/app_localizations_fr.dart b/covas_mobile_new/lib/gen_l10n/app_localizations_fr.dart
new file mode 100644
index 0000000..8f1750b
--- /dev/null
+++ b/covas_mobile_new/lib/gen_l10n/app_localizations_fr.dart
@@ -0,0 +1,437 @@
+// ignore: unused_import
+import 'package:intl/intl.dart' as intl;
+import 'app_localizations.dart';
+
+// ignore_for_file: type=lint
+
+/// The translations for French (`fr`).
+class AppLocalizationsFr extends AppLocalizations {
+ AppLocalizationsFr([String locale = 'fr']) : super(locale);
+
+ @override
+ String get menu_list => 'Liste d\'évènement';
+
+ @override
+ String get language => 'Langue';
+
+ @override
+ String get home => 'Accueil';
+
+ @override
+ String get settings => 'Paramètres';
+
+ @override
+ String get update_profile => 'Modifier le profil';
+
+ @override
+ String get about => 'À propos';
+
+ @override
+ String get log_out => 'Se déconnecter';
+
+ @override
+ String get french => 'Français';
+
+ @override
+ String get english => 'Anglais';
+
+ @override
+ String get german => 'Allemand';
+
+ @override
+ String get select_language => 'Selectionne la langue';
+
+ @override
+ String get search_item => 'Recherche par item';
+
+ @override
+ String get search_tag => 'Recherche par tags';
+
+ @override
+ String get search_geographical => 'Recherche par zone géographique';
+
+ @override
+ String get show_date_field => 'Afficher champ date';
+
+ @override
+ String get hide_date_field => 'Cacher Date Fields';
+
+ @override
+ String get no_data => 'Aucune donnée disponible';
+
+ @override
+ String get search => 'Recherche';
+
+ @override
+ String get no_events => 'Pas d\'évènements dans cette localisation';
+
+ @override
+ String get start_date => 'Date de début';
+
+ @override
+ String get end_date => 'Date de fin';
+
+ @override
+ String get failed_suggestions => 'Echec de chargement des suggestions';
+
+ @override
+ String get error => 'Erreur';
+
+ @override
+ String get password_different => 'Tu dois écrire un mot de passe different';
+
+ @override
+ String get create => 'Création';
+
+ @override
+ String get user_create => 'Votre utilisateur a été créé';
+
+ @override
+ String get user_update => 'Votre utilisateur a été modifié';
+
+ @override
+ String get request_error => 'Requête mal construite';
+
+ @override
+ String get incorrect_password => 'Mot de passe incorrect';
+
+ @override
+ String get unknown_user => 'Utilisateur inconnu';
+
+ @override
+ String get disabled_user => 'Utilisateur désactivé';
+
+ @override
+ String get invalid_token => 'Token invalide';
+
+ @override
+ String get internal_error_server => 'Erreur interne de serveur';
+
+ @override
+ String get unknown_error_auth => 'Problème d\'authentification inconnu';
+
+ @override
+ String get required_input => 'Champ requis';
+
+ @override
+ String get create_profile => 'Creation profil';
+
+ @override
+ String get edit_pseudo => 'Modifier le pseudo';
+
+ @override
+ String get password => 'Mot de passe';
+
+ @override
+ String get enter_password => 'Entrez le password';
+
+ @override
+ String get password_confirmed => 'Confirmez le mot de passe';
+
+ @override
+ String get last_name => 'Nom';
+
+ @override
+ String get first_name => 'Prénom';
+
+ @override
+ String get email => 'Email';
+
+ @override
+ String get edit_last_name => 'Modifier le nom';
+
+ @override
+ String get edit_first_name => 'Modifier le prénom';
+
+ @override
+ String get edit_email => 'Modifier l\'email';
+
+ @override
+ String get birth_date => 'Date de naissance';
+
+ @override
+ String get edit_birth => 'Modifier la date de naissance';
+
+ @override
+ String get create_profile_button => 'Créer le profil';
+
+ @override
+ String get take_picture => 'Take a picture';
+
+ @override
+ String get error_ia =>
+ 'L\'IA de Google n\'a pas su analyser l\'image. Recommencer avec une autre';
+
+ @override
+ String get no_data_geo => 'Aucune donnée géographique';
+
+ @override
+ String get response_status_update =>
+ 'Code du statut de réponse de la modification';
+
+ @override
+ String get error_token => 'Erreur de token';
+
+ @override
+ String get error_format => 'Erreur de format de donnée fourni par l\'IA';
+
+ @override
+ String get display_picture => 'Display the Picture';
+
+ @override
+ String get analyze_image => 'Analyse de l\'image en cours';
+
+ @override
+ String get loading_progress => 'Chargement en cours';
+
+ @override
+ String get error_event => 'Erreur de l\'évènement';
+
+ @override
+ String get no_future_event => 'Évènement non futur';
+
+ @override
+ String get error_user => 'Erreur de l\'utilisateur';
+
+ @override
+ String get empty_input => 'Champ vide';
+
+ @override
+ String get info_event => 'Event info';
+
+ @override
+ String get event_already => 'Event already exists';
+
+ @override
+ String get picture_error => 'Erreur image';
+
+ @override
+ String get no_picture_published => 'Image non publiée';
+
+ @override
+ String get event_update => 'Évènement modifié';
+
+ @override
+ String get location => 'Lieu';
+
+ @override
+ String get add_event => 'Ajouter ou modifier un évènement';
+
+ @override
+ String get edit_image => 'Changer la photo';
+
+ @override
+ String get name => 'Nom';
+
+ @override
+ String get edit_event_name => 'Changer le nom de l\'évènement';
+
+ @override
+ String get start_time => 'Heure de début';
+
+ @override
+ String get end_time => 'Heure de fin';
+
+ @override
+ String get select_date => 'Cliquer pour selectionner une date';
+
+ @override
+ String get select_time => 'Cliquer pour selectionner une heure';
+
+ @override
+ String get tag => 'Tags';
+
+ @override
+ String get already_tag => 'Tu as déjà entré ce tag';
+
+ @override
+ String get enter_tag => 'Entrer un tag';
+
+ @override
+ String get organizer => 'Organisateur';
+
+ @override
+ String get already_organiser => 'Tu as déjà rentré cet organisateur';
+
+ @override
+ String get enter_organizer => 'Entrer un organisateur';
+
+ @override
+ String get description => 'Description';
+
+ @override
+ String get describe_event => 'Décrire l\'évènement';
+
+ @override
+ String get add => 'Ajouter';
+
+ @override
+ String get different_password_error => 'Mot de passe différent';
+
+ @override
+ String get update => 'Mettre à jour';
+
+ @override
+ String get updated => 'Mis à jour';
+
+ @override
+ String get settings_updated => 'Paramètre mis à jour';
+
+ @override
+ String get define_kilometer => 'Definir un kilomètre';
+
+ @override
+ String get email_sent => 'Email a été envoyé';
+
+ @override
+ String get forgot_password => 'Mot de passe oublié';
+
+ @override
+ String get enter_email => 'Entrez l\'email';
+
+ @override
+ String get send_email => 'Send email';
+
+ @override
+ String get invalid_cache => 'Cache invalide';
+
+ @override
+ String get item_date => 'Date : ';
+
+ @override
+ String get item_maps => 'Carte : ';
+
+ @override
+ String get item_organizer => 'Organisateurs : ';
+
+ @override
+ String get item_description => 'Description : ';
+
+ @override
+ String get item_tags => 'Tags : ';
+
+ @override
+ String get failed_auth => 'Échec de l\'authenticaton';
+
+ @override
+ String get login_page => 'Page d\'authentification';
+
+ @override
+ String get pseudo => 'Pseudo';
+
+ @override
+ String get enter_existing_pseudo => 'Entrez un pseudo existant';
+
+ @override
+ String get remembr_me => 'Se souvenir de moi';
+
+ @override
+ String get new_user => 'Nouvel utilisateur ? Créer un compte';
+
+ @override
+ String get sign_in => 'Se connecter';
+
+ @override
+ String get map_token => 'Token d\'accès de Mapbox n\'est pas disponible';
+
+ @override
+ String get geo_disabled => 'Les services de localisation sont désactivés.';
+
+ @override
+ String get permission_denied =>
+ 'Les permissions de localisation sont refusées.';
+
+ @override
+ String get enable_permission =>
+ 'Les permissions de localisation sont toujours désactivés. Il faut les désactiver';
+
+ @override
+ String get no_last_position => 'Aucune position n\'est pas disponible.';
+
+ @override
+ String get failed_location =>
+ 'Échec de récupération des données geographique';
+
+ @override
+ String get failed_fetch => 'Échec de récupération des routes';
+
+ @override
+ String get invalid_coordinates_symbol =>
+ 'Coordonnées invalides. On ne peut pas ajouter le symbole';
+
+ @override
+ String get error_symbol => 'Erreur lors de l\'ajout du symbole';
+
+ @override
+ String get position_not_init =>
+ 'Coordonnées non initialisées. Essaye encore.';
+
+ @override
+ String get invalid_coordinates => 'Coordonnées invalides';
+
+ @override
+ String get walking => 'Marche';
+
+ @override
+ String get cycling => 'Vélo';
+
+ @override
+ String get driving => 'Voiture';
+
+ @override
+ String get get_direction => 'Get Directions and Markers';
+
+ @override
+ String get missing_token => 'Token d\'accès manquant';
+
+ @override
+ String get geocoding_error => 'Erreur lors du geocodage';
+
+ @override
+ String get no_found_place => 'Lieu introuvable';
+
+ @override
+ String get upload_error => 'Erreur lors de l\'upload d\'image';
+
+ @override
+ String get event_added => 'Évènement ajouté';
+
+ @override
+ String get unknown_error => 'Erreur inconnue';
+
+ @override
+ String get app_error => 'Erreur d\'application';
+
+ @override
+ String get at => 'à';
+
+ @override
+ String get to_date => 'jusqu\'à';
+
+ @override
+ String get item_link => 'Lien : ';
+
+ @override
+ String get item_ticket => 'Billet : ';
+
+ @override
+ String get link => 'Lien';
+
+ @override
+ String get edit_link => 'Editer le lien';
+
+ @override
+ String get ticket => 'Billet';
+
+ @override
+ String get edit_ticket => 'Editer le lien du billet';
+
+ @override
+ String get toogle_interest => 'Erreur de bouton de changement';
+
+ @override
+ String get error_update => 'Erreur lors de la mise à jour';
+
+ @override
+ String get count_interested => 'Nombre de personne interessé';
+}
diff --git a/covas_mobile/lib/l10n/app_de.arb b/covas_mobile_new/lib/l10n/app_de.arb
similarity index 100%
rename from covas_mobile/lib/l10n/app_de.arb
rename to covas_mobile_new/lib/l10n/app_de.arb
diff --git a/covas_mobile/lib/l10n/app_en.arb b/covas_mobile_new/lib/l10n/app_en.arb
similarity index 100%
rename from covas_mobile/lib/l10n/app_en.arb
rename to covas_mobile_new/lib/l10n/app_en.arb
diff --git a/covas_mobile/lib/l10n/app_fr.arb b/covas_mobile_new/lib/l10n/app_fr.arb
similarity index 100%
rename from covas_mobile/lib/l10n/app_fr.arb
rename to covas_mobile_new/lib/l10n/app_fr.arb
diff --git a/covas_mobile/lib/locale_provider.dart b/covas_mobile_new/lib/locale_provider.dart
similarity index 100%
rename from covas_mobile/lib/locale_provider.dart
rename to covas_mobile_new/lib/locale_provider.dart
diff --git a/covas_mobile_new/lib/main.dart b/covas_mobile_new/lib/main.dart
new file mode 100644
index 0000000..682e45c
--- /dev/null
+++ b/covas_mobile_new/lib/main.dart
@@ -0,0 +1,43 @@
+import 'package:flutter/material.dart';
+import 'package:google_mobile_ads/google_mobile_ads.dart';
+import 'package:provider/provider.dart';
+
+import 'pages/LoginDemo.dart';
+import 'locale_provider.dart'; // <-- à adapter selon ton arborescence
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'classes/notification_service.dart';
+import 'classes/auth_service.dart';
+import 'pages/ListItemMenu.dart';
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ await MobileAds.instance.initialize();
+ await NotificationService.initialize();
+ final AuthService _authService = AuthService();
+
+ final loggedIn = await _authService.isLoggedIn();
+
+ runApp(
+ ChangeNotifierProvider(
+ create: (_) => LocaleProvider(),
+ child: MyApp(isLoggedIn: loggedIn),
+ ),
+ );
+}
+
+class MyApp extends StatelessWidget {
+ final bool isLoggedIn;
+ const MyApp({Key? key, required this.isLoggedIn}) : super(key: key);
+ @override
+ Widget build(BuildContext context) {
+ final localeProvider = Provider.of(
+ context); // écoute les changements de langue
+ return MaterialApp(
+ debugShowCheckedModeBanner: false,
+ locale: localeProvider.locale, // <-- utilise la locale courante
+ supportedLocales: L10n.all,
+ localizationsDelegates: AppLocalizations.localizationsDelegates,
+ home: isLoggedIn ? ListItemMenu() : LoginDemo(),
+ );
+ }
+}
diff --git a/covas_mobile_new/lib/pages/AddProfile.dart b/covas_mobile_new/lib/pages/AddProfile.dart
new file mode 100644
index 0000000..a49af47
--- /dev/null
+++ b/covas_mobile_new/lib/pages/AddProfile.dart
@@ -0,0 +1,335 @@
+import 'package:flutter/material.dart';
+import 'package:http/http.dart' as http;
+import 'package:intl/intl.dart';
+
+import 'dart:convert';
+import 'dart:io';
+
+import '../pages/LoginDemo.dart';
+
+import '../classes/alert.dart';
+
+import '../variable/globals.dart' as globals;
+
+import '../classes/ad_helper.dart';
+import 'package:google_mobile_ads/google_mobile_ads.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+import '../locale_provider.dart'; // Créé plus loin
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ await MobileAds.instance.initialize();
+ runApp(MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ debugShowCheckedModeBanner: false,
+ home: AddProfile(),
+ );
+ }
+}
+
+class AddProfile extends StatefulWidget {
+ const AddProfile({super.key});
+
+ @override
+ _AddProfileState createState() => _AddProfileState();
+}
+
+class _AddProfileState extends State with ShowAlertDialog {
+ BannerAd? _bannerAd;
+
+ TextEditingController inputUserName = TextEditingController();
+
+ TextEditingController inputName = TextEditingController();
+
+ TextEditingController inputFirstName = TextEditingController();
+ TextEditingController inputEmail = TextEditingController();
+ TextEditingController inputBirth = TextEditingController();
+ TextEditingController inputPassword = TextEditingController();
+ TextEditingController inputPasswordConfirmed = TextEditingController();
+
+ onTapFunctionDatePicker({required BuildContext context}) async {
+ DateTime? pickedDate = await showDatePicker(
+ context: context,
+ firstDate: DateTime(1900),
+ initialDate: DateTime.now(),
+ lastDate: DateTime(2104));
+ if (pickedDate == null) return;
+ inputBirth.text = DateFormat("dd/MM/yyyy").format(pickedDate);
+ }
+
+ convertNulltoEmptyString(var check) {
+ if (check == null) {
+ return "";
+ }
+ return check;
+ }
+
+ convertNulltoArray(List check) {
+ if (check == null) {
+ return [];
+ }
+ return check;
+ }
+
+ String formatDate(String date) {
+ var splitedDate = date.split("/");
+
+ var day = splitedDate[0];
+ var month = splitedDate[1];
+ var year = splitedDate[2];
+
+ return "${year}-${month}-${day}";
+ }
+
+ Future _createProfile(BuildContext context) async {
+ var username = inputUserName.text;
+ var firstName = inputFirstName.text;
+ var name = inputName.text;
+ var email = inputEmail.text;
+ var password = inputPassword.text;
+ var confirmedPassword = inputPasswordConfirmed.text;
+ var birth = DateTime.parse(formatDate(inputBirth.text));
+
+ if ((password.isNotEmpty) && (confirmedPassword.isNotEmpty)) {
+ if (password != confirmedPassword) {
+ showAlertDialog(
+ context,
+ AppLocalizations.of(context)?.error ?? "Error",
+ AppLocalizations.of(context)?.password_different ??
+ "Must write a different password");
+ return;
+ }
+ }
+
+ var urlPut = Uri.parse("${globals.api}/mail");
+
+ var responsePost = await http.post(urlPut,
+ headers: {
+ HttpHeaders.acceptHeader: 'application/json, text/plain, */*',
+ HttpHeaders.contentTypeHeader: 'application/json'
+ },
+ body: jsonEncode({
+ 'name': name,
+ 'username': username,
+ 'firstName': firstName,
+ 'password': password,
+ 'email': email,
+ 'birth': birth.toString()
+ }));
+ print(responsePost.statusCode);
+ if (responsePost.statusCode == 200) {
+ showAlertDialog(
+ context,
+ AppLocalizations.of(context)?.create ?? "Creation",
+ AppLocalizations.of(context)?.user_create ?? "Your user created");
+ Navigator.pushReplacement(
+ context, MaterialPageRoute(builder: (_) => LoginDemo()));
+ return;
+ }
+
+ final errorMessages = {
+ 400: AppLocalizations.of(context)?.request_error ??
+ "Poorly constructed query",
+ 406: AppLocalizations.of(context)?.incorrect_password ??
+ "Incorrect password",
+ 404: AppLocalizations.of(context)?.unknown_user ?? "Unknown user",
+ 403: AppLocalizations.of(context)?.disabled_user ?? "Disabled user",
+ 410: AppLocalizations.of(context)?.invalid_token ?? "Invalid token",
+ 500: AppLocalizations.of(context)?.internal_error_server ??
+ "Internal error server"
+ };
+
+ final text = errorMessages[responsePost.statusCode] ??
+ AppLocalizations.of(context)?.unknown_error_auth ??
+ "Unknown error auth";
+ showAlertDialog(
+ context, AppLocalizations.of(context)?.error ?? "Error", text);
+ }
+
+ @override
+ void initState() {
+ super.initState();
+
+ AdHelper.createBannerAd(() => setState(() {})).then((ad) {
+ setState(() {
+ _bannerAd = ad;
+ });
+ });
+ }
+
+ final _formKey = GlobalKey();
+ String? _validateField(String? value) {
+ return value!.isEmpty
+ ? AppLocalizations.of(context)?.required_input ?? 'Required input'
+ : null;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: AppBar(
+ title: Text(
+ AppLocalizations.of(context)?.create_profile ?? "Create profile"),
+ backgroundColor: Colors.blue,
+ foregroundColor: Colors.white,
+ ),
+ body: Form(
+ key: _formKey,
+ child: SingleChildScrollView(
+ child: Column(
+ children: [
+ _bannerAd == null
+ ? SizedBox.shrink()
+ : SizedBox(
+ height: _bannerAd!.size.height.toDouble(),
+ width: _bannerAd!.size.width.toDouble(),
+ child: AdWidget(ad: _bannerAd!)),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputUserName,
+ validator: (value) => _validateField(value),
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText: 'Pseudo',
+ hintText: AppLocalizations.of(context)?.edit_pseudo ??
+ 'Edit pseudo'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputPassword,
+ validator: (value) => _validateField(value),
+ obscureText: true,
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText: AppLocalizations.of(context)?.password ??
+ 'Password',
+ hintText:
+ AppLocalizations.of(context)?.enter_password ??
+ 'Enter the password'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputPasswordConfirmed,
+ validator: (value) => _validateField(value),
+ obscureText: true,
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText:
+ AppLocalizations.of(context)?.password_confirmed ??
+ 'Password confirmed',
+ hintText:
+ AppLocalizations.of(context)?.password_confirmed ??
+ 'Password confirmed',
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputName,
+ validator: (value) => _validateField(value),
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText: AppLocalizations.of(context)?.last_name ??
+ 'Last name',
+ hintText:
+ AppLocalizations.of(context)?.edit_last_name ??
+ 'Edit last name'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputFirstName,
+ validator: (value) => _validateField(value),
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText: AppLocalizations.of(context)?.first_name ??
+ 'First name',
+ hintText:
+ AppLocalizations.of(context)?.edit_first_name ??
+ 'Edit first name'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputEmail,
+ validator: (value) => _validateField(value),
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText:
+ AppLocalizations.of(context)?.email ?? 'Email',
+ hintText: AppLocalizations.of(context)?.edit_email ??
+ 'Edit email'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(
+ left: 15.0, right: 15.0, top: 15, bottom: 0),
+ //padding: EdgeInsets.symmetric(horizontal: 15),
+ child: TextFormField(
+ controller: inputBirth,
+ readOnly: true,
+ validator: (value) => _validateField(value),
+ decoration: InputDecoration(
+ border: OutlineInputBorder(),
+ labelText: AppLocalizations.of(context)?.birth_date ??
+ 'Birth date',
+ hintText: AppLocalizations.of(context)?.edit_birth ??
+ 'Edit birth date'),
+ onTap: () => onTapFunctionDatePicker(context: context)),
+ ),
+ SizedBox(
+ height: 30,
+ ),
+ Container(
+ height: 50,
+ width: 250,
+ decoration: BoxDecoration(
+ color: Colors.blue,
+ borderRadius: BorderRadius.circular(20)),
+ child: TextButton(
+ onPressed: () {
+ if (_formKey.currentState!.validate()) {
+ _createProfile(context);
+ }
+ },
+ child: Text(
+ AppLocalizations.of(context)?.create_profile_button ??
+ "Create profile",
+ style: TextStyle(color: Colors.white, fontSize: 25),
+ ),
+ ),
+ )
+ ],
+ ),
+ ),
+ ));
+ }
+}
diff --git a/covas_mobile_new/lib/pages/Camera.dart b/covas_mobile_new/lib/pages/Camera.dart
new file mode 100644
index 0000000..a29fa76
--- /dev/null
+++ b/covas_mobile_new/lib/pages/Camera.dart
@@ -0,0 +1,163 @@
+import 'dart:async';
+
+import 'package:image_picker/image_picker.dart';
+import '../classes/MyDrawer.dart';
+
+import 'DisplayPictureScreen.dart';
+import 'package:camera/camera.dart';
+import 'package:flutter/material.dart';
+import '../classes/auth_service.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+import '../locale_provider.dart'; // Créé plus loin
+
+Future main() async {
+ // Ensure that plugin services are initialized so that `availableCameras()`
+ // can be called before `runApp()`
+ WidgetsFlutterBinding.ensureInitialized();
+
+ // Obtain a list of the available cameras on the device.
+ final cameras = await availableCameras();
+
+ // Get a specific camera from the list of available cameras.
+ final firstCamera = cameras.first;
+
+ runApp(
+ MaterialApp(
+ theme: ThemeData.dark(),
+ home: Camera(
+ // Pass the appropriate camera to the TakePictureScreen widget.
+ camera: firstCamera,
+ ),
+ ),
+ );
+}
+
+// A screen that allows users to take a picture using a given camera.
+class Camera extends StatefulWidget {
+ const Camera({
+ super.key,
+ required this.camera,
+ });
+
+ final CameraDescription camera;
+
+ @override
+ CameraState createState() => CameraState();
+}
+
+class CameraState extends State {
+ late CameraController _controller;
+ late Future _initializeControllerFuture;
+ final AuthService _authService = AuthService();
+
+ @override
+ void initState() {
+ super.initState();
+ // To display the current output from the Camera,
+ // create a CameraController.
+ _authService.checkTokenStatus(context);
+
+ _controller = CameraController(
+ // Get a specific camera from the list of available cameras.
+ widget.camera,
+ // Define the resolution to use.
+ ResolutionPreset.medium,
+ );
+
+ // Next, initialize the controller. This returns a Future.
+ _initializeControllerFuture = _controller.initialize();
+ }
+
+ Future pickImage() async {
+ final imagePicker = ImagePicker();
+ final pickedFile = await imagePicker.pickImage(source: ImageSource.gallery);
+ if (pickedFile != null) {
+ await Navigator.of(context).push(
+ MaterialPageRoute(
+ builder: (context) => DisplayPictureScreen(
+ // Pass the automatically generated path to
+ // the DisplayPictureScreen widget.
+ imagePath: pickedFile.path,
+ ),
+ ),
+ );
+ }
+ }
+
+ @override
+ void dispose() {
+ // Dispose of the controller when the widget is disposed.
+ _controller.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(AppLocalizations.of(context)?.take_picture ??
+ "Take a picture")),
+ // You must wait until the controller is initialized before displaying the
+ // camera preview. Use a FutureBuilder to display a loading spinner until the
+ // controller has finished initializing.
+ drawer: MyDrawer(),
+ body: FutureBuilder(
+ future: _initializeControllerFuture,
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.done) {
+ // If the Future is complete, display the preview.
+ return CameraPreview(_controller);
+ } else {
+ // Otherwise, display a loading indicator.
+ return const Center(child: CircularProgressIndicator());
+ }
+ },
+ ),
+ floatingActionButton: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ FloatingActionButton(
+ onPressed: pickImage,
+ child: Icon(Icons.photo_library),
+ ),
+ SizedBox(width: 40),
+ FloatingActionButton(
+ // Provide an onPressed callback.
+ onPressed: () async {
+ // Take the Picture in a try / catch block. If anything goes wrong,
+ // catch the error.
+ try {
+ // Ensure that the camera is initialized.
+ await _initializeControllerFuture;
+
+ // Attempt to take a picture and get the file `image`
+ // where it was saved.
+ final image = await _controller.takePicture();
+
+ if (!context.mounted) return;
+
+ // If the picture was taken, display it on a new screen.
+ await Navigator.of(context).push(
+ MaterialPageRoute(
+ builder: (context) => DisplayPictureScreen(
+ // Pass the automatically generated path to
+ // the DisplayPictureScreen widget.
+ imagePath: image.path,
+ ),
+ ),
+ );
+ } catch (e) {
+ // If an error occurs, log the error to the console.
+ print(e);
+ }
+ },
+ child: const Icon(Icons.camera_alt),
+ )
+ ],
+ )));
+ }
+}
diff --git a/covas_mobile_new/lib/pages/CameraEdit.dart b/covas_mobile_new/lib/pages/CameraEdit.dart
new file mode 100644
index 0000000..f4c276f
--- /dev/null
+++ b/covas_mobile_new/lib/pages/CameraEdit.dart
@@ -0,0 +1,166 @@
+import 'dart:async';
+import 'dart:io';
+
+import '../classes/events.dart';
+import '../classes/MyDrawer.dart';
+import 'package:image_picker/image_picker.dart';
+import 'EditEvent.dart';
+import 'package:camera/camera.dart';
+import 'package:flutter/material.dart';
+import '../classes/auth_service.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+import '../locale_provider.dart'; // Créé
+
+Future main() async {
+ // Ensure that plugin services are initialized so that `availableCameras()`
+ // can be called before `runApp()`
+ WidgetsFlutterBinding.ensureInitialized();
+
+ // Obtain a list of the available cameras on the device.
+ final cameras = await availableCameras();
+
+ // Get a specific camera from the list of available cameras.
+ final firstCamera = cameras.first;
+ Events? events;
+
+ runApp(
+ MaterialApp(
+ theme: ThemeData.dark(),
+ home: CameraEdit(
+ // Pass the appropriate camera to the TakePictureScreen widget.
+ camera: firstCamera,
+ events: events),
+ ),
+ );
+}
+
+// A screen that allows users to take a picture using a given camera.
+class CameraEdit extends StatefulWidget {
+ const CameraEdit({super.key, required this.camera, required this.events});
+ final Events? events;
+
+ final CameraDescription camera;
+
+ @override
+ CameraEditState createState() => CameraEditState();
+}
+
+class CameraEditState extends State {
+ late CameraController _controller;
+ late Future _initializeControllerFuture;
+ final AuthService _authService = AuthService();
+
+ @override
+ void initState() {
+ super.initState();
+ _authService.checkTokenStatus(context);
+
+ // To display the current output from the Camera,
+ // create a CameraController.
+
+ _controller = CameraController(
+ // Get a specific camera from the list of available cameras.
+ widget.camera,
+ // Define the resolution to use.
+ ResolutionPreset.medium,
+ );
+
+ // Next, initialize the controller. This returns a Future.
+ _initializeControllerFuture = _controller.initialize();
+ }
+
+ Future pickImage() async {
+ final imagePicker = ImagePicker();
+ final pickedFile = await imagePicker.pickImage(source: ImageSource.gallery);
+ if (pickedFile != null) {
+ await Navigator.of(context).push(
+ MaterialPageRoute(
+ builder: (context) => EditEvent(
+ // Pass the automatically generated path to
+ // the DisplayPictureScreen widget.
+ events: widget.events,
+ imgPath: pickedFile.path,
+ ),
+ ),
+ );
+ }
+ }
+
+ @override
+ void dispose() {
+ // Dispose of the controller when the widget is disposed.
+ _controller.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(AppLocalizations.of(context)?.take_picture ??
+ 'Take a picture')),
+ // You must wait until the controller is initialized before displaying the
+ // camera preview. Use a FutureBuilder to display a loading spinner until the
+ // controller has finished initializing.
+ drawer: MyDrawer(),
+ body: FutureBuilder(
+ future: _initializeControllerFuture,
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.done) {
+ // If the Future is complete, display the preview.
+ return CameraPreview(_controller);
+ } else {
+ // Otherwise, display a loading indicator.
+ return const Center(child: CircularProgressIndicator());
+ }
+ },
+ ),
+ floatingActionButton: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ FloatingActionButton(
+ onPressed: pickImage,
+ child: Icon(Icons.photo_library),
+ ),
+ SizedBox(width: 40),
+ FloatingActionButton(
+ // Provide an onPressed callback.
+ onPressed: () async {
+ // Take the Picture in a try / catch block. If anything goes wrong,
+ // catch the error.
+ try {
+ // Ensure that the camera is initialized.
+ await _initializeControllerFuture;
+
+ // Attempt to take a picture and get the file `image`
+ // where it was saved.
+ final image = await _controller.takePicture();
+
+ if (!context.mounted) return;
+
+ // If the picture was taken, display it on a new screen.
+ await Navigator.of(context).push(
+ MaterialPageRoute(
+ builder: (context) => EditEvent(
+ // Pass the automatically generated path to
+ // the DisplayPictureScreen widget.
+ events: widget.events,
+ imgPath: image.path,
+ ),
+ ),
+ );
+ } catch (e) {
+ // If an error occurs, log the error to the console.
+ print(e);
+ }
+ },
+ child: const Icon(Icons.camera_alt),
+ )
+ ],
+ )));
+ }
+}
diff --git a/covas_mobile_new/lib/pages/DisplayPictureScreen.dart b/covas_mobile_new/lib/pages/DisplayPictureScreen.dart
new file mode 100644
index 0000000..9893b6f
--- /dev/null
+++ b/covas_mobile_new/lib/pages/DisplayPictureScreen.dart
@@ -0,0 +1,266 @@
+import 'package:flutter/material.dart';
+import 'dart:io';
+import '../classes/addEventImage.dart';
+import '../classes/alert.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart';
+import 'package:flutter_gemini/flutter_gemini.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import 'package:http/http.dart' as http;
+import "ItemMenu.dart";
+import 'UpdateEventImage.dart';
+
+import 'dart:convert';
+
+import '../variable/globals.dart' as globals;
+import '../classes/MyDrawer.dart';
+
+import '../classes/ad_helper.dart';
+import 'package:google_mobile_ads/google_mobile_ads.dart';
+import '../classes/auth_service.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:covas_mobile/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+import '../locale_provider.dart'; // Créé
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ await MobileAds.instance.initialize();
+ runApp(MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ const MyApp({Key? key}) : super(key: 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 running your application with "flutter run". You'll see the
+ // application has a blue toolbar. Then, without quitting the app, try
+ // changing the primarySwatch below to Colors.green and then invoke
+ // "hot reload" (press "r" in the console where you ran "flutter run",
+ // or simply save your changes to "hot reload" in a Flutter IDE).
+ // Notice that the counter didn't reset back to zero; the application
+ // is not restarted.
+ primarySwatch: Colors.blue,
+ ),
+ );
+ }
+}
+
+// A screen that allows users to take a picture using a given camera.
+class DisplayPictureScreen extends StatefulWidget {
+ final String imagePath;
+
+ const DisplayPictureScreen({super.key, required this.imagePath});
+
+ @override
+ DisplayPictureScreenState createState() => DisplayPictureScreenState();
+}
+
+// A widget that displays the picture taken by the user.
+class DisplayPictureScreenState extends State
+ with ShowDescImageAdd, ShowAlertDialog, TickerProviderStateMixin {
+ BannerAd? _bannerAd;
+ final AuthService _authService = AuthService();
+
+ late AnimationController controller;
+ @override
+ void initState() {
+ super.initState();
+ _authService.checkTokenStatus(context);
+
+ AdHelper.createBannerAd(() => setState(() {})).then((ad) {
+ setState(() {
+ _bannerAd = ad;
+ });
+ });
+
+ controller = AnimationController(
+ /// [AnimationController]s can be created with `vsync: this` because of
+ /// [TickerProviderStateMixin].
+ vsync: this,
+ duration: const Duration(seconds: 5),
+ )..addListener(() {
+ setState(() {});
+ });
+ controller.repeat(reverse: false);
+
+ _getEventInfosFromImage();
+ }
+
+ @override
+ void dispose() {
+ controller.dispose();
+ super.dispose();
+ }
+
+ Future displayError(String e) async {
+ print("problem gemini : ${e}");
+ showAlertDialog(
+ context,
+ AppLocalizations.of(context)?.error ?? 'Error',
+ AppLocalizations.of(context)?.error_ia ??
+ 'Google AI failed to analyze picture. Retry with another one');
+ }
+
+ void _showErrorDialog(BuildContext context, String title, String message) {
+ showAlertDialog(context, title, message);
+ }
+
+ Future