commit c12d33c1dbc8e6b73e885407ff911b9c930f5a48
Author: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com>
Date: Mon Jun 10 11:44:03 2024 +0000
Updating to latest FlutterFlow output.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..600088c7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# FREHub
+
+A new Flutter project.
+
+## Getting Started
+
+FlutterFlow projects are built to run on the Flutter _stable_ release.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 00000000..78e77505
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,35 @@
+# 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
+ unnecessary_string_escapes: false
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
+
+
+analyzer:
+ exclude:
+ - lib/custom_code/**
+ - lib/flutter_flow/custom_functions.dart
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 00000000..0a741cb4
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,11 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 00000000..9883c333
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,79 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+
+
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+android {
+ compileSdkVersion 34
+
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ lintOptions {
+ disable 'InvalidPackage'
+ checkReleaseBuilds false
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.freaccess.hub"
+ minSdkVersion 21
+ targetSdkVersion 34
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
+ 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.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10"
+}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000..288304cb
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..08fca23b
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt b/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
new file mode 100644
index 00000000..f6d5d1f0
--- /dev/null
+++ b/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.freaccess.hub
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..db77bb4b
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..17987b79
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..09d43914
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..d5f1c8d3
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4d6372ee
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100644
index 00000000..f93aa34d
--- /dev/null
+++ b/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000..f93aa34d
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml
new file mode 100644
index 00000000..d74aa35c
--- /dev/null
+++ b/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..d5c63adc
--- /dev/null
+++ b/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+ FREHub
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000..d74aa35c
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000..288304cb
--- /dev/null
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 00000000..cf9fba7e
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,18 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 00000000..498c33b7
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,4 @@
+org.gradle.jvmargs=-Xmx4608m
+android.useAndroidX=true
+android.enableJetifier=true
+android.enableR8=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..6b665338
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 00000000..e699619d
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,27 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return 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 "7.3.0" apply false
+ id "org.jetbrains.kotlin.android" version "1.7.10" apply false
+
+
+}
+
+include ":app"
\ No newline at end of file
diff --git a/assets/audios/favicon.png b/assets/audios/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/audios/favicon.png differ
diff --git a/assets/fonts/Nunito-Medium.ttf b/assets/fonts/Nunito-Medium.ttf
new file mode 100644
index 00000000..f9881a02
Binary files /dev/null and b/assets/fonts/Nunito-Medium.ttf differ
diff --git a/assets/fonts/Nunito-Regular.ttf b/assets/fonts/Nunito-Regular.ttf
new file mode 100644
index 00000000..dfd0fcb4
Binary files /dev/null and b/assets/fonts/Nunito-Regular.ttf differ
diff --git a/assets/fonts/SFPRODISPLAYBOLD.OTF b/assets/fonts/SFPRODISPLAYBOLD.OTF
new file mode 100644
index 00000000..025b25c2
Binary files /dev/null and b/assets/fonts/SFPRODISPLAYBOLD.OTF differ
diff --git a/assets/fonts/SFPRODISPLAYMEDIUM.OTF b/assets/fonts/SFPRODISPLAYMEDIUM.OTF
new file mode 100644
index 00000000..b2f7daca
Binary files /dev/null and b/assets/fonts/SFPRODISPLAYMEDIUM.OTF differ
diff --git a/assets/fonts/SFPRODISPLAYREGULAR.OTF b/assets/fonts/SFPRODISPLAYREGULAR.OTF
new file mode 100644
index 00000000..09aaca9f
Binary files /dev/null and b/assets/fonts/SFPRODISPLAYREGULAR.OTF differ
diff --git a/assets/fonts/favicon.png b/assets/fonts/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/fonts/favicon.png differ
diff --git a/assets/fonts/icons.ttf b/assets/fonts/icons.ttf
new file mode 100644
index 00000000..967993d2
Binary files /dev/null and b/assets/fonts/icons.ttf differ
diff --git a/assets/fonts/menu.ttf b/assets/fonts/menu.ttf
new file mode 100644
index 00000000..96dead6b
Binary files /dev/null and b/assets/fonts/menu.ttf differ
diff --git a/assets/images/adaptive_background_icon.svg b/assets/images/adaptive_background_icon.svg
new file mode 100644
index 00000000..5e3c0b13
--- /dev/null
+++ b/assets/images/adaptive_background_icon.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/adaptive_foreground_icon.svg b/assets/images/adaptive_foreground_icon.svg
new file mode 100644
index 00000000..5e3c0b13
--- /dev/null
+++ b/assets/images/adaptive_foreground_icon.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/app_launcher_icon.svg b/assets/images/app_launcher_icon.svg
new file mode 100644
index 00000000..5e3c0b13
--- /dev/null
+++ b/assets/images/app_launcher_icon.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/error_image.svg b/assets/images/error_image.svg
new file mode 100644
index 00000000..5e3c0b13
--- /dev/null
+++ b/assets/images/error_image.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/favicon.png b/assets/images/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/images/favicon.png differ
diff --git a/assets/images/logo.svg b/assets/images/logo.svg
new file mode 100644
index 00000000..5e3c0b13
--- /dev/null
+++ b/assets/images/logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/lottie_animations/favicon.png b/assets/lottie_animations/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/lottie_animations/favicon.png differ
diff --git a/assets/pdfs/favicon.png b/assets/pdfs/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/pdfs/favicon.png differ
diff --git a/assets/rive_animations/favicon.png b/assets/rive_animations/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/rive_animations/favicon.png differ
diff --git a/assets/videos/favicon.png b/assets/videos/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/assets/videos/favicon.png differ
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 00000000..eb86478d
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,33 @@
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+build/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000..d57061dd
--- /dev/null
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ 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/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000..e8efba11
--- /dev/null
+++ b/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000..399e9340
--- /dev/null
+++ b/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/ios/ImageNotification/Info.plist b/ios/ImageNotification/Info.plist
new file mode 100644
index 00000000..9f280602
--- /dev/null
+++ b/ios/ImageNotification/Info.plist
@@ -0,0 +1,31 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ ImageNotification
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.usernotifications.service
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).NotificationService
+
+
+
diff --git a/ios/ImageNotification/NotificationService.swift b/ios/ImageNotification/NotificationService.swift
new file mode 100644
index 00000000..d16342e0
--- /dev/null
+++ b/ios/ImageNotification/NotificationService.swift
@@ -0,0 +1,27 @@
+import FirebaseMessaging
+import UserNotifications
+
+class NotificationService: UNNotificationServiceExtension {
+
+ var contentHandler: ((UNNotificationContent) -> Void)?
+ var bestAttemptContent: UNMutableNotificationContent?
+
+ override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
+ self.contentHandler = contentHandler
+ bestAttemptContent = request.content
+ .mutableCopy() as? UNMutableNotificationContent
+ guard let bestAttemptContent = bestAttemptContent else { return }
+ FIRMessagingExtensionHelper().populateNotificationContent(
+ bestAttemptContent,
+ withContentHandler: contentHandler)
+ }
+
+ override func serviceExtensionTimeWillExpire() {
+ // Called just before the extension will be terminated by the system.
+ // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
+ if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
+ contentHandler(bestAttemptContent)
+ }
+ }
+
+}
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 00000000..23464e32
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,45 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '13.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks! :linkage => :static
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ target.build_configurations.each do |config|
+ config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
+
+ end
+ end
+end
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..5f2695cd
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,514 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 6436409A27A31CD800820AF7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6436409C27A31CD800820AF7 /* InfoPlist.strings */; };
+ 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 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 = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; 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 = ""; };
+ 6436409527A31CDE00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; };
+ 6436409227A31CDC00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; 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 */
+ 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 */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ 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 */,
+ 6436409C27A31CD800820AF7 /* InfoPlist.strings */,
+ 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 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 = {
+ LastUpgradeCheck = 1020;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = pt;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ pt,
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */,
+ 6436409A27A31CD800820AF7 /* InfoPlist.strings 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;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ 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;
+ 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 */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 6436409527A31CDE00820AF7 /* pt */,
+ 6436409227A31CDC00820AF7 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 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;
+ 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;
+ 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;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.freaccess.hub;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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;
+ 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;
+ 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;
+ 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_OPTIMIZATION_LEVEL = "-Owholemodule";
+ 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;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.freaccess.hub;
+ 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;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.freaccess.hub;
+ 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 */
+ 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/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..a28140cf
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..f52eb22e
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,14 @@
+import UIKit
+
+import Flutter
+
+@UIApplicationMain
+@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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..d36b1fab
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..dc9ada47
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..28c6bf03
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..2ccbfd96
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..f091b6b0
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..4cde1211
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..d0ef06e7
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..dcdc2306
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..2ccbfd96
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..c8f9ed8f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..a6d6b860
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..a6d6b860
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..75b2d164
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..c4df70d3
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..6a84f41e
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..d0e1f585
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 00000000..ed9b52db
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,78 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ FREHub
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ FREHub
+ CFBundlePackageType
+ APPL
+ CFBundleLocalizations
+
+ pt
+ en
+
+
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ frehub.com
+ CFBundleURLSchemes
+
+ frehub
+
+
+
+ FlutterDeepLinkingEnabled
+
+
+
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+
+ NSCameraUsageDescription
+ In order to take a picture or video, this app requires permission to access the camera.
+ NSPhotoLibraryUsageDescription
+ In order to upload data, this app requires permission to access the photo library.
+
+
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
+
diff --git a/ios/Runner/PrivacyInfo.xcprivacy b/ios/Runner/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..0c67376e
--- /dev/null
+++ b/ios/Runner/PrivacyInfo.xcprivacy
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
new file mode 100644
index 00000000..6631ffa6
--- /dev/null
+++ b/ios/Runner/Runner.entitlements
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/ios/Runner/en.lproj/InfoPlist.strings b/ios/Runner/en.lproj/InfoPlist.strings
new file mode 100644
index 00000000..9b1e3bbf
--- /dev/null
+++ b/ios/Runner/en.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+NSCameraUsageDescription = "dd/mm/yyyy";
diff --git a/ios/Runner/pt.lproj/InfoPlist.strings b/ios/Runner/pt.lproj/InfoPlist.strings
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ios/Runner/pt.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+
diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart
new file mode 100644
index 00000000..6cbc3c59
--- /dev/null
+++ b/lib/actions/actions.dart
@@ -0,0 +1,275 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/custom_code/actions/index.dart' as actions;
+import '/flutter_flow/random_data_util.dart' as random_data;
+import 'package:flutter/material.dart';
+
+Future repeatVisitScheduleAction(
+ BuildContext context, {
+ List? visitorJsonList,
+ String? visitorStrList,
+ String? visitStartDateStr,
+ String? visitEndDateStr,
+ String? visitReasonStr,
+ String? visitLevelStr,
+ bool? visitTempBol,
+ String? visitObsStr,
+}) async {
+ context.pushNamed(
+ 'scheduleCompleteVisitPage',
+ queryParameters: {
+ 'visitStartDateStr': serializeParam(
+ visitStartDateStr,
+ ParamType.String,
+ ),
+ 'visitEndDateStr': serializeParam(
+ visitEndDateStr,
+ ParamType.String,
+ ),
+ 'visitReasonStr': serializeParam(
+ visitReasonStr,
+ ParamType.String,
+ ),
+ 'visitLevelStr': serializeParam(
+ visitLevelStr,
+ ParamType.String,
+ ),
+ 'visitTempBol': serializeParam(
+ visitTempBol,
+ ParamType.bool,
+ ),
+ 'visitObsStr': serializeParam(
+ visitObsStr,
+ ParamType.String,
+ ),
+ 'visitorStrList': serializeParam(
+ visitorStrList,
+ ParamType.String,
+ ),
+ 'visitorJsonList': serializeParam(
+ visitorJsonList,
+ ParamType.JSON,
+ true,
+ ),
+ }.withoutNulls,
+ );
+}
+
+Future manageStatusColorAction(
+ BuildContext context, {
+ required String? visitStatusStr,
+}) async {
+ if (visitStatusStr == 'A') {
+ return FlutterFlowTheme.of(context).success;
+ } else if ((visitStatusStr == 'C') ||
+ (visitStatusStr == 'F') ||
+ (visitStatusStr == 'B') ||
+ (visitStatusStr == 'I')) {
+ return FlutterFlowTheme.of(context).error;
+ }
+
+ return FlutterFlowTheme.of(context).warning;
+}
+
+Future singInActionApp(
+ BuildContext context, {
+ String? emailAdress,
+ String? password,
+}) async {
+ String? devUUID;
+ ApiCallResponse? loginCall;
+
+ await Future.wait([
+ Future(() async {
+ FFAppState().email = emailAdress!;
+ }),
+ Future(() async {
+ FFAppState().passwd = password!;
+ }),
+ ]);
+ if ((FFAppState().email != '') &&
+ (FFAppState().passwd != '')) {
+ devUUID = await actions.getDevUUID();
+ FFAppState().devUUID = devUUID!;
+ loginCall = await PhpGroup.loginCall.call(
+ email: FFAppState().email,
+ password: FFAppState().passwd,
+ uuid: FFAppState().devUUID,
+ type: FFAppState().device,
+ description: random_data.randomString(
+ 10,
+ 10,
+ true,
+ false,
+ false,
+ ),
+ );
+ FFAppState().userUUID = PhpGroup.loginCall.userUUID(
+ (loginCall.jsonBody ?? ''),
+ )!;
+ if (PhpGroup.loginCall.error(
+ (loginCall.jsonBody ?? ''),
+ ) ==
+ false) {
+ FFAppState().isLogged = true;
+
+ context.goNamed(
+ 'homePage',
+ extra: {
+ kTransitionInfoKey: const TransitionInfo(
+ hasTransition: true,
+ transitionType: PageTransitionType.fade,
+ ),
+ },
+ );
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg: PhpGroup.loginCall.msg(
+ (loginCall?.jsonBody ?? ''),
+ )!,
+ ),
+ );
+ },
+ );
+
+ FFAppState().email = '';
+ FFAppState().passwd = '';
+ FFAppState().update(() {});
+ }
+ } else {
+ return;
+ }
+}
+
+Future signUpActionApp(
+ BuildContext context, {
+ required String? name,
+ String? passwd,
+ required String? email,
+ String? device,
+}) async {
+ ApiCallResponse? registerCall;
+
+ if ((email != null && email != '') &&
+ (passwd != null && passwd != '') &&
+ (name != null && name != '')) {
+ registerCall = await PhpGroup.registerCall.call(
+ name: name,
+ password: passwd,
+ email: email,
+ token: random_data.randomString(
+ 36,
+ 36,
+ false,
+ false,
+ true,
+ ),
+ uuid: random_data.randomString(
+ 36,
+ 36,
+ false,
+ false,
+ true,
+ ),
+ tipo: device,
+ descricao: random_data.randomString(
+ 36,
+ 36,
+ true,
+ false,
+ false,
+ ),
+ );
+ if (PhpGroup.registerCall.error(
+ (registerCall.jsonBody ?? ''),
+ ) ==
+ false) {
+ return true;
+ }
+
+ await showDialog(
+ context: context,
+ builder: (alertDialogContext) {
+ return AlertDialog(
+ title: const Text('ERROR2'),
+ content: const Text('ERROR2'),
+ actions: [
+ TextButton(
+ onPressed: () => Navigator.pop(alertDialogContext),
+ child: const Text('ERROR2 '),
+ ),
+ ],
+ );
+ },
+ );
+ return false;
+ } else {
+ await showDialog(
+ context: context,
+ builder: (alertDialogContext) {
+ return AlertDialog(
+ title: const Text('ERROR1'),
+ content: const Text('ERROR1'),
+ actions: [
+ TextButton(
+ onPressed: () => Navigator.pop(alertDialogContext),
+ child: const Text('ERROR1 '),
+ ),
+ ],
+ );
+ },
+ );
+ return false;
+ }
+}
+
+Future forgotPasswdAction(
+ BuildContext context, {
+ required String? email,
+}) async {
+ ApiCallResponse? forgotPasswd;
+
+ forgotPasswd = await PhpGroup.forgotPasswordCall.call(
+ email: email,
+ );
+ if (PhpGroup.forgotPasswordCall.error(
+ (forgotPasswd.jsonBody ?? ''),
+ ) ==
+ false) {
+ context.pushNamed(
+ 'LoginPage',
+ queryParameters: {
+ 'device': serializeParam(
+ FFAppState().device,
+ ParamType.String,
+ ),
+ }.withoutNulls,
+ );
+ } else {
+ return;
+ }
+}
+
+Future cachingLoginActionApp(BuildContext context) async {
+ if (FFAppState().isLogged == true) {
+ context.pushNamed('homePage');
+ } else {
+ if (isAndroid == true) {
+ FFAppState().device = 'Android';
+ } else if (isiOS == true) {
+ FFAppState().device = 'iOS';
+ } else {
+ FFAppState().device = 'Web';
+ }
+ }
+}
diff --git a/lib/app_state.dart b/lib/app_state.dart
new file mode 100644
index 00000000..f0256969
--- /dev/null
+++ b/lib/app_state.dart
@@ -0,0 +1,129 @@
+import 'package:flutter/material.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+class FFAppState extends ChangeNotifier {
+ static FFAppState _instance = FFAppState._internal();
+
+ factory FFAppState() {
+ return _instance;
+ }
+
+ FFAppState._internal();
+
+ static void reset() {
+ _instance = FFAppState._internal();
+ }
+
+ Future initializePersistedState() async {
+ prefs = await SharedPreferences.getInstance();
+ _safeInit(() {
+ _cliUUID = prefs.getString('ff_cliUUID') ?? _cliUUID;
+ });
+ _safeInit(() {
+ _ownerUUID = prefs.getString('ff_ownerUUID') ?? _ownerUUID;
+ });
+ _safeInit(() {
+ _userUUID = prefs.getString('ff_userUUID') ?? _userUUID;
+ });
+ _safeInit(() {
+ _devUUID = prefs.getString('ff_devUUID') ?? _devUUID;
+ });
+ _safeInit(() {
+ _email = prefs.getString('ff_email') ?? _email;
+ });
+ _safeInit(() {
+ _passwd = prefs.getString('ff_passwd') ?? _passwd;
+ });
+ _safeInit(() {
+ _device = prefs.getString('ff_device') ?? _device;
+ });
+ _safeInit(() {
+ _isLogged = prefs.getBool('ff_isLogged') ?? _isLogged;
+ });
+ _safeInit(() {
+ _local = prefs.getString('ff_local') ?? _local;
+ });
+ }
+
+ void update(VoidCallback callback) {
+ callback();
+ notifyListeners();
+ }
+
+ late SharedPreferences prefs;
+
+ String _cliUUID = '';
+ String get cliUUID => _cliUUID;
+ set cliUUID(String value) {
+ _cliUUID = value;
+ prefs.setString('ff_cliUUID', value);
+ }
+
+ String _ownerUUID = '';
+ String get ownerUUID => _ownerUUID;
+ set ownerUUID(String value) {
+ _ownerUUID = value;
+ prefs.setString('ff_ownerUUID', value);
+ }
+
+ String _userUUID = '';
+ String get userUUID => _userUUID;
+ set userUUID(String value) {
+ _userUUID = value;
+ prefs.setString('ff_userUUID', value);
+ }
+
+ String _devUUID = '';
+ String get devUUID => _devUUID;
+ set devUUID(String value) {
+ _devUUID = value;
+ prefs.setString('ff_devUUID', value);
+ }
+
+ String _email = '';
+ String get email => _email;
+ set email(String value) {
+ _email = value;
+ prefs.setString('ff_email', value);
+ }
+
+ String _passwd = '';
+ String get passwd => _passwd;
+ set passwd(String value) {
+ _passwd = value;
+ prefs.setString('ff_passwd', value);
+ }
+
+ String _device = '';
+ String get device => _device;
+ set device(String value) {
+ _device = value;
+ prefs.setString('ff_device', value);
+ }
+
+ bool _isLogged = false;
+ bool get isLogged => _isLogged;
+ set isLogged(bool value) {
+ _isLogged = value;
+ prefs.setBool('ff_isLogged', value);
+ }
+
+ String _local = '';
+ String get local => _local;
+ set local(String value) {
+ _local = value;
+ prefs.setString('ff_local', value);
+ }
+}
+
+void _safeInit(Function() initializeField) {
+ try {
+ initializeField();
+ } catch (_) {}
+}
+
+Future _safeInitAsync(Function() initializeField) async {
+ try {
+ await initializeField();
+ } catch (_) {}
+}
diff --git a/lib/application_components/atomic_components/text_field_component/text_field_component_model.dart b/lib/application_components/atomic_components/text_field_component/text_field_component_model.dart
new file mode 100644
index 00000000..30f54431
--- /dev/null
+++ b/lib/application_components/atomic_components/text_field_component/text_field_component_model.dart
@@ -0,0 +1,22 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'text_field_component_widget.dart' show TextFieldComponentWidget;
+import 'package:flutter/material.dart';
+
+class TextFieldComponentModel
+ extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode;
+ TextEditingController? textController;
+ String? Function(BuildContext, String?)? textControllerValidator;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ textFieldFocusNode?.dispose();
+ textController?.dispose();
+ }
+}
diff --git a/lib/application_components/atomic_components/text_field_component/text_field_component_widget.dart b/lib/application_components/atomic_components/text_field_component/text_field_component_widget.dart
new file mode 100644
index 00000000..e9ab116f
--- /dev/null
+++ b/lib/application_components/atomic_components/text_field_component/text_field_component_widget.dart
@@ -0,0 +1,117 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'text_field_component_model.dart';
+export 'text_field_component_model.dart';
+
+class TextFieldComponentWidget extends StatefulWidget {
+ const TextFieldComponentWidget({
+ super.key,
+ this.initialValueStrParam,
+ this.labelTextStrParam,
+ this.hintTextStrParam,
+ });
+
+ final String? initialValueStrParam;
+ final String? labelTextStrParam;
+ final String? hintTextStrParam;
+
+ @override
+ State createState() =>
+ _TextFieldComponentWidgetState();
+}
+
+class _TextFieldComponentWidgetState extends State {
+ late TextFieldComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => TextFieldComponentModel());
+
+ _model.textController ??=
+ TextEditingController(text: widget.initialValueStrParam);
+ _model.textFieldFocusNode ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(8.0, 10.0, 8.0, 10.0),
+ child: TextFormField(
+ controller: _model.textController,
+ focusNode: _model.textFieldFocusNode,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: widget.labelTextStrParam,
+ labelStyle: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintText: widget.hintTextStrParam,
+ hintStyle: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ validator: _model.textControllerValidator.asValidator(context),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/molecular_components/opt_modal/opt_modal_model.dart b/lib/application_components/molecular_components/opt_modal/opt_modal_model.dart
new file mode 100644
index 00000000..c05b8e19
--- /dev/null
+++ b/lib/application_components/molecular_components/opt_modal/opt_modal_model.dart
@@ -0,0 +1,11 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'opt_modal_widget.dart' show OptModalWidget;
+import 'package:flutter/material.dart';
+
+class OptModalModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/molecular_components/opt_modal/opt_modal_widget.dart b/lib/application_components/molecular_components/opt_modal/opt_modal_widget.dart
new file mode 100644
index 00000000..536c2e80
--- /dev/null
+++ b/lib/application_components/molecular_components/opt_modal/opt_modal_widget.dart
@@ -0,0 +1,68 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'opt_modal_model.dart';
+export 'opt_modal_model.dart';
+
+class OptModalWidget extends StatefulWidget {
+ const OptModalWidget({super.key});
+
+ @override
+ State createState() => _OptModalWidgetState();
+}
+
+class _OptModalWidgetState extends State {
+ late OptModalModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => OptModalModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ height: 400.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
+ child: Icon(
+ Icons.settings,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 24.0,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_model.dart b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_model.dart
new file mode 100644
index 00000000..d9448232
--- /dev/null
+++ b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'option_selection_modal_widget.dart' show OptionSelectionModalWidget;
+import 'package:flutter/material.dart';
+
+class OptionSelectionModalModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart
new file mode 100644
index 00000000..8baf37ac
--- /dev/null
+++ b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart
@@ -0,0 +1,389 @@
+import '/flutter_flow/flutter_flow_animations.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_animate/flutter_animate.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'option_selection_modal_model.dart';
+export 'option_selection_modal_model.dart';
+
+class OptionSelectionModalWidget extends StatefulWidget {
+ const OptionSelectionModalWidget({super.key});
+
+ @override
+ State createState() =>
+ _OptionSelectionModalWidgetState();
+}
+
+class _OptionSelectionModalWidgetState extends State
+ with TickerProviderStateMixin {
+ late OptionSelectionModalModel _model;
+
+ final animationsMap = {};
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => OptionSelectionModalModel());
+
+ animationsMap.addAll({
+ 'wrapOnPageLoadAnimation': AnimationInfo(
+ trigger: AnimationTrigger.onPageLoad,
+ effectsBuilder: () => [
+ ScaleEffect(
+ curve: Curves.easeInOut,
+ delay: 0.0.ms,
+ duration: 100.0.ms,
+ begin: const Offset(0.0, 0.0),
+ end: const Offset(1.0, 1.0),
+ ),
+ ],
+ ),
+ });
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Wrap(
+ spacing: 17.0,
+ runSpacing: 0.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+ },
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).customColor1,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.schedule_send,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 34.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'omxabblt' /* Agenda
+Rápida */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+
+ context.pushNamed('scheduleProvisionalVisitPage');
+ },
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).customColor1,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.hourglass_bottom,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 34.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'vpy51li0' /* Agenda
+Provisória */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+
+ context.pushNamed('scheduleCompleteVisitPage');
+ },
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).customColor1,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.scale,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 34.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '8ad3hms9' /* Agenda
+Completa */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ).animateOnPageLoad(animationsMap['wrapOnPageLoadAnimation']!),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/application_components/molecular_components/throw_exception/throw_exception_model.dart b/lib/application_components/molecular_components/throw_exception/throw_exception_model.dart
new file mode 100644
index 00000000..31b6cee7
--- /dev/null
+++ b/lib/application_components/molecular_components/throw_exception/throw_exception_model.dart
@@ -0,0 +1,11 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'throw_exception_widget.dart' show ThrowExceptionWidget;
+import 'package:flutter/material.dart';
+
+class ThrowExceptionModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/molecular_components/throw_exception/throw_exception_widget.dart b/lib/application_components/molecular_components/throw_exception/throw_exception_widget.dart
new file mode 100644
index 00000000..684115dd
--- /dev/null
+++ b/lib/application_components/molecular_components/throw_exception/throw_exception_widget.dart
@@ -0,0 +1,125 @@
+import '/flutter_flow/flutter_flow_animations.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_animate/flutter_animate.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'throw_exception_model.dart';
+export 'throw_exception_model.dart';
+
+class ThrowExceptionWidget extends StatefulWidget {
+ const ThrowExceptionWidget({
+ super.key,
+ required this.msg,
+ });
+
+ final String? msg;
+
+ @override
+ State createState() => _ThrowExceptionWidgetState();
+}
+
+class _ThrowExceptionWidgetState extends State
+ with TickerProviderStateMixin {
+ late ThrowExceptionModel _model;
+
+ final animationsMap = {};
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ThrowExceptionModel());
+
+ animationsMap.addAll({
+ 'stackOnPageLoadAnimation': AnimationInfo(
+ trigger: AnimationTrigger.onPageLoad,
+ effectsBuilder: () => [
+ FadeEffect(
+ curve: Curves.easeInOut,
+ delay: 0.0.ms,
+ duration: 600.0.ms,
+ begin: 0.0,
+ end: 1.0,
+ ),
+ ],
+ ),
+ });
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Stack(
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.circle_outlined,
+ color: FlutterFlowTheme.of(context).error,
+ size: 200.0,
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.close_outlined,
+ color: FlutterFlowTheme.of(context).error,
+ size: 200.0,
+ ),
+ ),
+ ],
+ ).animateOnPageLoad(animationsMap['stackOnPageLoadAnimation']!),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Text(
+ FFLocalizations.of(context).getText(
+ 'e58xxxiq' /* ERRO */,
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
+ fontSize: 20.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
+ child: Text(
+ valueOrDefault(
+ widget.msg,
+ 'Message Not Found',
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ].addToStart(const SizedBox(height: 50.0)),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart
new file mode 100644
index 00000000..f89f479d
--- /dev/null
+++ b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart
@@ -0,0 +1,13 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'visitor_not_found_component_widget.dart'
+ show VisitorNotFoundComponentWidget;
+import 'package:flutter/material.dart';
+
+class VisitorNotFoundComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart
new file mode 100644
index 00000000..a6b63538
--- /dev/null
+++ b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart
@@ -0,0 +1,177 @@
+import '/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'visitor_not_found_component_model.dart';
+export 'visitor_not_found_component_model.dart';
+
+class VisitorNotFoundComponentWidget extends StatefulWidget {
+ const VisitorNotFoundComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _VisitorNotFoundComponentWidgetState();
+}
+
+class _VisitorNotFoundComponentWidgetState
+ extends State {
+ late VisitorNotFoundComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => VisitorNotFoundComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Container(
+ width: 350.0,
+ height: 350.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(1.0, -1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 5.0, 5.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.close,
+ color: FlutterFlowTheme.of(context).accent1,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ Navigator.pop(context);
+ },
+ ),
+ ),
+ ),
+ Icon(
+ Icons.notifications_none,
+ color: FlutterFlowTheme.of(context).accent1,
+ size: 72.0,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 16.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '1p9mykbj' /* Usuário não encontrado */,
+ ),
+ style: FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).headlineMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).headlineMediumFamily),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(10.0, 4.0, 10.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'kt937sp6' /* O documento inserido não corre... */,
+ ),
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontStyle: FontStyle.italic,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ Navigator.pop(context);
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const RegisiterVistorComponentWidget(),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ text: FFLocalizations.of(context).getText(
+ 'y2x4nfcn' /* Adicionar */,
+ ),
+ options: FFButtonOptions(
+ width: double.infinity,
+ height: 30.0,
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primary,
+ textStyle: FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).titleSmallFamily,
+ color: Colors.white,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).titleSmallFamily),
+ ),
+ elevation: 3.0,
+ borderSide: const BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_model.dart b/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_model.dart
new file mode 100644
index 00000000..f0b590e3
--- /dev/null
+++ b/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_model.dart
@@ -0,0 +1,13 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'bottom_arrow_linked_locals_component_widget.dart'
+ show BottomArrowLinkedLocalsComponentWidget;
+import 'package:flutter/material.dart';
+
+class BottomArrowLinkedLocalsComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart b/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart
new file mode 100644
index 00000000..7637f47f
--- /dev/null
+++ b/lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart
@@ -0,0 +1,247 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'bottom_arrow_linked_locals_component_model.dart';
+export 'bottom_arrow_linked_locals_component_model.dart';
+
+class BottomArrowLinkedLocalsComponentWidget extends StatefulWidget {
+ const BottomArrowLinkedLocalsComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _BottomArrowLinkedLocalsComponentWidgetState();
+}
+
+class _BottomArrowLinkedLocalsComponentWidgetState
+ extends State {
+ late BottomArrowLinkedLocalsComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model =
+ createModel(context, () => BottomArrowLinkedLocalsComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ height: 150.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ height: 150.0,
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ child: FutureBuilder(
+ future: PhpGroup.getLocalsCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme.of(context).primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final gridViewGetLocalsResponse = snapshot.data!;
+ return Builder(
+ builder: (context) {
+ final eachLocals = (PhpGroup.getLocalsCall
+ .locais(
+ gridViewGetLocalsResponse.jsonBody,
+ )
+ ?.map((e) => e)
+ .toList()
+ .toList() ??
+ [])
+ .take(2)
+ .toList();
+ return GridView.builder(
+ padding: EdgeInsets.zero,
+ gridDelegate:
+ const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 1,
+ crossAxisSpacing: 10.0,
+ mainAxisSpacing: 0.0,
+ childAspectRatio: 1.0,
+ ),
+ scrollDirection: Axis.horizontal,
+ itemCount: eachLocals.length,
+ itemBuilder: (context, eachLocalsIndex) {
+ final eachLocalsItem =
+ eachLocals[eachLocalsIndex];
+ return InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ FFAppState().cliUUID = getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_ID''',
+ ).toString();
+ setState(() {});
+ FFAppState().local = getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_NOME''',
+ ).toString();
+ setState(() {});
+ FFAppState().ownerUUID = getJsonField(
+ eachLocalsItem,
+ r'''$.CLU_OWNER_ID''',
+ ).toString();
+ setState(() {});
+ Navigator.pop(context);
+ },
+ child: Container(
+ width: 50.0,
+ height: double.infinity,
+ decoration: const BoxDecoration(),
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight:
+ Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ border: Border.all(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryText,
+ width: 3.0,
+ ),
+ ),
+ child: ClipRRect(
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight:
+ Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ child: Image.network(
+ 'https://freaccess.com.br/freaccess/Images/Clients/${getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_ID''',
+ ).toString()}.png',
+ width: double.infinity,
+ height: double.infinity,
+ fit: BoxFit.fill,
+ alignment: const Alignment(0.0, 0.0),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 10.0, 0.0, 0.0),
+ child: Text(
+ getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_NOME''',
+ ).toString(),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ );
+ },
+ );
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/local_profile_component/local_profile_component_model.dart b/lib/application_components/organism_components/local_profile_component/local_profile_component_model.dart
new file mode 100644
index 00000000..25442482
--- /dev/null
+++ b/lib/application_components/organism_components/local_profile_component/local_profile_component_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'local_profile_component_widget.dart' show LocalProfileComponentWidget;
+import 'package:flutter/material.dart';
+
+class LocalProfileComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart
new file mode 100644
index 00000000..ec4c3b0a
--- /dev/null
+++ b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart
@@ -0,0 +1,151 @@
+import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/custom_functions.dart' as functions;
+import '/flutter_flow/random_data_util.dart' as random_data;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'local_profile_component_model.dart';
+export 'local_profile_component_model.dart';
+
+class LocalProfileComponentWidget extends StatefulWidget {
+ const LocalProfileComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _LocalProfileComponentWidgetState();
+}
+
+class _LocalProfileComponentWidgetState
+ extends State {
+ late LocalProfileComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => LocalProfileComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Visibility(
+ visible: random_data.randomInteger(0, 10) != null,
+ child: Container(
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Material(
+ color: Colors.transparent,
+ elevation: 0.0,
+ child: Container(
+ width: double.infinity,
+ height: 119.0,
+ decoration: BoxDecoration(
+ color: const Color(0xFF1AAB5F),
+ border: Border.all(
+ color: const Color(0xFF1AAB5F),
+ ),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsets.all(2.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: const Color(0x00FFFFFF),
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const SizedBox(
+ height: double.infinity,
+ child:
+ BottomArrowLinkedLocalsComponentWidget(),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(200.0),
+ child: Image.network(
+ valueOrDefault(
+ 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ width: 80.0,
+ height: 80.0,
+ fit: BoxFit.cover,
+ alignment: const Alignment(0.0, 0.0),
+ errorBuilder: (context, error, stackTrace) =>
+ Image.asset(
+ 'assets/images/error_image.svg',
+ width: 80.0,
+ height: 80.0,
+ fit: BoxFit.cover,
+ alignment: const Alignment(0.0, 0.0),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ valueOrDefault(
+ functions.convertToUppercase(FFAppState().local),
+ 'NOME DO LOCAL',
+ ),
+ style:
+ FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context).info,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey('Nunito'),
+ ),
+ ),
+ ],
+ ),
+ ]
+ .divide(const SizedBox(width: 20.0))
+ .addToStart(const SizedBox(width: 20.0))
+ .addToEnd(const SizedBox(width: 20.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_model.dart b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_model.dart
new file mode 100644
index 00000000..7ce9985b
--- /dev/null
+++ b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'menu_list_view_component_widget.dart' show MenuListViewComponentWidget;
+import 'package:flutter/material.dart';
+
+class MenuListViewComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart
new file mode 100644
index 00000000..607e68af
--- /dev/null
+++ b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart
@@ -0,0 +1,630 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'menu_list_view_component_model.dart';
+export 'menu_list_view_component_model.dart';
+
+class MenuListViewComponentWidget extends StatefulWidget {
+ const MenuListViewComponentWidget({
+ super.key,
+ required this.changeMenuStyle,
+ required this.registerVisitorAction,
+ required this.scheduleVisitAction,
+ });
+
+ final Future Function()? changeMenuStyle;
+ final Future Function()? registerVisitorAction;
+ final Future Function()? scheduleVisitAction;
+
+ @override
+ State createState() =>
+ _MenuListViewComponentWidgetState();
+}
+
+class _MenuListViewComponentWidgetState
+ extends State {
+ late MenuListViewComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => MenuListViewComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Wrap(
+ spacing: 0.0,
+ runSpacing: 0.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(5.0, 0.0, 5.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: 125.0,
+ decoration: const BoxDecoration(),
+ child: ListView(
+ padding: const EdgeInsets.fromLTRB(
+ 10.0,
+ 0,
+ 10.0,
+ 0,
+ ),
+ scrollDirection: Axis.horizontal,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await widget.scheduleVisitAction?.call();
+ },
+ child: Container(
+ width: 100.0,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector1,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'utgue9a5' /* Agendar
+Visita */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await widget.registerVisitorAction?.call();
+ },
+ child: Container(
+ width: 100.0,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '82b5f8yz' /* Cadastrar
+Visitante */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0),
+ child: Container(
+ width: 100.0,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.khome,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 't4ie13ut' /* Vincular
+Condomínio */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0),
+ child: Container(
+ width: 100.0,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kpets,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'n3n76pha' /* Cadastrar
+Pet */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0),
+ child: Container(
+ width: 100.0,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector2,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'l6b9o7yn' /* QR Code
+de Acesso */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ ].divide(const SizedBox(width: 15.0)),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 50.0,
+ fillColor: const Color(0x00FFFFFF),
+ icon: Icon(
+ Icons.keyboard_arrow_down_outlined,
+ color: FlutterFlowTheme.of(context).primary,
+ ),
+ onPressed: () async {
+ await widget.changeMenuStyle?.call();
+ },
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart
new file mode 100644
index 00000000..8aebfc69
--- /dev/null
+++ b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart
@@ -0,0 +1,13 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'menu_staggered_view_component_widget.dart'
+ show MenuStaggeredViewComponentWidget;
+import 'package:flutter/material.dart';
+
+class MenuStaggeredViewComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart
new file mode 100644
index 00000000..8fc6e479
--- /dev/null
+++ b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart
@@ -0,0 +1,667 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'menu_staggered_view_component_model.dart';
+export 'menu_staggered_view_component_model.dart';
+
+class MenuStaggeredViewComponentWidget extends StatefulWidget {
+ const MenuStaggeredViewComponentWidget({
+ super.key,
+ required this.changeMenuStyleAction,
+ required this.registerVisitorOptAction,
+ required this.scheduleVisitOptAction,
+ });
+
+ final Future Function()? changeMenuStyleAction;
+ final Future Function()? registerVisitorOptAction;
+ final Future Function()? scheduleVisitOptAction;
+
+ @override
+ State createState() =>
+ _MenuStaggeredViewComponentWidgetState();
+}
+
+class _MenuStaggeredViewComponentWidgetState
+ extends State {
+ late MenuStaggeredViewComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => MenuStaggeredViewComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Wrap(
+ spacing: 0.0,
+ runSpacing: 0.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ Container(
+ width: double.infinity,
+ height: MediaQuery.sizeOf(context).height * 0.35,
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: MasonryGridView.builder(
+ physics: const NeverScrollableScrollPhysics(),
+ gridDelegate: const SliverSimpleGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 3,
+ ),
+ crossAxisSpacing: 10.0,
+ mainAxisSpacing: 10.0,
+ itemCount: 5,
+ shrinkWrap: true,
+ itemBuilder: (context, index) {
+ return [
+ () => InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await widget.scheduleVisitOptAction?.call();
+ },
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color:
+ FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector1,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'ee33l0ms' /* Agendar
+Visita */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ () => InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await widget.registerVisitorOptAction?.call();
+ },
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color:
+ FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'ya37l3jt' /* Cadastrar
+ Visitante */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ),
+ () => Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.khome,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'h8s3adu8' /* Vincular
+Condomínio */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ () => Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kpets,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'j6tfixen' /* Cadastrar
+Pet */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ () => Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: FlutterFlowTheme.of(context).customColor5,
+ offset: const Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(24.0),
+ shape: BoxShape.rectangle,
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 0.5,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 30.0,
+ height: 30.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ FFIcons.kvector2,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '9tli4i2x' /* QR Code
+de Acesso */
+ ,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ].divide(const SizedBox(height: 0.0)),
+ ),
+ ),
+ ),
+ ][index]();
+ },
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Container(
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 50.0,
+ fillColor: const Color(0x00FFFFFF),
+ icon: Icon(
+ Icons.keyboard_arrow_up_sharp,
+ color: FlutterFlowTheme.of(context).primary,
+ ),
+ onPressed: () async {
+ await widget.changeMenuStyleAction?.call();
+ },
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_model.dart b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_model.dart
new file mode 100644
index 00000000..d30b8442
--- /dev/null
+++ b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_model.dart
@@ -0,0 +1,60 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'schedule_visit_detail_widget.dart' show ScheduleVisitDetailWidget;
+import 'package:flutter/material.dart';
+
+class ScheduleVisitDetailModel
+ extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode4;
+ TextEditingController? textController4;
+ String? Function(BuildContext, String?)? textController4Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode5;
+ TextEditingController? textController5;
+ String? Function(BuildContext, String?)? textController5Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode6;
+ TextEditingController? textController6;
+ String? Function(BuildContext, String?)? textController6Validator;
+ // Stores action output result for [Backend Call - API (postScheduleVisit)] action in Icon widget.
+ ApiCallResponse? postScheduleVisit;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+
+ textFieldFocusNode4?.dispose();
+ textController4?.dispose();
+
+ textFieldFocusNode5?.dispose();
+ textController5?.dispose();
+
+ textFieldFocusNode6?.dispose();
+ textController6?.dispose();
+ }
+}
diff --git a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart
new file mode 100644
index 00000000..83d530d2
--- /dev/null
+++ b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart
@@ -0,0 +1,976 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/custom_functions.dart' as functions;
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'schedule_visit_detail_model.dart';
+export 'schedule_visit_detail_model.dart';
+
+class ScheduleVisitDetailWidget extends StatefulWidget {
+ const ScheduleVisitDetailWidget({
+ super.key,
+ required this.visitorJsonList,
+ required this.visitorStrList,
+ this.visitorImgPath,
+ required this.visitStartDate,
+ required this.visitEndDate,
+ required this.visitResonStr,
+ required this.visitLevelStr,
+ required this.visitTempStr,
+ required this.visitObsStr,
+ });
+
+ final List? visitorJsonList;
+ final String? visitorStrList;
+ final String? visitorImgPath;
+ final String? visitStartDate;
+ final String? visitEndDate;
+ final String? visitResonStr;
+ final String? visitLevelStr;
+ final String? visitTempStr;
+ final String? visitObsStr;
+
+ @override
+ State createState() =>
+ _ScheduleVisitDetailWidgetState();
+}
+
+class _ScheduleVisitDetailWidgetState extends State {
+ late ScheduleVisitDetailModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ScheduleVisitDetailModel());
+
+ _model.textController1 ??= TextEditingController(text: widget.visitTempStr);
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??=
+ TextEditingController(text: widget.visitStartDate);
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.textController3 ??= TextEditingController(text: widget.visitEndDate);
+ _model.textFieldFocusNode3 ??= FocusNode();
+
+ _model.textController4 ??= TextEditingController(
+ text: functions.extractDescToStr(widget.visitResonStr!));
+ _model.textFieldFocusNode4 ??= FocusNode();
+
+ _model.textController5 ??= TextEditingController(
+ text: functions.extractDescToStr(widget.visitLevelStr!));
+ _model.textFieldFocusNode5 ??= FocusNode();
+
+ _model.textController6 ??= TextEditingController(text: widget.visitObsStr);
+ _model.textFieldFocusNode6 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Container(
+ width: double.infinity,
+ height: 35.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Visibility(
+ visible: widget.visitorStrList != null &&
+ widget.visitorStrList != '',
+ child: Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(15.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.keyboard_return,
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ Navigator.pop(context);
+ },
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(
+ shape: BoxShape.rectangle,
+ ),
+ child: Stack(
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 5.0, 0.0, 5.0, 20.0),
+ child: Container(
+ width: 100.0,
+ decoration: const BoxDecoration(),
+ child: Builder(
+ builder: (context) {
+ final visitorsData = widget.visitorJsonList!
+ .toList()
+ .take(1)
+ .toList();
+ return SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: List.generate(visitorsData.length,
+ (visitorsDataIndex) {
+ final visitorsDataItem =
+ visitorsData[visitorsDataIndex];
+ return Container(
+ decoration: BoxDecoration(
+ borderRadius:
+ BorderRadius.circular(100.0),
+ ),
+ child: Align(
+ alignment:
+ const AlignmentDirectional(1.0, -1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor:
+ Colors.transparent,
+ useSafeArea: true,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding:
+ MediaQuery.viewInsetsOf(
+ context),
+ child:
+ const VisitorDetailsModalWidget(),
+ );
+ },
+ ).then((value) =>
+ safeSetState(() {}));
+ },
+ child: ClipRRect(
+ borderRadius:
+ BorderRadius.circular(100.0),
+ child: CachedNetworkImage(
+ fadeInDuration:
+ const Duration(milliseconds: 500),
+ fadeOutDuration:
+ const Duration(milliseconds: 500),
+ imageUrl:
+ valueOrDefault(
+ 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
+ visitorsDataItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString()}&tipo=E',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ width: 100.0,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ );
+ }),
+ ),
+ );
+ },
+ ),
+ ),
+ ),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 10.0),
+ child: TextFormField(
+ controller: _model.textController1,
+ focusNode: _model.textFieldFocusNode1,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ isDense: false,
+ labelText:
+ FFLocalizations.of(context).getText(
+ '7w4fohoa' /* Encerramento da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController1Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 10.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController2,
+ focusNode: _model.textFieldFocusNode2,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'snah4iet' /* Início */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ '0cp1e31d' /* dd/mm/yyyy */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController2Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode: _model.textFieldFocusNode3,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'abppdgz3' /* Término */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ 'kqralft4' /* dd/mm/yyyy */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController3Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 10.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController4,
+ focusNode: _model.textFieldFocusNode4,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'xjxhzqqm' /* Motivo da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ '47oezdm6' /* Motivo */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController4Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController5,
+ focusNode: _model.textFieldFocusNode5,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ '2ujg7u18' /* Nível de Acesso */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ '3emmbbfv' /* Nível de Acesso */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController5Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController6,
+ focusNode: _model.textFieldFocusNode6,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'ritce5uw' /* Observações da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController6Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: double.infinity,
+ height: 22.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ ),
+ ]
+ .divide(const SizedBox(height: 30.0))
+ .addToStart(const SizedBox(height: 100.0)),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 6.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: 35.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ _model.postScheduleVisit =
+ await PhpGroup.postScheduleVisitCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ atividade: 'putVisita',
+ devDesc: widget.visitObsStr,
+ idVisitante: widget.visitorStrList,
+ dtInicio: widget.visitStartDate,
+ dtFim: widget.visitEndDate,
+ unica: widget.visitTempStr,
+ idMotivo:
+ functions.extractIdToStr(widget.visitResonStr!),
+ idNAC: functions.extractIdToStr(widget.visitLevelStr!),
+ obs: widget.visitObsStr,
+ cliID: FFAppState().cliUUID,
+ );
+ if (PhpGroup.postScheduleVisitCall.error(
+ (_model.postScheduleVisit?.jsonBody ?? ''),
+ ) ==
+ false) {
+ Navigator.pop(context);
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg: PhpGroup.postScheduleVisitCall.errorMsg(
+ (_model.postScheduleVisit?.jsonBody ?? ''),
+ )!,
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ child: Icon(
+ Icons.save_alt,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart b/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart
new file mode 100644
index 00000000..e4db1d96
--- /dev/null
+++ b/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart
@@ -0,0 +1,13 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'up_arrow_linked_locals_component_widget.dart'
+ show UpArrowLinkedLocalsComponentWidget;
+import 'package:flutter/material.dart';
+
+class UpArrowLinkedLocalsComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart b/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart
new file mode 100644
index 00000000..49237edc
--- /dev/null
+++ b/lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart
@@ -0,0 +1,241 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'up_arrow_linked_locals_component_model.dart';
+export 'up_arrow_linked_locals_component_model.dart';
+
+class UpArrowLinkedLocalsComponentWidget extends StatefulWidget {
+ const UpArrowLinkedLocalsComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _UpArrowLinkedLocalsComponentWidgetState();
+}
+
+class _UpArrowLinkedLocalsComponentWidgetState
+ extends State {
+ late UpArrowLinkedLocalsComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => UpArrowLinkedLocalsComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Container(
+ width: double.infinity,
+ height: 150.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ height: 150.0,
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ child: FutureBuilder(
+ future: PhpGroup.getLocalsCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme.of(context).primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final gridViewGetLocalsResponse = snapshot.data!;
+ return Builder(
+ builder: (context) {
+ final eachLocals = (PhpGroup.getLocalsCall
+ .locais(
+ gridViewGetLocalsResponse.jsonBody,
+ )
+ ?.map((e) => e)
+ .toList()
+ .toList() ??
+ [])
+ .take(2)
+ .toList();
+ return GridView.builder(
+ padding: EdgeInsets.zero,
+ gridDelegate:
+ const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 1,
+ crossAxisSpacing: 10.0,
+ mainAxisSpacing: 0.0,
+ childAspectRatio: 1.0,
+ ),
+ scrollDirection: Axis.horizontal,
+ itemCount: eachLocals.length,
+ itemBuilder: (context, eachLocalsIndex) {
+ final eachLocalsItem =
+ eachLocals[eachLocalsIndex];
+ return InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ FFAppState().cliUUID = getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_ID''',
+ ).toString();
+ setState(() {});
+ FFAppState().local = getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_NOME''',
+ ).toString();
+ setState(() {});
+ Navigator.pop(context);
+ },
+ child: Container(
+ width: 50.0,
+ height: double.infinity,
+ decoration: const BoxDecoration(),
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ children: [
+ Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight:
+ Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ border: Border.all(
+ color:
+ FlutterFlowTheme.of(context)
+ .secondaryText,
+ width: 3.0,
+ ),
+ ),
+ child: ClipRRect(
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight:
+ Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ child: Image.network(
+ 'https://freaccess.com.br/freaccess/Images/Clients/${getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_ID''',
+ ).toString()}.png',
+ width: double.infinity,
+ height: double.infinity,
+ fit: BoxFit.fill,
+ alignment: const Alignment(0.0, 0.0),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 10.0, 0.0, 0.0),
+ child: Text(
+ getJsonField(
+ eachLocalsItem,
+ r'''$.CLI_NOME''',
+ ).toString(),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ );
+ },
+ );
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart
new file mode 100644
index 00000000..32e250ab
--- /dev/null
+++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart
@@ -0,0 +1,61 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget;
+import 'package:flutter/material.dart';
+
+class ViewVisitDetailModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // Stores action output result for [Action Block - manageStatusColorAction] action in viewVisitDetail widget.
+ Color? visitStatusColor;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode4;
+ TextEditingController? textController4;
+ String? Function(BuildContext, String?)? textController4Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode5;
+ TextEditingController? textController5;
+ String? Function(BuildContext, String?)? textController5Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode6;
+ TextEditingController? textController6;
+ String? Function(BuildContext, String?)? textController6Validator;
+ // Stores action output result for [Backend Call - API (deleteVisit)] action in IconButton widget.
+ ApiCallResponse? deleteVisit;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+
+ textFieldFocusNode4?.dispose();
+ textController4?.dispose();
+
+ textFieldFocusNode5?.dispose();
+ textController5?.dispose();
+
+ textFieldFocusNode6?.dispose();
+ textController6?.dispose();
+ }
+}
diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart
new file mode 100644
index 00000000..a19cff25
--- /dev/null
+++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart
@@ -0,0 +1,928 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/actions/actions.dart' as action_blocks;
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'view_visit_detail_model.dart';
+export 'view_visit_detail_model.dart';
+
+class ViewVisitDetailWidget extends StatefulWidget {
+ const ViewVisitDetailWidget({
+ super.key,
+ this.visitorImgPath,
+ required this.visitStartDate,
+ required this.visitEndDate,
+ required this.visitReasonStr,
+ required this.visitLevelStr,
+ required this.visitTempStr,
+ required this.visitObsStr,
+ required this.visitStatusStr,
+ required this.visitorStrList,
+ this.visitorJsonList,
+ required this.visitIdStr,
+ required this.updateToggleIdx,
+ this.repeatVisitScheduleActionBlock,
+ });
+
+ final String? visitorImgPath;
+ final String? visitStartDate;
+ final String? visitEndDate;
+ final String? visitReasonStr;
+ final String? visitLevelStr;
+ final String? visitTempStr;
+ final String? visitObsStr;
+ final String? visitStatusStr;
+ final String? visitorStrList;
+ final List? visitorJsonList;
+ final String? visitIdStr;
+ final Future Function()? updateToggleIdx;
+ final Future Function()? repeatVisitScheduleActionBlock;
+
+ @override
+ State createState() => _ViewVisitDetailWidgetState();
+}
+
+class _ViewVisitDetailWidgetState extends State {
+ late ViewVisitDetailModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ViewVisitDetailModel());
+
+ // On component load action.
+ SchedulerBinding.instance.addPostFrameCallback((_) async {
+ _model.visitStatusColor = await action_blocks.manageStatusColorAction(
+ context,
+ visitStatusStr: widget.visitStatusStr,
+ );
+ });
+
+ _model.textController1 ??= TextEditingController(
+ text: widget.visitTempStr == 'null' ? '' : widget.visitTempStr);
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??=
+ TextEditingController(text: widget.visitStartDate);
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.textController3 ??= TextEditingController(text: widget.visitEndDate);
+ _model.textFieldFocusNode3 ??= FocusNode();
+
+ _model.textController4 ??=
+ TextEditingController(text: widget.visitReasonStr);
+ _model.textFieldFocusNode4 ??= FocusNode();
+
+ _model.textController5 ??=
+ TextEditingController(text: widget.visitLevelStr);
+ _model.textFieldFocusNode5 ??= FocusNode();
+
+ _model.textController6 ??= TextEditingController(text: widget.visitObsStr);
+ _model.textFieldFocusNode6 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Container(
+ width: double.infinity,
+ height: 35.0,
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Align(
+ alignment: const AlignmentDirectional(1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(15.0, 0.0, 15.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.close,
+ color: FlutterFlowTheme.of(context).accent1,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ Navigator.pop(context);
+ },
+ ),
+ ),
+ ),
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(
+ shape: BoxShape.rectangle,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(1.0, -1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 20.0, 20.0),
+ child: Container(
+ width: 100.0,
+ decoration: const BoxDecoration(),
+ child: Container(
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(100.0),
+ ),
+ child: Align(
+ alignment: const AlignmentDirectional(1.0, -1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ useSafeArea: true,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const VisitorDetailsModalWidget(),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(100.0),
+ child: CachedNetworkImage(
+ fadeInDuration: const Duration(milliseconds: 500),
+ fadeOutDuration: const Duration(milliseconds: 500),
+ imageUrl: valueOrDefault(
+ widget.visitorImgPath,
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ width: 100.0,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 10.0),
+ child: TextFormField(
+ controller: _model.textController1,
+ focusNode: _model.textFieldFocusNode1,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ '9yu35pzg' /* Encerramento da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController1Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 10.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController2,
+ focusNode: _model.textFieldFocusNode2,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'aj6scczp' /* Início */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ 'ub084nhy' /* dd/mm/yyyy */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController2Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode: _model.textFieldFocusNode3,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'rvi5z7wg' /* Término */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ 'ixs67mrz' /* dd/mm/yyyy */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController3Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 10.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController4,
+ focusNode: _model.textFieldFocusNode4,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'yxilg7ek' /* Motivo da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ 'ypeydbem' /* Motivo */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController4Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController5,
+ focusNode: _model.textFieldFocusNode5,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'dgr3pk3a' /* Nível de Acesso */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ 'rs3d4gb8' /* Nível de Acesso */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController5Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController6,
+ focusNode: _model.textFieldFocusNode6,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'lppn9rxa' /* Observações da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController6Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 6.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: 35.0,
+ decoration: BoxDecoration(
+ color: valueOrDefault(
+ _model.visitStatusColor,
+ FlutterFlowTheme.of(context).primary,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ child: Builder(
+ builder: (context) {
+ if (widget.visitStatusStr == 'A') {
+ return Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.block_sharp,
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ _model.deleteVisit =
+ await PhpGroup.deleteVisitCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'cancelaVisita',
+ idVisita: widget.visitIdStr,
+ );
+ if (PhpGroup.deleteVisitCall.error(
+ (_model.deleteVisit?.jsonBody ?? ''),
+ ) ==
+ false) {
+ Navigator.pop(context);
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding:
+ MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg: PhpGroup.deleteVisitCall.msg(
+ (_model.deleteVisit?.jsonBody ??
+ ''),
+ )!,
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ ),
+ FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.share,
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ],
+ );
+ } else if ((widget.visitStatusStr == 'C') ||
+ (widget.visitStatusStr == 'F') ||
+ (widget.visitStatusStr == 'B') ||
+ (widget.visitStatusStr == 'I')) {
+ return InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await widget.updateToggleIdx?.call();
+ Navigator.pop(context);
+
+ context.pushNamed(
+ 'scheduleCompleteVisitPage',
+ queryParameters: {
+ 'visitStartDateStr': serializeParam(
+ dateTimeFormat(
+ 'd/M/y H:mm:ss',
+ getCurrentTimestamp,
+ locale: FFLocalizations.of(context)
+ .languageCode,
+ ),
+ ParamType.String,
+ ),
+ 'visitEndDateStr': serializeParam(
+ '',
+ ParamType.String,
+ ),
+ 'visitReasonStr': serializeParam(
+ widget.visitReasonStr,
+ ParamType.String,
+ ),
+ 'visitLevelStr': serializeParam(
+ widget.visitLevelStr,
+ ParamType.String,
+ ),
+ 'visitTempBol': serializeParam(
+ widget.visitTempStr == 'Sim' ? true : false,
+ ParamType.bool,
+ ),
+ 'visitObsStr': serializeParam(
+ widget.visitObsStr,
+ ParamType.String,
+ ),
+ 'visitorStrList': serializeParam(
+ widget.visitorStrList,
+ ParamType.String,
+ ),
+ 'visitorJsonList': serializeParam(
+ widget.visitorJsonList,
+ ParamType.JSON,
+ true,
+ ),
+ }.withoutNulls,
+ );
+ },
+ child: Icon(
+ Icons.repeat,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ );
+ } else {
+ return Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ ),
+ );
+ }
+ },
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart b/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart
new file mode 100644
index 00000000..a63f3b06
--- /dev/null
+++ b/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart
@@ -0,0 +1,13 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'arrow_linked_locals_component_widget.dart'
+ show ArrowLinkedLocalsComponentWidget;
+import 'package:flutter/material.dart';
+
+class ArrowLinkedLocalsComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart b/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart
new file mode 100644
index 00000000..0738f46c
--- /dev/null
+++ b/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart
@@ -0,0 +1,41 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'arrow_linked_locals_component_model.dart';
+export 'arrow_linked_locals_component_model.dart';
+
+class ArrowLinkedLocalsComponentWidget extends StatefulWidget {
+ const ArrowLinkedLocalsComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _ArrowLinkedLocalsComponentWidgetState();
+}
+
+class _ArrowLinkedLocalsComponentWidgetState
+ extends State {
+ late ArrowLinkedLocalsComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ArrowLinkedLocalsComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container();
+ }
+}
diff --git a/lib/application_components/templates_components/menu_component/menu_component_model.dart b/lib/application_components/templates_components/menu_component/menu_component_model.dart
new file mode 100644
index 00000000..b7be1afb
--- /dev/null
+++ b/lib/application_components/templates_components/menu_component/menu_component_model.dart
@@ -0,0 +1,57 @@
+import '/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart';
+import '/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
+import '/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'menu_component_widget.dart' show MenuComponentWidget;
+import 'package:flutter/material.dart';
+
+class MenuComponentModel extends FlutterFlowModel {
+ /// Local state fields for this component.
+
+ bool isGrid = false;
+
+ /// State fields for stateful widgets in this component.
+
+ // Model for menuListViewComponent.
+ late MenuListViewComponentModel menuListViewComponentModel;
+ // Model for menuStaggeredViewComponent.
+ late MenuStaggeredViewComponentModel menuStaggeredViewComponentModel;
+
+ @override
+ void initState(BuildContext context) {
+ menuListViewComponentModel =
+ createModel(context, () => MenuListViewComponentModel());
+ menuStaggeredViewComponentModel =
+ createModel(context, () => MenuStaggeredViewComponentModel());
+ }
+
+ @override
+ void dispose() {
+ menuListViewComponentModel.dispose();
+ menuStaggeredViewComponentModel.dispose();
+ }
+
+ /// Action blocks.
+ Future changeMenuStyle(BuildContext context) async {
+ isGrid = !isGrid;
+ }
+
+ Future scheduleVisitOptAction(BuildContext context) async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const OptionSelectionModalWidget(),
+ );
+ },
+ );
+ }
+
+ Future registerVisitorOptAction(BuildContext context) async {
+ context.pushNamed('registerVisitorPage');
+ }
+}
diff --git a/lib/application_components/templates_components/menu_component/menu_component_widget.dart b/lib/application_components/templates_components/menu_component/menu_component_widget.dart
new file mode 100644
index 00000000..b03e32ff
--- /dev/null
+++ b/lib/application_components/templates_components/menu_component/menu_component_widget.dart
@@ -0,0 +1,88 @@
+import '/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
+import '/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'menu_component_model.dart';
+export 'menu_component_model.dart';
+
+class MenuComponentWidget extends StatefulWidget {
+ const MenuComponentWidget({super.key});
+
+ @override
+ State createState() => _MenuComponentWidgetState();
+}
+
+class _MenuComponentWidgetState extends State {
+ late MenuComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => MenuComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
+ child: Builder(
+ builder: (context) {
+ if (_model.isGrid == true) {
+ return wrapWithModel(
+ model: _model.menuListViewComponentModel,
+ updateCallback: () => setState(() {}),
+ updateOnChange: true,
+ child: MenuListViewComponentWidget(
+ changeMenuStyle: () async {
+ await _model.changeMenuStyle(context);
+ setState(() {});
+ },
+ registerVisitorAction: () async {
+ await _model.registerVisitorOptAction(context);
+ setState(() {});
+ },
+ scheduleVisitAction: () async {
+ await _model.scheduleVisitOptAction(context);
+ setState(() {});
+ },
+ ),
+ );
+ } else {
+ return wrapWithModel(
+ model: _model.menuStaggeredViewComponentModel,
+ updateCallback: () => setState(() {}),
+ updateOnChange: true,
+ child: MenuStaggeredViewComponentWidget(
+ changeMenuStyleAction: () async {
+ await _model.changeMenuStyle(context);
+ setState(() {});
+ },
+ registerVisitorOptAction: () async {
+ await _model.registerVisitorOptAction(context);
+ setState(() {});
+ },
+ scheduleVisitOptAction: () async {
+ await _model.scheduleVisitOptAction(context);
+ setState(() {});
+ },
+ ),
+ );
+ }
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/message_well_component/message_well_component_model.dart b/lib/application_components/templates_components/message_well_component/message_well_component_model.dart
new file mode 100644
index 00000000..3da2a723
--- /dev/null
+++ b/lib/application_components/templates_components/message_well_component/message_well_component_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'message_well_component_widget.dart' show MessageWellComponentWidget;
+import 'package:flutter/material.dart';
+
+class MessageWellComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/templates_components/message_well_component/message_well_component_widget.dart b/lib/application_components/templates_components/message_well_component/message_well_component_widget.dart
new file mode 100644
index 00000000..3109dce7
--- /dev/null
+++ b/lib/application_components/templates_components/message_well_component/message_well_component_widget.dart
@@ -0,0 +1,125 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'message_well_component_model.dart';
+export 'message_well_component_model.dart';
+
+class MessageWellComponentWidget extends StatefulWidget {
+ const MessageWellComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _MessageWellComponentWidgetState();
+}
+
+class _MessageWellComponentWidgetState
+ extends State {
+ late MessageWellComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => MessageWellComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 40.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: 167.0,
+ decoration: const BoxDecoration(),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Text(
+ FFLocalizations.of(context).getText(
+ '8fworxmb' /* Mural de Mensagens */,
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Nunito Sans',
+ letterSpacing: 0.0,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey('Nunito Sans'),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 5.0, 0.0, 0.0),
+ child: FFButtonWidget(
+ onPressed: () {
+ print('Button pressed ...');
+ },
+ text: FFLocalizations.of(context).getText(
+ 'yikill36' /* Todos */,
+ ),
+ options: FFButtonOptions(
+ width: 260.0,
+ height: 20.0,
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: const Color(0xFF1AAB5F),
+ textStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.normal,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ elevation: 3.0,
+ borderSide: const BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
+ child: Container(
+ width: 464.0,
+ height: 127.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.rectangle,
+ ),
+ child: ListView(
+ padding: EdgeInsets.zero,
+ scrollDirection: Axis.vertical,
+ children: const [],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart b/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart
new file mode 100644
index 00000000..3cf3c27f
--- /dev/null
+++ b/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart
@@ -0,0 +1,57 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/form_field_controller.dart';
+import 'regisiter_vistor_component_widget.dart'
+ show RegisiterVistorComponentWidget;
+import 'package:flutter/material.dart';
+
+class RegisiterVistorComponentModel
+ extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ bool isDataUploading = false;
+ FFUploadedFile uploadedLocalFile =
+ FFUploadedFile(bytes: Uint8List.fromList([]));
+
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ // State field(s) for DropDown widget.
+ String? dropDownValue;
+ FormFieldController? dropDownValueController;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode4;
+ TextEditingController? textController4;
+ String? Function(BuildContext, String?)? textController4Validator;
+ // Stores action output result for [Custom Action - convertImageFileToBase64] action in Button widget.
+ String? imgBase64;
+ // Stores action output result for [Backend Call - API (postScheduleVisitor)] action in Button widget.
+ ApiCallResponse? registerVisitor;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+
+ textFieldFocusNode4?.dispose();
+ textController4?.dispose();
+ }
+}
diff --git a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart b/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart
new file mode 100644
index 00000000..d8d2d7ea
--- /dev/null
+++ b/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart
@@ -0,0 +1,819 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_drop_down.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/flutter_flow/form_field_controller.dart';
+import '/flutter_flow/upload_data.dart';
+import '/custom_code/actions/index.dart' as actions;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'regisiter_vistor_component_model.dart';
+export 'regisiter_vistor_component_model.dart';
+
+class RegisiterVistorComponentWidget extends StatefulWidget {
+ const RegisiterVistorComponentWidget({super.key});
+
+ @override
+ State createState() =>
+ _RegisiterVistorComponentWidgetState();
+}
+
+class _RegisiterVistorComponentWidgetState
+ extends State {
+ late RegisiterVistorComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => RegisiterVistorComponentModel());
+
+ _model.textController1 ??= TextEditingController();
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??= TextEditingController();
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.textController3 ??= TextEditingController();
+ _model.textFieldFocusNode3 ??= FocusNode();
+
+ _model.textController4 ??= TextEditingController();
+ _model.textFieldFocusNode4 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 30.0, 0.0, 0.0),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, -1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(20.0, 0.0, 0.0, 20.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'wnhkedzt' /* Cadastrar Visitante */,
+ ),
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Nunito',
+ fontSize: 21.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w800,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Builder(
+ builder: (context) {
+ if ((_model.uploadedLocalFile.bytes?.isNotEmpty ?? false)) {
+ return InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ setState(() {
+ _model.isDataUploading = false;
+ _model.uploadedLocalFile =
+ FFUploadedFile(bytes: Uint8List.fromList([]));
+ });
+ },
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(8.0),
+ child: Image.memory(
+ _model.uploadedLocalFile.bytes ??
+ Uint8List.fromList([]),
+ width: 300.0,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ );
+ } else {
+ return Stack(
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.01, 0.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ final selectedMedia =
+ await selectMediaWithSourceBottomSheet(
+ context: context,
+ maxWidth: 300.00,
+ maxHeight: 300.00,
+ imageQuality: 0,
+ allowPhoto: true,
+ includeDimensions: true,
+ );
+ if (selectedMedia != null &&
+ selectedMedia.every((m) =>
+ validateFileFormat(
+ m.storagePath, context))) {
+ setState(() => _model.isDataUploading = true);
+ var selectedUploadedFiles =
+ [];
+
+ try {
+ showUploadMessage(
+ context,
+ 'Uploading file...',
+ showLoading: true,
+ );
+ selectedUploadedFiles = selectedMedia
+ .map((m) => FFUploadedFile(
+ name:
+ m.storagePath.split('/').last,
+ bytes: m.bytes,
+ height: m.dimensions?.height,
+ width: m.dimensions?.width,
+ blurHash: m.blurHash,
+ ))
+ .toList();
+ } finally {
+ ScaffoldMessenger.of(context)
+ .hideCurrentSnackBar();
+ _model.isDataUploading = false;
+ }
+ if (selectedUploadedFiles.length ==
+ selectedMedia.length) {
+ setState(() {
+ _model.uploadedLocalFile =
+ selectedUploadedFiles.first;
+ });
+ showUploadMessage(context, 'Success!');
+ } else {
+ setState(() {});
+ showUploadMessage(
+ context, 'Failed to upload data');
+ return;
+ }
+ }
+ },
+ text: '',
+ icon: Icon(
+ Icons.photo_camera,
+ color: FlutterFlowTheme.of(context).accent1,
+ size: 30.0,
+ ),
+ options: FFButtonOptions(
+ width: 300.0,
+ height: 80.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: const EdgeInsetsDirectional.fromSTEB(
+ 14.0, 0.0, 0.0, 20.0),
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ textStyle: FlutterFlowTheme.of(context)
+ .titleSmall
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .titleSmallFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 16.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily),
+ ),
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 50.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'kpd31z4d' /* Clique para adicionar a foto p... */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+ },
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'q986vs4m' /* Preencha o formulário com os d... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController1,
+ focusNode: _model.textFieldFocusNode1,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'llcw2tei' /* Nome */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.person,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ maxLines: null,
+ keyboardType: TextInputType.name,
+ validator:
+ _model.textController1Validator.asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 20.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 20.0, 10.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '67ykbznt' /* Selecione o tipo: */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 20.0, 0.0, 5.0),
+ child: FlutterFlowDropDown(
+ controller: _model.dropDownValueController ??=
+ FormFieldController(null),
+ options: [
+ FFLocalizations.of(context).getText(
+ 'ugjkeiz7' /* Visitante */,
+ ),
+ FFLocalizations.of(context).getText(
+ '8nlk5xlk' /* Prestador de Serviço */,
+ )
+ ],
+ onChanged: (val) =>
+ setState(() => _model.dropDownValue = val),
+ width: 200.0,
+ height: 48.0,
+ textStyle: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ 'kw07i43y' /* Selecione... */,
+ ),
+ icon: Icon(
+ Icons.keyboard_arrow_down_rounded,
+ color: FlutterFlowTheme.of(context).primaryText,
+ size: 24.0,
+ ),
+ elevation: 2.0,
+ borderColor: FlutterFlowTheme.of(context).accent1,
+ borderWidth: 0.5,
+ borderRadius: 8.0,
+ margin: const EdgeInsetsDirectional.fromSTEB(
+ 16.0, 4.0, 16.0, 4.0),
+ hidesUnderline: true,
+ isOverButton: true,
+ isSearchable: false,
+ isMultiSelect: false,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController2,
+ focusNode: _model.textFieldFocusNode2,
+ autofocus: false,
+ textCapitalization: TextCapitalization.none,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ '96ayre48' /* Documento */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.document_scanner,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ validator:
+ _model.textController2Validator.asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'j0g7ggs2' /* Contatos */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode: _model.textFieldFocusNode3,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'ybdjabnd' /* Telefone */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.phone,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ validator:
+ _model.textController3Validator.asValidator(context),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.all(24.0),
+ child: TextFormField(
+ controller: _model.textController4,
+ focusNode: _model.textFieldFocusNode4,
+ autofocus: false,
+ textInputAction: TextInputAction.done,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'tlr6uxo4' /* Email */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.email,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ keyboardType: TextInputType.emailAddress,
+ validator:
+ _model.textController4Validator.asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 50.0, 0.0, 0.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ if (((_model.uploadedLocalFile.bytes?.isNotEmpty ??
+ false)) &&
+ (_model.textController1.text != '') &&
+ (_model.dropDownValue != null &&
+ _model.dropDownValue != '') &&
+ (_model.textController2.text != '')) {
+ _model.imgBase64 =
+ await actions.convertImageFileToBase64(
+ _model.uploadedLocalFile,
+ );
+ _model.registerVisitor =
+ await PhpGroup.postScheduleVisitorCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'putVisitante',
+ documento: _model.textController2.text,
+ nome: _model.textController1.text,
+ tipo: (_model.dropDownValue == 'Visitante') ||
+ (_model.dropDownValue == 'Visitor')
+ ? 'V'
+ : 'P',
+ foto: 'base64;jpeg,klajsalkjslkajslkajl',
+ );
+ if (PhpGroup.postScheduleVisitorCall.error(
+ (_model.registerVisitor?.jsonBody ?? ''),
+ ) ==
+ false) {
+ setState(() {
+ _model.textController1?.clear();
+ _model.textController2?.clear();
+ _model.textController3?.clear();
+ _model.textController4?.clear();
+ });
+ setState(() {
+ _model.dropDownValueController?.reset();
+ });
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg:
+ '\\devUUID=${FFAppState().devUUID}\\userUUID=${FFAppState().userUUID}\\cliID=${FFAppState().cliUUID}\\Documento=${_model.textController2.text}\\Nome=${_model.textController1.text}\\dropdown${_model.dropDownValue}\\${PhpGroup.postScheduleVisitorCall.errorMsg(
+ (_model.registerVisitor?.jsonBody ?? ''),
+ )}',
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg:
+ 'Você esqueceu de adicionar algum dado obrigatório. Verifique se a imagem, nome, tipo e documento estão foram preenchidos corretamente.- devUUID=${FFAppState().devUUID}- userUUID=${FFAppState().userUUID}- cliID=${FFAppState().cliUUID}- Documento=${_model.textController2.text}- Nome=${_model.textController1.text}- Tipo=${_model.dropDownValue}',
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ text: FFLocalizations.of(context).getText(
+ '65puvap9' /* Cadastrar */,
+ ),
+ options: FFButtonOptions(
+ width: double.infinity,
+ height: 36.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 80.0, 0.0, 80.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primary,
+ textStyle: FlutterFlowTheme.of(context)
+ .titleSmall
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).titleSmallFamily,
+ color: FlutterFlowTheme.of(context).info,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily),
+ ),
+ borderSide: const BorderSide(
+ color: Colors.transparent,
+ width: 30.0,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart b/lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart
new file mode 100644
index 00000000..af6db9a6
--- /dev/null
+++ b/lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart
@@ -0,0 +1,31 @@
+import '/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart';
+import '/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'visit_details_modal_widget.dart' show VisitDetailsModalWidget;
+import 'package:flutter/material.dart';
+
+class VisitDetailsModalModel extends FlutterFlowModel {
+ /// Local state fields for this component.
+
+ Color statusColor = const Color(0xff000000);
+
+ /// State fields for stateful widgets in this component.
+
+ // Model for viewVisitDetail component.
+ late ViewVisitDetailModel viewVisitDetailModel;
+ // Model for scheduleVisitDetail component.
+ late ScheduleVisitDetailModel scheduleVisitDetailModel;
+
+ @override
+ void initState(BuildContext context) {
+ viewVisitDetailModel = createModel(context, () => ViewVisitDetailModel());
+ scheduleVisitDetailModel =
+ createModel(context, () => ScheduleVisitDetailModel());
+ }
+
+ @override
+ void dispose() {
+ viewVisitDetailModel.dispose();
+ scheduleVisitDetailModel.dispose();
+ }
+}
diff --git a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart b/lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart
new file mode 100644
index 00000000..1e2dca21
--- /dev/null
+++ b/lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart
@@ -0,0 +1,122 @@
+import '/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart';
+import '/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'visit_details_modal_model.dart';
+export 'visit_details_modal_model.dart';
+
+class VisitDetailsModalWidget extends StatefulWidget {
+ const VisitDetailsModalWidget({
+ super.key,
+ this.visitStatusStr,
+ this.visitStartDateStr,
+ this.visitEndDateStr,
+ this.visitReasonStr,
+ this.visitLevelStr,
+ this.visitTempStr,
+ this.visitObsStr,
+ this.visitorStrList,
+ this.visitorJsonList,
+ this.visitorImgPath,
+ this.visitorImgList,
+ this.visitIdStr,
+ this.updateToggleIdx,
+ this.repeatVisitSchedule,
+ });
+
+ final String? visitStatusStr;
+ final String? visitStartDateStr;
+ final String? visitEndDateStr;
+ final String? visitReasonStr;
+ final String? visitLevelStr;
+ final String? visitTempStr;
+ final String? visitObsStr;
+ final String? visitorStrList;
+ final List? visitorJsonList;
+ final String? visitorImgPath;
+ final List? visitorImgList;
+ final String? visitIdStr;
+ final Future Function()? updateToggleIdx;
+ final Future Function()? repeatVisitSchedule;
+
+ @override
+ State createState() =>
+ _VisitDetailsModalWidgetState();
+}
+
+class _VisitDetailsModalWidgetState extends State {
+ late VisitDetailsModalModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => VisitDetailsModalModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Builder(
+ builder: (context) {
+ if (widget.visitStatusStr != null && widget.visitStatusStr != '') {
+ return wrapWithModel(
+ model: _model.viewVisitDetailModel,
+ updateCallback: () => setState(() {}),
+ updateOnChange: true,
+ child: ViewVisitDetailWidget(
+ visitorImgPath: widget.visitorImgPath,
+ visitStartDate: widget.visitStartDateStr!,
+ visitEndDate: widget.visitEndDateStr!,
+ visitReasonStr: widget.visitReasonStr!,
+ visitLevelStr: widget.visitLevelStr!,
+ visitTempStr: widget.visitTempStr!,
+ visitObsStr: widget.visitObsStr!,
+ visitStatusStr: widget.visitStatusStr!,
+ visitorStrList: widget.visitorStrList!,
+ visitorJsonList: widget.visitorJsonList,
+ visitIdStr: widget.visitIdStr!,
+ updateToggleIdx: () async {
+ await widget.updateToggleIdx?.call();
+ },
+ repeatVisitScheduleActionBlock: () async {
+ await widget.repeatVisitSchedule?.call();
+ },
+ ),
+ );
+ } else {
+ return wrapWithModel(
+ model: _model.scheduleVisitDetailModel,
+ updateCallback: () => setState(() {}),
+ updateOnChange: true,
+ child: ScheduleVisitDetailWidget(
+ visitorStrList: widget.visitorStrList!,
+ visitorImgPath: widget.visitorImgPath,
+ visitStartDate: widget.visitStartDateStr!,
+ visitEndDate: widget.visitEndDateStr!,
+ visitResonStr: widget.visitReasonStr!,
+ visitLevelStr: widget.visitLevelStr!,
+ visitTempStr: widget.visitTempStr!,
+ visitObsStr: widget.visitObsStr!,
+ visitorJsonList: widget.visitorJsonList!,
+ ),
+ );
+ }
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart b/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart
new file mode 100644
index 00000000..03f37209
--- /dev/null
+++ b/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'visit_history_component_widget.dart' show VisitHistoryComponentWidget;
+import 'package:flutter/material.dart';
+
+class VisitHistoryComponentModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart b/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart
new file mode 100644
index 00000000..b33ddd82
--- /dev/null
+++ b/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart
@@ -0,0 +1,388 @@
+import '/application_components/molecular_components/opt_modal/opt_modal_widget.dart';
+import '/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/custom_functions.dart' as functions;
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'visit_history_component_model.dart';
+export 'visit_history_component_model.dart';
+
+class VisitHistoryComponentWidget extends StatefulWidget {
+ const VisitHistoryComponentWidget({
+ super.key,
+ this.parameter1,
+ });
+
+ final FFUploadedFile? parameter1;
+
+ @override
+ State createState() =>
+ _VisitHistoryComponentWidgetState();
+}
+
+class _VisitHistoryComponentWidgetState
+ extends State {
+ late VisitHistoryComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => VisitHistoryComponentModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Container(
+ width: double.infinity,
+ height: 900.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.settings_sharp,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const OptModalWidget(),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ ),
+ ],
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(14.0),
+ child: FutureBuilder(
+ future: PhpGroup.getVisitsCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'getVisitas',
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme.of(context).primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final gridViewGetVisitsResponse = snapshot.data!;
+ return Builder(
+ builder: (context) {
+ final visitHistory = (PhpGroup.getVisitsCall
+ .visitasList(
+ gridViewGetVisitsResponse.jsonBody,
+ )
+ ?.toList() ??
+ [])
+ .take(10)
+ .toList();
+ return GridView.builder(
+ padding: EdgeInsets.zero,
+ gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 3,
+ crossAxisSpacing: 10.0,
+ mainAxisSpacing: 10.0,
+ childAspectRatio: 1.0,
+ ),
+ scrollDirection: Axis.vertical,
+ itemCount: visitHistory.length,
+ itemBuilder: (context, visitHistoryIndex) {
+ final visitHistoryItem =
+ visitHistory[visitHistoryIndex];
+ return Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(50.0),
+ bottomRight: Radius.circular(50.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ shape: BoxShape.rectangle,
+ ),
+ child: Stack(
+ children: [
+ Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: valueOrDefault(
+ () {
+ if (functions.jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"A\"') {
+ return FlutterFlowTheme.of(context)
+ .success;
+ } else if (functions
+ .jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"C\"') {
+ return FlutterFlowTheme.of(context)
+ .error;
+ } else if (functions
+ .jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"I\"') {
+ return FlutterFlowTheme.of(context)
+ .warning;
+ } else {
+ return FlutterFlowTheme.of(context)
+ .primary;
+ }
+ }(),
+ FlutterFlowTheme.of(context).primary,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(10.0),
+ bottomRight: Radius.circular(10.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ shape: BoxShape.rectangle,
+ ),
+ ),
+ InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ useSafeArea: true,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding:
+ MediaQuery.viewInsetsOf(context),
+ child: VisitDetailsModalWidget(
+ visitStatusStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS
''',
+ ).toString(),
+ visitStartDateStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_DTINICIO''',
+ ).toString(),
+ visitEndDateStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_DTFIM''',
+ ).toString(),
+ visitReasonStr: getJsonField(
+ visitHistoryItem,
+ r'''$.MOT_DESCRICAO''',
+ ).toString(),
+ visitLevelStr: getJsonField(
+ visitHistoryItem,
+ r'''$.NAC_DESCRICAO''',
+ ).toString(),
+ visitTempStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VTE_UNICA
''',
+ ).toString(),
+ visitObsStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_OBS''',
+ ).toString(),
+ visitorImgPath:
+ valueOrDefault(
+ 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
+ visitHistoryItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString()}&tipo=E',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ visitorStrList: getJsonField(
+ visitHistoryItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString(),
+ visitIdStr: getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_ID''',
+ ).toString(),
+ visitorJsonList: PhpGroup
+ .getVisitsCall
+ .visitasList(
+ gridViewGetVisitsResponse
+ .jsonBody,
+ ),
+ updateToggleIdx: () async {
+ setState(() {});
+ },
+ repeatVisitSchedule: () async {},
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ child: ClipRRect(
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(25.0),
+ bottomRight: Radius.circular(25.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ child: CachedNetworkImage(
+ fadeInDuration:
+ const Duration(milliseconds: 500),
+ fadeOutDuration:
+ const Duration(milliseconds: 500),
+ imageUrl: valueOrDefault(
+ 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
+ visitHistoryItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString()}&tipo=E',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ width: double.infinity,
+ height: double.infinity,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Container(
+ width: 200.0,
+ height: 20.0,
+ decoration: BoxDecoration(
+ color: valueOrDefault(
+ () {
+ if (functions.jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"A\"') {
+ return FlutterFlowTheme.of(context)
+ .success;
+ } else if (functions
+ .jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"C\"') {
+ return FlutterFlowTheme.of(context)
+ .error;
+ } else if (functions
+ .jsonToStr(getJsonField(
+ visitHistoryItem,
+ r'''$.VAW_STATUS''',
+ )) ==
+ '\"I\"') {
+ return FlutterFlowTheme.of(context)
+ .warning;
+ } else {
+ return FlutterFlowTheme.of(context)
+ .primary;
+ }
+ }(),
+ FlutterFlowTheme.of(context).primary,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ getJsonField(
+ visitHistoryItem,
+ r'''$.VTE_NOME''',
+ ).toString(),
+ textAlign: TextAlign.center,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .info,
+ fontSize: 12.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ },
+ );
+ },
+ );
+ },
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart b/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart
new file mode 100644
index 00000000..06aee0b3
--- /dev/null
+++ b/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart
@@ -0,0 +1,12 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'visitor_details_modal_widget.dart' show VisitorDetailsModalWidget;
+import 'package:flutter/material.dart';
+
+class VisitorDetailsModalModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart b/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart
new file mode 100644
index 00000000..bb280e11
--- /dev/null
+++ b/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart
@@ -0,0 +1,280 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'visitor_details_modal_model.dart';
+export 'visitor_details_modal_model.dart';
+
+class VisitorDetailsModalWidget extends StatefulWidget {
+ const VisitorDetailsModalWidget({super.key});
+
+ @override
+ State createState() =>
+ _VisitorDetailsModalWidgetState();
+}
+
+class _VisitorDetailsModalWidgetState extends State {
+ late VisitorDetailsModalModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => VisitorDetailsModalModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(25.0),
+ ),
+ child: Stack(
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ height: 34.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryText,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, -1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(20.0, 40.0, 20.0, 0.0),
+ child: Container(
+ decoration: const BoxDecoration(
+ shape: BoxShape.rectangle,
+ ),
+ child: Stack(
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 10.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Container(
+ width: 100.0,
+ height: 100.0,
+ clipBehavior: Clip.antiAlias,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Image.network(
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ fit: BoxFit.cover,
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 20.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'kqzf7nx2' /* Nome do Visitante */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ fontSize: 24.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 20.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'hz7ivuqn' /* Tipo de Visitante */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.phone,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 24.0,
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 20.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'rwqn0det' /* (00) 0 0000-0000 */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.email,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 24.0,
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 20.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '0wqbiekp' /* email@provider.etc */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, -1.0),
+ child: Container(
+ width: double.infinity,
+ height: 34.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryText,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ shape: BoxShape.rectangle,
+ ),
+ child: Align(
+ alignment: const AlignmentDirectional(1.0, -1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(10.0, 5.0, 15.0, 0.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ Navigator.pop(context);
+ },
+ child: Icon(
+ Icons.close,
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart
new file mode 100644
index 00000000..19e2c235
--- /dev/null
+++ b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart
@@ -0,0 +1,44 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'visitor_search_component_widget.dart' show VisitorSearchComponentWidget;
+import 'package:flutter/material.dart';
+
+class VisitorSearchComponentModel
+ extends FlutterFlowModel {
+ /// Local state fields for this component.
+
+ List visitors = [];
+ void addToVisitors(dynamic item) => visitors.add(item);
+ void removeFromVisitors(dynamic item) => visitors.remove(item);
+ void removeAtIndexFromVisitors(int index) => visitors.removeAt(index);
+ void insertAtIndexInVisitors(int index, dynamic item) =>
+ visitors.insert(index, item);
+ void updateVisitorsAtIndex(int index, Function(dynamic) updateFn) =>
+ visitors[index] = updateFn(visitors[index]);
+
+ List docs = [];
+ void addToDocs(String item) => docs.add(item);
+ void removeFromDocs(String item) => docs.remove(item);
+ void removeAtIndexFromDocs(int index) => docs.removeAt(index);
+ void insertAtIndexInDocs(int index, String item) => docs.insert(index, item);
+ void updateDocsAtIndex(int index, Function(String) updateFn) =>
+ docs[index] = updateFn(docs[index]);
+
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode;
+ TextEditingController? textController;
+ String? Function(BuildContext, String?)? textControllerValidator;
+ // Stores action output result for [Backend Call - API (getVisitorByDoc)] action in TextField widget.
+ ApiCallResponse? getVisitorByDoc;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ textFieldFocusNode?.dispose();
+ textController?.dispose();
+ }
+}
diff --git a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart
new file mode 100644
index 00000000..42495373
--- /dev/null
+++ b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart
@@ -0,0 +1,527 @@
+import '/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart';
+import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'visitor_search_component_model.dart';
+export 'visitor_search_component_model.dart';
+
+class VisitorSearchComponentWidget extends StatefulWidget {
+ const VisitorSearchComponentWidget({
+ super.key,
+ this.getVisitors,
+ this.getDocs,
+ });
+
+ final Future Function(List? visitorsParam)? getVisitors;
+ final Future Function(List? docsParam)? getDocs;
+
+ @override
+ State createState() =>
+ _VisitorSearchComponentWidgetState();
+}
+
+class _VisitorSearchComponentWidgetState
+ extends State with TickerProviderStateMixin {
+ late VisitorSearchComponentModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => VisitorSearchComponentModel());
+
+ _model.textController ??= TextEditingController();
+ _model.textFieldFocusNode ??= FocusNode();
+
+ WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {
+ _model.textController?.text = FFLocalizations.of(context).getText(
+ 'oj12tamm' /* test */,
+ );
+ }));
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 300.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(16.0, 10.0, 16.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController,
+ focusNode: _model.textFieldFocusNode,
+ onFieldSubmitted: (_) async {
+ setState(() {
+ _model.textController?.text = valueOrDefault(
+ _model.textController.text,
+ '69696777',
+ );
+ });
+ _model.getVisitorByDoc =
+ await PhpGroup.getVisitorByDocCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'getVisitante',
+ documento: _model.textController.text,
+ );
+ if (PhpGroup.getVisitorByDocCall.vistanteId(
+ (_model.getVisitorByDoc?.jsonBody ?? ''),
+ ) !=
+ '0') {
+ _model
+ .addToVisitors(PhpGroup.getVisitorByDocCall.visitante(
+ (_model.getVisitorByDoc?.jsonBody ?? ''),
+ ));
+ setState(() {});
+ _model.addToDocs(_model.textController.text);
+ setState(() {});
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const VisitorNotFoundComponentWidget(),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ autofocus: false,
+ textInputAction: TextInputAction.done,
+ obscureText: false,
+ decoration: InputDecoration(
+ isDense: false,
+ labelText: FFLocalizations.of(context).getText(
+ 'cjlpru1m' /* Procure pelo documento do visi... */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintText: FFLocalizations.of(context).getText(
+ '8i1qszba' /* test */,
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(15.0),
+ bottomRight: Radius.circular(15.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(15.0),
+ bottomRight: Radius.circular(15.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(15.0),
+ bottomRight: Radius.circular(15.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(15.0),
+ bottomRight: Radius.circular(15.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ filled: true,
+ fillColor: FlutterFlowTheme.of(context).primaryBackground,
+ prefixIcon: Icon(
+ Icons.search_outlined,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ keyboardType: TextInputType.number,
+ validator:
+ _model.textControllerValidator.asValidator(context),
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '9coywebh' /* Visitantes encontrados */,
+ ),
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).labelMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(4.0, 12.0, 16.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '6f5p0fv6' /* 24 */,
+ ),
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Expanded(
+ child: Builder(
+ builder: (context) {
+ if (_model.visitors.isNotEmpty) {
+ return Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(8.0, 8.0, 8.0, 0.0),
+ child: Builder(
+ builder: (context) {
+ final visitor =
+ _model.visitors.map((e) => e).toList();
+ return ListView.builder(
+ padding: EdgeInsets.zero,
+ scrollDirection: Axis.vertical,
+ itemCount: visitor.length,
+ itemBuilder: (context, visitorIndex) {
+ final visitorItem = visitor[visitorIndex];
+ return Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return Padding(
+ padding: MediaQuery.viewInsetsOf(
+ context),
+ child: const SizedBox(
+ height: 610.0,
+ child:
+ VisitorDetailsModalWidget(),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ child: Container(
+ width: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0.0,
+ color: FlutterFlowTheme.of(context)
+ .alternate,
+ offset: const Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment:
+ CrossAxisAlignment.center,
+ children: [
+ ClipRRect(
+ borderRadius:
+ BorderRadius.circular(40.0),
+ child: CachedNetworkImage(
+ fadeInDuration:
+ const Duration(milliseconds: 500),
+ fadeOutDuration:
+ const Duration(milliseconds: 500),
+ imageUrl:
+ valueOrDefault(
+ 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
+ visitorItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString()}&tipo=E',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ width: 60.0,
+ height: 60.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Expanded(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment:
+ CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(12.0, 0.0,
+ 0.0, 0.0),
+ child: Text(
+ valueOrDefault(
+ getJsonField(
+ visitorItem,
+ r'''$.VTE_NOME''',
+ )?.toString(),
+ 'NOT FOUND',
+ ),
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyLarge
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyLargeFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyLargeFamily),
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(4.0, 4.0,
+ 0.0, 0.0),
+ child: Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .start,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(
+ 0.0, -1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 0.0,
+ 0.0),
+ child: Text(
+ getJsonField(
+ visitorItem,
+ r'''$.VTE_TELEFONE''',
+ ).toString(),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primary,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.restore_from_trash,
+ color:
+ FlutterFlowTheme.of(context)
+ .primary,
+ size: 20.0,
+ ),
+ onPressed: () async {
+ _model.removeFromVisitors(
+ visitorItem);
+ setState(() {});
+ },
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ },
+ );
+ },
+ ),
+ );
+ } else {
+ return Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ ),
+ );
+ }
+ },
+ ),
+ ),
+ FFButtonWidget(
+ onPressed: () async {
+ await widget.getVisitors?.call(
+ _model.visitors,
+ );
+ await widget.getDocs?.call(
+ _model.docs,
+ );
+ Navigator.pop(context);
+ },
+ text: FFLocalizations.of(context).getText(
+ 'ug6qzyla' /* Adicionar */,
+ ),
+ options: FFButtonOptions(
+ width: double.infinity,
+ height: 30.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primary,
+ textStyle: FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily:
+ FlutterFlowTheme.of(context).titleSmallFamily,
+ color: Colors.white,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context).titleSmallFamily),
+ ),
+ elevation: 3.0,
+ borderSide: const BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_model.dart b/lib/application_pages/fast_pass_page/fast_pass_page_model.dart
new file mode 100644
index 00000000..2b4d9d53
--- /dev/null
+++ b/lib/application_pages/fast_pass_page/fast_pass_page_model.dart
@@ -0,0 +1,17 @@
+import '/flutter_flow/flutter_flow_util.dart';
+import 'fast_pass_page_widget.dart' show FastPassPageWidget;
+import 'package:flutter/material.dart';
+
+class FastPassPageModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ }
+}
diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart b/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart
new file mode 100644
index 00000000..5edf4ae4
--- /dev/null
+++ b/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart
@@ -0,0 +1,44 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'fast_pass_page_model.dart';
+export 'fast_pass_page_model.dart';
+
+class FastPassPageWidget extends StatefulWidget {
+ const FastPassPageWidget({super.key});
+
+ @override
+ State createState() => _FastPassPageWidgetState();
+}
+
+class _FastPassPageWidgetState extends State {
+ late FastPassPageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => FastPassPageModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ );
+ }
+}
diff --git a/lib/application_pages/home_page/home_page_model.dart b/lib/application_pages/home_page/home_page_model.dart
new file mode 100644
index 00000000..ca2e9e8b
--- /dev/null
+++ b/lib/application_pages/home_page/home_page_model.dart
@@ -0,0 +1,46 @@
+import '/application_components/organism_components/local_profile_component/local_profile_component_widget.dart';
+import '/application_components/templates_components/menu_component/menu_component_widget.dart';
+import '/application_components/templates_components/message_well_component/message_well_component_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'home_page_widget.dart' show HomePageWidget;
+import 'package:flutter/material.dart';
+
+class HomePageModel extends FlutterFlowModel {
+ /// Local state fields for this page.
+
+ bool isGrid = false;
+
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode;
+ TextEditingController? textController;
+ String? Function(BuildContext, String?)? textControllerValidator;
+ // Model for localComponent.
+ late LocalProfileComponentModel localComponentModel;
+ // Model for menuComponent component.
+ late MenuComponentModel menuComponentModel;
+ // Model for messageWellComponent component.
+ late MessageWellComponentModel messageWellComponentModel;
+
+ @override
+ void initState(BuildContext context) {
+ localComponentModel =
+ createModel(context, () => LocalProfileComponentModel());
+ menuComponentModel = createModel(context, () => MenuComponentModel());
+ messageWellComponentModel =
+ createModel(context, () => MessageWellComponentModel());
+ }
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ textFieldFocusNode?.dispose();
+ textController?.dispose();
+
+ localComponentModel.dispose();
+ menuComponentModel.dispose();
+ messageWellComponentModel.dispose();
+ }
+}
diff --git a/lib/application_pages/home_page/home_page_widget.dart b/lib/application_pages/home_page/home_page_widget.dart
new file mode 100644
index 00000000..cfe4a776
--- /dev/null
+++ b/lib/application_pages/home_page/home_page_widget.dart
@@ -0,0 +1,1080 @@
+import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
+import '/application_components/organism_components/local_profile_component/local_profile_component_widget.dart';
+import '/application_components/templates_components/menu_component/menu_component_widget.dart';
+import '/application_components/templates_components/message_well_component/message_well_component_widget.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'home_page_model.dart';
+export 'home_page_model.dart';
+
+class HomePageWidget extends StatefulWidget {
+ const HomePageWidget({super.key});
+
+ @override
+ State createState() => _HomePageWidgetState();
+}
+
+class _HomePageWidgetState extends State {
+ late HomePageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => HomePageModel());
+
+ // On page load action.
+ SchedulerBinding.instance.addPostFrameCallback((_) async {
+ if (FFAppState().cliUUID == '') {
+ showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const BottomArrowLinkedLocalsComponentWidget(),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ } else {
+ return;
+ }
+ });
+
+ _model.textController ??= TextEditingController();
+ _model.textFieldFocusNode ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
+ drawer: SizedBox(
+ width: 750.0,
+ child: Drawer(
+ elevation: 16.0,
+ child: Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ shape: BoxShape.rectangle,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(5.0),
+ bottomRight: Radius.circular(5.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(0.0),
+ ),
+ shape: BoxShape.rectangle,
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 30.0, 0.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding: const EdgeInsets.all(12.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ width: 50.0,
+ height: 50.0,
+ clipBehavior: Clip.antiAlias,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Image.network(
+ valueOrDefault(
+ 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ fit: BoxFit.cover,
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Container(
+ decoration: const BoxDecoration(),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'lyiat6s2' /* NOME DO MORADOR */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyLarge
+ .override(
+ fontFamily: 'Nunito Sans',
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ letterSpacing: 0.0,
+ fontWeight:
+ FontWeight.normal,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito Sans'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: const BoxDecoration(),
+ child: FlutterFlowIconButton(
+ borderRadius: 100.0,
+ borderWidth: 1.0,
+ buttonSize: 1.0,
+ icon: Icon(
+ Icons.close_sharp,
+ color: FlutterFlowTheme.of(context).info,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ if (scaffoldKey.currentState!.isDrawerOpen ||
+ scaffoldKey.currentState!.isEndDrawerOpen) {
+ Navigator.pop(context);
+ }
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Flexible(
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 8.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController,
+ focusNode: _model.textFieldFocusNode,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ alignLabelWithHint: false,
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(6.0),
+ ),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(6.0),
+ ),
+ errorBorder: UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(6.0),
+ ),
+ focusedErrorBorder: UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(6.0),
+ ),
+ prefixIcon: const Icon(
+ Icons.search_sharp,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textControllerValidator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(10.0, 20.0, 10.0, 0.0),
+ child: ListView(
+ padding: EdgeInsets.zero,
+ scrollDirection: Axis.vertical,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kfast,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'dlaeicxd' /* Auto-Visita */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.khome,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ '53jd930v' /* Condominio */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kpets,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'ptsx0rln' /* Cadastrar Pet */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kvector1,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'rgxgw626' /* Cadastrar Visitante */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kvector2,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'j2tn9lpw' /* QR Code de Acesso */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kvector3,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ '9weuwgs1' /* Histórico de Acesso */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Divider(
+ thickness: 1.0,
+ color:
+ FlutterFlowTheme.of(context).customColor1,
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ FFIcons.kvector1,
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ size: 24.0,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'vuk5bjau' /* Agendar Visita */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .titleLarge
+ .override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts:
+ GoogleFonts.asMap()
+ .containsKey(
+ 'Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .customColor1,
+ size: 24.0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 0.0, 0.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ FFAppState().isLogged = false;
+ setState(() {});
+
+ context.goNamed(
+ 'onBoardingPage',
+ extra: {
+ kTransitionInfoKey: const TransitionInfo(
+ hasTransition: true,
+ transitionType: PageTransitionType.scale,
+ alignment: Alignment.bottomCenter,
+ ),
+ },
+ );
+ },
+ text: FFLocalizations.of(context).getText(
+ 'xx0db4wi' /* Sair */,
+ ),
+ options: FFButtonOptions(
+ height: 40.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color: const Color(0x00D70000),
+ textStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: 'Plus Jakarta Sans',
+ color: FlutterFlowTheme.of(context).primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w500,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Plus Jakarta Sans'),
+ ),
+ elevation: 0.0,
+ borderSide: const BorderSide(
+ width: 0.0,
+ ),
+ borderRadius: BorderRadius.circular(50.0),
+ ),
+ ),
+ ),
+ ),
+ ].addToEnd(const SizedBox(height: 64.0)),
+ ),
+ ),
+ ),
+ ),
+ body: Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Wrap(
+ spacing: 0.0,
+ runSpacing: 0.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: const BoxDecoration(
+ color: Color(0xFF1AAB5F),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ height: 50.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ fillColor:
+ FlutterFlowTheme.of(context)
+ .primary,
+ icon: const Icon(
+ Icons.menu_rounded,
+ color: Colors.white,
+ size: 28.0,
+ ),
+ onPressed: () async {
+ scaffoldKey.currentState!
+ .openDrawer();
+ },
+ ),
+ ),
+ ),
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 60.0, 15.0, 0.0, 0.0),
+ child: ClipRRect(
+ borderRadius:
+ BorderRadius.circular(8.0),
+ child: Image.network(
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/8r2vsbd9i03k/logo.png',
+ width: 50.0,
+ height: 200.0,
+ fit: BoxFit.none,
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 15.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'rg9pzkpz' /* FRE ACCESS */,
+ ),
+ style:
+ FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme
+ .of(context)
+ .info,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ width: 100.0,
+ height: 50.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(1.0, 1.0),
+ child: FlutterFlowIconButton(
+ borderColor:
+ FlutterFlowTheme.of(context)
+ .primary,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ fillColor: FlutterFlowTheme.of(context)
+ .accent1,
+ icon: Icon(
+ Icons.notifications_sharp,
+ color:
+ FlutterFlowTheme.of(context).info,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ wrapWithModel(
+ model: _model.localComponentModel,
+ updateCallback: () => setState(() {}),
+ child: const LocalProfileComponentWidget(),
+ ),
+ Wrap(
+ spacing: 0.0,
+ runSpacing: 0.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: [
+ wrapWithModel(
+ model: _model.menuComponentModel,
+ updateCallback: () => setState(() {}),
+ child: const MenuComponentWidget(),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: wrapWithModel(
+ model: _model.messageWellComponentModel,
+ updateCallback: () => setState(() {}),
+ child: const MessageWellComponentWidget(),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_pages/register_visitor_page/register_visitor_page_model.dart b/lib/application_pages/register_visitor_page/register_visitor_page_model.dart
new file mode 100644
index 00000000..81633e4d
--- /dev/null
+++ b/lib/application_pages/register_visitor_page/register_visitor_page_model.dart
@@ -0,0 +1,58 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/form_field_controller.dart';
+import 'register_visitor_page_widget.dart' show RegisterVisitorPageWidget;
+import 'package:flutter/material.dart';
+
+class RegisterVisitorPageModel
+ extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+ bool isDataUploading = false;
+ FFUploadedFile uploadedLocalFile =
+ FFUploadedFile(bytes: Uint8List.fromList([]));
+
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ // State field(s) for DropDown widget.
+ String? dropDownValue;
+ FormFieldController? dropDownValueController;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode4;
+ TextEditingController? textController4;
+ String? Function(BuildContext, String?)? textController4Validator;
+ // Stores action output result for [Custom Action - convertImageFileToBase64] action in Button widget.
+ String? imgBase64;
+ // Stores action output result for [Backend Call - API (postScheduleVisitor)] action in Button widget.
+ ApiCallResponse? scheduleVisitor;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+
+ textFieldFocusNode4?.dispose();
+ textController4?.dispose();
+ }
+}
diff --git a/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart
new file mode 100644
index 00000000..cb72f361
--- /dev/null
+++ b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart
@@ -0,0 +1,898 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_drop_down.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/flutter_flow/form_field_controller.dart';
+import '/flutter_flow/upload_data.dart';
+import '/custom_code/actions/index.dart' as actions;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'register_visitor_page_model.dart';
+export 'register_visitor_page_model.dart';
+
+class RegisterVisitorPageWidget extends StatefulWidget {
+ const RegisterVisitorPageWidget({super.key});
+
+ @override
+ State createState() =>
+ _RegisterVisitorPageWidgetState();
+}
+
+class _RegisterVisitorPageWidgetState extends State {
+ late RegisterVisitorPageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => RegisterVisitorPageModel());
+
+ _model.textController1 ??= TextEditingController();
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??= TextEditingController();
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.textController3 ??= TextEditingController();
+ _model.textFieldFocusNode3 ??= FocusNode();
+
+ _model.textController4 ??= TextEditingController();
+ _model.textFieldFocusNode4 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ body: SafeArea(
+ top: true,
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(25.0),
+ topRight: Radius.circular(25.0),
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(0.0, 30.0, 0.0, 0.0),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, -1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 20.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'q8cct5lk' /* Cadastrar Visitante */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyLarge
+ .override(
+ fontFamily: 'Nunito',
+ fontSize: 21.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w800,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ),
+ Builder(
+ builder: (context) {
+ if ((_model.uploadedLocalFile.bytes?.isNotEmpty ??
+ false)) {
+ return InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ setState(() {
+ _model.isDataUploading = false;
+ _model.uploadedLocalFile = FFUploadedFile(
+ bytes: Uint8List.fromList([]));
+ });
+ },
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(8.0),
+ child: Image.memory(
+ _model.uploadedLocalFile.bytes ??
+ Uint8List.fromList([]),
+ width: 300.0,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ );
+ } else {
+ return Stack(
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(0.01, 0.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ final selectedMedia =
+ await selectMediaWithSourceBottomSheet(
+ context: context,
+ maxWidth: 300.00,
+ maxHeight: 300.00,
+ imageQuality: 0,
+ allowPhoto: true,
+ includeDimensions: true,
+ );
+ if (selectedMedia != null &&
+ selectedMedia.every((m) =>
+ validateFileFormat(
+ m.storagePath, context))) {
+ setState(() =>
+ _model.isDataUploading = true);
+ var selectedUploadedFiles =
+ [];
+
+ try {
+ showUploadMessage(
+ context,
+ 'Uploading file...',
+ showLoading: true,
+ );
+ selectedUploadedFiles = selectedMedia
+ .map((m) => FFUploadedFile(
+ name: m.storagePath
+ .split('/')
+ .last,
+ bytes: m.bytes,
+ height:
+ m.dimensions?.height,
+ width: m.dimensions?.width,
+ blurHash: m.blurHash,
+ ))
+ .toList();
+ } finally {
+ ScaffoldMessenger.of(context)
+ .hideCurrentSnackBar();
+ _model.isDataUploading = false;
+ }
+ if (selectedUploadedFiles.length ==
+ selectedMedia.length) {
+ setState(() {
+ _model.uploadedLocalFile =
+ selectedUploadedFiles.first;
+ });
+ showUploadMessage(
+ context, 'Success!');
+ } else {
+ setState(() {});
+ showUploadMessage(
+ context, 'Failed to upload data');
+ return;
+ }
+ }
+ },
+ text: '',
+ icon: Icon(
+ Icons.photo_camera,
+ color:
+ FlutterFlowTheme.of(context).accent1,
+ size: 30.0,
+ ),
+ options: FFButtonOptions(
+ width: 300.0,
+ height: 80.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 14.0, 0.0, 0.0, 20.0),
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ textStyle: FlutterFlowTheme.of(context)
+ .titleSmall
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 16.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily),
+ ),
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 50.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'p4ftwxcy' /* Clique para adicionar a foto p... */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+ },
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'zazj5d8b' /* Preencha o formulário com os d... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController1,
+ focusNode: _model.textFieldFocusNode1,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'v7g73yik' /* Nome */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.person,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ maxLines: null,
+ keyboardType: TextInputType.name,
+ validator: _model.textController1Validator
+ .asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Container(
+ decoration: const BoxDecoration(),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 20.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 10.0, 20.0, 10.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'yp23q90m' /* Selecione o tipo: */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 20.0, 0.0, 5.0),
+ child: FlutterFlowDropDown(
+ controller:
+ _model.dropDownValueController ??=
+ FormFieldController(null),
+ options: [
+ FFLocalizations.of(context).getText(
+ 'n8vddmcq' /* Visitante */,
+ ),
+ FFLocalizations.of(context).getText(
+ '9luaa09e' /* Prestador de Serviço */,
+ )
+ ],
+ onChanged: (val) => setState(
+ () => _model.dropDownValue = val),
+ width: 200.0,
+ height: 48.0,
+ textStyle: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ 'pmezihb4' /* Selecione... */,
+ ),
+ icon: Icon(
+ Icons.keyboard_arrow_down_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 24.0,
+ ),
+ elevation: 2.0,
+ borderColor:
+ FlutterFlowTheme.of(context).accent1,
+ borderWidth: 0.5,
+ borderRadius: 8.0,
+ margin: const EdgeInsetsDirectional.fromSTEB(
+ 16.0, 4.0, 16.0, 4.0),
+ hidesUnderline: true,
+ isOverButton: true,
+ isSearchable: false,
+ isMultiSelect: false,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController2,
+ focusNode: _model.textFieldFocusNode2,
+ autofocus: false,
+ textCapitalization: TextCapitalization.none,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'rl8tvwnr' /* Documento */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.document_scanner,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController2Validator
+ .asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'bqpucwh0' /* Contatos */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode: _model.textFieldFocusNode3,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'h84ls2r6' /* Telefone */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.phone,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ validator: _model.textController3Validator
+ .asValidator(context),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.all(24.0),
+ child: TextFormField(
+ controller: _model.textController4,
+ focusNode: _model.textFieldFocusNode4,
+ autofocus: false,
+ textInputAction: TextInputAction.done,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText: FFLocalizations.of(context).getText(
+ 'fqp7qmka' /* Email */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).accent1,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).primary,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context).error,
+ width: 0.5,
+ ),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.email,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap().containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ keyboardType: TextInputType.emailAddress,
+ validator: _model.textController4Validator
+ .asValidator(context),
+ ),
+ ),
+ Align(
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 50.0, 0.0, 0.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ if (((_model.uploadedLocalFile.bytes
+ ?.isNotEmpty ??
+ false)) &&
+ (_model.textController1.text != '') &&
+ (_model.dropDownValue != null &&
+ _model.dropDownValue != '') &&
+ (_model.textController2.text != '')) {
+ _model.imgBase64 =
+ await actions.convertImageFileToBase64(
+ _model.uploadedLocalFile,
+ );
+ _model.scheduleVisitor =
+ await PhpGroup.postScheduleVisitorCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'putVisitante',
+ documento: '7654553234232342',
+ nome: 'Test',
+ tipo: 'V',
+ foto: 'base64;jpeg,klajsalkjslkajslkajl',
+ );
+ if (PhpGroup.postScheduleVisitorCall.error(
+ (_model.scheduleVisitor?.jsonBody ?? ''),
+ ) ==
+ false) {
+ setState(() {
+ _model.textController1?.clear();
+ _model.textController2?.clear();
+ _model.textController3?.clear();
+ _model.textController4?.clear();
+ });
+ setState(() {
+ _model.dropDownValueController?.reset();
+ });
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(
+ _model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding:
+ MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg:
+ '\\devUUID=${FFAppState().devUUID}\\userUUID=${FFAppState().userUUID}\\cliID=${FFAppState().cliUUID}\\Documento=${_model.textController2.text}\\Nome=${_model.textController1.text}\\dropdown${_model.dropDownValue}\\${PhpGroup.postScheduleVisitorCall.errorMsg(
+ (_model.scheduleVisitor
+ ?.jsonBody ??
+ ''),
+ )}',
+ ),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding:
+ MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg:
+ 'Você esqueceu de adicionar algum dado obrigatório. Verifique se a imagem, nome, tipo e documento estão foram preenchidos corretamente.- devUUID=${FFAppState().devUUID}- userUUID=${FFAppState().userUUID}- cliID=${FFAppState().cliUUID}- Documento=${_model.textController2.text}- Nome=${_model.textController1.text}- Tipo=${_model.dropDownValue}',
+ ),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ text: FFLocalizations.of(context).getText(
+ 'okbw0aiu' /* Cadastrar */,
+ ),
+ options: FFButtonOptions(
+ width: double.infinity,
+ height: 36.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 80.0, 0.0, 80.0, 0.0),
+ iconPadding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primary,
+ textStyle: FlutterFlowTheme.of(context)
+ .titleSmall
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .titleSmallFamily,
+ color: FlutterFlowTheme.of(context).info,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily),
+ ),
+ borderSide: const BorderSide(
+ color: Colors.transparent,
+ width: 30.0,
+ ),
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart
new file mode 100644
index 00000000..061b4853
--- /dev/null
+++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart
@@ -0,0 +1,92 @@
+import '/components/select_header_component_widget.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/form_field_controller.dart';
+import 'schedule_complete_visit_page_widget.dart'
+ show ScheduleCompleteVisitPageWidget;
+import 'package:flutter/material.dart';
+
+class ScheduleCompleteVisitPageModel
+ extends FlutterFlowModel {
+ /// Local state fields for this page.
+
+ List visitorJsonList = [];
+ void addToVisitorJsonList(dynamic item) => visitorJsonList.add(item);
+ void removeFromVisitorJsonList(dynamic item) => visitorJsonList.remove(item);
+ void removeAtIndexFromVisitorJsonList(int index) =>
+ visitorJsonList.removeAt(index);
+ void insertAtIndexInVisitorJsonList(int index, dynamic item) =>
+ visitorJsonList.insert(index, item);
+ void updateVisitorJsonListAtIndex(int index, Function(dynamic) updateFn) =>
+ visitorJsonList[index] = updateFn(visitorJsonList[index]);
+
+ String visitorStrList = '0';
+
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+ // Model for selectHeaderComponent component.
+ late SelectHeaderComponentModel selectHeaderComponentModel;
+ // Stores action output result for [Action Block - toggleCurrentSelectionHeader] action in selectHeaderComponent widget.
+ bool? toggleIndexValue;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ DateTime? datePicked1;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ DateTime? datePicked2;
+ // State field(s) for DropDown widget.
+ String? dropDownValue1;
+ FormFieldController? dropDownValueController1;
+ // State field(s) for DropDown widget.
+ String? dropDownValue2;
+ FormFieldController? dropDownValueController2;
+ // State field(s) for Switch widget.
+ bool? switchValue;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+
+ @override
+ void initState(BuildContext context) {
+ selectHeaderComponentModel =
+ createModel(context, () => SelectHeaderComponentModel());
+ }
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ selectHeaderComponentModel.dispose();
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+ }
+
+ /// Action blocks.
+ Future getVisitorsActionPage(
+ BuildContext context, {
+ List? visitorsJsonList,
+ }) async {
+ visitorJsonList = visitorsJsonList!.toList().cast();
+ }
+
+ Future toggleCurrentSelectionHeader(
+ BuildContext context, {
+ required bool? toggleIndexValue,
+ }) async {
+ if (toggleIndexValue == true) {
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart
new file mode 100644
index 00000000..71159cbe
--- /dev/null
+++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart
@@ -0,0 +1,2539 @@
+import '/application_components/molecular_components/opt_modal/opt_modal_widget.dart';
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart';
+import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart';
+import '/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/components/select_header_component_widget.dart';
+import '/flutter_flow/flutter_flow_drop_down.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/flutter_flow/form_field_controller.dart';
+import '/flutter_flow/custom_functions.dart' as functions;
+import 'package:auto_size_text/auto_size_text.dart';
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'schedule_complete_visit_page_model.dart';
+export 'schedule_complete_visit_page_model.dart';
+
+class ScheduleCompleteVisitPageWidget extends StatefulWidget {
+ const ScheduleCompleteVisitPageWidget({
+ super.key,
+ this.visitorStrList,
+ this.visitStartDateStr,
+ this.visitEndDateStr,
+ this.visitReasonStr,
+ this.visitLevelStr,
+ this.visitTempBol,
+ this.visitObsStr,
+ this.visitorJsonList,
+ });
+
+ final String? visitorStrList;
+ final String? visitStartDateStr;
+ final String? visitEndDateStr;
+ final String? visitReasonStr;
+ final String? visitLevelStr;
+ final bool? visitTempBol;
+ final String? visitObsStr;
+ final List? visitorJsonList;
+
+ @override
+ State createState() =>
+ _ScheduleCompleteVisitPageWidgetState();
+}
+
+class _ScheduleCompleteVisitPageWidgetState
+ extends State {
+ late ScheduleCompleteVisitPageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ScheduleCompleteVisitPageModel());
+
+ // On page load action.
+ SchedulerBinding.instance.addPostFrameCallback((_) async {
+ if ((widget.visitorStrList != null && widget.visitorStrList != '') &&
+ ((widget.visitorJsonList != null &&
+ (widget.visitorJsonList)!.isNotEmpty) !=
+ null)) {
+ _model.visitorJsonList = widget.visitorJsonList!
+ .where((e) =>
+ widget.visitorStrList ==
+ getJsonField(
+ e,
+ r'''$.VTE_DOCUMENTO''',
+ ))
+ .toList()
+ .toList()
+ .cast();
+ _model.visitorStrList = widget.visitorStrList!;
+ setState(() {});
+ } else {
+ return;
+ }
+ });
+
+ _model.textController1 ??= TextEditingController();
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??= TextEditingController();
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.switchValue = true;
+ _model.textController3 ??= TextEditingController();
+ _model.textFieldFocusNode3 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ appBar: AppBar(
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ automaticallyImplyLeading: false,
+ leading: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 60.0,
+ icon: Icon(
+ Icons.keyboard_arrow_left,
+ color: FlutterFlowTheme.of(context).primaryText,
+ size: 30.0,
+ ),
+ onPressed: () async {
+ context.pop();
+ },
+ ),
+ title: Text(
+ FFLocalizations.of(context).getText(
+ '61lcxdgm' /* Agendar Visita */,
+ ),
+ style: FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily: 'Nunito',
+ color: FlutterFlowTheme.of(context).primaryText,
+ fontSize: 15.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
+ ),
+ ),
+ actions: const [],
+ centerTitle: true,
+ ),
+ body: SafeArea(
+ top: true,
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ wrapWithModel(
+ model: _model.selectHeaderComponentModel,
+ updateCallback: () => setState(() {}),
+ updateOnChange: true,
+ child: SelectHeaderComponentWidget(
+ toggleIndexValue: _model.toggleIndexValue,
+ selectToggle: (toggleIndex) async {
+ _model.toggleIndexValue =
+ await _model.toggleCurrentSelectionHeader(
+ context,
+ toggleIndexValue: toggleIndex,
+ );
+
+ setState(() {});
+ },
+ ),
+ ),
+ if (valueOrDefault(
+ _model.toggleIndexValue == true,
+ true,
+ ))
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Stack(
+ children: [
+ Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ ),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceEvenly,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'qo0pg2at' /* Quais visitantes você deseja c... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ if (_model.visitorJsonList.isNotEmpty)
+ Builder(
+ builder: (context) {
+ final visitorListView = _model
+ .visitorJsonList
+ .map((e) => e)
+ .toList();
+ return ListView.separated(
+ padding: const EdgeInsets.fromLTRB(
+ 0,
+ 0,
+ 0,
+ 20.0,
+ ),
+ shrinkWrap: true,
+ scrollDirection: Axis.vertical,
+ itemCount: visitorListView.length,
+ separatorBuilder: (_, __) =>
+ const SizedBox(height: 5.0),
+ itemBuilder: (context,
+ visitorListViewIndex) {
+ final visitorListViewItem =
+ visitorListView[
+ visitorListViewIndex];
+ return InkWell(
+ splashColor:
+ Colors.transparent,
+ focusColor:
+ Colors.transparent,
+ hoverColor:
+ Colors.transparent,
+ highlightColor:
+ Colors.transparent,
+ onTap: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor:
+ Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode
+ .canRequestFocus
+ ? FocusScope.of(
+ context)
+ .requestFocus(
+ _model
+ .unfocusNode)
+ : FocusScope.of(
+ context)
+ .unfocus(),
+ child: Padding(
+ padding: MediaQuery
+ .viewInsetsOf(
+ context),
+ child:
+ const VisitorDetailsModalWidget(),
+ ),
+ );
+ },
+ ).then((value) =>
+ safeSetState(() {}));
+ },
+ onLongPress: () async {
+ _model
+ .removeFromVisitorJsonList(
+ visitorListViewItem);
+ setState(() {});
+ },
+ child: Container(
+ width: 100.0,
+ height: 70.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme
+ .of(context)
+ .secondaryBackground,
+ ),
+ child: Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Container(
+ width: 50.0,
+ height: 50.0,
+ clipBehavior:
+ Clip.antiAlias,
+ decoration:
+ const BoxDecoration(
+ shape:
+ BoxShape.circle,
+ ),
+ child:
+ CachedNetworkImage(
+ fadeInDuration:
+ const Duration(
+ milliseconds:
+ 500),
+ fadeOutDuration:
+ const Duration(
+ milliseconds:
+ 500),
+ imageUrl:
+ valueOrDefault<
+ String>(
+ 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
+ visitorListViewItem,
+ r'''$.VTE_DOCUMENTO''',
+ ).toString()}&tipo=E',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ fit: BoxFit.cover,
+ ),
+ ),
+ Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Text(
+ getJsonField(
+ visitorListViewItem,
+ r'''$.VTE_NOME''',
+ ).toString(),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ Text(
+ getJsonField(
+ visitorListViewItem,
+ r'''$.VTE_TIPO''',
+ ).toString(),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ],
+ ),
+ ]
+ .divide(const SizedBox(
+ width: 30.0))
+ .addToStart(const SizedBox(
+ width: 30.0)),
+ ),
+ ),
+ );
+ },
+ );
+ },
+ ),
+ Stack(
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(0.01, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 0.0, 0.0, 20.0),
+ child: FFButtonWidget(
+ onPressed: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode
+ .canRequestFocus
+ ? FocusScope.of(
+ context)
+ .requestFocus(_model
+ .unfocusNode)
+ : FocusScope.of(
+ context)
+ .unfocus(),
+ child: Padding(
+ padding: MediaQuery
+ .viewInsetsOf(
+ context),
+ child:
+ VisitorSearchComponentWidget(
+ getVisitors:
+ (visitorsParam) async {
+ _model.visitorJsonList =
+ visitorsParam!
+ .toList()
+ .cast<
+ dynamic>();
+ setState(() {});
+ },
+ getDocs:
+ (docsParam) async {
+ _model.visitorStrList =
+ functions.strListToStr(
+ docsParam!
+ .toList());
+ setState(() {});
+ },
+ ),
+ ),
+ );
+ },
+ ).then((value) =>
+ safeSetState(() {}));
+ },
+ text: '',
+ icon: Icon(
+ Icons.add,
+ color: FlutterFlowTheme.of(
+ context)
+ .primary,
+ size: 30.0,
+ ),
+ options: FFButtonOptions(
+ width:
+ MediaQuery.sizeOf(context)
+ .width *
+ 0.8,
+ height: 80.0,
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional
+ .fromSTEB(14.0, 0.0,
+ 0.0, 20.0),
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryBackground,
+ textStyle: FlutterFlowTheme
+ .of(context)
+ .titleSmall
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .titleSmallFamily,
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ fontSize: 16.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .titleSmallFamily),
+ ),
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(
+ context)
+ .accent4,
+ width: 1.0,
+ ),
+ borderRadius:
+ BorderRadius.circular(
+ 8.0),
+ ),
+ ),
+ ),
+ ),
+ Align(
+ alignment:
+ const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 50.0, 0.0, 0.0),
+ child: Container(
+ width:
+ MediaQuery.sizeOf(context)
+ .width *
+ 0.8,
+ height: 20.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment:
+ const AlignmentDirectional(
+ 0.0, 0.0),
+ child: AutoSizeText(
+ FFLocalizations.of(context)
+ .getText(
+ 'i0jhuu3e' /* Clique para adicionar um visit... */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme
+ .of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 24.0, 0.0, 24.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'z4ry3tge' /* Qual o período de validade da ... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'hjp5mzbd' /* Inicio da Visita */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: SizedBox(
+ height: double.infinity,
+ child: Stack(
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 24.0,
+ 0.0),
+ child: TextFormField(
+ controller: _model
+ .textController1,
+ focusNode: _model
+ .textFieldFocusNode1,
+ autofocus: false,
+ obscureText: false,
+ decoration:
+ InputDecoration(
+ isDense: true,
+ labelStyle:
+ FlutterFlowTheme.of(
+ context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'ce6xryf4' /* Quando você inicia a visita? */,
+ ),
+ hintStyle:
+ FlutterFlowTheme.of(
+ context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ lineHeight:
+ 1.0,
+ ),
+ enabledBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .accent4,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ focusedBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ errorBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ focusedErrorBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ suffixIcon: Icon(
+ Icons.date_range,
+ color: FlutterFlowTheme
+ .of(context)
+ .accent1,
+ ),
+ ),
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ lineHeight:
+ 1.0,
+ ),
+ textAlign:
+ TextAlign.center,
+ validator: _model
+ .textController1Validator
+ .asValidator(
+ context),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 24.0,
+ 0.0),
+ child: InkWell(
+ splashColor:
+ Colors.transparent,
+ focusColor:
+ Colors.transparent,
+ hoverColor:
+ Colors.transparent,
+ highlightColor:
+ Colors.transparent,
+ onTap: () async {
+ final datePicked1Date =
+ await showDatePicker(
+ context: context,
+ initialDate:
+ getCurrentTimestamp,
+ firstDate:
+ getCurrentTimestamp,
+ lastDate:
+ DateTime(2050),
+ builder: (context,
+ child) {
+ return wrapInMaterialDatePickerTheme(
+ context,
+ child!,
+ headerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ headerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ headerTextStyle:
+ FlutterFlowTheme.of(
+ context)
+ .headlineLarge
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).headlineLargeFamily,
+ fontSize:
+ 32.0,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight.w600,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
+ ),
+ pickerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ pickerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ selectedDateTimeBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ selectedDateTimeForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ actionButtonForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ iconSize: 24.0,
+ );
+ },
+ );
+
+ TimeOfDay?
+ datePicked1Time;
+ if (datePicked1Date !=
+ null) {
+ datePicked1Time =
+ await showTimePicker(
+ context: context,
+ initialTime: TimeOfDay
+ .fromDateTime(
+ getCurrentTimestamp),
+ builder: (context,
+ child) {
+ return wrapInMaterialTimePickerTheme(
+ context,
+ child!,
+ headerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ headerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ headerTextStyle: FlutterFlowTheme.of(
+ context)
+ .headlineLarge
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).headlineLargeFamily,
+ fontSize:
+ 32.0,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight.w600,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
+ ),
+ pickerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ pickerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ selectedDateTimeBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ selectedDateTimeForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ actionButtonForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ iconSize:
+ 24.0,
+ );
+ },
+ );
+ }
+
+ if (datePicked1Date !=
+ null &&
+ datePicked1Time !=
+ null) {
+ safeSetState(() {
+ _model.datePicked1 =
+ DateTime(
+ datePicked1Date
+ .year,
+ datePicked1Date
+ .month,
+ datePicked1Date
+ .day,
+ datePicked1Time!
+ .hour,
+ datePicked1Time
+ .minute,
+ );
+ });
+ }
+ setState(() {
+ _model.textController1
+ ?.text =
+ dateTimeFormat(
+ 'd/M/y H:mm:ss',
+ _model
+ .datePicked1,
+ locale: FFLocalizations
+ .of(context)
+ .languageCode,
+ );
+ });
+ },
+ child: Container(
+ width:
+ double.infinity,
+ height: 55.0,
+ decoration:
+ BoxDecoration(
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'jwsbk0xu' /* Fim da Visita */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: SizedBox(
+ height: double.infinity,
+ child: Stack(
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 24.0,
+ 0.0),
+ child: TextFormField(
+ controller: _model
+ .textController2,
+ focusNode: _model
+ .textFieldFocusNode2,
+ autofocus: false,
+ obscureText: false,
+ decoration:
+ InputDecoration(
+ isDense: true,
+ labelStyle:
+ FlutterFlowTheme.of(
+ context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'lyfe46f6' /* Quando a visita terminá? */,
+ ),
+ hintStyle:
+ FlutterFlowTheme.of(
+ context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).labelMediumFamily),
+ lineHeight:
+ 1.0,
+ ),
+ enabledBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .accent4,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ focusedBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ errorBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ focusedErrorBorder:
+ OutlineInputBorder(
+ borderSide:
+ BorderSide(
+ color: FlutterFlowTheme
+ .of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ suffixIcon: Icon(
+ Icons.date_range,
+ color: FlutterFlowTheme
+ .of(context)
+ .accent1,
+ ),
+ ),
+ style:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ lineHeight:
+ 1.0,
+ ),
+ textAlign:
+ TextAlign.center,
+ validator: _model
+ .textController2Validator
+ .asValidator(
+ context),
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 24.0,
+ 0.0),
+ child: InkWell(
+ splashColor:
+ Colors.transparent,
+ focusColor:
+ Colors.transparent,
+ hoverColor:
+ Colors.transparent,
+ highlightColor:
+ Colors.transparent,
+ onTap: () async {
+ final datePicked2Date =
+ await showDatePicker(
+ context: context,
+ initialDate:
+ getCurrentTimestamp,
+ firstDate:
+ getCurrentTimestamp,
+ lastDate:
+ DateTime(2050),
+ builder: (context,
+ child) {
+ return wrapInMaterialDatePickerTheme(
+ context,
+ child!,
+ headerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ headerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ headerTextStyle:
+ FlutterFlowTheme.of(
+ context)
+ .headlineLarge
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).headlineLargeFamily,
+ fontSize:
+ 32.0,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight.w600,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
+ ),
+ pickerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ pickerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ selectedDateTimeBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ selectedDateTimeForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ actionButtonForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ iconSize: 24.0,
+ );
+ },
+ );
+
+ TimeOfDay?
+ datePicked2Time;
+ if (datePicked2Date !=
+ null) {
+ datePicked2Time =
+ await showTimePicker(
+ context: context,
+ initialTime: TimeOfDay
+ .fromDateTime(
+ getCurrentTimestamp),
+ builder: (context,
+ child) {
+ return wrapInMaterialTimePickerTheme(
+ context,
+ child!,
+ headerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ headerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ headerTextStyle: FlutterFlowTheme.of(
+ context)
+ .headlineLarge
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context).headlineLargeFamily,
+ fontSize:
+ 32.0,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight.w600,
+ useGoogleFonts:
+ GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily),
+ ),
+ pickerBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .secondaryBackground,
+ pickerForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ selectedDateTimeBackgroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primary,
+ selectedDateTimeForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .info,
+ actionButtonForegroundColor:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ iconSize:
+ 24.0,
+ );
+ },
+ );
+ }
+
+ if (datePicked2Date !=
+ null &&
+ datePicked2Time !=
+ null) {
+ safeSetState(() {
+ _model.datePicked2 =
+ DateTime(
+ datePicked2Date
+ .year,
+ datePicked2Date
+ .month,
+ datePicked2Date
+ .day,
+ datePicked2Time!
+ .hour,
+ datePicked2Time
+ .minute,
+ );
+ });
+ }
+ setState(() {
+ _model.textController2
+ ?.text =
+ dateTimeFormat(
+ 'd/M/y H:mm:ss',
+ _model
+ .datePicked2,
+ locale: FFLocalizations
+ .of(context)
+ .languageCode,
+ );
+ });
+ },
+ child: Container(
+ width:
+ double.infinity,
+ height: 39.0,
+ decoration:
+ BoxDecoration(
+ borderRadius:
+ BorderRadius
+ .circular(
+ 8.0),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ].divide(const SizedBox(height: 10.0)),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 24.0, 0.0, 24.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'p81uol2v' /* Quais são os motivos da visita... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 42.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'bbauep0b' /* Motivo da Visita */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 0.0, 24.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: FutureBuilder<
+ ApiCallResponse>(
+ future: PhpGroup.getDadosCall
+ .call(
+ devUUID:
+ FFAppState().devUUID,
+ userUUID:
+ FFAppState().userUUID,
+ cliUUID:
+ FFAppState().cliUUID,
+ atividade: 'getDados',
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final dropDownGetDadosResponse =
+ snapshot.data!;
+ return FlutterFlowDropDown<
+ String>(
+ controller: _model
+ .dropDownValueController1 ??=
+ FormFieldController<
+ String>(
+ _model.dropDownValue1 ??=
+ '',
+ ),
+ options: List<
+ String>.from(
+ PhpGroup.getDadosCall
+ .reasonsJsonList(
+ dropDownGetDadosResponse
+ .jsonBody,
+ )!
+ .map((e) =>
+ e.toString())
+ .toList()),
+ optionLabels: PhpGroup
+ .getDadosCall
+ .reasonsMotDescStrList(
+ dropDownGetDadosResponse
+ .jsonBody,
+ )!,
+ onChanged: (val) =>
+ setState(() => _model
+ .dropDownValue1 =
+ val),
+ width: double.infinity,
+ height: double.infinity,
+ textStyle:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'x1ij847i' /* Escolha um motivo aqui */,
+ ),
+ icon: Icon(
+ Icons
+ .keyboard_arrow_down_rounded,
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .accent1,
+ size: 24.0,
+ ),
+ elevation: 2.0,
+ borderColor:
+ FlutterFlowTheme.of(
+ context)
+ .accent4,
+ borderWidth: 0.5,
+ borderRadius: 10.0,
+ margin:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 16.0,
+ 0.0,
+ 16.0,
+ 0.0),
+ hidesUnderline: true,
+ isOverButton: true,
+ isSearchable: false,
+ isMultiSelect: false,
+ );
+ },
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 42.0,
+ decoration: const BoxDecoration(),
+ child: Align(
+ alignment: const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ 'etzbm8l5' /* Nível de Acesso */,
+ ),
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 0.0, 24.0, 0.0),
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: const BoxDecoration(),
+ child: FutureBuilder<
+ ApiCallResponse>(
+ future: PhpGroup.getDadosCall
+ .call(
+ devUUID:
+ FFAppState().devUUID,
+ userUUID:
+ FFAppState().userUUID,
+ cliUUID:
+ FFAppState().cliUUID,
+ atividade: 'getDados',
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final dropDownGetDadosResponse =
+ snapshot.data!;
+ return FlutterFlowDropDown<
+ String>(
+ controller: _model
+ .dropDownValueController2 ??=
+ FormFieldController<
+ String>(
+ _model.dropDownValue2 ??=
+ '',
+ ),
+ options: List<
+ String>.from(
+ PhpGroup.getDadosCall
+ .levelJsonList(
+ dropDownGetDadosResponse
+ .jsonBody,
+ )!
+ .map((e) =>
+ e.toString())
+ .toList()),
+ optionLabels: PhpGroup
+ .getDadosCall
+ .levelNACDescricaoStrList(
+ dropDownGetDadosResponse
+ .jsonBody,
+ )!,
+ onChanged: (val) =>
+ setState(() => _model
+ .dropDownValue2 =
+ val),
+ width: double.infinity,
+ height: double.infinity,
+ textStyle:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'kmgv5j7x' /* Escolha um nível de acesso aqu... */,
+ ),
+ icon: Icon(
+ Icons
+ .keyboard_arrow_down_rounded,
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .accent1,
+ size: 24.0,
+ ),
+ elevation: 2.0,
+ borderColor:
+ FlutterFlowTheme.of(
+ context)
+ .accent4,
+ borderWidth: 0.5,
+ borderRadius: 10.0,
+ margin:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 16.0,
+ 0.0,
+ 16.0,
+ 0.0),
+ hidesUnderline: true,
+ isOverButton: true,
+ isSearchable: false,
+ isMultiSelect: false,
+ );
+ },
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ].divide(const SizedBox(height: 10.0)),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 24.0, 0.0, 24.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'mddp33o0' /* Visita se encerra após o prime... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 30.0, 0.0, 30.0, 20.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
+ crossAxisAlignment:
+ CrossAxisAlignment.center,
+ children: [
+ Flexible(
+ child: Padding(
+ padding: const EdgeInsetsDirectional
+ .fromSTEB(
+ 0.0, 0.0, 130.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context)
+ .getText(
+ '68j9gw4h' /* Visita única */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(
+ context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Switch.adaptive(
+ value: _model.switchValue!,
+ onChanged: (newValue) async {
+ setState(() => _model
+ .switchValue = newValue);
+ },
+ activeColor:
+ FlutterFlowTheme.of(context)
+ .success,
+ activeTrackColor:
+ FlutterFlowTheme.of(context)
+ .customColor4,
+ inactiveTrackColor:
+ FlutterFlowTheme.of(context)
+ .customColor4,
+ inactiveThumbColor:
+ FlutterFlowTheme.of(context)
+ .error,
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment:
+ const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 0.0, 0.0, 24.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '9rudpkq7' /* Você tem alguma observação sob... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w600,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 0.0),
+ child: SizedBox(
+ width: double.infinity,
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode:
+ _model.textFieldFocusNode3,
+ autofocus: false,
+ textInputAction:
+ TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ isDense: true,
+ labelText:
+ FFLocalizations.of(context)
+ .getText(
+ '4rgpxrfe' /* Observações da Visita */,
+ ),
+ labelStyle:
+ FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context)
+ .getText(
+ '7knytis2' /* Escreva as suas observações aq... */,
+ ),
+ hintStyle:
+ FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(
+ context)
+ .accent4,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(
+ context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(
+ context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder:
+ OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(
+ context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.text_fields,
+ color:
+ FlutterFlowTheme.of(context)
+ .accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.start,
+ maxLines: null,
+ validator: _model
+ .textController3Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: 100.0,
+ height: 54.0,
+ decoration: const BoxDecoration(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ if ((_model.textController1.text != '') &&
+ (_model.textController2.text != '') &&
+ (_model.dropDownValue1 != null &&
+ _model.dropDownValue1 != '') &&
+ (_model.dropDownValue2 != null &&
+ _model.dropDownValue2 != '')) {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () =>
+ _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: VisitDetailsModalWidget(
+ visitStartDateStr:
+ _model.textController1.text,
+ visitEndDateStr:
+ _model.textController2.text,
+ visitReasonStr: _model.dropDownValue1,
+ visitLevelStr: _model.dropDownValue2,
+ visitTempStr: _model.switchValue == true
+ ? 'Sim'
+ : 'Não',
+ visitObsStr: _model.textController3.text,
+ visitorStrList: _model.visitorStrList,
+ visitorJsonList: _model.visitorJsonList,
+ updateToggleIdx: () async {},
+ repeatVisitSchedule: () async {},
+ ),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () =>
+ _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: const ThrowExceptionWidget(
+ msg: 'Campos obrigatórios imcompletos.',
+ ),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+ },
+ child: Container(
+ width: MediaQuery.sizeOf(context).width * 0.5,
+ height: 40.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.save_alt,
+ color: FlutterFlowTheme.of(context).info,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ].addToEnd(const SizedBox(height: 30.0)),
+ ),
+ if (valueOrDefault(
+ _model.toggleIndexValue == false,
+ true,
+ ))
+ Container(
+ width: double.infinity,
+ height: 900.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 20.0,
+ borderWidth: 1.0,
+ buttonSize: 40.0,
+ icon: Icon(
+ Icons.settings_sharp,
+ color: FlutterFlowTheme.of(context).primary,
+ size: 24.0,
+ ),
+ onPressed: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding:
+ MediaQuery.viewInsetsOf(context),
+ child: const OptModalWidget(),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ ),
+ ],
+ ),
+ FutureBuilder(
+ future: PhpGroup.getVisitsCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'getVisitas',
+ ),
+ builder: (context, snapshot) {
+ // Customize what your widget looks like when it's loading.
+ if (!snapshot.hasData) {
+ return Center(
+ child: SizedBox(
+ width: 50.0,
+ height: 50.0,
+ child: SpinKitCircle(
+ color: FlutterFlowTheme.of(context).primary,
+ size: 50.0,
+ ),
+ ),
+ );
+ }
+ final wrapGetVisitsResponse = snapshot.data!;
+ return Builder(
+ builder: (context) {
+ final visitaWrap = PhpGroup.getVisitsCall
+ .visitasList(
+ wrapGetVisitsResponse.jsonBody,
+ )
+ ?.toList() ??
+ [];
+ return Wrap(
+ spacing: 2.0,
+ runSpacing: 1.0,
+ alignment: WrapAlignment.start,
+ crossAxisAlignment: WrapCrossAlignment.start,
+ direction: Axis.horizontal,
+ runAlignment: WrapAlignment.start,
+ verticalDirection: VerticalDirection.down,
+ clipBehavior: Clip.none,
+ children: List.generate(visitaWrap.length,
+ (visitaWrapIndex) {
+ final visitaWrapItem =
+ visitaWrap[visitaWrapIndex];
+ return Card(
+ clipBehavior: Clip.antiAliasWithSaveLayer,
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ elevation: 5.0,
+ shape: RoundedRectangleBorder(
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ child: Container(
+ width: 350.0,
+ height: 115.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ child: Container(
+ width: 100.0,
+ height: 100.0,
+ decoration: const BoxDecoration(),
+ child: Column(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ children: [
+ Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'd34nuw4w' /* Visitante: */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight
+ .bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ Align(
+ alignment:
+ const AlignmentDirectional(
+ -1.0, -1.0),
+ child: Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'y8geteyc' /* Lucas Martin Mota */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ].addToStart(const SizedBox(
+ width: 10.0)),
+ ),
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .start,
+ children: [
+ Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'gxdykms1' /* Morador: */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight
+ .bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'ue7wkm9r' /* Lucas Martin Mota */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ].addToStart(const SizedBox(
+ width: 10.0)),
+ ),
+ Row(
+ mainAxisSize:
+ MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment
+ .start,
+ children: [
+ Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'zs8s0wd3' /* Validade: */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ letterSpacing:
+ 0.0,
+ fontWeight:
+ FontWeight
+ .bold,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'z7fset9r' /* 16/10/2024 a 16/10/2024 */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(
+ context)
+ .bodyMediumFamily,
+ fontSize: 13.0,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ].addToStart(const SizedBox(
+ width: 10.0)),
+ ),
+ Align(
+ alignment:
+ const AlignmentDirectional(
+ -1.0, 0.0),
+ child: Padding(
+ padding:
+ const EdgeInsetsDirectional
+ .fromSTEB(
+ 10.0,
+ 0.0,
+ 0.0,
+ 0.0),
+ child: Container(
+ width: 200.0,
+ height: 27.0,
+ decoration:
+ BoxDecoration(
+ color: FlutterFlowTheme
+ .of(context)
+ .primary,
+ borderRadius:
+ BorderRadius
+ .circular(
+ 5.0),
+ ),
+ child: Align(
+ alignment:
+ const AlignmentDirectional(
+ 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(
+ context)
+ .getText(
+ 'fcb5avae' /* Agendamento Ativo */,
+ ),
+ style: FlutterFlowTheme
+ .of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(
+ context)
+ .info,
+ letterSpacing:
+ 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context).bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ].divide(
+ const SizedBox(height: 2.0)),
+ ),
+ ),
+ ),
+ ClipRRect(
+ borderRadius:
+ BorderRadius.circular(0.0),
+ child: Image.network(
+ 'https://images.unsplash.com/photo-1599566150163-29194dcaad36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w0NTYyMDF8MHwxfHNlYXJjaHwxNHx8cGVyc29ufGVufDB8fHx8MTcxNzc4MDk1Mnww&ixlib=rb-4.0.3&q=80&w=1080',
+ fit: BoxFit.cover,
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }),
+ );
+ },
+ );
+ },
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_model.dart b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_model.dart
new file mode 100644
index 00000000..6166e387
--- /dev/null
+++ b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_model.dart
@@ -0,0 +1,64 @@
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'schedule_provisional_visit_page_widget.dart'
+ show ScheduleProvisionalVisitPageWidget;
+import 'package:flutter/material.dart';
+
+class ScheduleProvisionalVisitPageModel
+ extends FlutterFlowModel {
+ /// Local state fields for this page.
+
+ bool toggleIdx = false;
+
+ List visitors = [];
+ void addToVisitors(dynamic item) => visitors.add(item);
+ void removeFromVisitors(dynamic item) => visitors.remove(item);
+ void removeAtIndexFromVisitors(int index) => visitors.removeAt(index);
+ void insertAtIndexInVisitors(int index, dynamic item) =>
+ visitors.insert(index, item);
+ void updateVisitorsAtIndex(int index, Function(dynamic) updateFn) =>
+ visitors[index] = updateFn(visitors[index]);
+
+ List docs = [];
+ void addToDocs(String item) => docs.add(item);
+ void removeFromDocs(String item) => docs.remove(item);
+ void removeAtIndexFromDocs(int index) => docs.removeAt(index);
+ void insertAtIndexInDocs(int index, String item) => docs.insert(index, item);
+ void updateDocsAtIndex(int index, Function(String) updateFn) =>
+ docs[index] = updateFn(docs[index]);
+
+ /// State fields for stateful widgets in this page.
+
+ final unfocusNode = FocusNode();
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode1;
+ TextEditingController? textController1;
+ String? Function(BuildContext, String?)? textController1Validator;
+ DateTime? datePicked;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode2;
+ TextEditingController? textController2;
+ String? Function(BuildContext, String?)? textController2Validator;
+ // State field(s) for TextField widget.
+ FocusNode? textFieldFocusNode3;
+ TextEditingController? textController3;
+ String? Function(BuildContext, String?)? textController3Validator;
+ // Stores action output result for [Backend Call - API (postProvVisitScheduling)] action in sendContainer widget.
+ ApiCallResponse? provisionalVisitScheduling;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {
+ unfocusNode.dispose();
+ textFieldFocusNode1?.dispose();
+ textController1?.dispose();
+
+ textFieldFocusNode2?.dispose();
+ textController2?.dispose();
+
+ textFieldFocusNode3?.dispose();
+ textController3?.dispose();
+ }
+}
diff --git a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart
new file mode 100644
index 00000000..f9c25f93
--- /dev/null
+++ b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart
@@ -0,0 +1,925 @@
+import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart';
+import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
+import '/backend/api_requests/api_calls.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'schedule_provisional_visit_page_model.dart';
+export 'schedule_provisional_visit_page_model.dart';
+
+class ScheduleProvisionalVisitPageWidget extends StatefulWidget {
+ const ScheduleProvisionalVisitPageWidget({super.key});
+
+ @override
+ State createState() =>
+ _ScheduleProvisionalVisitPageWidgetState();
+}
+
+class _ScheduleProvisionalVisitPageWidgetState
+ extends State {
+ late ScheduleProvisionalVisitPageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => ScheduleProvisionalVisitPageModel());
+
+ _model.textController1 ??= TextEditingController();
+ _model.textFieldFocusNode1 ??= FocusNode();
+
+ _model.textController2 ??= TextEditingController();
+ _model.textFieldFocusNode2 ??= FocusNode();
+
+ _model.textController3 ??= TextEditingController();
+ _model.textFieldFocusNode3 ??= FocusNode();
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ context.watch();
+
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context).requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ body: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ _model.toggleIdx = true;
+ setState(() {});
+ },
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(100.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(100.0),
+ ),
+ ),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'n7bbd202' /* Agendamento Provisório */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context).info,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 10.0, 0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, -1.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 20.0, 0.0, 20.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'i4xujgbn' /* Visita Provisória */,
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyLarge
+ .override(
+ fontFamily: 'Nunito',
+ fontSize: 21.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey('Nunito'),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Divider(
+ thickness: 0.5,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'x7at46ur' /* Quais visitantes você deseja c... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Stack(
+ children: [
+ FFButtonWidget(
+ onPressed: () async {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model
+ .unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(
+ _model.unfocusNode)
+ : FocusScope.of(context)
+ .unfocus(),
+ child: Padding(
+ padding: MediaQuery.viewInsetsOf(
+ context),
+ child:
+ const BottomArrowLinkedLocalsComponentWidget(),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ },
+ text: FFAppState().local,
+ options: FFButtonOptions(
+ width: 320.0,
+ height: 51.0,
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 0.0),
+ iconPadding:
+ const EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ textStyle: FlutterFlowTheme.of(context)
+ .titleSmall
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .titleSmallFamily),
+ ),
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ width: 0.3,
+ ),
+ borderRadius: BorderRadius.circular(24.0),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 10.0, 0.0, 0.0),
+ child: Container(
+ width: 35.0,
+ height: 35.0,
+ clipBehavior: Clip.antiAlias,
+ decoration: const BoxDecoration(
+ shape: BoxShape.circle,
+ ),
+ child: CachedNetworkImage(
+ fadeInDuration:
+ const Duration(milliseconds: 100),
+ fadeOutDuration:
+ const Duration(milliseconds: 100),
+ imageUrl: valueOrDefault(
+ 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png',
+ 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
+ ),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ].addToEnd(const SizedBox(height: 20.0)),
+ ),
+ Divider(
+ thickness: 0.5,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 0.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'shj19b2o' /* Qual o período de validade da ... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Stack(
+ children: [
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 50.0, 24.0, 0.0),
+ child: TextFormField(
+ controller: _model.textController1,
+ focusNode: _model.textFieldFocusNode1,
+ autofocus: false,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ '8zgsw5so' /* Ínicio da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ 'p16wm7kp' /* Quando a visitas se inicia? */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ suffixIcon: Icon(
+ Icons.hourglass_top,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.center,
+ validator: _model.textController1Validator
+ .asValidator(context),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 50.0, 24.0, 0.0),
+ child: InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ final datePickedDate =
+ await showDatePicker(
+ context: context,
+ initialDate: getCurrentTimestamp,
+ firstDate: DateTime(1900),
+ lastDate: DateTime(2050),
+ builder: (context, child) {
+ return wrapInMaterialDatePickerTheme(
+ context,
+ child!,
+ headerBackgroundColor:
+ FlutterFlowTheme.of(context)
+ .primary,
+ headerForegroundColor:
+ FlutterFlowTheme.of(context)
+ .info,
+ headerTextStyle:
+ FlutterFlowTheme.of(context)
+ .headlineLarge
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(
+ context)
+ .headlineLargeFamily,
+ fontSize: 32.0,
+ letterSpacing: 0.0,
+ fontWeight:
+ FontWeight.w600,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .headlineLargeFamily),
+ ),
+ pickerBackgroundColor:
+ FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ pickerForegroundColor:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ selectedDateTimeBackgroundColor:
+ FlutterFlowTheme.of(context)
+ .primary,
+ selectedDateTimeForegroundColor:
+ FlutterFlowTheme.of(context)
+ .info,
+ actionButtonForegroundColor:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ iconSize: 24.0,
+ );
+ },
+ );
+
+ if (datePickedDate != null) {
+ safeSetState(() {
+ _model.datePicked = DateTime(
+ datePickedDate.year,
+ datePickedDate.month,
+ datePickedDate.day,
+ );
+ });
+ }
+ setState(() {
+ _model.textController1?.text =
+ dateTimeFormat(
+ 'd/M/y',
+ _model.datePicked,
+ locale: FFLocalizations.of(context)
+ .languageCode,
+ );
+ });
+ },
+ child: Container(
+ width: double.infinity,
+ height: 50.0,
+ decoration: BoxDecoration(
+ borderRadius:
+ BorderRadius.circular(8.0),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ Divider(
+ thickness: 0.5,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ '3zfd7uf9' /* Qual o nome do visitante? */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Container(
+ height: 93.0,
+ decoration: const BoxDecoration(),
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 20.0),
+ child: SizedBox(
+ width: double.infinity,
+ child: TextFormField(
+ controller: _model.textController2,
+ focusNode: _model.textFieldFocusNode2,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'wehvxbz4' /* Nome do Visitante */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ 'juh7f24w' /* Escreva o nome do visitante aq... */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color:
+ FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts
+ .asMap()
+ .containsKey(
+ FlutterFlowTheme.of(
+ context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.person,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.start,
+ maxLines: null,
+ validator: _model.textController2Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Divider(
+ thickness: 0.5,
+ color: FlutterFlowTheme.of(context).accent1,
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Align(
+ alignment: const AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 20.0, 30.0, 0.0, 30.0),
+ child: Text(
+ FFLocalizations.of(context).getText(
+ 'jhss056s' /* Você tem alguma observação sob... */,
+ ),
+ textAlign: TextAlign.start,
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsetsDirectional.fromSTEB(
+ 24.0, 0.0, 24.0, 20.0),
+ child: SizedBox(
+ width: double.infinity,
+ child: TextFormField(
+ controller: _model.textController3,
+ focusNode: _model.textFieldFocusNode3,
+ autofocus: false,
+ textInputAction: TextInputAction.next,
+ obscureText: false,
+ decoration: InputDecoration(
+ labelText:
+ FFLocalizations.of(context).getText(
+ 'cw8b3tbb' /* Observações da Visita */,
+ ),
+ labelStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ hintText:
+ FFLocalizations.of(context).getText(
+ 'k4qkbv1f' /* Escreva as suas observações aq... */,
+ ),
+ hintStyle: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .labelMediumFamily),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(
+ color: FlutterFlowTheme.of(context)
+ .error,
+ width: 0.5,
+ ),
+ borderRadius:
+ BorderRadius.circular(10.0),
+ ),
+ suffixIcon: Icon(
+ Icons.format_color_text,
+ color: FlutterFlowTheme.of(context)
+ .accent1,
+ ),
+ ),
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily:
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ letterSpacing: 0.0,
+ useGoogleFonts: GoogleFonts.asMap()
+ .containsKey(
+ FlutterFlowTheme.of(context)
+ .bodyMediumFamily),
+ ),
+ textAlign: TextAlign.start,
+ maxLines: null,
+ validator: _model.textController3Validator
+ .asValidator(context),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: 100.0,
+ height: 54.0,
+ decoration: const BoxDecoration(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ InkWell(
+ splashColor: Colors.transparent,
+ focusColor: Colors.transparent,
+ hoverColor: Colors.transparent,
+ highlightColor: Colors.transparent,
+ onTap: () async {
+ _model.provisionalVisitScheduling =
+ await PhpGroup.postProvVisitSchedulingCall.call(
+ devUUID: FFAppState().devUUID,
+ userUUID: FFAppState().userUUID,
+ cliID: FFAppState().cliUUID,
+ atividade: 'putAgendamentoProv',
+ data: _model.textController1.text,
+ motivo: _model.textController3.text,
+ nome: _model.textController2.text,
+ proID: FFAppState().ownerUUID,
+ );
+ if (PhpGroup.postProvVisitSchedulingCall.error(
+ (_model.provisionalVisitScheduling?.jsonBody ?? ''),
+ ) ==
+ false) {
+ setState(() {
+ _model.textController1?.clear();
+ _model.textController2?.clear();
+ _model.textController3?.clear();
+ });
+ } else {
+ await showModalBottomSheet(
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ enableDrag: false,
+ context: context,
+ builder: (context) {
+ return GestureDetector(
+ onTap: () => _model.unfocusNode.canRequestFocus
+ ? FocusScope.of(context)
+ .requestFocus(_model.unfocusNode)
+ : FocusScope.of(context).unfocus(),
+ child: Padding(
+ padding: MediaQuery.viewInsetsOf(context),
+ child: ThrowExceptionWidget(
+ msg: PhpGroup.postProvVisitSchedulingCall.msg(
+ (_model.provisionalVisitScheduling
+ ?.jsonBody ??
+ ''),
+ )!,
+ ),
+ ),
+ );
+ },
+ ).then((value) => safeSetState(() {}));
+ }
+
+ setState(() {});
+ },
+ child: Container(
+ width: 100.0,
+ height: 40.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primary,
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(15.0),
+ bottomRight: Radius.circular(15.0),
+ topLeft: Radius.circular(15.0),
+ topRight: Radius.circular(15.0),
+ ),
+ ),
+ alignment: const AlignmentDirectional(0.0, 1.0),
+ child: Align(
+ alignment: const AlignmentDirectional(0.0, 0.0),
+ child: Icon(
+ Icons.save_alt,
+ color: FlutterFlowTheme.of(context).info,
+ size: 24.0,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ]
+ .addToStart(const SizedBox(height: 40.0))
+ .addToEnd(const SizedBox(height: 40.0)),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/backend/api_requests/api_calls.dart b/lib/backend/api_requests/api_calls.dart
new file mode 100644
index 00000000..7204e476
--- /dev/null
+++ b/lib/backend/api_requests/api_calls.dart
@@ -0,0 +1,1467 @@
+import 'dart:convert';
+
+import 'package:flutter/foundation.dart';
+
+import '/flutter_flow/flutter_flow_util.dart';
+import 'api_manager.dart';
+
+export 'api_manager.dart' show ApiCallResponse;
+
+const _kPrivateApiFunctionName = 'ffPrivateApiCall';
+
+/// Start PHP Group Code
+
+class PhpGroup {
+ static String getBaseUrl() => 'https://freaccess.com.br/freaccess';
+ static Map headers = {};
+ static LoginCall loginCall = LoginCall();
+ static RegisterCall registerCall = RegisterCall();
+ static ForgotPasswordCall forgotPasswordCall = ForgotPasswordCall();
+ static GetLocalsCall getLocalsCall = GetLocalsCall();
+ static PostScheduleVisitorCall postScheduleVisitorCall =
+ PostScheduleVisitorCall();
+ static PostScheduleVisitCall postScheduleVisitCall = PostScheduleVisitCall();
+ static DebugCallCall debugCallCall = DebugCallCall();
+ static GetScheduleVisitCall getScheduleVisitCall = GetScheduleVisitCall();
+ static GetDadosCall getDadosCall = GetDadosCall();
+ static GetVisitorByDocCall getVisitorByDocCall = GetVisitorByDocCall();
+ static GetFotoVisitanteCall getFotoVisitanteCall = GetFotoVisitanteCall();
+ static PostProvVisitSchedulingCall postProvVisitSchedulingCall =
+ PostProvVisitSchedulingCall();
+ static GetVisitsCall getVisitsCall = GetVisitsCall();
+ static DeleteVisitCall deleteVisitCall = DeleteVisitCall();
+}
+
+class LoginCall {
+ Future call({
+ String? email = '',
+ String? password = '',
+ String? uuid = '',
+ String? type = '',
+ String? description = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'login',
+ apiUrl: '$baseUrl/login.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'email': email,
+ 'password': password,
+ 'uuid': uuid,
+ 'tipo': type,
+ 'descricao': description,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? msg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+ List? info(dynamic response) => getJsonField(
+ response,
+ r'''$.error_info''',
+ true,
+ ) as List?;
+ String? userUUID(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.uid''',
+ ));
+ dynamic userObject(dynamic response) => getJsonField(
+ response,
+ r'''$.user''',
+ );
+ String? userName(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.name''',
+ ));
+ String? userEmail(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.email''',
+ ));
+ String? userDeviceId(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.dev_id''',
+ ));
+ String? userCreatAt(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.created_at''',
+ ));
+ String? userUpdateAt(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.updated_at''',
+ ));
+ String? userStatus(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.status''',
+ ));
+}
+
+class RegisterCall {
+ Future call({
+ String? name = '',
+ String? email = '',
+ String? password = '',
+ String? token = '',
+ String? uuid = '',
+ String? tipo = '',
+ String? descricao = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'register',
+ apiUrl: '$baseUrl/registro.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'name': name,
+ 'email': email,
+ 'password': password,
+ 'token': token,
+ 'uuid': uuid,
+ 'tipo': tipo,
+ 'descricao': descricao,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? uid(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.uid''',
+ ));
+ dynamic user(dynamic response) => getJsonField(
+ response,
+ r'''$.user''',
+ );
+ String? name(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.name''',
+ ));
+ String? email(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.email''',
+ ));
+ String? devId(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.dev_id''',
+ ));
+ String? createdAt(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.user.created_at''',
+ ));
+}
+
+class ForgotPasswordCall {
+ Future call({
+ String? email = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'forgotPassword',
+ apiUrl: '$baseUrl/iforgot.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'email': email,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? msg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+}
+
+class GetLocalsCall {
+ Future call({
+ String? devUUID = '',
+ String? userUUID = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'getLocals',
+ apiUrl: '$baseUrl/getLocais.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'devUUID': devUUID,
+ 'userUUID': userUUID,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ List? locais(dynamic response) => getJsonField(
+ response,
+ r'''$.locais''',
+ true,
+ ) as List?;
+ String? cluOwnerID(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLU_OWNER_ID''',
+ ));
+ String? cluOwnerDSC(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLU_OWNER_DSC''',
+ ));
+ String? cluStatus(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLU_STATUS''',
+ ));
+ String? cluBlkMessage(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLU_BLK_MESSAGE''',
+ ));
+ String? cliID(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLI_ID''',
+ ));
+ String? cliPrefix(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLI_PREFIXO''',
+ ));
+ String? cliName(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLI_NOME''',
+ ));
+ String? userName(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].USU_NOME''',
+ ));
+ String? cliSysId(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.locais[:].CLI_SIS_ID''',
+ ));
+}
+
+class PostScheduleVisitorCall {
+ Future call({
+ String? devUUID = '',
+ String? userUUID = '',
+ String? cliID = '',
+ String? atividade = 'putVisitante',
+ String? documento = '',
+ String? nome = '',
+ String? tipo = '',
+ String? foto = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'postScheduleVisitor',
+ apiUrl: '$baseUrl/processRequest.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'devUUID': devUUID,
+ 'userUUID': userUUID,
+ 'cliID': cliID,
+ 'atividade': atividade,
+ 'Documento': documento,
+ 'Nome': nome,
+ 'Tipo': tipo,
+ 'Foto': foto,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? errorMsg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+}
+
+class PostScheduleVisitCall {
+ Future call({
+ String? devUUID = '',
+ String? userUUID = '',
+ String? cliID = '',
+ String? atividade = '',
+ String? devDesc = '',
+ String? idVisitante = '',
+ String? dtInicio = '',
+ String? dtFim = '',
+ String? unica = '',
+ int? idMotivo,
+ int? idNAC,
+ String? obs = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'postScheduleVisit',
+ apiUrl: '$baseUrl/processRequest.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'devUUID': devUUID,
+ 'userUUID': userUUID,
+ 'cliID': cliID,
+ 'atividade': atividade,
+ 'idVisitante': idVisitante,
+ 'dtInicio': dtInicio,
+ 'dtFim': dtFim,
+ 'unica': unica,
+ 'idMotivo': idMotivo,
+ 'idNAC': idNAC,
+ 'obs': obs,
+ 'DevDesc': devDesc,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? errorMsg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+}
+
+class DebugCallCall {
+ Future call({
+ String? devUUID = '',
+ String? userUUID = '',
+ String? cliID = '',
+ String? atividade = '',
+ String? devDesc = '',
+ String? idVisitante = '',
+ String? dtInicio = '',
+ String? dtFim = '',
+ String? unica = '',
+ int? idMotivo,
+ int? idNAC,
+ String? obs = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'debugCall',
+ apiUrl: '$baseUrl/jonh.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'devUUID': devUUID,
+ 'userUUID': userUUID,
+ 'cliID': cliID,
+ 'atividade': atividade,
+ 'DevDesc': devDesc,
+ 'idVisitante': idVisitante,
+ 'dtInicio': dtInicio,
+ 'dtFim': dtFim,
+ 'unica': unica,
+ 'idMotivo': idMotivo,
+ 'idNAC': idNAC,
+ 'obs': obs,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? errorMsg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+}
+
+class GetScheduleVisitCall {
+ Future call({
+ String? devUUID = '',
+ String? userUUID = '',
+ String? cliUUID = '',
+ String? atividade = '',
+ int? pageSize,
+ int? pageNumber,
+ String? chaveBusca = '',
+ }) async {
+ final baseUrl = PhpGroup.getBaseUrl();
+
+ return ApiManager.instance.makeApiCall(
+ callName: 'getScheduleVisit',
+ apiUrl: '$baseUrl/processRequest.php',
+ callType: ApiCallType.POST,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ params: {
+ 'devUUID': devUUID,
+ 'userUUID': userUUID,
+ 'cliID': cliUUID,
+ 'atividade': atividade,
+ 'pageSize': pageSize,
+ 'pageNumber': pageNumber,
+ 'chaveBusca': chaveBusca,
+ },
+ bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
+ returnBody: true,
+ encodeBodyUtf8: false,
+ decodeUtf8: false,
+ cache: false,
+ alwaysAllowBody: false,
+ );
+ }
+
+ bool? error(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error''',
+ ));
+ String? errorMsg(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.error_msg''',
+ ));
+ int? totalRows(dynamic response) => castToType(getJsonField(
+ response,
+ r'''$.total_rows''',
+ ));
+ List? visitas(dynamic response) => getJsonField(
+ response,
+ r'''$.visitas''',
+ true,
+ ) as List?;
+ List? visitaDesNome(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].DES_NOME''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaMotDescricao(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].MOT_DESCRICAO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaMotDia(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].MOT_DIA''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaMotHorafixa(dynamic response) => getJsonField(
+ response,
+ r'''$.visitas[:].MOT_HORAFIXA''',
+ true,
+ ) as List?;
+ List? visitaMotHoras(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].MOT_HORAS''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaMotMinutos(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].MOT_MINUTOS''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaMotTipo(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].MOT_TIPO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaNacDescricao(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].NAC_DESCRICAO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawChave(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_CHAVE''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVarDestino(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_DESTINO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawDtCriacao(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_DTCRIACAO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawDtFIm(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_DTFIM''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawDtInicio(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_DTINICIO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawId(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_ID''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawObs(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_OBS''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawStatus(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_STATUS''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVawUnica(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VAW_UNICA''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVteDocumentos(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VTE_DOCUMENTO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVteEmail(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VTE_EMAIL''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVteEmpresa(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VTE_EMPRESA''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVteNome(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VTE_NOME''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType(x))
+ .withoutNulls
+ .toList();
+ List? visitaVteTipo(dynamic response) => (getJsonField(
+ response,
+ r'''$.visitas[:].VTE_TIPO''',
+ true,
+ ) as List?)
+ ?.withoutNulls
+ .map((x) => castToType