From c12d33c1dbc8e6b73e885407ff911b9c930f5a48 Mon Sep 17 00:00:00 2001 From: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:44:03 +0000 Subject: [PATCH] Updating to latest FlutterFlow output. --- README.md | 7 + analysis_options.yaml | 35 + android/.gitignore | 11 + android/app/build.gradle | 79 + android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 65 + .../com/example/my_project/MainActivity.kt | 6 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../src/main/res/values-night-v31/styles.xml | 18 + .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values-v31/styles.xml | 18 + android/app/src/main/res/values/strings.xml | 5 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 18 + android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 27 + assets/audios/favicon.png | Bin 0 -> 917 bytes assets/fonts/Nunito-Medium.ttf | Bin 0 -> 131844 bytes assets/fonts/Nunito-Regular.ttf | Bin 0 -> 131736 bytes assets/fonts/SFPRODISPLAYBOLD.OTF | Bin 0 -> 334728 bytes assets/fonts/SFPRODISPLAYMEDIUM.OTF | Bin 0 -> 335512 bytes assets/fonts/SFPRODISPLAYREGULAR.OTF | Bin 0 -> 298944 bytes assets/fonts/favicon.png | Bin 0 -> 917 bytes assets/fonts/icons.ttf | Bin 0 -> 2032 bytes assets/fonts/menu.ttf | Bin 0 -> 2516 bytes assets/images/adaptive_background_icon.svg | 9 + assets/images/adaptive_foreground_icon.svg | 9 + assets/images/app_launcher_icon.svg | 9 + assets/images/error_image.svg | 9 + assets/images/favicon.png | Bin 0 -> 917 bytes assets/images/logo.svg | 9 + assets/lottie_animations/favicon.png | Bin 0 -> 917 bytes assets/pdfs/favicon.png | Bin 0 -> 917 bytes assets/rive_animations/favicon.png | Bin 0 -> 917 bytes assets/videos/favicon.png | Bin 0 -> 917 bytes ios/.gitignore | 33 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/ImageNotification/Info.plist | 31 + .../NotificationService.swift | 27 + ios/Podfile | 45 + ios/Runner.xcodeproj/project.pbxproj | 514 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 14 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 78 + ios/Runner/PrivacyInfo.xcprivacy | 5 + ios/Runner/Runner-Bridging-Header.h | 1 + ios/Runner/Runner.entitlements | 6 + ios/Runner/en.lproj/InfoPlist.strings | 1 + ios/Runner/pt.lproj/InfoPlist.strings | 1 + lib/actions/actions.dart | 275 ++ lib/app_state.dart | 129 + .../text_field_component_model.dart | 22 + .../text_field_component_widget.dart | 117 + .../opt_modal/opt_modal_model.dart | 11 + .../opt_modal/opt_modal_widget.dart | 68 + .../option_selection_modal_model.dart | 12 + .../option_selection_modal_widget.dart | 389 +++ .../throw_exception_model.dart | 11 + .../throw_exception_widget.dart | 125 + .../visitor_not_found_component_model.dart | 13 + .../visitor_not_found_component_widget.dart | 177 ++ ...m_arrow_linked_locals_component_model.dart | 13 + ..._arrow_linked_locals_component_widget.dart | 247 ++ .../local_profile_component_model.dart | 12 + .../local_profile_component_widget.dart | 151 + .../menu_list_view_component_model.dart | 12 + .../menu_list_view_component_widget.dart | 630 ++++ .../menu_staggered_view_component_model.dart | 13 + .../menu_staggered_view_component_widget.dart | 667 +++++ .../schedule_visit_detail_model.dart | 60 + .../schedule_visit_detail_widget.dart | 976 +++++++ ...p_arrow_linked_locals_component_model.dart | 13 + ..._arrow_linked_locals_component_widget.dart | 241 ++ .../view_visit_detail_model.dart | 61 + .../view_visit_detail_widget.dart | 928 ++++++ .../arrow_linked_locals_component_model.dart | 13 + .../arrow_linked_locals_component_widget.dart | 41 + .../menu_component/menu_component_model.dart | 57 + .../menu_component/menu_component_widget.dart | 88 + .../message_well_component_model.dart | 12 + .../message_well_component_widget.dart | 125 + .../regisiter_vistor_component_model.dart | 57 + .../regisiter_vistor_component_widget.dart | 819 ++++++ .../visit_details_modal_model.dart | 31 + .../visit_details_modal_widget.dart | 122 + .../visit_history_component_model.dart | 12 + .../visit_history_component_widget.dart | 388 +++ .../visitor_details_modal_model.dart | 12 + .../visitor_details_modal_widget.dart | 280 ++ .../visitor_search_component_model.dart | 44 + .../visitor_search_component_widget.dart | 527 ++++ .../fast_pass_page/fast_pass_page_model.dart | 17 + .../fast_pass_page/fast_pass_page_widget.dart | 44 + .../home_page/home_page_model.dart | 46 + .../home_page/home_page_widget.dart | 1080 +++++++ .../register_visitor_page_model.dart | 58 + .../register_visitor_page_widget.dart | 898 ++++++ .../schedule_complete_visit_page_model.dart | 92 + .../schedule_complete_visit_page_widget.dart | 2539 +++++++++++++++++ ...schedule_provisional_visit_page_model.dart | 64 + ...chedule_provisional_visit_page_widget.dart | 925 ++++++ lib/backend/api_requests/api_calls.dart | 1467 ++++++++++ lib/backend/api_requests/api_manager.dart | 471 +++ lib/backend/schema/enums/enums.dart | 24 + lib/backend/schema/structs/action_struct.dart | 85 + lib/backend/schema/structs/device_struct.dart | 110 + lib/backend/schema/structs/index.dart | 4 + lib/backend/schema/util/schema_util.dart | 87 + lib/components/image_cropper_model.dart | 11 + lib/components/image_cropper_widget.dart | 64 + .../legacy_local_component_model.dart | 12 + .../legacy_local_component_widget.dart | 167 ++ .../select_header_component_model.dart | 12 + .../select_header_component_widget.dart | 185 ++ .../actions/convert_image_file_to_base64.dart | 22 + .../actions/convert_to_upload_file.dart | 32 + lib/custom_code/actions/get_dev_u_u_i_d.dart | 28 + lib/custom_code/actions/index.dart | 3 + lib/custom_code/widgets/image_cropper.dart | 179 ++ lib/custom_code/widgets/index.dart | 1 + lib/flutter_flow/custom_functions.dart | 107 + lib/flutter_flow/custom_icons.dart | 21 + lib/flutter_flow/flutter_flow_animations.dart | 111 + lib/flutter_flow/flutter_flow_drop_down.dart | 373 +++ .../flutter_flow_icon_button.dart | 170 ++ lib/flutter_flow/flutter_flow_model.dart | 169 ++ lib/flutter_flow/flutter_flow_theme.dart | 613 ++++ lib/flutter_flow/flutter_flow_util.dart | 562 ++++ lib/flutter_flow/flutter_flow_widgets.dart | 285 ++ lib/flutter_flow/form_field_controller.dart | 10 + lib/flutter_flow/internationalization.dart | 1127 ++++++++ lib/flutter_flow/lat_lng.dart | 19 + lib/flutter_flow/nav/nav.dart | 346 +++ lib/flutter_flow/nav/serialization_util.dart | 227 ++ lib/flutter_flow/place.dart | 46 + lib/flutter_flow/random_data_util.dart | 51 + lib/flutter_flow/upload_data.dart | 377 +++ lib/flutter_flow/uploaded_file.dart | 68 + lib/index.dart | 20 + lib/main.dart | 120 + .../forgot_password_component_model.dart | 26 + .../forgot_password_component_widget.dart | 292 ++ .../on_boarding_page_model.dart | 45 + .../on_boarding_page_widget.dart | 131 + .../sign_in_component_model.dart | 31 + .../sign_in_component_widget.dart | 899 ++++++ .../sign_up_component_model.dart | 43 + .../sign_up_component_widget.dart | 770 +++++ .../welcome_component_model.dart | 11 + .../welcome_component_widget.dart | 456 +++ .../forgot_password_page_model.dart | 29 + .../forgot_password_page_widget.dart | 335 +++ .../login_page/login_page_model.dart | 113 + .../login_page/login_page_widget.dart | 971 +++++++ .../register_page/register_page_model.dart | 53 + .../register_page/register_page_widget.dart | 867 ++++++ .../welcome_page/welcome_page_model.dart | 21 + .../welcome_page/welcome_page_widget.dart | 529 ++++ pubspec.yaml | 171 ++ test/widget_test.dart | 17 + web/favicon.png | Bin 0 -> 54361 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/app_launcher_icon.svg | 9 + web/index.html | 67 + 203 files changed, 28978 insertions(+) create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/example/my_project/MainActivity.kt create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values-night-v31/styles.xml create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values-v31/styles.xml create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/audios/favicon.png create mode 100644 assets/fonts/Nunito-Medium.ttf create mode 100644 assets/fonts/Nunito-Regular.ttf create mode 100644 assets/fonts/SFPRODISPLAYBOLD.OTF create mode 100644 assets/fonts/SFPRODISPLAYMEDIUM.OTF create mode 100644 assets/fonts/SFPRODISPLAYREGULAR.OTF create mode 100644 assets/fonts/favicon.png create mode 100644 assets/fonts/icons.ttf create mode 100644 assets/fonts/menu.ttf create mode 100644 assets/images/adaptive_background_icon.svg create mode 100644 assets/images/adaptive_foreground_icon.svg create mode 100644 assets/images/app_launcher_icon.svg create mode 100644 assets/images/error_image.svg create mode 100644 assets/images/favicon.png create mode 100644 assets/images/logo.svg create mode 100644 assets/lottie_animations/favicon.png create mode 100644 assets/pdfs/favicon.png create mode 100644 assets/rive_animations/favicon.png create mode 100644 assets/videos/favicon.png create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/ImageNotification/Info.plist create mode 100644 ios/ImageNotification/NotificationService.swift create mode 100644 ios/Podfile create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/PrivacyInfo.xcprivacy create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/Runner/Runner.entitlements create mode 100644 ios/Runner/en.lproj/InfoPlist.strings create mode 100644 ios/Runner/pt.lproj/InfoPlist.strings create mode 100644 lib/actions/actions.dart create mode 100644 lib/app_state.dart create mode 100644 lib/application_components/atomic_components/text_field_component/text_field_component_model.dart create mode 100644 lib/application_components/atomic_components/text_field_component/text_field_component_widget.dart create mode 100644 lib/application_components/molecular_components/opt_modal/opt_modal_model.dart create mode 100644 lib/application_components/molecular_components/opt_modal/opt_modal_widget.dart create mode 100644 lib/application_components/molecular_components/option_selection_modal/option_selection_modal_model.dart create mode 100644 lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart create mode 100644 lib/application_components/molecular_components/throw_exception/throw_exception_model.dart create mode 100644 lib/application_components/molecular_components/throw_exception/throw_exception_widget.dart create mode 100644 lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart create mode 100644 lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart create mode 100644 lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_model.dart create mode 100644 lib/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart create mode 100644 lib/application_components/organism_components/local_profile_component/local_profile_component_model.dart create mode 100644 lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart create mode 100644 lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_model.dart create mode 100644 lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart create mode 100644 lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart create mode 100644 lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart create mode 100644 lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_model.dart create mode 100644 lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart create mode 100644 lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart create mode 100644 lib/application_components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart create mode 100644 lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart create mode 100644 lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart create mode 100644 lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart create mode 100644 lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart create mode 100644 lib/application_components/templates_components/menu_component/menu_component_model.dart create mode 100644 lib/application_components/templates_components/menu_component/menu_component_widget.dart create mode 100644 lib/application_components/templates_components/message_well_component/message_well_component_model.dart create mode 100644 lib/application_components/templates_components/message_well_component/message_well_component_widget.dart create mode 100644 lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart create mode 100644 lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart create mode 100644 lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart create mode 100644 lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart create mode 100644 lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart create mode 100644 lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart create mode 100644 lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart create mode 100644 lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart create mode 100644 lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart create mode 100644 lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart create mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_model.dart create mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_widget.dart create mode 100644 lib/application_pages/home_page/home_page_model.dart create mode 100644 lib/application_pages/home_page/home_page_widget.dart create mode 100644 lib/application_pages/register_visitor_page/register_visitor_page_model.dart create mode 100644 lib/application_pages/register_visitor_page/register_visitor_page_widget.dart create mode 100644 lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart create mode 100644 lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart create mode 100644 lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_model.dart create mode 100644 lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart create mode 100644 lib/backend/api_requests/api_calls.dart create mode 100644 lib/backend/api_requests/api_manager.dart create mode 100644 lib/backend/schema/enums/enums.dart create mode 100644 lib/backend/schema/structs/action_struct.dart create mode 100644 lib/backend/schema/structs/device_struct.dart create mode 100644 lib/backend/schema/structs/index.dart create mode 100644 lib/backend/schema/util/schema_util.dart create mode 100644 lib/components/image_cropper_model.dart create mode 100644 lib/components/image_cropper_widget.dart create mode 100644 lib/components/legacy_local_component_model.dart create mode 100644 lib/components/legacy_local_component_widget.dart create mode 100644 lib/components/select_header_component_model.dart create mode 100644 lib/components/select_header_component_widget.dart create mode 100644 lib/custom_code/actions/convert_image_file_to_base64.dart create mode 100644 lib/custom_code/actions/convert_to_upload_file.dart create mode 100644 lib/custom_code/actions/get_dev_u_u_i_d.dart create mode 100644 lib/custom_code/actions/index.dart create mode 100644 lib/custom_code/widgets/image_cropper.dart create mode 100644 lib/custom_code/widgets/index.dart create mode 100644 lib/flutter_flow/custom_functions.dart create mode 100644 lib/flutter_flow/custom_icons.dart create mode 100644 lib/flutter_flow/flutter_flow_animations.dart create mode 100644 lib/flutter_flow/flutter_flow_drop_down.dart create mode 100644 lib/flutter_flow/flutter_flow_icon_button.dart create mode 100644 lib/flutter_flow/flutter_flow_model.dart create mode 100644 lib/flutter_flow/flutter_flow_theme.dart create mode 100644 lib/flutter_flow/flutter_flow_util.dart create mode 100644 lib/flutter_flow/flutter_flow_widgets.dart create mode 100644 lib/flutter_flow/form_field_controller.dart create mode 100644 lib/flutter_flow/internationalization.dart create mode 100644 lib/flutter_flow/lat_lng.dart create mode 100644 lib/flutter_flow/nav/nav.dart create mode 100644 lib/flutter_flow/nav/serialization_util.dart create mode 100644 lib/flutter_flow/place.dart create mode 100644 lib/flutter_flow/random_data_util.dart create mode 100644 lib/flutter_flow/upload_data.dart create mode 100644 lib/flutter_flow/uploaded_file.dart create mode 100644 lib/index.dart create mode 100644 lib/main.dart create mode 100644 lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart create mode 100644 lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart create mode 100644 lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart create mode 100644 lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart create mode 100644 lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart create mode 100644 lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart create mode 100644 lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart create mode 100644 lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart create mode 100644 lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart create mode 100644 lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart create mode 100644 lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart create mode 100644 lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart create mode 100644 lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart create mode 100644 lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart create mode 100644 lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart create mode 100644 lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart create mode 100644 lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart create mode 100644 lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/app_launcher_icon.svg create mode 100644 web/index.html 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 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/assets/fonts/Nunito-Medium.ttf b/assets/fonts/Nunito-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f9881a0240f6498e3a5557562e25bf084cd9b069 GIT binary patch literal 131844 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 Z<^8lQx6-oQM$7UE@~^g&fAyfqe*n9Yy8i$G literal 0 HcmV?d00001 diff --git a/assets/fonts/SFPRODISPLAYREGULAR.OTF b/assets/fonts/SFPRODISPLAYREGULAR.OTF new file mode 100644 index 0000000000000000000000000000000000000000..09aaca9fcc08ccfd0666b128a23a3ba6066757a5 GIT binary patch literal 298944 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⩰e1tBA=ub1t;gHv*+Ev(c+EVRy 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 C@aFUY literal 0 HcmV?d00001 diff --git a/assets/fonts/favicon.png b/assets/fonts/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/assets/fonts/icons.ttf b/assets/fonts/icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..967993d21655dde5ecbe93a56aedc3da2b8897a4 GIT binary patch literal 2032 zcmb7FOK%%h6h3Dj9($bF9x}EkA#uiWVmGeiI*v1LT5u9tRVt*k1QH1eHFXk`lqPma zQqdFz5U5ov%0rbvjT8y!20;-URFHs$p;@q~#OnuC;vuzy1t77g)QmZIW(*+TWdLj?{jr(i(gN`S>5RK) z=2o7(e0|>|q@My1ad!+wFdgtu?@~M`KB!SD#^tsAZ zkvq%3N_vWPb-s9N0sK%TeTa0uT%0d``{Mi>>Bp!>d7-kjO!K56eZ%a)^Vjfo5COO~ z?m8i_*&Kg?KJ+lZEdy!V{~kjCw*O;2#R*gNaWV1PMd9{K7y9t-U z4IKRt^jku0vsSaB^jl!bSo<+7P~6tM2uNOjhEZjp${av`z;gM&7)8{od<(^jY&V*M zeV9Nra=S3z;m2_P;(2`Iym^8<=k<=u?ef0!`*8IVesReh#J3uv4HFFw53W5#Go{W^ zo-3560W|1@3_L;EvPOR{9_w%g)lgr4ixS-;hquU58WYw(7Vn@i$%lXc!x0RJjJ=o* z_8#~~tz?sg@*S5Hn3>w7$+78X2v^x?@Q z^}_DyyVQ$rwzHT!yc!DmJe0qp^{AVRct}wNQ92 z-RR~;e&^Ha!fHBo&gh@*A=Ta3l+?({IF}+UJ`&?E2YlVVz1`itcV6)}@oil@vhiG7 z2Zv2wenD;X-uXV@%O$w0iJU*MIYM)#lUSw|T&g+{uuSV@GEKQzR>c4gn;Qz5 zoTzpA-awxu1qM`n9$!)i6tbCPYDO`~e4e|->0M*%y+P}32LlenQQDu5`2E!Pcz=$L z7ZKW-Hnu%M)wL6eBxvbfqAQ-Dj&vE>uoz*dGR9L&`W4GPs6^|6>WU@mxvUg1{!6ua zL)A2Oqghq84Yj#h-O#SO8hLZwTvs|}SyJ${+$Q6*0ZEpc)hIrS_o0KNdDc_c)+j3_>ZZvl!BN%1H%-=9z@f(rkM=X{_ zS@#It5hp&?S10`U{Rv)b42>U-UfBGHJDsBYnVo5CP>glYfpCNAM6K(_Hd@qUXR;9% z#(zS7jDJnM$BMCyGN=%N2jDA=;G0~FmB|AW>@J~EuW0+))CV6r_0aONYjYsM!w$|9 zo^fP>C0r@l$6Lt_@IN!&;pC>UKKoq$Yil)4ty}?$UNcwjx3No>&PO#GcAtn zB7DCi%aDT$$EPagB{)tKs6ZK(#!HJ!$17#MH=TiTC{ayjWF{SYAq|;r{@c{i(#*-Z z;v$Sv=nR~MIr_9MZu2=%DKG0YrE+PpxLlgnCs*`?Q%QAQ*1E55>!)neK?soX;Tp6v0S9!W8|XgYwg83^ z{vm-7kSt2z9|fa{Srh$7!#`$D6QU*(gT{Z5gv2cxBK%>3Q4`jA?t2|Jgc!Z;z2}_Y zJs!O`4=()ZnY0IVVTrQzJv1W}1(MyW@nbd*JbxW8f&jo> z;V25cVNm=PVkk1bvW8NbptG9*?wR?;)kWCEQzwk&Vy*dghDBq&hUN^)>smEng69ag zffYFVAo%Z@S65b7bu0fp(0N>4QcPr5?iT?`%gHc`3>29INNvzn{wqc+SzY9BldTt8 zVGDo~422_@5;2raCA|uIWeYk`4LluIp9*J1pC}6w#)>y3L3Sr4?31M8N46@7gQrf- zi&fGeHpS*POBgTSk_5LqC1I9~3bx8Ri&;v_IEK^YiKdD}?ub+zsu2G#&Jt>3`=vxK zLOmp*7y9X^3Whc!Z6py-b|DS1sJ9kr@W|$7q#;auY!J+$FlD468C8Tjv`|KPO36kn zsR!2VWV0Gx^QF7sy)OBhB+Jq@*(G_dx@6gP)$^ucK6$qS=8-Q4uk<&TKV1 z#g~g)D}x@%CF2z`kOP&M&M}*FYvUZ5PO3CA|QiqC{k{R`;(wIty!iz24-7VDbmuL&Z6G(eaw8q(>@D`KRWwp9Q zV!RDb0-G{6vAxN6I%CP4_BFMOw%#UOOt-eA(=Dy(0vpx@Mhk1g>w(UI%WvU04iP!D z*1G~-{-%M={!UTwDJHSgzj>gEazQ7C>i;v!MI$?fNZX;k7^6$}#-hnsniYd$jCI5( z6E4~}b*AYua2Nlox~rjkHWE3RPS3VEth|YDo{XeVMw-v0;zwFcCf>Tv-Q-huhEivm z2@CC1`FABpV@F40W5=WOb~j(!@N6^`uMKkOw(}Emt^LvWk|Q4GJ_*O2(#o#KYptTS z3hd@|dtw+yOvc+V6m+7Jnmdbcoh`n`ow3{dZ1uJ+XSd+&W&Hedu^Zp12vi)XsMv93 zC;6coD4hWwEK~zdaDxKXbRtv;Lo>8N47#8jw!;gs2l`+ym5iE*@v19^s)wj27N8!c zjpD=`*AYnpVsfvc&>s zSHYlIFsQaPxxBozv{WoiYT5=(TP_Y}sd0sDc9VuR#bvy(jO1on!wXurP*?@bu7E+g zK7&5e<|hkmewo6NpQRtNEAv?%vXma9CiFX^6E?H^ffcsdqt;_ejq4R1i|Qrrk@XpN z30k~55{v5di8wnNA=TnhQsIQk_3X=Jjt14a1^&idbya^ly?uK+-Ctc*Rn7QqvyrWJ zs@mJ!+{*OSU{F1p$?WU6rOxl*&#OTuELd(Zld9@+^Ca2%d;w83bc`SmAD-wM`j+j3 zJp|O>pL*}?0q66-gPkrvYCjF$4*f$*l|T<8+qd4xMt{rLWl4=j=Bd1uJQ)x(W18ii zr?+`c*0pR@b#-tFefTy$Qd^6z3#GvUAC_XH?#@^TM^(GEg!6>A zmUt8KdrQ1Pb!|kTzY~OSDB(7!f+6;fnnXgZG-L1_IAB+a=Lzp9@h0N;mw18RNTtM^ z3Ex=aZ4if3qxrEJ7==8H!AxIXn>sQ+=I@BK)A7lJ22*eZ#%an=jw8@su3XOV$q&zr z + + + + + + + + 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 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/assets/pdfs/favicon.png b/assets/pdfs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/assets/rive_animations/favicon.png b/assets/rive_animations/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/assets/videos/favicon.png b/assets/videos/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 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(x)) + .withoutNulls + .toList(); + List? visitaVteTelefone(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_TELEFONE''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? visitaVdoNome(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VDO_NOME''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + int? visitaTotalPages(dynamic response) => castToType(getJsonField( + response, + r'''$.total_pages''', + )); + String? page(dynamic response) => castToType(getJsonField( + response, + r'''$.page''', + )); +} + +class GetDadosCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliUUID = '', + String? atividade = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'getDados', + apiUrl: '$baseUrl/processRequest.php', + callType: ApiCallType.POST, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliUUID, + 'atividade': atividade, + }, + bodyType: BodyType.X_WWW_FORM_URL_ENCODED, + returnBody: true, + encodeBodyUtf8: false, + decodeUtf8: false, + cache: false, + alwaysAllowBody: false, + ); + } + + bool? errorBolean(dynamic response) => castToType(getJsonField( + response, + r'''$.error''', + )); + String? msgStr(dynamic response) => castToType(getJsonField( + response, + r'''$.error_msg''', + )); + String? visitedDesNomeStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.DES_NOME''', + )); + String? visitedVDOTIdStr(dynamic response) => castToType(getJsonField( + response, + r'''$.visitado.VDO_ID''', + )); + String? visitedVDOTNomeStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_NOME''', + )); + String? visitedVDOTipoStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_TIPO''', + )); + String? visitedVDOImeiStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_IMEI''', + )); + String? visitedVDODocumentoStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_DOCUMENTO''', + )); + String? visitedVDOEmailStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_EMAIL''', + )); + String? visitedVDOStatusWebStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_STATUSWEB''', + )); + List? reasonsMotIdList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_ID''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? reasonsMotDescStrList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_DESCRICAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? reasonsMotTypeStrList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_TIPO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? reasonsMotWebStrList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_WEB''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + dynamic visitedJson(dynamic response) => getJsonField( + response, + r'''$.visitado''', + ); + String? visitedDescIdStr(dynamic response) => castToType(getJsonField( + response, + r'''$.visitado.DES_ID''', + )); + String? visitedVDoNotTerceirosStr(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitado.VDO_NOTTERCEIROS''', + )); + List? reasonsJsonList(dynamic response) => getJsonField( + response, + r'''$.motivos''', + true, + ) as List?; + List? resonsMotDiaStrList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_DIA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? reasonsMotHorasStrList(dynamic response) => (getJsonField( + response, + r'''$.motivos[:].MOT_HORAS''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? reasonsMotMinutosStrList(dynamic response) => getJsonField( + response, + r'''$.motivos[:].MOT_MINUTOS''', + true, + ) as List?; + List? reasonsMotHoraFixaStrList(dynamic response) => getJsonField( + response, + r'''$.motivos[:].MOT_HORAFIXA''', + true, + ) as List?; + List? levelJsonList(dynamic response) => getJsonField( + response, + r'''$.niveis''', + true, + ) as List?; + List? levelNACIdStrList(dynamic response) => (getJsonField( + response, + r'''$.niveis[:].NAC_ID''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACDescricaoStrList(dynamic response) => (getJsonField( + response, + r'''$.niveis[:].NAC_DESCRICAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACHorIdStrList(dynamic response) => (getJsonField( + response, + r'''$.niveis[:].NAC_HOR_ID''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACIndPermiteReentradaStrList(dynamic response) => + (getJsonField( + response, + r'''$.niveis[:].NAC_INDPERMITEREENTRADA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACObservacaoStrList(dynamic response) => (getJsonField( + response, + r'''$.niveis[:].NAC_OBSERVACAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACTempoAntiCaronaStrList(dynamic response) => + (getJsonField( + response, + r'''$.niveis[:].NAC_TEMPOANTICARONA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? levelNACTpUserStrList(dynamic response) => (getJsonField( + response, + r'''$.niveis[:].NAC_TPUSER''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + bool? provisionalBoolean(dynamic response) => castToType(getJsonField( + response, + r'''$.provisional''', + )); + bool? whatsappBoolean(dynamic response) => castToType(getJsonField( + response, + r'''$.whatsapp''', + )); +} + +class GetVisitorByDocCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + String? documento = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'getVisitorByDoc', + 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, + }, + 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''', + )); + dynamic visitante(dynamic response) => getJsonField( + response, + r'''$.visitante''', + ); + String? vistanteId(dynamic response) => castToType(getJsonField( + response, + r'''$.visitante.VTE_ID''', + )); + String? visitanteNome(dynamic response) => castToType(getJsonField( + response, + r'''$.visitante.VTE_NOME''', + )); + String? visitanteRG(dynamic response) => castToType(getJsonField( + response, + r'''$.visitante.VTE_RG''', + )); + String? visitanteDocumento(dynamic response) => + castToType(getJsonField( + response, + r'''$.visitante.VTE_DOCUMENTO''', + )); + String? visitanteTipo(dynamic response) => castToType(getJsonField( + response, + r'''$.visitante.VTE_TIPO''', + )); +} + +class GetFotoVisitanteCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + String? documento = '', + String? tipo = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'getFotoVisitante', + apiUrl: '$baseUrl/getImage.php', + callType: ApiCallType.GET, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliID, + 'atividade': atividade, + 'Documento': documento, + 'tipo': tipo, + }, + returnBody: true, + encodeBodyUtf8: false, + decodeUtf8: false, + cache: false, + alwaysAllowBody: false, + ); + } +} + +class PostProvVisitSchedulingCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + String? data = '', + String? motivo = '', + String? nome = '', + String? proID = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'postProvVisitScheduling', + apiUrl: '$baseUrl/processRequest.php', + callType: ApiCallType.POST, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliID, + 'atividade': atividade, + 'data': data, + 'motivo': motivo, + 'nome': nome, + 'proID': proID, + }, + bodyType: BodyType.X_WWW_FORM_URL_ENCODED, + returnBody: true, + encodeBodyUtf8: false, + decodeUtf8: false, + cache: false, + alwaysAllowBody: false, + ); + } + + String? msg(dynamic response) => castToType(getJsonField( + response, + r'''$.mensagem''', + )); + bool? error(dynamic response) => castToType(getJsonField( + response, + r'''$.error''', + )); +} + +class GetVisitsCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'getVisits', + apiUrl: '$baseUrl/processRequest.php', + callType: ApiCallType.POST, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliID, + 'atividade': atividade, + }, + 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''', + )); + int? totalRows(dynamic response) => castToType(getJsonField( + response, + r'''$.total_rows''', + )); + List? visitasList(dynamic response) => getJsonField( + response, + r'''$.visitas''', + true, + ) as List?; + List? desNome(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].DES_NOME''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? motDesc(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].MOT_DESCRICAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? motDia(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].MOT_DIA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? motHorafixa(dynamic response) => getJsonField( + response, + r'''$.visitas[:].MOT_HORAFIXA''', + true, + ) as List?; + List? motHoras(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].MOT_HORAS''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? motMinutos(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].MOT_MINUTOS''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? motTipo(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].MOT_TIPO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? nACDesc(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].NAC_DESCRICAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWChave(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_CHAVE''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWDestino(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_DESTINO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWDTCriacao(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_DTCRIACAO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWDTFim(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_DTFIM''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vawdtinicio(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_DTINICIO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWId(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_ID''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWObs(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_OBS''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWStatus(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_STATUS''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vAWUnica(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VAW_UNICA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTEDocumento(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_DOCUMENTO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTEEmail(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_EMAIL''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTEEmpresa(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_EMPRESA''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTENome(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_NOME''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTETIpo(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_TIPO''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vTETelefone(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VTE_TELEFONE''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? vDONome(dynamic response) => (getJsonField( + response, + r'''$.visitas[:].VDO_NOME''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); +} + +class DeleteVisitCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + String? idVisita = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'deleteVisit', + apiUrl: '$baseUrl/processRequest.php', + callType: ApiCallType.POST, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliID, + 'atividade': atividade, + 'idVisita': idVisita, + }, + 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''', + )); +} + +/// End PHP Group Code + +class ApiPagingParams { + int nextPageNumber = 0; + int numItems = 0; + dynamic lastResponse; + + ApiPagingParams({ + required this.nextPageNumber, + required this.numItems, + required this.lastResponse, + }); + + @override + String toString() => + 'PagingParams(nextPageNumber: $nextPageNumber, numItems: $numItems, lastResponse: $lastResponse,)'; +} + +String _toEncodable(dynamic item) { + return item; +} + +String _serializeList(List? list) { + list ??= []; + try { + return json.encode(list, toEncodable: _toEncodable); + } catch (_) { + if (kDebugMode) { + print("List serialization failed. Returning empty list."); + } + return '[]'; + } +} + +String _serializeJson(dynamic jsonVar, [bool isList = false]) { + jsonVar ??= (isList ? [] : {}); + try { + return json.encode(jsonVar, toEncodable: _toEncodable); + } catch (_) { + if (kDebugMode) { + print("Json serialization failed. Returning empty json."); + } + return isList ? '[]' : '{}'; + } +} diff --git a/lib/backend/api_requests/api_manager.dart b/lib/backend/api_requests/api_manager.dart new file mode 100644 index 00000000..6c3a6d7c --- /dev/null +++ b/lib/backend/api_requests/api_manager.dart @@ -0,0 +1,471 @@ +// ignore_for_file: constant_identifier_names, depend_on_referenced_packages, prefer_final_fields + +import 'dart:convert'; +import 'dart:core'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:http/http.dart' as http; +import 'package:equatable/equatable.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:mime_type/mime_type.dart'; + +import '/flutter_flow/uploaded_file.dart'; + +enum ApiCallType { + GET, + POST, + DELETE, + PUT, + PATCH, +} + +enum BodyType { + NONE, + JSON, + TEXT, + X_WWW_FORM_URL_ENCODED, + MULTIPART, +} + +class ApiCallOptions extends Equatable { + const ApiCallOptions({ + this.callName = '', + required this.callType, + required this.apiUrl, + required this.headers, + required this.params, + this.bodyType, + this.body, + this.returnBody = true, + this.encodeBodyUtf8 = false, + this.decodeUtf8 = false, + this.alwaysAllowBody = false, + this.cache = false, + }); + + final String callName; + final ApiCallType callType; + final String apiUrl; + final Map headers; + final Map params; + final BodyType? bodyType; + final String? body; + final bool returnBody; + final bool encodeBodyUtf8; + final bool decodeUtf8; + final bool alwaysAllowBody; + final bool cache; + + ApiCallOptions clone() => ApiCallOptions( + callName: callName, + callType: callType, + apiUrl: apiUrl, + headers: _cloneMap(headers), + params: _cloneMap(params), + bodyType: bodyType, + body: body, + returnBody: returnBody, + encodeBodyUtf8: encodeBodyUtf8, + decodeUtf8: decodeUtf8, + alwaysAllowBody: alwaysAllowBody, + cache: cache, + ); + + @override + List get props => [ + callName, + callType.name, + apiUrl, + headers, + params, + bodyType, + body, + returnBody, + encodeBodyUtf8, + decodeUtf8, + alwaysAllowBody, + cache, + ]; + + static Map _cloneMap(Map map) { + try { + return json.decode(json.encode(map)) as Map; + } catch (_) { + return Map.from(map); + } + } +} + +class ApiCallResponse { + const ApiCallResponse( + this.jsonBody, + this.headers, + this.statusCode, { + this.response, + this.exception, + }); + final dynamic jsonBody; + final Map headers; + final int statusCode; + final http.Response? response; + final Object? exception; + // Whether we received a 2xx status (which generally marks success). + bool get succeeded => statusCode >= 200 && statusCode < 300; + String getHeader(String headerName) => headers[headerName] ?? ''; + // Return the raw body from the response, or if this came from a cloud call + // and the body is not a string, then the json encoded body. + String get bodyText => + response?.body ?? + (jsonBody is String ? jsonBody as String : jsonEncode(jsonBody)); + String get exceptionMessage => exception.toString(); + + static ApiCallResponse fromHttpResponse( + http.Response response, + bool returnBody, + bool decodeUtf8, + ) { + dynamic jsonBody; + try { + final responseBody = decodeUtf8 && returnBody + ? const Utf8Decoder().convert(response.bodyBytes) + : response.body; + jsonBody = returnBody ? json.decode(responseBody) : null; + } catch (_) {} + return ApiCallResponse( + jsonBody, + response.headers, + response.statusCode, + response: response, + ); + } + + static ApiCallResponse fromCloudCallResponse(Map response) => + ApiCallResponse( + response['body'], + ApiManager.toStringMap(response['headers'] ?? {}), + response['statusCode'] ?? 400, + ); +} + +class ApiManager { + ApiManager._(); + + // Cache that will ensure identical calls are not repeatedly made. + static Map _apiCache = {}; + + static ApiManager? _instance; + static ApiManager get instance => _instance ??= ApiManager._(); + + // If your API calls need authentication, populate this field once + // the user has authenticated. Alter this as needed. + static String? _accessToken; + + // You may want to call this if, for example, you make a change to the + // database and no longer want the cached result of a call that may + // have changed. + static void clearCache(String callName) => _apiCache.keys + .toSet() + .forEach((k) => k.callName == callName ? _apiCache.remove(k) : null); + + static Map toStringMap(Map map) => + map.map((key, value) => MapEntry(key.toString(), value.toString())); + + static String asQueryParams(Map map) => map.entries + .map((e) => + "${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value.toString())}") + .join('&'); + + static Future urlRequest( + ApiCallType callType, + String apiUrl, + Map headers, + Map params, + bool returnBody, + bool decodeUtf8, { + http.Client? client, + }) async { + if (params.isNotEmpty) { + final specifier = + Uri.parse(apiUrl).queryParameters.isNotEmpty ? '&' : '?'; + apiUrl = '$apiUrl$specifier${asQueryParams(params)}'; + } + final makeRequest = callType == ApiCallType.GET + ? (client != null ? client.get : http.get) + : (client != null ? client.delete : http.delete); + final response = + await makeRequest(Uri.parse(apiUrl), headers: toStringMap(headers)); + return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8); + } + + static Future requestWithBody( + ApiCallType type, + String apiUrl, + Map headers, + Map params, + String? body, + BodyType? bodyType, + bool returnBody, + bool encodeBodyUtf8, + bool decodeUtf8, + bool alwaysAllowBody, { + http.Client? client, + }) async { + assert( + {ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type) || + (alwaysAllowBody && type == ApiCallType.DELETE), + 'Invalid ApiCallType $type for request with body', + ); + final postBody = + createBody(headers, params, body, bodyType, encodeBodyUtf8); + + if (bodyType == BodyType.MULTIPART) { + return multipartRequest(type, apiUrl, headers, params, returnBody, + decodeUtf8, alwaysAllowBody); + } + + final requestFn = { + ApiCallType.POST: client != null ? client.post : http.post, + ApiCallType.PUT: client != null ? client.put : http.put, + ApiCallType.PATCH: client != null ? client.patch : http.patch, + ApiCallType.DELETE: client != null ? client.delete : http.delete, + }[type]!; + final response = await requestFn(Uri.parse(apiUrl), + headers: toStringMap(headers), body: postBody); + return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8); + } + + static Future multipartRequest( + ApiCallType? type, + String apiUrl, + Map headers, + Map params, + bool returnBody, + bool decodeUtf8, + bool alwaysAllowBody, + ) async { + assert( + {ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type) || + (alwaysAllowBody && type == ApiCallType.DELETE), + 'Invalid ApiCallType $type for request with body', + ); + + bool isFile(dynamic e) => + e is FFUploadedFile || + e is List || + (e is List && e.firstOrNull is FFUploadedFile); + + final nonFileParams = toStringMap( + Map.fromEntries(params.entries.where((e) => !isFile(e.value)))); + + List files = []; + params.entries.where((e) => isFile(e.value)).forEach((e) { + final param = e.value; + final uploadedFiles = param is List + ? param as List + : [param as FFUploadedFile]; + for (var uploadedFile in uploadedFiles) { + files.add( + http.MultipartFile.fromBytes( + e.key, + uploadedFile.bytes ?? Uint8List.fromList([]), + filename: uploadedFile.name, + contentType: _getMediaType(uploadedFile.name), + ), + ); + } + }); + + final request = http.MultipartRequest( + type.toString().split('.').last, Uri.parse(apiUrl)) + ..headers.addAll(toStringMap(headers)) + ..files.addAll(files); + nonFileParams.forEach((key, value) => request.fields[key] = value); + + final response = await http.Response.fromStream(await request.send()); + return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8); + } + + static MediaType? _getMediaType(String? filename) { + final contentType = mime(filename); + if (contentType == null) { + return null; + } + final parts = contentType.split('/'); + if (parts.length != 2) { + return null; + } + return MediaType(parts.first, parts.last); + } + + static dynamic createBody( + Map headers, + Map? params, + String? body, + BodyType? bodyType, + bool encodeBodyUtf8, + ) { + String? contentType; + dynamic postBody; + switch (bodyType) { + case BodyType.JSON: + contentType = 'application/json'; + postBody = body ?? json.encode(params ?? {}); + break; + case BodyType.TEXT: + contentType = 'text/plain'; + postBody = body ?? json.encode(params ?? {}); + break; + case BodyType.X_WWW_FORM_URL_ENCODED: + contentType = 'application/x-www-form-urlencoded'; + postBody = toStringMap(params ?? {}); + break; + case BodyType.MULTIPART: + contentType = 'multipart/form-data'; + postBody = params; + break; + case BodyType.NONE: + case null: + break; + } + // Set "Content-Type" header if it was previously unset. + if (contentType != null && + !headers.keys.any((h) => h.toLowerCase() == 'content-type')) { + headers['Content-Type'] = contentType; + } + return encodeBodyUtf8 && postBody is String + ? utf8.encode(postBody) + : postBody; + } + + Future call(ApiCallOptions options) => makeApiCall( + callName: options.callName, + apiUrl: options.apiUrl, + callType: options.callType, + headers: options.headers, + params: options.params, + body: options.body, + bodyType: options.bodyType, + returnBody: options.returnBody, + encodeBodyUtf8: options.encodeBodyUtf8, + decodeUtf8: options.decodeUtf8, + alwaysAllowBody: options.alwaysAllowBody, + cache: options.cache, + options: options, + ); + + Future makeApiCall({ + required String callName, + required String apiUrl, + required ApiCallType callType, + Map headers = const {}, + Map params = const {}, + String? body, + BodyType? bodyType, + bool returnBody = true, + bool encodeBodyUtf8 = false, + bool decodeUtf8 = false, + bool alwaysAllowBody = false, + bool cache = false, + ApiCallOptions? options, + http.Client? client, + }) async { + final callOptions = options ?? + ApiCallOptions( + callName: callName, + callType: callType, + apiUrl: apiUrl, + headers: headers, + params: params, + bodyType: bodyType, + body: body, + returnBody: returnBody, + encodeBodyUtf8: encodeBodyUtf8, + decodeUtf8: decodeUtf8, + alwaysAllowBody: alwaysAllowBody, + cache: cache, + ); + // Modify for your specific needs if this differs from your API. + if (_accessToken != null) { + headers[HttpHeaders.authorizationHeader] = 'Bearer $_accessToken'; + } + if (!apiUrl.startsWith('http')) { + apiUrl = 'https://$apiUrl'; + } + + // If we've already made this exact call before and caching is on, + // return the cached result. + if (cache && _apiCache.containsKey(callOptions)) { + return _apiCache[callOptions]!; + } + + ApiCallResponse result; + try { + switch (callType) { + case ApiCallType.GET: + result = await urlRequest( + callType, + apiUrl, + headers, + params, + returnBody, + decodeUtf8, + client: client, + ); + break; + case ApiCallType.DELETE: + result = alwaysAllowBody + ? await requestWithBody( + callType, + apiUrl, + headers, + params, + body, + bodyType, + returnBody, + encodeBodyUtf8, + decodeUtf8, + alwaysAllowBody, + client: client, + ) + : await urlRequest( + callType, + apiUrl, + headers, + params, + returnBody, + decodeUtf8, + client: client, + ); + break; + case ApiCallType.POST: + case ApiCallType.PUT: + case ApiCallType.PATCH: + result = await requestWithBody( + callType, + apiUrl, + headers, + params, + body, + bodyType, + returnBody, + encodeBodyUtf8, + decodeUtf8, + alwaysAllowBody, + client: client, + ); + break; + } + + // If caching is on, cache the result (if present). + if (cache) { + _apiCache[callOptions] = result; + } + } catch (e) { + result = ApiCallResponse(null, {}, -1, exception: e); + } + + return result; + } +} diff --git a/lib/backend/schema/enums/enums.dart b/lib/backend/schema/enums/enums.dart new file mode 100644 index 00000000..cfef83fe --- /dev/null +++ b/lib/backend/schema/enums/enums.dart @@ -0,0 +1,24 @@ +import 'package:collection/collection.dart'; + +enum AppHeaderComponent { + menu, + home, +} + +extension FFEnumExtensions on T { + String serialize() => name; +} + +extension FFEnumListExtensions on Iterable { + T? deserialize(String? value) => + firstWhereOrNull((e) => e.serialize() == value); +} + +T? deserializeEnum(String? value) { + switch (T) { + case (AppHeaderComponent): + return AppHeaderComponent.values.deserialize(value) as T?; + default: + return null; + } +} diff --git a/lib/backend/schema/structs/action_struct.dart b/lib/backend/schema/structs/action_struct.dart new file mode 100644 index 00000000..8bdb04c8 --- /dev/null +++ b/lib/backend/schema/structs/action_struct.dart @@ -0,0 +1,85 @@ +// ignore_for_file: unnecessary_getters_setters + +import '/backend/schema/util/schema_util.dart'; + +import 'index.dart'; +import '/flutter_flow/flutter_flow_util.dart'; + +class ActionStruct extends BaseStruct { + ActionStruct({ + String? title, + String? icon, + }) : _title = title, + _icon = icon; + + // "title" field. + String? _title; + String get title => _title ?? ''; + set title(String? val) => _title = val; + bool hasTitle() => _title != null; + + // "icon" field. + String? _icon; + String get icon => _icon ?? ''; + set icon(String? val) => _icon = val; + bool hasIcon() => _icon != null; + + static ActionStruct fromMap(Map data) => ActionStruct( + title: data['title'] as String?, + icon: data['icon'] as String?, + ); + + static ActionStruct? maybeFromMap(dynamic data) => + data is Map ? ActionStruct.fromMap(data.cast()) : null; + + Map toMap() => { + 'title': _title, + 'icon': _icon, + }.withoutNulls; + + @override + Map toSerializableMap() => { + 'title': serializeParam( + _title, + ParamType.String, + ), + 'icon': serializeParam( + _icon, + ParamType.String, + ), + }.withoutNulls; + + static ActionStruct fromSerializableMap(Map data) => + ActionStruct( + title: deserializeParam( + data['title'], + ParamType.String, + false, + ), + icon: deserializeParam( + data['icon'], + ParamType.String, + false, + ), + ); + + @override + String toString() => 'ActionStruct(${toMap()})'; + + @override + bool operator ==(Object other) { + return other is ActionStruct && title == other.title && icon == other.icon; + } + + @override + int get hashCode => const ListEquality().hash([title, icon]); +} + +ActionStruct createActionStruct({ + String? title, + String? icon, +}) => + ActionStruct( + title: title, + icon: icon, + ); diff --git a/lib/backend/schema/structs/device_struct.dart b/lib/backend/schema/structs/device_struct.dart new file mode 100644 index 00000000..03db22f3 --- /dev/null +++ b/lib/backend/schema/structs/device_struct.dart @@ -0,0 +1,110 @@ +// ignore_for_file: unnecessary_getters_setters + +import '/backend/schema/util/schema_util.dart'; + +import 'index.dart'; +import '/flutter_flow/flutter_flow_util.dart'; + +class DeviceStruct extends BaseStruct { + DeviceStruct({ + String? devUUID, + String? version, + String? description, + }) : _devUUID = devUUID, + _version = version, + _description = description; + + // "devUUID" field. + String? _devUUID; + String get devUUID => _devUUID ?? ''; + set devUUID(String? val) => _devUUID = val; + bool hasDevUUID() => _devUUID != null; + + // "version" field. + String? _version; + String get version => _version ?? ''; + set version(String? val) => _version = val; + bool hasVersion() => _version != null; + + // "description" field. + String? _description; + String get description => _description ?? ''; + set description(String? val) => _description = val; + bool hasDescription() => _description != null; + + static DeviceStruct fromMap(Map data) => DeviceStruct( + devUUID: data['devUUID'] as String?, + version: data['version'] as String?, + description: data['description'] as String?, + ); + + static DeviceStruct? maybeFromMap(dynamic data) => + data is Map ? DeviceStruct.fromMap(data.cast()) : null; + + Map toMap() => { + 'devUUID': _devUUID, + 'version': _version, + 'description': _description, + }.withoutNulls; + + @override + Map toSerializableMap() => { + 'devUUID': serializeParam( + _devUUID, + ParamType.String, + ), + 'version': serializeParam( + _version, + ParamType.String, + ), + 'description': serializeParam( + _description, + ParamType.String, + ), + }.withoutNulls; + + static DeviceStruct fromSerializableMap(Map data) => + DeviceStruct( + devUUID: deserializeParam( + data['devUUID'], + ParamType.String, + false, + ), + version: deserializeParam( + data['version'], + ParamType.String, + false, + ), + description: deserializeParam( + data['description'], + ParamType.String, + false, + ), + ); + + @override + String toString() => 'DeviceStruct(${toMap()})'; + + @override + bool operator ==(Object other) { + return other is DeviceStruct && + devUUID == other.devUUID && + version == other.version && + description == other.description; + } + + @override + int get hashCode => + const ListEquality().hash([devUUID, version, description]); +} + +DeviceStruct createDeviceStruct({ + String? devUUID, + String? version, + String? description, +}) => + DeviceStruct( + devUUID: devUUID, + version: version, + description: description, + ); diff --git a/lib/backend/schema/structs/index.dart b/lib/backend/schema/structs/index.dart new file mode 100644 index 00000000..0c01c05d --- /dev/null +++ b/lib/backend/schema/structs/index.dart @@ -0,0 +1,4 @@ +export '/backend/schema/util/schema_util.dart'; + +export 'action_struct.dart'; +export 'device_struct.dart'; diff --git a/lib/backend/schema/util/schema_util.dart b/lib/backend/schema/util/schema_util.dart new file mode 100644 index 00000000..a074ea89 --- /dev/null +++ b/lib/backend/schema/util/schema_util.dart @@ -0,0 +1,87 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:from_css_color/from_css_color.dart'; + +import '/backend/schema/enums/enums.dart'; +import '/flutter_flow/flutter_flow_util.dart'; + +export 'package:collection/collection.dart' show ListEquality; +export 'package:flutter/material.dart' show Color, Colors; +export 'package:from_css_color/from_css_color.dart'; + +typedef StructBuilder = T Function(Map data); + +abstract class BaseStruct { + Map toSerializableMap(); + String serialize() => json.encode(toSerializableMap()); +} + +dynamic deserializeStructParam( + dynamic param, + ParamType paramType, + bool isList, { + required StructBuilder structBuilder, +}) { + if (param == null) { + return null; + } else if (isList) { + final paramValues; + try { + paramValues = param is Iterable ? param : json.decode(param); + } catch (e) { + return null; + } + if (paramValues is! Iterable) { + return null; + } + return paramValues + .map((e) => deserializeStructParam(e, paramType, false, + structBuilder: structBuilder)) + .toList(); + } else if (param is Map) { + return structBuilder(param); + } else { + return deserializeParam( + param, + paramType, + isList, + structBuilder: structBuilder, + ); + } +} + +List? getStructList( + dynamic value, + StructBuilder structBuilder, +) => + value is! List + ? null + : value + .whereType>() + .map((e) => structBuilder(e)) + .toList(); + +List? getEnumList(dynamic value) => value is! List + ? null + : value.map((e) => deserializeEnum(e)).withoutNulls; + +Color? getSchemaColor(dynamic value) => value is String + ? fromCssColor(value) + : value is Color + ? value + : null; + +List? getColorsList(dynamic value) => + value is! List ? null : value.map(getSchemaColor).withoutNulls; + +List? getDataList(dynamic value) => + value is! List ? null : value.map((e) => castToType(e)!).toList(); + +extension MapDataExtensions on Map { + Map get withoutNulls => Map.fromEntries( + entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, e.value!)), + ); +} diff --git a/lib/components/image_cropper_model.dart b/lib/components/image_cropper_model.dart new file mode 100644 index 00000000..3d5fedec --- /dev/null +++ b/lib/components/image_cropper_model.dart @@ -0,0 +1,11 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'image_cropper_widget.dart' show ImageCropperWidget; +import 'package:flutter/material.dart'; + +class ImageCropperModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/components/image_cropper_widget.dart b/lib/components/image_cropper_widget.dart new file mode 100644 index 00000000..90467078 --- /dev/null +++ b/lib/components/image_cropper_widget.dart @@ -0,0 +1,64 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/custom_code/widgets/index.dart' as custom_widgets; +import 'package:flutter/material.dart'; +import 'image_cropper_model.dart'; +export 'image_cropper_model.dart'; + +class ImageCropperWidget extends StatefulWidget { + const ImageCropperWidget({ + super.key, + required this.uploadImageFile, + }); + + final FFUploadedFile? uploadImageFile; + + @override + State createState() => _ImageCropperWidgetState(); +} + +class _ImageCropperWidgetState extends State { + late ImageCropperModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => ImageCropperModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: 500.0, + height: 500.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + ), + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: custom_widgets.ImageCropper( + width: double.infinity, + height: double.infinity, + imageFile: widget.uploadImageFile, + callBackAction: (url) async { + Navigator.pop(context, url); + }, + ), + ), + ); + } +} diff --git a/lib/components/legacy_local_component_model.dart b/lib/components/legacy_local_component_model.dart new file mode 100644 index 00000000..65087833 --- /dev/null +++ b/lib/components/legacy_local_component_model.dart @@ -0,0 +1,12 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'legacy_local_component_widget.dart' show LegacyLocalComponentWidget; +import 'package:flutter/material.dart'; + +class LegacyLocalComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/components/legacy_local_component_widget.dart b/lib/components/legacy_local_component_widget.dart new file mode 100644 index 00000000..54c3610d --- /dev/null +++ b/lib/components/legacy_local_component_widget.dart @@ -0,0 +1,167 @@ +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 'legacy_local_component_model.dart'; +export 'legacy_local_component_model.dart'; + +class LegacyLocalComponentWidget extends StatefulWidget { + const LegacyLocalComponentWidget({super.key}); + + @override + State createState() => + _LegacyLocalComponentWidgetState(); +} + +class _LegacyLocalComponentWidgetState + extends State { + late LegacyLocalComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => LegacyLocalComponentModel()); + } + + @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( + height: 284.0, + decoration: const BoxDecoration(), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.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), + ), + ), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Container( + width: 200.0, + height: 200.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.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: 300.0, + height: 200.0, + fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + errorBuilder: (context, error, stackTrace) => + Image.asset( + 'assets/images/error_image.svg', + width: 300.0, + height: 200.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).primaryText, + fontSize: 20.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/components/select_header_component_model.dart b/lib/components/select_header_component_model.dart new file mode 100644 index 00000000..4c60514f --- /dev/null +++ b/lib/components/select_header_component_model.dart @@ -0,0 +1,12 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'select_header_component_widget.dart' show SelectHeaderComponentWidget; +import 'package:flutter/material.dart'; + +class SelectHeaderComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/components/select_header_component_widget.dart b/lib/components/select_header_component_widget.dart new file mode 100644 index 00000000..8f4f9339 --- /dev/null +++ b/lib/components/select_header_component_widget.dart @@ -0,0 +1,185 @@ +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 'select_header_component_model.dart'; +export 'select_header_component_model.dart'; + +class SelectHeaderComponentWidget extends StatefulWidget { + const SelectHeaderComponentWidget({ + super.key, + required this.selectToggle, + bool? toggleIndexValue, + }) : toggleIndexValue = toggleIndexValue ?? true; + + final Future Function(bool toggleIndex)? selectToggle; + final bool toggleIndexValue; + + @override + State createState() => + _SelectHeaderComponentWidgetState(); +} + +class _SelectHeaderComponentWidgetState + extends State { + late SelectHeaderComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SelectHeaderComponentModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + height: 55.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.selectToggle?.call( + true, + ); + }, + child: Container( + width: double.infinity, + height: 50.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: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + '1gr8ztd5' /* Criar Agendamento */, + ), + 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), + ), + ), + ), + ), + ), + if (widget.toggleIndexValue == true) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), + child: Container( + width: double.infinity, + height: 2.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: BorderRadius.circular(100.0), + ), + ), + ), + ], + ), + ), + ), + Expanded( + child: Container( + height: 55.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.selectToggle?.call( + false, + ); + }, + child: Container( + width: double.infinity, + height: 50.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: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'xjahsbjw' /* Histórico de Visitas */, + ), + 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), + ), + ), + ), + ), + ), + if (widget.toggleIndexValue == false) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), + child: Container( + width: double.infinity, + height: 2.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: BorderRadius.circular(100.0), + ), + ), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/lib/custom_code/actions/convert_image_file_to_base64.dart b/lib/custom_code/actions/convert_image_file_to_base64.dart new file mode 100644 index 00000000..595a0468 --- /dev/null +++ b/lib/custom_code/actions/convert_image_file_to_base64.dart @@ -0,0 +1,22 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom action code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'dart:convert'; +import 'dart:typed_data'; + +Future convertImageFileToBase64(FFUploadedFile imageFile) async { + List? imageBytes = imageFile.bytes; + if (imageBytes != null) { + String base64Image = base64Encode(imageBytes); + return base64Image; + } +} diff --git a/lib/custom_code/actions/convert_to_upload_file.dart b/lib/custom_code/actions/convert_to_upload_file.dart new file mode 100644 index 00000000..da9e3dae --- /dev/null +++ b/lib/custom_code/actions/convert_to_upload_file.dart @@ -0,0 +1,32 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom action code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'dart:convert'; // Import for base64 decoding +import 'dart:io'; // Import for file operations +import 'package:path_provider/path_provider.dart'; // Import for temporary directory + +Future convertToUploadFile(String img) async { + // Decode the base64 string into bytes + Uint8List bytes = base64.decode(img); + + // Create a temporary file to store the image + final tempDir = await getTemporaryDirectory(); + final tempPath = tempDir.path; + final tempFile = await File('$tempPath/image.jpg').create(); + await tempFile.writeAsBytes(bytes); + + // Create an FFUploadedFile object using the temporary file + return FFUploadedFile( + bytes: bytes, + name: 'image.jpg', + ); +} diff --git a/lib/custom_code/actions/get_dev_u_u_i_d.dart b/lib/custom_code/actions/get_dev_u_u_i_d.dart new file mode 100644 index 00000000..6d4843e7 --- /dev/null +++ b/lib/custom_code/actions/get_dev_u_u_i_d.dart @@ -0,0 +1,28 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom action code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; + +Future getDevUUID() async { + var deviceInfo = DeviceInfoPlugin(); + if (Platform.isIOS) { + // import 'dart:io' + var iosDeviceInfo = await deviceInfo.iosInfo; + return iosDeviceInfo.identifierForVendor; // unique ID on iOS + } else if (Platform.isAndroid) { + var androidDeviceInfo = await deviceInfo.androidInfo; + print(AndroidDeviceInfo); + return androidDeviceInfo.serialNumber; // unique ID on Android + } +} diff --git a/lib/custom_code/actions/index.dart b/lib/custom_code/actions/index.dart new file mode 100644 index 00000000..2110f043 --- /dev/null +++ b/lib/custom_code/actions/index.dart @@ -0,0 +1,3 @@ +export 'convert_image_file_to_base64.dart' show convertImageFileToBase64; +export 'convert_to_upload_file.dart' show convertToUploadFile; +export 'get_dev_u_u_i_d.dart' show getDevUUID; diff --git a/lib/custom_code/widgets/image_cropper.dart b/lib/custom_code/widgets/image_cropper.dart new file mode 100644 index 00000000..459c718b --- /dev/null +++ b/lib/custom_code/widgets/image_cropper.dart @@ -0,0 +1,179 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom widgets +import '/custom_code/actions/index.dart'; // Imports custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom widget code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'package:crop_your_image/crop_your_image.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '/backend/firebase_storage/storage.dart'; + +class ImageCropper extends StatefulWidget { + const ImageCropper({ + super.key, + this.width, + this.height, + this.imageFile, + this.callBackAction, + this.currentUserId, + }); + + final double? width; + final double? height; + final FFUploadedFile? imageFile; + final Future Function(String? url)? callBackAction; + final String? currentUserId; + + @override + State createState() => _ImageCropperState(); +} + +class _ImageCropperState extends State { + bool loading = false; + final _crop_controller = CropController(); + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: widget.width ?? double.infinity, + height: (widget.height ?? 555) - 80, + child: Center( + child: Crop( + image: Uint8List.fromList(widget.imageFile!.bytes!), + controller: _crop_controller, + onCropped: (image) async { + final path = _getStoragePath(_firebasePathPrefix(), + widget.imageFile!.name!, false, 0); + uploadData(path, image).then((value) { + print('image cropped'); + widget.callBackAction!.call(value!); + loading = false; + }); + // add error handling here + }, + + aspectRatio: 1 / 1, + initialSize: 0.5, + // initialArea: Rect.fromLTWH(240, 212, 800, 600),\ + //initialAreaBuilder: (rect) => Rect.fromLTRB(rect.left + 80, rect.top + 80, rect.right - 80, rect.bottom - 80), + withCircleUi: true, + baseColor: Color.fromARGB(255, 0, 3, 22), + maskColor: Colors.white.withAlpha(100), + radius: 20, + + onMoved: (newRect) { + // do something with current cropping area. + }, + onStatusChanged: (status) { + // do something with current CropStatus + }, + cornerDotBuilder: (size, edgeAlignment) => + const DotControl(color: Colors.white), + interactive: true, + // fixArea: true, + ))), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8, 5, 8, 5), + child: ElevatedButton( + onPressed: () async { + if (!loading) { + setState(() { + loading = true; + }); + print('Button pressed ...'); + _crop_controller.crop(); + + //widget.loading = true; + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + FlutterFlowTheme.of(context).primaryColor, + ), + padding: MaterialStateProperty.all( + EdgeInsets.zero, + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(100), + side: BorderSide.none, + ), + ), + ), + child: Container( + width: 250, + height: 50, + alignment: Alignment.center, + child: loading + ? CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(Colors.white), + ) + : Text( + 'Crop', + style: FlutterFlowTheme.of(context) + .subtitle2 + .override( + fontFamily: 'Lexend', + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.normal, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .subtitle2Family), + ), + ), + ), + )), + ]), + Positioned( + top: 4, + right: 4, + child: IconButton( + icon: Icon(Icons.close), + onPressed: () => Navigator.pop(context), + )) + ], + ); + } + + String _getStoragePath( + String? pathPrefix, + String filePath, + bool isVideo, [ + int? index, + ]) { + pathPrefix ??= _firebasePathPrefix(); + pathPrefix = _removeTrailingSlash(pathPrefix); + final timestamp = DateTime.now().microsecondsSinceEpoch; + final prefix = 'cropped-'; + // Workaround fixed by https://github.com/flutter/plugins/pull/3685 + // (not yet in stable). + final ext = isVideo ? 'mp4' : filePath.split('.').last; + final indexStr = index != null ? '_$index' : ''; + return '$pathPrefix/$prefix$timestamp$indexStr.$ext'; + } + + String? _removeTrailingSlash(String? path) => + path != null && path.endsWith('/') + ? path.substring(0, path.length - 1) + : path; + + String _firebasePathPrefix() => 'users/${widget.currentUserId}/uploads'; +} +// Set your widget name, define your parameter, and then add the +// boilerplate code using the green button on the right! diff --git a/lib/custom_code/widgets/index.dart b/lib/custom_code/widgets/index.dart new file mode 100644 index 00000000..ec35fd3e --- /dev/null +++ b/lib/custom_code/widgets/index.dart @@ -0,0 +1 @@ +export 'image_cropper.dart' show ImageCropper; diff --git a/lib/flutter_flow/custom_functions.dart b/lib/flutter_flow/custom_functions.dart new file mode 100644 index 00000000..2aaa5566 --- /dev/null +++ b/lib/flutter_flow/custom_functions.dart @@ -0,0 +1,107 @@ +import 'dart:convert'; +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:intl/intl.dart'; +import 'package:timeago/timeago.dart' as timeago; +import 'lat_lng.dart'; +import 'place.dart'; +import 'uploaded_file.dart'; +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; + +String? isOneAcliID(String jsonString) { + // Converte o JSON em um Map + final Map data = jsonDecode(jsonString); + + // Extrai a lista de locais + final List locais = data['locais']; + + // Filtra os locais onde CLU_STATUS é igual a "A" + final List locaisAtivos = + locais.where((local) => local['CLU_STATUS'] == 'A').toList(); + + // Verifica se existe somente um local ativo + if (locaisAtivos.length == 1) { + return locaisAtivos.first['CLI_ID']; + } else { + return null; + } +} + +String? convertToUppercase(String input) { + // recebe uuma string qualquer e retorna ela em uppercase + return input.toUpperCase(); +} + +String? uploadFileToBase64(String? uploadFile) { + // takes an UploadFile of an image as an argument and returns a base64 string of that image + if (uploadFile == null) { + return null; + } + + // Converte a string em uma lista de inteiros + final List bytes = uploadFile.codeUnits; + + // Converte os bytes em uma string base64 + final String base64String = base64.encode(bytes); + + return base64String; +} + +String jsonListToStr(List visitorList) { + // rece um json list e retorna uma string de $.visitante.VTE_DOCUMENTO separado por virgula + String result = ''; + for (var visitor in visitorList) { + result += '${visitor['VTE_DOCUMENTO']},'; + } + return result.substring(0, result.length - 1); +} + +List listStrJsonToJsonList( + dynamic jsonList, + List strList, +) { + // Recebe um jsonList e uma stringList como argumento e retorna uma nova jsonList associando cada item + List result = []; + + for (int i = 0; i < jsonList.length; i++) { + Map item = jsonList[i]; + if (i < strList.length) { + item['newField'] = strList[i]; + } else { + item['newField'] = ''; + } + result.add(item); + } + + return result; +} + +String strListToStr(List strList) { + // recebe uma stringList como argumento e retorna uma str com cada item da strList separado por virgula + + return strList.join(','); +} + +int extractIdToStr(String str) { + // recebe um uma string e retorna um inteiro com o valor entre '_ID:' e a próxima vírgula ',' + final idStart = str.indexOf('_ID:') + 4; + final idEnd = str.indexOf(',', idStart); + final idStr = str.substring(idStart, idEnd); + return int.parse(idStr); +} + +String extractDescToStr(String str) { + // recebe um uma string e retorna uma string com o valor entre '_DESCRICAO' e a próxima vírgula ',' + final startIndex = str.indexOf('_DESCRICAO:') + '_DESCRICAO:'.length; + final endIndex = str.indexOf(',', startIndex); + return str.substring(startIndex, endIndex); +} + +String jsonToStr(dynamic json) { + // recebe um json como parametro, converte-o em string e retorna essa string + String jsonString = jsonEncode(json); + return jsonString; +} diff --git a/lib/flutter_flow/custom_icons.dart b/lib/flutter_flow/custom_icons.dart new file mode 100644 index 00000000..52991086 --- /dev/null +++ b/lib/flutter_flow/custom_icons.dart @@ -0,0 +1,21 @@ +import 'package:flutter/widgets.dart'; + +class FFIcons { + FFIcons._(); + + static const String _iconsFamily = 'Icons'; + static const String _menuFamily = 'Menu'; + + // icons + static const IconData kvector = IconData(0xe900, fontFamily: _iconsFamily); + static const IconData kfast = IconData(0xe903, fontFamily: _iconsFamily); + static const IconData khome = IconData(0xe904, fontFamily: _iconsFamily); + static const IconData kpets = IconData(0xe901, fontFamily: _iconsFamily); + static const IconData kvector1 = IconData(0xe902, fontFamily: _iconsFamily); + + // menu + static const IconData kiconFastPass = + IconData(0xe900, fontFamily: _menuFamily); + static const IconData kvector2 = IconData(0xe905, fontFamily: _menuFamily); + static const IconData kvector3 = IconData(0xe906, fontFamily: _menuFamily); +} diff --git a/lib/flutter_flow/flutter_flow_animations.dart b/lib/flutter_flow/flutter_flow_animations.dart new file mode 100644 index 00000000..486179ca --- /dev/null +++ b/lib/flutter_flow/flutter_flow_animations.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; + +enum AnimationTrigger { + onPageLoad, + onActionTrigger, +} + +class AnimationInfo { + AnimationInfo({ + required this.trigger, + required this.effectsBuilder, + this.loop = false, + this.reverse = false, + this.applyInitialState = true, + }); + final AnimationTrigger trigger; + final List Function()? effectsBuilder; + final bool applyInitialState; + final bool loop; + final bool reverse; + late AnimationController controller; + + List? _effects; + List get effects => _effects ??= effectsBuilder!(); + + void maybeUpdateEffects(List? updatedEffects) { + if (updatedEffects != null) { + _effects = updatedEffects; + } + } +} + +void createAnimation(AnimationInfo animation, TickerProvider vsync) { + final newController = AnimationController(vsync: vsync); + animation.controller = newController; +} + +void setupAnimations(Iterable animations, TickerProvider vsync) { + for (var animation in animations) { + createAnimation(animation, vsync); + } +} + +extension AnimatedWidgetExtension on Widget { + Widget animateOnPageLoad( + AnimationInfo animationInfo, { + List? effects, + }) { + animationInfo.maybeUpdateEffects(effects); + return Animate( + effects: animationInfo.effects, + child: this, + onPlay: (controller) => animationInfo.loop + ? controller.repeat(reverse: animationInfo.reverse) + : null, + onComplete: (controller) => !animationInfo.loop && animationInfo.reverse + ? controller.reverse() + : null, + ); + } + + Widget animateOnActionTrigger( + AnimationInfo animationInfo, { + List? effects, + bool hasBeenTriggered = false, + }) { + animationInfo.maybeUpdateEffects(effects); + return hasBeenTriggered || animationInfo.applyInitialState + ? Animate( + controller: animationInfo.controller, + autoPlay: false, + effects: animationInfo.effects, + child: this) + : this; + } +} + +class TiltEffect extends Effect { + const TiltEffect({ + super.delay, + super.duration, + super.curve, + Offset? begin, + Offset? end, + }) : super( + begin: begin ?? const Offset(0.0, 0.0), + end: end ?? const Offset(0.0, 0.0), + ); + + @override + Widget build( + BuildContext context, + Widget child, + AnimationController controller, + EffectEntry entry, + ) { + Animation animation = buildAnimation(controller, entry); + return getOptimizedBuilder( + animation: animation, + builder: (_, __) => Transform( + transform: Matrix4.identity() + ..setEntry(3, 2, 0.001) + ..rotateX(animation.value.dx) + ..rotateY(animation.value.dy), + alignment: Alignment.center, + child: child, + ), + ); + } +} diff --git a/lib/flutter_flow/flutter_flow_drop_down.dart b/lib/flutter_flow/flutter_flow_drop_down.dart new file mode 100644 index 00000000..edaba01f --- /dev/null +++ b/lib/flutter_flow/flutter_flow_drop_down.dart @@ -0,0 +1,373 @@ +import 'package:dropdown_button2/dropdown_button2.dart'; + +import 'form_field_controller.dart'; +import 'package:flutter/material.dart'; + +class FlutterFlowDropDown extends StatefulWidget { + const FlutterFlowDropDown({ + super.key, + this.controller, + this.multiSelectController, + this.hintText, + this.searchHintText, + required this.options, + this.optionLabels, + this.onChanged, + this.onMultiSelectChanged, + this.icon, + this.width, + this.height, + this.maxHeight, + this.fillColor, + this.searchHintTextStyle, + this.searchTextStyle, + this.searchCursorColor, + required this.textStyle, + required this.elevation, + required this.borderWidth, + required this.borderRadius, + required this.borderColor, + required this.margin, + this.hidesUnderline = false, + this.disabled = false, + this.isOverButton = false, + this.menuOffset, + this.isSearchable = false, + this.isMultiSelect = false, + this.labelText, + this.labelTextStyle, + }) : assert( + isMultiSelect + ? (controller == null && + onChanged == null && + multiSelectController != null && + onMultiSelectChanged != null) + : (controller != null && + onChanged != null && + multiSelectController == null && + onMultiSelectChanged == null), + ); + + final FormFieldController? controller; + final FormFieldController?>? multiSelectController; + final String? hintText; + final String? searchHintText; + final List options; + final List? optionLabels; + final Function(T?)? onChanged; + final Function(List?)? onMultiSelectChanged; + final Widget? icon; + final double? width; + final double? height; + final double? maxHeight; + final Color? fillColor; + final TextStyle? searchHintTextStyle; + final TextStyle? searchTextStyle; + final Color? searchCursorColor; + final TextStyle textStyle; + final double elevation; + final double borderWidth; + final double borderRadius; + final Color borderColor; + final EdgeInsetsGeometry margin; + final bool hidesUnderline; + final bool disabled; + final bool isOverButton; + final Offset? menuOffset; + final bool isSearchable; + final bool isMultiSelect; + final String? labelText; + final TextStyle? labelTextStyle; + + @override + State> createState() => _FlutterFlowDropDownState(); +} + +class _FlutterFlowDropDownState extends State> { + bool get isMultiSelect => widget.isMultiSelect; + FormFieldController get controller => widget.controller!; + FormFieldController?> get multiSelectController => + widget.multiSelectController!; + + T? get currentValue { + final value = isMultiSelect + ? multiSelectController.value?.firstOrNull + : controller.value; + return widget.options.contains(value) ? value : null; + } + + Set get currentValues { + if (!isMultiSelect || multiSelectController.value == null) { + return {}; + } + return widget.options + .toSet() + .intersection(multiSelectController.value!.toSet()); + } + + Map get optionLabels => Map.fromEntries( + widget.options.asMap().entries.map( + (option) => MapEntry( + option.value, + widget.optionLabels == null || + widget.optionLabels!.length < option.key + 1 + ? option.value.toString() + : widget.optionLabels![option.key], + ), + ), + ); + + EdgeInsetsGeometry get horizontalMargin => widget.margin.clamp( + EdgeInsetsDirectional.zero, + const EdgeInsetsDirectional.symmetric(horizontal: double.infinity), + ); + + late void Function() _listener; + final TextEditingController _textEditingController = TextEditingController(); + + @override + void initState() { + super.initState(); + if (isMultiSelect) { + _listener = + () => widget.onMultiSelectChanged!(multiSelectController.value); + multiSelectController.addListener(_listener); + } else { + _listener = () => widget.onChanged!(controller.value); + controller.addListener(_listener); + } + } + + @override + void dispose() { + if (isMultiSelect) { + multiSelectController.removeListener(_listener); + } else { + controller.removeListener(_listener); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final dropdownWidget = _buildDropdownWidget(); + return SizedBox( + width: widget.width, + height: widget.height, + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(widget.borderRadius), + border: Border.all( + color: widget.borderColor, + width: widget.borderWidth, + ), + color: widget.fillColor, + ), + child: Padding( + padding: _useDropdown2() ? EdgeInsets.zero : widget.margin, + child: widget.hidesUnderline + ? DropdownButtonHideUnderline(child: dropdownWidget) + : dropdownWidget, + ), + ), + ); + } + + bool _useDropdown2() => + widget.isMultiSelect || + widget.isSearchable || + !widget.isOverButton || + widget.maxHeight != null; + + Widget _buildDropdownWidget() => + _useDropdown2() ? _buildDropdown() : _buildLegacyDropdown(); + + Widget _buildLegacyDropdown() { + return DropdownButtonFormField( + value: currentValue, + hint: _createHintText(), + items: _createMenuItems(), + elevation: widget.elevation.toInt(), + onChanged: widget.disabled ? null : (value) => controller.value = value, + icon: widget.icon, + isExpanded: true, + dropdownColor: widget.fillColor, + focusColor: Colors.transparent, + decoration: InputDecoration( + labelText: widget.labelText == null || widget.labelText!.isEmpty + ? null + : widget.labelText, + labelStyle: widget.labelTextStyle, + border: widget.hidesUnderline + ? InputBorder.none + : const UnderlineInputBorder(), + ), + ); + } + + Text? _createHintText() => widget.hintText != null + ? Text(widget.hintText!, style: widget.textStyle) + : null; + + List> _createMenuItems() => widget.options + .map( + (option) => DropdownMenuItem( + value: option, + child: Padding( + padding: _useDropdown2() ? horizontalMargin : EdgeInsets.zero, + child: Text(optionLabels[option] ?? '', style: widget.textStyle), + ), + ), + ) + .toList(); + + List> _createMultiselectMenuItems() => widget.options + .map( + (item) => DropdownMenuItem( + value: item, + // Disable default onTap to avoid closing menu when selecting an item + enabled: false, + child: StatefulBuilder( + builder: (context, menuSetState) { + final isSelected = + multiSelectController.value?.contains(item) ?? false; + return InkWell( + onTap: () { + multiSelectController.value ??= []; + isSelected + ? multiSelectController.value!.remove(item) + : multiSelectController.value!.add(item); + multiSelectController.update(); + // This rebuilds the StatefulWidget to update the button's text. + setState(() {}); + // This rebuilds the dropdownMenu Widget to update the check mark. + menuSetState(() {}); + }, + child: Container( + height: double.infinity, + padding: horizontalMargin, + child: Row( + children: [ + if (isSelected) + const Icon(Icons.check_box_outlined) + else + const Icon(Icons.check_box_outline_blank), + const SizedBox(width: 16), + Expanded( + child: Text( + optionLabels[item]!, + style: widget.textStyle, + ), + ), + ], + ), + ), + ); + }, + ), + ), + ) + .toList(); + + Widget _buildDropdown() { + final overlayColor = MaterialStateProperty.resolveWith((states) => + states.contains(MaterialState.focused) ? Colors.transparent : null); + final iconStyleData = widget.icon != null + ? IconStyleData(icon: widget.icon!) + : const IconStyleData(); + return DropdownButton2( + value: currentValue, + hint: _createHintText(), + items: isMultiSelect ? _createMultiselectMenuItems() : _createMenuItems(), + iconStyleData: iconStyleData, + buttonStyleData: ButtonStyleData( + elevation: widget.elevation.toInt(), + overlayColor: overlayColor, + padding: widget.margin, + ), + menuItemStyleData: MenuItemStyleData( + overlayColor: overlayColor, + padding: EdgeInsets.zero, + ), + dropdownStyleData: DropdownStyleData( + elevation: widget.elevation.toInt(), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: widget.fillColor, + ), + isOverButton: widget.isOverButton, + offset: widget.menuOffset ?? Offset.zero, + maxHeight: widget.maxHeight, + padding: EdgeInsets.zero, + ), + onChanged: widget.disabled + ? null + : (isMultiSelect ? (_) {} : (val) => widget.controller!.value = val), + isExpanded: true, + selectedItemBuilder: (context) => widget.options + .map( + (item) => Align( + alignment: AlignmentDirectional.centerStart, + child: Text( + isMultiSelect + ? currentValues + .where((v) => optionLabels.containsKey(v)) + .map((v) => optionLabels[v]) + .join(', ') + : optionLabels[item]!, + style: widget.textStyle, + maxLines: 1, + ), + ), + ) + .toList(), + dropdownSearchData: widget.isSearchable + ? DropdownSearchData( + searchController: _textEditingController, + searchInnerWidgetHeight: 50, + searchInnerWidget: Container( + height: 50, + padding: const EdgeInsets.only( + top: 8, + bottom: 4, + right: 8, + left: 8, + ), + child: TextFormField( + expands: true, + maxLines: null, + controller: _textEditingController, + cursorColor: widget.searchCursorColor, + style: widget.searchTextStyle, + decoration: InputDecoration( + isDense: true, + contentPadding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), + hintText: widget.searchHintText, + hintStyle: widget.searchHintTextStyle, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ), + searchMatchFn: (item, searchValue) { + return (optionLabels[item.value] ?? '') + .toLowerCase() + .contains(searchValue.toLowerCase()); + }, + ) + : null, + // This is to clear the search value when you close the menu + onMenuStateChange: widget.isSearchable + ? (isOpen) { + if (!isOpen) { + _textEditingController.clear(); + } + } + : null, + ); + } +} diff --git a/lib/flutter_flow/flutter_flow_icon_button.dart b/lib/flutter_flow/flutter_flow_icon_button.dart new file mode 100644 index 00000000..cabfa4e9 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_icon_button.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +class FlutterFlowIconButton extends StatefulWidget { + const FlutterFlowIconButton({ + super.key, + required this.icon, + this.borderColor, + this.borderRadius, + this.borderWidth, + this.buttonSize, + this.fillColor, + this.disabledColor, + this.disabledIconColor, + this.hoverColor, + this.hoverIconColor, + this.onPressed, + this.showLoadingIndicator = false, + }); + + final Widget icon; + final double? borderRadius; + final double? buttonSize; + final Color? fillColor; + final Color? disabledColor; + final Color? disabledIconColor; + final Color? hoverColor; + final Color? hoverIconColor; + final Color? borderColor; + final double? borderWidth; + final bool showLoadingIndicator; + final Function()? onPressed; + + @override + State createState() => _FlutterFlowIconButtonState(); +} + +class _FlutterFlowIconButtonState extends State { + bool loading = false; + late double? iconSize; + late Color? iconColor; + late Widget effectiveIcon; + + @override + void initState() { + super.initState(); + _updateIcon(); + } + + @override + void didUpdateWidget(FlutterFlowIconButton oldWidget) { + super.didUpdateWidget(oldWidget); + _updateIcon(); + } + + void _updateIcon() { + final isFontAwesome = widget.icon is FaIcon; + if (isFontAwesome) { + FaIcon icon = widget.icon as FaIcon; + effectiveIcon = FaIcon( + icon.icon, + size: icon.size, + ); + iconSize = icon.size; + iconColor = icon.color; + } else { + Icon icon = widget.icon as Icon; + effectiveIcon = Icon( + icon.icon, + size: icon.size, + ); + iconSize = icon.size; + iconColor = icon.color; + } + } + + @override + Widget build(BuildContext context) { + ButtonStyle style = ButtonStyle( + shape: MaterialStateProperty.resolveWith( + (states) { + return RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.borderRadius ?? 0), + side: BorderSide( + color: widget.borderColor ?? Colors.transparent, + width: widget.borderWidth ?? 0, + ), + ); + }, + ), + iconColor: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.disabled) && + widget.disabledIconColor != null) { + return widget.disabledIconColor; + } + if (states.contains(MaterialState.hovered) && + widget.hoverIconColor != null) { + return widget.hoverIconColor; + } + return iconColor; + }, + ), + backgroundColor: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.disabled) && + widget.disabledColor != null) { + return widget.disabledColor; + } + if (states.contains(MaterialState.hovered) && + widget.hoverColor != null) { + return widget.hoverColor; + } + + return widget.fillColor; + }, + ), + overlayColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.pressed)) { + return null; + } + return widget.hoverColor == null ? null : Colors.transparent; + }), + ); + + return SizedBox( + width: widget.buttonSize, + height: widget.buttonSize, + child: Theme( + data: ThemeData.from( + colorScheme: Theme.of(context).colorScheme, + useMaterial3: true, + ), + child: IgnorePointer( + ignoring: (widget.showLoadingIndicator && loading), + child: IconButton( + icon: (widget.showLoadingIndicator && loading) + ? SizedBox( + width: iconSize, + height: iconSize, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + iconColor ?? Colors.white, + ), + ), + ) + : effectiveIcon, + onPressed: widget.onPressed == null + ? null + : () async { + if (loading) { + return; + } + setState(() => loading = true); + try { + await widget.onPressed!(); + } finally { + if (mounted) { + setState(() => loading = false); + } + } + }, + splashRadius: widget.buttonSize, + style: style, + ), + ), + ), + ); + } +} diff --git a/lib/flutter_flow/flutter_flow_model.dart b/lib/flutter_flow/flutter_flow_model.dart new file mode 100644 index 00000000..4606ba84 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_model.dart @@ -0,0 +1,169 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +Widget wrapWithModel({ + required T model, + required Widget child, + required VoidCallback updateCallback, + bool updateOnChange = false, +}) { + // Set the component to optionally update the page on updates. + model.setOnUpdate( + onUpdate: updateCallback, + updateOnChange: updateOnChange, + ); + // Models for components within a page will be disposed by the page's model, + // so we don't want the component widget to dispose them until the page is + // itself disposed. + model.disposeOnWidgetDisposal = false; + // Wrap in a Provider so that the model can be accessed by the component. + return Provider.value( + value: model, + child: child, + ); +} + +T createModel( + BuildContext context, + T Function() defaultBuilder, +) { + final model = context.read() ?? defaultBuilder(); + model._init(context); + return model; +} + +abstract class FlutterFlowModel { + // Initialization methods + bool _isInitialized = false; + void initState(BuildContext context); + void _init(BuildContext context) { + if (!_isInitialized) { + initState(context); + _isInitialized = true; + } + if (context.widget is W) _widget = context.widget as W; + } + + // The widget associated with this model. This is useful for accessing the + // parameters of the widget, for example. + W? _widget; + // This will always be non-null when used, but is nullable to allow us to + // dispose of the widget in the [dispose] method (for garbage collection). + W get widget => _widget!; + + // Dispose methods + // Whether to dispose this model when the corresponding widget is + // disposed. By default this is true for pages and false for components, + // as page/component models handle the disposal of their children. + bool disposeOnWidgetDisposal = true; + void dispose(); + void maybeDispose() { + if (disposeOnWidgetDisposal) { + dispose(); + } + // Remove reference to widget for garbage collection purposes. + _widget = null; + } + + // Whether to update the containing page / component on updates. + bool updateOnChange = false; + // Function to call when the model receives an update. + VoidCallback _updateCallback = () {}; + void onUpdate() => updateOnChange ? _updateCallback() : () {}; + FlutterFlowModel setOnUpdate({ + bool updateOnChange = false, + required VoidCallback onUpdate, + }) => + this + .._updateCallback = onUpdate + ..updateOnChange = updateOnChange; + // Update the containing page when this model received an update. + void updatePage(VoidCallback callback) { + callback(); + _updateCallback(); + } +} + +class FlutterFlowDynamicModels { + FlutterFlowDynamicModels(this.defaultBuilder); + + final T Function() defaultBuilder; + final Map _childrenModels = {}; + final Map _childrenIndexes = {}; + Set? _activeKeys; + + T getModel(String uniqueKey, int index) { + _updateActiveKeys(uniqueKey); + _childrenIndexes[uniqueKey] = index; + return _childrenModels[uniqueKey] ??= defaultBuilder(); + } + + List getValues(S? Function(T) getValue) { + return _childrenIndexes.entries + // Sort keys by index. + .sorted((a, b) => a.value.compareTo(b.value)) + .where((e) => _childrenModels[e.key] != null) + // Map each model to the desired value and return as list. In order + // to preserve index order, rather than removing null values we provide + // default values (for types with reasonable defaults). + .map((e) => getValue(_childrenModels[e.key]!) ?? _getDefaultValue()!) + .toList(); + } + + S? getValueAtIndex(int index, S? Function(T) getValue) { + final uniqueKey = + _childrenIndexes.entries.firstWhereOrNull((e) => e.value == index)?.key; + return getValueForKey(uniqueKey, getValue); + } + + S? getValueForKey(String? uniqueKey, S? Function(T) getValue) { + final model = _childrenModels[uniqueKey]; + return model != null ? getValue(model) : null; + } + + void dispose() => _childrenModels.values.forEach((model) => model.dispose()); + + void _updateActiveKeys(String uniqueKey) { + final shouldResetActiveKeys = _activeKeys == null; + _activeKeys ??= {}; + _activeKeys!.add(uniqueKey); + + if (shouldResetActiveKeys) { + // Add a post-frame callback to remove and dispose of unused models after + // we're done building, then reset `_activeKeys` to null so we know to do + // this again next build. + SchedulerBinding.instance.addPostFrameCallback((_) { + _childrenIndexes.removeWhere((k, _) => !_activeKeys!.contains(k)); + _childrenModels.keys + .toSet() + .difference(_activeKeys!) + // Remove and dispose of unused models since they are not being used + // elsewhere and would not otherwise be disposed. + .forEach((k) => _childrenModels.remove(k)?.maybeDispose()); + _activeKeys = null; + }); + } + } +} + +T? _getDefaultValue() { + switch (T) { + case int: + return 0 as T; + case double: + return 0.0 as T; + case String: + return '' as T; + case bool: + return false as T; + default: + return null as T; + } +} + +extension TextValidationExtensions on String? Function(BuildContext, String?)? { + String? Function(String?)? asValidator(BuildContext context) => + this != null ? (val) => this!(context, val) : null; +} diff --git a/lib/flutter_flow/flutter_flow_theme.dart b/lib/flutter_flow/flutter_flow_theme.dart new file mode 100644 index 00000000..7429aca2 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_theme.dart @@ -0,0 +1,613 @@ +// ignore_for_file: overridden_fields, annotate_overrides + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import 'package:shared_preferences/shared_preferences.dart'; + +const kThemeModeKey = '__theme_mode__'; +SharedPreferences? _prefs; + +enum DeviceSize { + mobile, + tablet, + desktop, +} + +abstract class FlutterFlowTheme { + static DeviceSize deviceSize = DeviceSize.mobile; + + static Future initialize() async => + _prefs = await SharedPreferences.getInstance(); + static ThemeMode get themeMode { + final darkMode = _prefs?.getBool(kThemeModeKey); + return darkMode == null + ? ThemeMode.system + : darkMode + ? ThemeMode.dark + : ThemeMode.light; + } + + static void saveThemeMode(ThemeMode mode) => mode == ThemeMode.system + ? _prefs?.remove(kThemeModeKey) + : _prefs?.setBool(kThemeModeKey, mode == ThemeMode.dark); + + static FlutterFlowTheme of(BuildContext context) { + deviceSize = getDeviceSize(context); + return Theme.of(context).brightness == Brightness.dark + ? DarkModeTheme() + : LightModeTheme(); + } + + @Deprecated('Use primary instead') + Color get primaryColor => primary; + @Deprecated('Use secondary instead') + Color get secondaryColor => secondary; + @Deprecated('Use tertiary instead') + Color get tertiaryColor => tertiary; + + late Color primary; + late Color secondary; + late Color tertiary; + late Color alternate; + late Color primaryText; + late Color secondaryText; + late Color primaryBackground; + late Color secondaryBackground; + late Color accent1; + late Color accent2; + late Color accent3; + late Color accent4; + late Color success; + late Color warning; + late Color error; + late Color info; + + late Color customColor1; + late Color customColor2; + late Color customColor3; + late Color customColor4; + late Color customColor5; + + @Deprecated('Use displaySmallFamily instead') + String get title1Family => displaySmallFamily; + @Deprecated('Use displaySmall instead') + TextStyle get title1 => typography.displaySmall; + @Deprecated('Use headlineMediumFamily instead') + String get title2Family => typography.headlineMediumFamily; + @Deprecated('Use headlineMedium instead') + TextStyle get title2 => typography.headlineMedium; + @Deprecated('Use headlineSmallFamily instead') + String get title3Family => typography.headlineSmallFamily; + @Deprecated('Use headlineSmall instead') + TextStyle get title3 => typography.headlineSmall; + @Deprecated('Use titleMediumFamily instead') + String get subtitle1Family => typography.titleMediumFamily; + @Deprecated('Use titleMedium instead') + TextStyle get subtitle1 => typography.titleMedium; + @Deprecated('Use titleSmallFamily instead') + String get subtitle2Family => typography.titleSmallFamily; + @Deprecated('Use titleSmall instead') + TextStyle get subtitle2 => typography.titleSmall; + @Deprecated('Use bodyMediumFamily instead') + String get bodyText1Family => typography.bodyMediumFamily; + @Deprecated('Use bodyMedium instead') + TextStyle get bodyText1 => typography.bodyMedium; + @Deprecated('Use bodySmallFamily instead') + String get bodyText2Family => typography.bodySmallFamily; + @Deprecated('Use bodySmall instead') + TextStyle get bodyText2 => typography.bodySmall; + + String get displayLargeFamily => typography.displayLargeFamily; + TextStyle get displayLarge => typography.displayLarge; + String get displayMediumFamily => typography.displayMediumFamily; + TextStyle get displayMedium => typography.displayMedium; + String get displaySmallFamily => typography.displaySmallFamily; + TextStyle get displaySmall => typography.displaySmall; + String get headlineLargeFamily => typography.headlineLargeFamily; + TextStyle get headlineLarge => typography.headlineLarge; + String get headlineMediumFamily => typography.headlineMediumFamily; + TextStyle get headlineMedium => typography.headlineMedium; + String get headlineSmallFamily => typography.headlineSmallFamily; + TextStyle get headlineSmall => typography.headlineSmall; + String get titleLargeFamily => typography.titleLargeFamily; + TextStyle get titleLarge => typography.titleLarge; + String get titleMediumFamily => typography.titleMediumFamily; + TextStyle get titleMedium => typography.titleMedium; + String get titleSmallFamily => typography.titleSmallFamily; + TextStyle get titleSmall => typography.titleSmall; + String get labelLargeFamily => typography.labelLargeFamily; + TextStyle get labelLarge => typography.labelLarge; + String get labelMediumFamily => typography.labelMediumFamily; + TextStyle get labelMedium => typography.labelMedium; + String get labelSmallFamily => typography.labelSmallFamily; + TextStyle get labelSmall => typography.labelSmall; + String get bodyLargeFamily => typography.bodyLargeFamily; + TextStyle get bodyLarge => typography.bodyLarge; + String get bodyMediumFamily => typography.bodyMediumFamily; + TextStyle get bodyMedium => typography.bodyMedium; + String get bodySmallFamily => typography.bodySmallFamily; + TextStyle get bodySmall => typography.bodySmall; + + Typography get typography => { + DeviceSize.mobile: MobileTypography(this), + DeviceSize.tablet: TabletTypography(this), + DeviceSize.desktop: DesktopTypography(this), + }[deviceSize]!; +} + +DeviceSize getDeviceSize(BuildContext context) { + final width = MediaQuery.sizeOf(context).width; + if (width < 479) { + return DeviceSize.mobile; + } else if (width < 991) { + return DeviceSize.tablet; + } else { + return DeviceSize.desktop; + } +} + +class LightModeTheme extends FlutterFlowTheme { + @Deprecated('Use primary instead') + Color get primaryColor => primary; + @Deprecated('Use secondary instead') + Color get secondaryColor => secondary; + @Deprecated('Use tertiary instead') + Color get tertiaryColor => tertiary; + + late Color primary = const Color(0xFF1AAB5F); + late Color secondary = const Color(0xFFB59E9E); + late Color tertiary = const Color(0xFF984BB6); + late Color alternate = const Color(0xFFF2F2F2); + late Color primaryText = const Color(0xFF000000); + late Color secondaryText = const Color(0xFFFFFFFF); + late Color primaryBackground = const Color(0xFFFFFFFF); + late Color secondaryBackground = const Color(0xFFFFFFFF); + late Color accent1 = const Color(0xFF1AAB5F); + late Color accent2 = const Color(0x4D000000); + late Color accent3 = const Color(0xFFFFFFFF); + late Color accent4 = const Color(0xFF1AAB5F); + late Color success = const Color(0xFF1AAB5F); + late Color warning = const Color(0xFFF3C344); + late Color error = const Color(0xFFD70000); + late Color info = const Color(0xFFFFFFFF); + + late Color customColor1 = const Color(0xFF000000); + late Color customColor2 = const Color(0xFF1AAB5F); + late Color customColor3 = const Color(0xFFFFFFFF); + late Color customColor4 = const Color(0xFFCFCFCF); + late Color customColor5 = const Color(0xFF979595); +} + +abstract class Typography { + String get displayLargeFamily; + TextStyle get displayLarge; + String get displayMediumFamily; + TextStyle get displayMedium; + String get displaySmallFamily; + TextStyle get displaySmall; + String get headlineLargeFamily; + TextStyle get headlineLarge; + String get headlineMediumFamily; + TextStyle get headlineMedium; + String get headlineSmallFamily; + TextStyle get headlineSmall; + String get titleLargeFamily; + TextStyle get titleLarge; + String get titleMediumFamily; + TextStyle get titleMedium; + String get titleSmallFamily; + TextStyle get titleSmall; + String get labelLargeFamily; + TextStyle get labelLarge; + String get labelMediumFamily; + TextStyle get labelMedium; + String get labelSmallFamily; + TextStyle get labelSmall; + String get bodyLargeFamily; + TextStyle get bodyLarge; + String get bodyMediumFamily; + TextStyle get bodyMedium; + String get bodySmallFamily; + TextStyle get bodySmall; +} + +class MobileTypography extends Typography { + MobileTypography(this.theme); + + final FlutterFlowTheme theme; + + String get displayLargeFamily => 'Nunito Sans'; + TextStyle get displayLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w300, + fontSize: 52.0, + ); + String get displayMediumFamily => 'Nunito Sans'; + TextStyle get displayMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 44.0, + ); + String get displaySmallFamily => 'Nunito Sans'; + TextStyle get displaySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 36.0, + ); + String get headlineLargeFamily => 'Nunito Sans'; + TextStyle get headlineLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 32.0, + ); + String get headlineMediumFamily => 'Nunito Sans'; + TextStyle get headlineMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 28.0, + ); + String get headlineSmallFamily => 'Nunito Sans'; + TextStyle get headlineSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 24.0, + ); + String get titleLargeFamily => 'Nunito Sans'; + TextStyle get titleLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 22.0, + ); + String get titleMediumFamily => 'Nunito Sans'; + TextStyle get titleMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 18.0, + ); + String get titleSmallFamily => 'Nunito Sans'; + TextStyle get titleSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelLargeFamily => 'Nunito Sans'; + TextStyle get labelLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelMediumFamily => 'Nunito Sans'; + TextStyle get labelMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 14.0, + ); + String get labelSmallFamily => 'Nunito Sans'; + TextStyle get labelSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 12.0, + ); + String get bodyLargeFamily => 'Nunito Sans'; + TextStyle get bodyLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontSize: 16.0, + ); + String get bodyMediumFamily => 'Nunito Sans'; + TextStyle get bodyMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 14.0, + ); + String get bodySmallFamily => 'Nunito Sans'; + TextStyle get bodySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 12.0, + ); +} + +class TabletTypography extends Typography { + TabletTypography(this.theme); + + final FlutterFlowTheme theme; + + String get displayLargeFamily => 'Nunito Sans'; + TextStyle get displayLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w300, + fontSize: 52.0, + ); + String get displayMediumFamily => 'Nunito Sans'; + TextStyle get displayMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 44.0, + ); + String get displaySmallFamily => 'Nunito Sans'; + TextStyle get displaySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 36.0, + ); + String get headlineLargeFamily => 'Nunito Sans'; + TextStyle get headlineLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 32.0, + ); + String get headlineMediumFamily => 'Nunito Sans'; + TextStyle get headlineMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 28.0, + ); + String get headlineSmallFamily => 'Nunito Sans'; + TextStyle get headlineSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 24.0, + ); + String get titleLargeFamily => 'Nunito Sans'; + TextStyle get titleLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 22.0, + ); + String get titleMediumFamily => 'Nunito Sans'; + TextStyle get titleMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 18.0, + ); + String get titleSmallFamily => 'Nunito Sans'; + TextStyle get titleSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelLargeFamily => 'Nunito Sans'; + TextStyle get labelLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelMediumFamily => 'Nunito Sans'; + TextStyle get labelMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 14.0, + ); + String get labelSmallFamily => 'Nunito Sans'; + TextStyle get labelSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 12.0, + ); + String get bodyLargeFamily => 'Nunito Sans'; + TextStyle get bodyLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontSize: 16.0, + ); + String get bodyMediumFamily => 'Nunito Sans'; + TextStyle get bodyMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 14.0, + ); + String get bodySmallFamily => 'Nunito Sans'; + TextStyle get bodySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 12.0, + ); +} + +class DesktopTypography extends Typography { + DesktopTypography(this.theme); + + final FlutterFlowTheme theme; + + String get displayLargeFamily => 'Nunito Sans'; + TextStyle get displayLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w300, + fontSize: 52.0, + ); + String get displayMediumFamily => 'Nunito Sans'; + TextStyle get displayMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 44.0, + ); + String get displaySmallFamily => 'Nunito Sans'; + TextStyle get displaySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 36.0, + ); + String get headlineLargeFamily => 'Nunito Sans'; + TextStyle get headlineLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 32.0, + ); + String get headlineMediumFamily => 'Nunito Sans'; + TextStyle get headlineMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 28.0, + ); + String get headlineSmallFamily => 'Nunito Sans'; + TextStyle get headlineSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 24.0, + ); + String get titleLargeFamily => 'Nunito Sans'; + TextStyle get titleLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.w500, + fontSize: 22.0, + ); + String get titleMediumFamily => 'Nunito Sans'; + TextStyle get titleMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 18.0, + ); + String get titleSmallFamily => 'Nunito Sans'; + TextStyle get titleSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.info, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelLargeFamily => 'Nunito Sans'; + TextStyle get labelLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 16.0, + ); + String get labelMediumFamily => 'Nunito Sans'; + TextStyle get labelMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 14.0, + ); + String get labelSmallFamily => 'Nunito Sans'; + TextStyle get labelSmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.secondaryText, + fontWeight: FontWeight.w500, + fontSize: 12.0, + ); + String get bodyLargeFamily => 'Nunito Sans'; + TextStyle get bodyLarge => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontSize: 16.0, + ); + String get bodyMediumFamily => 'Nunito Sans'; + TextStyle get bodyMedium => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 14.0, + ); + String get bodySmallFamily => 'Nunito Sans'; + TextStyle get bodySmall => GoogleFonts.getFont( + 'Nunito Sans', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 12.0, + ); +} + +class DarkModeTheme extends FlutterFlowTheme { + @Deprecated('Use primary instead') + Color get primaryColor => primary; + @Deprecated('Use secondary instead') + Color get secondaryColor => secondary; + @Deprecated('Use tertiary instead') + Color get tertiaryColor => tertiary; + + late Color primary = const Color(0xFF1AAB5F); + late Color secondary = const Color(0xFF18AA99); + late Color tertiary = const Color(0xFF984BB6); + late Color alternate = const Color(0xFF232323); + late Color primaryText = const Color(0xFFFFFFFF); + late Color secondaryText = const Color(0xFF000000); + late Color primaryBackground = const Color(0xFF171717); + late Color secondaryBackground = const Color(0xFF101818); + late Color accent1 = const Color(0xFFFFFFFF); + late Color accent2 = const Color(0x4D000000); + late Color accent3 = const Color(0xFFFFFFFF); + late Color accent4 = const Color(0xFF4A4A4A); + late Color success = const Color(0xFF1AAB5F); + late Color warning = const Color(0xFFF3C344); + late Color error = const Color(0xFFD70000); + late Color info = const Color(0xFFFFFFFF); + + late Color customColor1 = const Color(0xFFFFFFFF); + late Color customColor2 = const Color(0xFFFFFFFF); + late Color customColor3 = const Color(0xFF1AAB5F); + late Color customColor4 = const Color(0xFF232323); + late Color customColor5 = const Color(0xFF232323); +} + +extension TextStyleHelper on TextStyle { + TextStyle override({ + String? fontFamily, + Color? color, + double? fontSize, + FontWeight? fontWeight, + double? letterSpacing, + FontStyle? fontStyle, + bool useGoogleFonts = true, + TextDecoration? decoration, + double? lineHeight, + }) => + useGoogleFonts + ? GoogleFonts.getFont( + fontFamily!, + color: color ?? this.color, + fontSize: fontSize ?? this.fontSize, + letterSpacing: letterSpacing ?? this.letterSpacing, + fontWeight: fontWeight ?? this.fontWeight, + fontStyle: fontStyle ?? this.fontStyle, + decoration: decoration, + height: lineHeight, + ) + : copyWith( + fontFamily: fontFamily, + color: color, + fontSize: fontSize, + letterSpacing: letterSpacing, + fontWeight: fontWeight, + fontStyle: fontStyle, + decoration: decoration, + height: lineHeight, + ); +} diff --git a/lib/flutter_flow/flutter_flow_util.dart b/lib/flutter_flow/flutter_flow_util.dart new file mode 100644 index 00000000..f48a21ef --- /dev/null +++ b/lib/flutter_flow/flutter_flow_util.dart @@ -0,0 +1,562 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:collection/collection.dart'; +import 'package:from_css_color/from_css_color.dart'; +import 'dart:math' show pow, pi, sin; +import 'package:intl/intl.dart'; +import 'package:json_path/json_path.dart'; +import 'package:timeago/timeago.dart' as timeago; +import 'package:url_launcher/url_launcher.dart'; + +import '../main.dart'; + + +export 'lat_lng.dart'; +export 'place.dart'; +export 'uploaded_file.dart'; +export '../app_state.dart'; +export 'flutter_flow_model.dart'; +export 'dart:math' show min, max; +export 'dart:typed_data' show Uint8List; +export 'dart:convert' show jsonEncode, jsonDecode; +export 'package:intl/intl.dart'; +export 'package:page_transition/page_transition.dart'; +export 'custom_icons.dart' show FFIcons; +export 'internationalization.dart' show FFLocalizations; +export 'nav/nav.dart'; + +T valueOrDefault(T? value, T defaultValue) => + (value is String && value.isEmpty) || value == null ? defaultValue : value; + +void _setTimeagoLocales() { + timeago.setLocaleMessages('pt', timeago.PtBrMessages()); + timeago.setLocaleMessages('pt_short', timeago.PtBrShortMessages()); + timeago.setLocaleMessages('en', timeago.EnMessages()); + timeago.setLocaleMessages('en_short', timeago.EnShortMessages()); +} + +String dateTimeFormat(String format, DateTime? dateTime, {String? locale}) { + if (dateTime == null) { + return ''; + } + if (format == 'relative') { + _setTimeagoLocales(); + return timeago.format(dateTime, locale: locale, allowFromNow: true); + } + return DateFormat(format, locale).format(dateTime); +} + +Theme wrapInMaterialDatePickerTheme( + BuildContext context, + Widget child, { + required Color headerBackgroundColor, + required Color headerForegroundColor, + required TextStyle headerTextStyle, + required Color pickerBackgroundColor, + required Color pickerForegroundColor, + required Color selectedDateTimeBackgroundColor, + required Color selectedDateTimeForegroundColor, + required Color actionButtonForegroundColor, + required double iconSize, +}) { + final baseTheme = Theme.of(context); + final dateTimeMaterialStateForegroundColor = + MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return pickerForegroundColor.withOpacity(0.60); + } + if (states.contains(MaterialState.selected)) { + return selectedDateTimeForegroundColor; + } + if (states.isEmpty) { + return pickerForegroundColor; + } + return null; + }); + + final dateTimeMaterialStateBackgroundColor = + MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { + return selectedDateTimeBackgroundColor; + } + return null; + }); + + return Theme( + data: baseTheme.copyWith( + colorScheme: baseTheme.colorScheme.copyWith( + onSurface: pickerForegroundColor, + ), + disabledColor: pickerForegroundColor.withOpacity(0.3), + textTheme: baseTheme.textTheme.copyWith( + headlineSmall: headerTextStyle, + headlineMedium: headerTextStyle, + ), + iconTheme: baseTheme.iconTheme.copyWith( + size: iconSize, + ), + textButtonTheme: TextButtonThemeData( + style: ButtonStyle( + foregroundColor: MaterialStatePropertyAll( + actionButtonForegroundColor, + ), + overlayColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.hovered)) { + return actionButtonForegroundColor.withOpacity(0.04); + } + if (states.contains(MaterialState.focused) || + states.contains(MaterialState.pressed)) { + return actionButtonForegroundColor.withOpacity(0.12); + } + return null; + })), + ), + datePickerTheme: DatePickerThemeData( + backgroundColor: pickerBackgroundColor, + headerBackgroundColor: headerBackgroundColor, + headerForegroundColor: headerForegroundColor, + weekdayStyle: baseTheme.textTheme.labelMedium!.copyWith( + color: pickerForegroundColor, + ), + dayBackgroundColor: dateTimeMaterialStateBackgroundColor, + todayBackgroundColor: dateTimeMaterialStateBackgroundColor, + yearBackgroundColor: dateTimeMaterialStateBackgroundColor, + dayForegroundColor: dateTimeMaterialStateForegroundColor, + todayForegroundColor: dateTimeMaterialStateForegroundColor, + yearForegroundColor: dateTimeMaterialStateForegroundColor, + ), + ), + child: child, + ); +} + +Theme wrapInMaterialTimePickerTheme( + BuildContext context, + Widget child, { + required Color headerBackgroundColor, + required Color headerForegroundColor, + required TextStyle headerTextStyle, + required Color pickerBackgroundColor, + required Color pickerForegroundColor, + required Color selectedDateTimeBackgroundColor, + required Color selectedDateTimeForegroundColor, + required Color actionButtonForegroundColor, + required double iconSize, +}) { + final baseTheme = Theme.of(context); + return Theme( + data: baseTheme.copyWith( + iconTheme: baseTheme.iconTheme.copyWith( + size: iconSize, + ), + textButtonTheme: TextButtonThemeData( + style: ButtonStyle( + foregroundColor: MaterialStatePropertyAll( + actionButtonForegroundColor, + ), + overlayColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.hovered)) { + return actionButtonForegroundColor.withOpacity(0.04); + } + if (states.contains(MaterialState.focused) || + states.contains(MaterialState.pressed)) { + return actionButtonForegroundColor.withOpacity(0.12); + } + return null; + })), + ), + timePickerTheme: baseTheme.timePickerTheme.copyWith( + backgroundColor: pickerBackgroundColor, + hourMinuteTextColor: pickerForegroundColor, + dialHandColor: selectedDateTimeBackgroundColor, + dialTextColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? selectedDateTimeForegroundColor + : pickerForegroundColor), + dayPeriodBorderSide: BorderSide( + color: pickerForegroundColor, + ), + dayPeriodTextColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? selectedDateTimeForegroundColor + : pickerForegroundColor), + dayPeriodColor: MaterialStateColor.resolveWith((states) => + states.contains(MaterialState.selected) + ? selectedDateTimeBackgroundColor + : Colors.transparent), + entryModeIconColor: pickerForegroundColor, + ), + ), + child: child, + ); +} + +Future launchURL(String url) async { + var uri = Uri.parse(url); + try { + await launchUrl(uri); + } catch (e) { + throw 'Could not launch $uri: $e'; + } +} + +Color colorFromCssString(String color, {Color? defaultColor}) { + try { + return fromCssColor(color); + } catch (_) {} + return defaultColor ?? Colors.black; +} + +enum FormatType { + decimal, + percent, + scientific, + compact, + compactLong, + custom, +} + +enum DecimalType { + automatic, + periodDecimal, + commaDecimal, +} + +String formatNumber( + num? value, { + required FormatType formatType, + DecimalType? decimalType, + String? currency, + bool toLowerCase = false, + String? format, + String? locale, +}) { + if (value == null) { + return ''; + } + var formattedValue = ''; + switch (formatType) { + case FormatType.decimal: + switch (decimalType!) { + case DecimalType.automatic: + formattedValue = NumberFormat.decimalPattern().format(value); + break; + case DecimalType.periodDecimal: + formattedValue = NumberFormat.decimalPattern('en_US').format(value); + break; + case DecimalType.commaDecimal: + formattedValue = NumberFormat.decimalPattern('es_PA').format(value); + break; + } + break; + case FormatType.percent: + formattedValue = NumberFormat.percentPattern().format(value); + break; + case FormatType.scientific: + formattedValue = NumberFormat.scientificPattern().format(value); + if (toLowerCase) { + formattedValue = formattedValue.toLowerCase(); + } + break; + case FormatType.compact: + formattedValue = NumberFormat.compact().format(value); + break; + case FormatType.compactLong: + formattedValue = NumberFormat.compactLong().format(value); + break; + case FormatType.custom: + final hasLocale = locale != null && locale.isNotEmpty; + formattedValue = + NumberFormat(format, hasLocale ? locale : null).format(value); + } + + if (formattedValue.isEmpty) { + return value.toString(); + } + + if (currency != null) { + final currencySymbol = currency.isNotEmpty + ? currency + : NumberFormat.simpleCurrency().format(0.0).substring(0, 1); + formattedValue = '$currencySymbol$formattedValue'; + } + + return formattedValue; +} + +DateTime get getCurrentTimestamp => DateTime.now(); +DateTime dateTimeFromSecondsSinceEpoch(int seconds) { + return DateTime.fromMillisecondsSinceEpoch(seconds * 1000); +} + +extension DateTimeConversionExtension on DateTime { + int get secondsSinceEpoch => (millisecondsSinceEpoch / 1000).round(); +} + +extension DateTimeComparisonOperators on DateTime { + bool operator <(DateTime other) => isBefore(other); + bool operator >(DateTime other) => isAfter(other); + bool operator <=(DateTime other) => this < other || isAtSameMomentAs(other); + bool operator >=(DateTime other) => this > other || isAtSameMomentAs(other); +} + +T? castToType(dynamic value) { + if (value == null) { + return null; + } + switch (T) { + case double: + // Doubles may be stored as ints in some cases. + return value.toDouble() as T; + case int: + // Likewise, ints may be stored as doubles. If this is the case + // (i.e. no decimal value), return the value as an int. + if (value is num && value.toInt() == value) { + return value.toInt() as T; + } + break; + default: + break; + } + return value as T; +} + +dynamic getJsonField( + dynamic response, + String jsonPath, [ + bool isForList = false, +]) { + final field = JsonPath(jsonPath).read(response); + if (field.isEmpty) { + return null; + } + if (field.length > 1) { + return field.map((f) => f.value).toList(); + } + final value = field.first.value; + if (isForList) { + return value is! Iterable + ? [value] + : (value is List ? value : value.toList()); + } + return value; +} + +Rect? getWidgetBoundingBox(BuildContext context) { + try { + final renderBox = context.findRenderObject() as RenderBox?; + return renderBox!.localToGlobal(Offset.zero) & renderBox.size; + } catch (_) { + return null; + } +} + +bool get isAndroid => !kIsWeb && Platform.isAndroid; +bool get isiOS => !kIsWeb && Platform.isIOS; +bool get isWeb => kIsWeb; + +const kBreakpointSmall = 479.0; +const kBreakpointMedium = 767.0; +const kBreakpointLarge = 991.0; +bool isMobileWidth(BuildContext context) => + MediaQuery.sizeOf(context).width < kBreakpointSmall; +bool responsiveVisibility({ + required BuildContext context, + bool phone = true, + bool tablet = true, + bool tabletLandscape = true, + bool desktop = true, +}) { + final width = MediaQuery.sizeOf(context).width; + if (width < kBreakpointSmall) { + return phone; + } else if (width < kBreakpointMedium) { + return tablet; + } else if (width < kBreakpointLarge) { + return tabletLandscape; + } else { + return desktop; + } +} + +const kTextValidatorUsernameRegex = r'^[a-zA-Z][a-zA-Z0-9_-]{2,16}$'; +// https://stackoverflow.com/a/201378 +const kTextValidatorEmailRegex = + "^(?:[a-zA-Z0-9!#\$%&\'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#\$%&\'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])\$"; +const kTextValidatorWebsiteRegex = + r'(https?:\/\/)?(www\.)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,10}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)|(https?:\/\/)?(www\.)?(?!ww)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,10}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)'; + +extension FFTextEditingControllerExt on TextEditingController? { + String get text => this == null ? '' : this!.text; + set text(String newText) => this?.text = newText; +} + +extension IterableExt on Iterable { + List sortedList([S Function(T)? keyOf]) => toList() + ..sort(keyOf == null ? null : ((a, b) => keyOf(a).compareTo(keyOf(b)))); + + List mapIndexed(S Function(int, T) func) => toList() + .asMap() + .map((index, value) => MapEntry(index, func(index, value))) + .values + .toList(); +} + +void setAppLanguage(BuildContext context, String language) => + MyApp.of(context).setLocale(language); + +void setDarkModeSetting(BuildContext context, ThemeMode themeMode) => + MyApp.of(context).setThemeMode(themeMode); + +void showSnackbar( + BuildContext context, + String message, { + bool loading = false, + int duration = 4, +}) { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Row( + children: [ + if (loading) + const Padding( + padding: EdgeInsetsDirectional.only(end: 10.0), + child: SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + color: Colors.white, + ), + ), + ), + Text(message), + ], + ), + duration: Duration(seconds: duration), + ), + ); +} + +extension FFStringExt on String { + String maybeHandleOverflow({int? maxChars, String replacement = ''}) => + maxChars != null && length > maxChars + ? replaceRange(maxChars, null, replacement) + : this; +} + +extension ListFilterExt on Iterable { + List get withoutNulls => where((s) => s != null).map((e) => e!).toList(); +} + +extension MapListContainsExt on List { + bool containsMap(dynamic map) => map is Map + ? any((e) => e is Map && const DeepCollectionEquality().equals(e, map)) + : contains(map); +} + +extension ListDivideExt on Iterable { + Iterable> get enumerate => toList().asMap().entries; + + List divide(Widget t, {bool Function(int)? filterFn}) => isEmpty + ? [] + : (enumerate + .map((e) => [e.value, if (filterFn == null || filterFn(e.key)) t]) + .expand((i) => i) + .toList() + ..removeLast()); + + List around(Widget t) => addToStart(t).addToEnd(t); + + List addToStart(Widget t) => + enumerate.map((e) => e.value).toList()..insert(0, t); + + List addToEnd(Widget t) => + enumerate.map((e) => e.value).toList()..add(t); + + List paddingTopEach(double val) => + map((w) => Padding(padding: EdgeInsets.only(top: val), child: w)) + .toList(); +} + +extension StatefulWidgetExtensions on State { + /// Check if the widget exist before safely setting state. + void safeSetState(VoidCallback fn) { + if (mounted) { + // ignore: invalid_use_of_protected_member + setState(fn); + } + } +} + +// For iOS 16 and below, set the status bar color to match the app's theme. +// https://github.com/flutter/flutter/issues/41067 +Brightness? _lastBrightness; +void fixStatusBarOniOS16AndBelow(BuildContext context) { + if (!isiOS) { + return; + } + final brightness = Theme.of(context).brightness; + if (_lastBrightness != brightness) { + _lastBrightness = brightness; + SystemChrome.setSystemUIOverlayStyle( + SystemUiOverlayStyle( + statusBarBrightness: brightness, + systemStatusBarContrastEnforced: true, + ), + ); + } +} + +extension ListUniqueExt on Iterable { + List unique(dynamic Function(T) getKey) { + var distinctSet = {}; + var distinctList = []; + for (var item in this) { + if (distinctSet.add(getKey(item))) { + distinctList.add(item); + } + } + return distinctList; + } +} + +String roundTo(double value, int decimalPoints) { + final power = pow(10, decimalPoints); + return ((value * power).round() / power).toString(); +} + +double computeGradientAlignmentX(double evaluatedAngle) { + evaluatedAngle %= 360; + final rads = evaluatedAngle * pi / 180; + double x; + if (evaluatedAngle < 45 || evaluatedAngle > 315) { + x = sin(2 * rads); + } else if (45 <= evaluatedAngle && evaluatedAngle <= 135) { + x = 1; + } else if (135 <= evaluatedAngle && evaluatedAngle <= 225) { + x = sin(-2 * rads); + } else { + x = -1; + } + return double.parse(roundTo(x, 2)); +} + +double computeGradientAlignmentY(double evaluatedAngle) { + evaluatedAngle %= 360; + final rads = evaluatedAngle * pi / 180; + double y; + if (evaluatedAngle < 45 || evaluatedAngle > 315) { + y = -1; + } else if (45 <= evaluatedAngle && evaluatedAngle <= 135) { + y = sin(-2 * rads); + } else if (135 <= evaluatedAngle && evaluatedAngle <= 225) { + y = 1; + } else { + y = sin(2 * rads); + } + return double.parse(roundTo(y, 2)); +} diff --git a/lib/flutter_flow/flutter_flow_widgets.dart b/lib/flutter_flow/flutter_flow_widgets.dart new file mode 100644 index 00000000..6cfe3d67 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_widgets.dart @@ -0,0 +1,285 @@ +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:flutter/material.dart'; +import 'package:auto_size_text/auto_size_text.dart'; + +class FFButtonOptions { + const FFButtonOptions({ + this.textStyle, + this.elevation, + this.height, + this.width, + this.padding, + this.color, + this.disabledColor, + this.disabledTextColor, + this.splashColor, + this.iconSize, + this.iconColor, + this.iconPadding, + this.borderRadius, + this.borderSide, + this.hoverColor, + this.hoverBorderSide, + this.hoverTextColor, + this.hoverElevation, + this.maxLines, + }); + + final TextStyle? textStyle; + final double? elevation; + final double? height; + final double? width; + final EdgeInsetsGeometry? padding; + final Color? color; + final Color? disabledColor; + final Color? disabledTextColor; + final int? maxLines; + final Color? splashColor; + final double? iconSize; + final Color? iconColor; + final EdgeInsetsGeometry? iconPadding; + final BorderRadius? borderRadius; + final BorderSide? borderSide; + final Color? hoverColor; + final BorderSide? hoverBorderSide; + final Color? hoverTextColor; + final double? hoverElevation; +} + +class FFButtonWidget extends StatefulWidget { + const FFButtonWidget({ + super.key, + required this.text, + required this.onPressed, + this.icon, + this.iconData, + required this.options, + this.showLoadingIndicator = true, + }); + + final String text; + final Widget? icon; + final IconData? iconData; + final Function()? onPressed; + final FFButtonOptions options; + final bool showLoadingIndicator; + + @override + State createState() => _FFButtonWidgetState(); +} + +class _FFButtonWidgetState extends State { + bool loading = false; + + int get maxLines => widget.options.maxLines ?? 1; + String? get text => + widget.options.textStyle?.fontSize == 0 ? null : widget.text; + + @override + Widget build(BuildContext context) { + Widget textWidget = loading + ? SizedBox( + width: widget.options.width == null + ? _getTextWidth(text, widget.options.textStyle, maxLines) + : null, + child: Center( + child: SizedBox( + width: 23, + height: 23, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + widget.options.textStyle?.color ?? Colors.white, + ), + ), + ), + ), + ) + : AutoSizeText( + text ?? '', + style: + text == null ? null : widget.options.textStyle?.withoutColor(), + maxLines: maxLines, + overflow: TextOverflow.ellipsis, + ); + + final onPressed = widget.onPressed != null + ? (widget.showLoadingIndicator + ? () async { + if (loading) { + return; + } + setState(() => loading = true); + try { + await widget.onPressed!(); + } finally { + if (mounted) { + setState(() => loading = false); + } + } + } + : () => widget.onPressed!()) + : null; + + ButtonStyle style = ButtonStyle( + shape: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.hovered) && + widget.options.hoverBorderSide != null) { + return RoundedRectangleBorder( + borderRadius: + widget.options.borderRadius ?? BorderRadius.circular(8), + side: widget.options.hoverBorderSide!, + ); + } + return RoundedRectangleBorder( + borderRadius: + widget.options.borderRadius ?? BorderRadius.circular(8), + side: widget.options.borderSide ?? BorderSide.none, + ); + }, + ), + foregroundColor: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.disabled) && + widget.options.disabledTextColor != null) { + return widget.options.disabledTextColor; + } + if (states.contains(MaterialState.hovered) && + widget.options.hoverTextColor != null) { + return widget.options.hoverTextColor; + } + return widget.options.textStyle?.color ?? Colors.white; + }, + ), + backgroundColor: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.disabled) && + widget.options.disabledColor != null) { + return widget.options.disabledColor; + } + if (states.contains(MaterialState.hovered) && + widget.options.hoverColor != null) { + return widget.options.hoverColor; + } + return widget.options.color; + }, + ), + overlayColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.pressed)) { + return widget.options.splashColor; + } + return widget.options.hoverColor == null ? null : Colors.transparent; + }), + padding: MaterialStateProperty.all(widget.options.padding ?? + const EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0)), + elevation: MaterialStateProperty.resolveWith( + (states) { + if (states.contains(MaterialState.hovered) && + widget.options.hoverElevation != null) { + return widget.options.hoverElevation!; + } + return widget.options.elevation ?? 2.0; + }, + ), + ); + + if ((widget.icon != null || widget.iconData != null) && !loading) { + Widget icon = widget.icon ?? + FaIcon( + widget.iconData!, + size: widget.options.iconSize, + color: widget.options.iconColor, + ); + + if (text == null) { + return Container( + height: widget.options.height, + width: widget.options.width, + decoration: BoxDecoration( + border: Border.fromBorderSide( + widget.options.borderSide ?? BorderSide.none, + ), + borderRadius: + widget.options.borderRadius ?? BorderRadius.circular(8), + ), + child: IconButton( + splashRadius: 1.0, + icon: Padding( + padding: widget.options.iconPadding ?? EdgeInsets.zero, + child: icon, + ), + onPressed: onPressed, + style: style, + ), + ); + } + return SizedBox( + height: widget.options.height, + width: widget.options.width, + child: ElevatedButton.icon( + icon: Padding( + padding: widget.options.iconPadding ?? EdgeInsets.zero, + child: icon, + ), + label: textWidget, + onPressed: onPressed, + style: style, + ), + ); + } + + return SizedBox( + height: widget.options.height, + width: widget.options.width, + child: ElevatedButton( + onPressed: onPressed, + style: style, + child: textWidget, + ), + ); + } +} + +extension _WithoutColorExtension on TextStyle { + TextStyle withoutColor() => TextStyle( + inherit: inherit, + color: null, + backgroundColor: backgroundColor, + fontSize: fontSize, + fontWeight: fontWeight, + fontStyle: fontStyle, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + textBaseline: textBaseline, + height: height, + leadingDistribution: leadingDistribution, + locale: locale, + foreground: foreground, + background: background, + shadows: shadows, + fontFeatures: fontFeatures, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + debugLabel: debugLabel, + fontFamily: fontFamily, + fontFamilyFallback: fontFamilyFallback, + // The _package field is private so unfortunately we can't set it here, + // but it's almost always unset anyway. + // package: _package, + overflow: overflow, + ); +} + +// Slightly hacky method of getting the layout width of the provided text. +double? _getTextWidth(String? text, TextStyle? style, int maxLines) => + text != null + ? (TextPainter( + text: TextSpan(text: text, style: style), + textDirection: TextDirection.ltr, + maxLines: maxLines, + )..layout()) + .size + .width + : null; diff --git a/lib/flutter_flow/form_field_controller.dart b/lib/flutter_flow/form_field_controller.dart new file mode 100644 index 00000000..adcd778e --- /dev/null +++ b/lib/flutter_flow/form_field_controller.dart @@ -0,0 +1,10 @@ +import 'package:flutter/foundation.dart'; + +class FormFieldController extends ValueNotifier { + FormFieldController(this.initialValue) : super(initialValue); + + final T? initialValue; + + void reset() => value = initialValue; + void update() => notifyListeners(); +} diff --git a/lib/flutter_flow/internationalization.dart b/lib/flutter_flow/internationalization.dart new file mode 100644 index 00000000..b4a5794a --- /dev/null +++ b/lib/flutter_flow/internationalization.dart @@ -0,0 +1,1127 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +const _kLocaleStorageKey = '__locale_key__'; + +class FFLocalizations { + FFLocalizations(this.locale); + + final Locale locale; + + static FFLocalizations of(BuildContext context) => + Localizations.of(context, FFLocalizations)!; + + static List languages() => ['pt', 'en']; + + static late SharedPreferences _prefs; + static Future initialize() async => + _prefs = await SharedPreferences.getInstance(); + static Future storeLocale(String locale) => + _prefs.setString(_kLocaleStorageKey, locale); + static Locale? getStoredLocale() { + final locale = _prefs.getString(_kLocaleStorageKey); + return locale != null && locale.isNotEmpty ? createLocale(locale) : null; + } + + String get languageCode => locale.toString(); + String? get languageShortCode => + _languagesWithShortCode.contains(locale.toString()) + ? '${locale.toString()}_short' + : null; + int get languageIndex => languages().contains(languageCode) + ? languages().indexOf(languageCode) + : 0; + + String getText(String key) => + (kTranslationsMap[key] ?? {})[locale.toString()] ?? ''; + + String getVariableText({ + String? ptText = '', + String? enText = '', + }) => + [ptText, enText][languageIndex] ?? ''; + + static const Set _languagesWithShortCode = { + 'ar', + 'az', + 'ca', + 'cs', + 'da', + 'de', + 'dv', + 'en', + 'es', + 'et', + 'fi', + 'fr', + 'gr', + 'he', + 'hi', + 'hu', + 'it', + 'km', + 'ku', + 'mn', + 'ms', + 'no', + 'pt', + 'ro', + 'ru', + 'rw', + 'sv', + 'th', + 'uk', + 'vi', + }; +} + +class FFLocalizationsDelegate extends LocalizationsDelegate { + const FFLocalizationsDelegate(); + + @override + bool isSupported(Locale locale) { + final language = locale.toString(); + return FFLocalizations.languages().contains( + language.endsWith('_') + ? language.substring(0, language.length - 1) + : language, + ); + } + + @override + Future load(Locale locale) => + SynchronousFuture(FFLocalizations(locale)); + + @override + bool shouldReload(FFLocalizationsDelegate old) => false; +} + +Locale createLocale(String language) => language.contains('_') + ? Locale.fromSubtags( + languageCode: language.split('_').first, + scriptCode: language.split('_').last, + ) + : Locale(language); + +final kTranslationsMap = >>[ + // LoginPage + { + '0113wf5c': { + 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', + 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', + }, + 'f2go5a71': { + 'pt': 'Email', + 'en': 'Email', + }, + 'paon3y0v': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'wmbzwstw': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'j8567afe': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'y3wd9q18': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'j6ufb6sq': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'h85112qs': { + 'pt': 'Você esqueceu a sua senha?', + 'en': 'Have you forgotten your password?', + }, + 'di48hdaj': { + 'pt': ' Recupere aqui', + 'en': 'recover here', + }, + 'gx2fp6zq': { + 'pt': 'Termo de Uso', + 'en': 'Terms of use', + }, + 'ef5lm94r': { + 'pt': 'Home', + 'en': '', + }, + }, + // ForgotPasswordPage + { + 'gfvplb0h': { + 'pt': 'ESQUECEU SUA SENHA?', + 'en': 'FORGOT YOUR PASSWORD?', + }, + 'azssgpdi': { + 'pt': + 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', + 'en': + 'Don\'t worry, we will help you, enter the email registered in the application and click send.', + }, + '0o139961': { + 'pt': 'Email', + 'en': 'Email', + }, + 'aanw1fp3': { + 'pt': 'digite o seu email.....', + 'en': 'enter your email.....', + }, + 'e7hdgc4q': { + 'pt': 'Enviar', + 'en': 'To send', + }, + '3xnxor0t': { + 'pt': 'Home', + 'en': '', + }, + }, + // homePage + { + 'lyiat6s2': { + 'pt': 'NOME DO MORADOR', + 'en': 'RESIDENT\'S NAME', + }, + '3jgvv75o': { + 'pt': '', + 'en': '', + }, + 'dlaeicxd': { + 'pt': 'Auto-Visita', + 'en': 'Self-Visit', + }, + '53jd930v': { + 'pt': 'Condominio', + 'en': 'Condominium', + }, + 'ptsx0rln': { + 'pt': 'Cadastrar Pet', + 'en': 'Register Pet', + }, + 'rgxgw626': { + 'pt': 'Cadastrar Visitante', + 'en': 'Register Visitor', + }, + 'j2tn9lpw': { + 'pt': 'QR Code de Acesso', + 'en': 'Access QR Code', + }, + '9weuwgs1': { + 'pt': 'Histórico de Acesso', + 'en': 'Access History', + }, + 'vuk5bjau': { + 'pt': 'Agendar Visita', + 'en': 'Schedule Visit', + }, + 'xx0db4wi': { + 'pt': 'Sair', + 'en': 'Logout', + }, + 'rg9pzkpz': { + 'pt': 'FRE ACCESS', + 'en': 'FREE ACCESS', + }, + 'mp6igsok': { + 'pt': 'Home', + 'en': '', + }, + }, + // RegisterPage + { + '2d8uulm3': { + 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', + 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', + }, + '8kjhi406': { + 'pt': 'Nome', + 'en': 'Name', + }, + 'ro4zkkxp': { + 'pt': 'Email', + 'en': 'Email', + }, + 'j5yny8ee': { + 'pt': '', + 'en': '', + }, + 'lzgobioa': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'c7sfyeh8': { + 'pt': 'Cadastrar-se', + 'en': 'Sign-Up', + }, + 'jglpa1tr': { + 'pt': 'Você já tem uma conta? ', + 'en': 'You already have an account?', + }, + 'hfcm0td9': { + 'pt': 'Clique aqui', + 'en': 'Click here', + }, + 'c3kno4t9': { + 'pt': 'Termo de Uso', + 'en': '', + }, + 'tzy6n0n4': { + 'pt': 'Home', + 'en': '', + }, + }, + // WelcomePage + { + 'xflxvs9y': { + 'pt': 'UMA EXPERIÊCIA COMPLETA', + 'en': 'A COMPLETE EXPERIENCE', + }, + '5a86wzd1': { + 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', + 'en': 'WITH COMFORT WHEREVER YOU ARE.', + }, + '65nuva6j': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + '9u6oaw01': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'd1qem43w': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'bhowzv2u': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'qls72pio': { + 'pt': 'Home', + 'en': '', + }, + }, + // registerVisitorPage + { + 'q8cct5lk': { + 'pt': 'Cadastrar Visitante', + 'en': 'Register Visitor', + }, + 'p4ftwxcy': { + 'pt': 'Clique para adicionar a foto para o visitante', + 'en': 'Click to add photo for visitor', + }, + 'zazj5d8b': { + 'pt': 'Preencha o formulário com os dados do visitante', + 'en': 'Fill in the form with the visitor\'s data', + }, + 'v7g73yik': { + 'pt': 'Nome', + 'en': 'Name', + }, + 'yp23q90m': { + 'pt': 'Selecione o tipo:', + 'en': 'Select type:', + }, + 'n8vddmcq': { + 'pt': 'Visitante ', + 'en': 'Visitor', + }, + '9luaa09e': { + 'pt': 'Prestador de Serviço', + 'en': 'Service provider', + }, + 'pmezihb4': { + 'pt': 'Selecione...', + 'en': 'Please select...', + }, + 'yza6i4t7': { + 'pt': 'Search for an item...', + 'en': '', + }, + 'rl8tvwnr': { + 'pt': 'Documento', + 'en': 'Document', + }, + 'bqpucwh0': { + 'pt': 'Contatos', + 'en': 'Contacts', + }, + 'h84ls2r6': { + 'pt': 'Telefone', + 'en': 'Telephone', + }, + 'fqp7qmka': { + 'pt': 'Email', + 'en': 'Email', + }, + 'okbw0aiu': { + 'pt': 'Cadastrar', + 'en': 'Register', + }, + 'xtcz66ar': { + 'pt': 'registerVisitor', + 'en': '', + }, + }, + // scheduleCompleteVisitPage + { + 'qo0pg2at': { + 'pt': 'Quais visitantes você deseja cadastrar?', + 'en': 'Which visitors do you want to register?', + }, + 'i0jhuu3e': { + 'pt': 'Clique para adicionar um visitante', + 'en': 'Click to add a visitor', + }, + 'z4ry3tge': { + 'pt': 'Qual o período de validade da visita?', + 'en': 'Visit Validity Period', + }, + 'hjp5mzbd': { + 'pt': 'Inicio da Visita', + 'en': 'Start of Visit', + }, + '2in5sljf': { + 'pt': '', + 'en': 'End of Visit', + }, + 'ce6xryf4': { + 'pt': 'Quando você inicia a visita?', + 'en': 'When do you start the visit?', + }, + 'jwsbk0xu': { + 'pt': 'Fim da Visita', + 'en': 'End of Visit', + }, + '87rlxmbk': { + 'pt': '', + 'en': 'End of Visit', + }, + 'lyfe46f6': { + 'pt': 'Quando a visita terminá?', + 'en': 'When will the visit end?', + }, + 'p81uol2v': { + 'pt': 'Quais são os motivos da visita?', + 'en': 'What are the reasons for the visit?', + }, + 'bbauep0b': { + 'pt': 'Motivo da Visita', + 'en': 'End of Visit', + }, + 'x1ij847i': { + 'pt': 'Escolha um motivo aqui', + 'en': 'Choose a reason here', + }, + 'ejyyypuz': { + 'pt': 'Search for an item...', + 'en': '', + }, + 'etzbm8l5': { + 'pt': 'Nível de Acesso', + 'en': 'End of Visit', + }, + 'kmgv5j7x': { + 'pt': 'Escolha um nível de acesso aqui', + 'en': 'Choose an access level here', + }, + 'izwi0ya7': { + 'pt': 'Search for an item...', + 'en': '', + }, + 'mddp33o0': { + 'pt': 'Visita se encerra após o primeiro acesso?', + 'en': 'Does the visit end after the first access?', + }, + '68j9gw4h': { + 'pt': 'Visita única', + 'en': 'Single visit', + }, + '9rudpkq7': { + 'pt': 'Você tem alguma observação sobre está visita?', + 'en': 'Do you have any observations about this visit?', + }, + '4rgpxrfe': { + 'pt': 'Observações da Visita', + 'en': 'Visit Observations', + }, + '7knytis2': { + 'pt': 'Escreva as suas observações aqui', + 'en': 'Write your observations here', + }, + 'bvioevav': { + 'pt': 'Ativo', + 'en': 'Active', + }, + '295oz5is': { + 'pt': '16/10/2024', + 'en': '16/10/2024', + }, + '07h0w8ki': { + 'pt': '16/10/2024', + 'en': '16/10/2024', + }, + 'd34nuw4w': { + 'pt': 'Visitante:', + 'en': 'Visitor:', + }, + 'y8geteyc': { + 'pt': ' Lucas Martin Mota', + 'en': 'Lucas Martin Mota', + }, + 'gxdykms1': { + 'pt': 'Morador:', + 'en': 'Resident:', + }, + 'ue7wkm9r': { + 'pt': ' Lucas Martin Mota', + 'en': 'Lucas Martin Mota', + }, + 'zs8s0wd3': { + 'pt': 'Validade:', + 'en': 'Validity:', + }, + 'z7fset9r': { + 'pt': ' 16/10/2024 a 16/10/2024', + 'en': ' 16/10/2024 a 16/10/2024', + }, + 'fcb5avae': { + 'pt': 'Agendamento Ativo', + 'en': 'Active Scheduling', + }, + '61lcxdgm': { + 'pt': 'Agendar Visita', + 'en': 'Schedule Visit', + }, + 'v3mpyspm': { + 'pt': 'scheduleVisit', + 'en': '', + }, + }, + // scheduleProvisionalVisitPage + { + 'n7bbd202': { + 'pt': 'Agendamento Provisório', + 'en': 'Provisional Scheduling', + }, + 'i4xujgbn': { + 'pt': 'Visita Provisória', + 'en': 'Provisional Visit', + }, + 'x7at46ur': { + 'pt': 'Quais visitantes você deseja cadastrar?', + 'en': 'Which visitors do you want to register?', + }, + 'shj19b2o': { + 'pt': 'Qual o período de validade da visita?', + 'en': 'Visit Validity Period', + }, + '8zgsw5so': { + 'pt': 'Ínicio da Visita', + 'en': 'Start of the Visit', + }, + 'p16wm7kp': { + 'pt': 'Quando a visitas se inicia?', + 'en': 'When does the visit start?', + }, + '3zfd7uf9': { + 'pt': 'Qual o nome do visitante?', + 'en': 'What is the visitor\'s name?', + }, + 'wehvxbz4': { + 'pt': 'Nome do Visitante', + 'en': 'Visitor Name', + }, + 'juh7f24w': { + 'pt': 'Escreva o nome do visitante aqui', + 'en': 'Write the visitor\'s name here', + }, + 'jhss056s': { + 'pt': 'Você tem alguma observação sobre está visita?', + 'en': 'Do you have any observations about this visit?', + }, + 'cw8b3tbb': { + 'pt': 'Observações da Visita', + 'en': 'Visit Observations', + }, + 'k4qkbv1f': { + 'pt': 'Escreva as suas observações aqui', + 'en': 'Write your observations here', + }, + 'lhzhh2jb': { + 'pt': 'scheduleVisit', + 'en': '', + }, + }, + // onBoardingPage + { + '6exl3e75': { + 'pt': 'Home', + 'en': '', + }, + }, + // fastPassPage + { + 'koh6s96f': { + 'pt': 'Home', + 'en': '', + }, + }, + // visitorDetailsModal + { + 'kqzf7nx2': { + 'pt': 'Nome do Visitante', + 'en': 'Visitor Name', + }, + 'hz7ivuqn': { + 'pt': 'Tipo de Visitante', + 'en': 'Visitor Type', + }, + 'rwqn0det': { + 'pt': '(00) 0 0000-0000', + 'en': 'Telephone', + }, + '0wqbiekp': { + 'pt': 'email@provider.etc', + 'en': 'Email', + }, + }, + // throwException + { + 'e58xxxiq': { + 'pt': 'ERRO', + 'en': 'ERROR', + }, + }, + // regisiterVistorComponent + { + 'wnhkedzt': { + 'pt': 'Cadastrar Visitante', + 'en': 'Register Visitor', + }, + 'kpd31z4d': { + 'pt': 'Clique para adicionar a foto para o visitante', + 'en': 'Click to add photo for visitor', + }, + 'q986vs4m': { + 'pt': 'Preencha o formulário com os dados do visitante', + 'en': 'Fill in the form with the visitor\'s data', + }, + 'llcw2tei': { + 'pt': 'Nome', + 'en': 'Name', + }, + '67ykbznt': { + 'pt': 'Selecione o tipo:', + 'en': 'Select type:', + }, + 'ugjkeiz7': { + 'pt': 'Visitante ', + 'en': 'Visitor', + }, + '8nlk5xlk': { + 'pt': 'Prestador de Serviço', + 'en': 'Service provider', + }, + 'kw07i43y': { + 'pt': 'Selecione...', + 'en': 'Please select...', + }, + 'e887o707': { + 'pt': 'Search for an item...', + 'en': '', + }, + '96ayre48': { + 'pt': 'Documento', + 'en': 'Document', + }, + 'j0g7ggs2': { + 'pt': 'Contatos', + 'en': 'Contacts', + }, + 'ybdjabnd': { + 'pt': 'Telefone', + 'en': 'Telephone', + }, + 'tlr6uxo4': { + 'pt': 'Email', + 'en': 'Email', + }, + '65puvap9': { + 'pt': 'Cadastrar', + 'en': 'Register', + }, + }, + // visitorSearchComponent + { + 'cjlpru1m': { + 'pt': 'Procure pelo documento do visitante ', + 'en': 'Search for the visitor\'s document', + }, + '8i1qszba': { + 'pt': 'test', + 'en': '', + }, + 'oj12tamm': { + 'pt': 'test', + 'en': '', + }, + '9coywebh': { + 'pt': 'Visitantes encontrados', + 'en': 'Visitors Found', + }, + '6f5p0fv6': { + 'pt': '24', + 'en': '24', + }, + 'ug6qzyla': { + 'pt': 'Adicionar', + 'en': 'To add', + }, + }, + // visitorNotFoundComponent + { + '1p9mykbj': { + 'pt': 'Usuário não encontrado', + 'en': 'User not found', + }, + 'kt937sp6': { + 'pt': + 'O documento inserido não corresponde a nenhum usuário cadastrado no sistema. Verifique o documento inserido ou adicione um novo visitante ao sistema.', + 'en': + 'The document inserted does not correspond to any user registered in the system. Check the inserted document or add a new visitor to the system.', + }, + 'y2x4nfcn': { + 'pt': 'Adicionar ', + 'en': 'To add', + }, + }, + // viewVisitDetail + { + '9yu35pzg': { + 'pt': 'Encerramento da Visita', + 'en': 'Closing of the Visit', + }, + 'aj6scczp': { + 'pt': 'Início', + 'en': 'Start', + }, + 'ub084nhy': { + 'pt': 'dd/mm/yyyy', + 'en': 'dd/mm/yyyy', + }, + 'rvi5z7wg': { + 'pt': 'Término', + 'en': 'Termination', + }, + 'ixs67mrz': { + 'pt': 'dd/mm/yyyy', + 'en': 'dd/mm/yyyy', + }, + 'yxilg7ek': { + 'pt': 'Motivo da Visita', + 'en': 'Start of the Visit', + }, + 'ypeydbem': { + 'pt': 'Motivo', + 'en': 'Reason', + }, + 'dgr3pk3a': { + 'pt': 'Nível de Acesso', + 'en': 'Access Level', + }, + 'rs3d4gb8': { + 'pt': 'Nível de Acesso', + 'en': '', + }, + 'lppn9rxa': { + 'pt': 'Observações da Visita', + 'en': 'Visit Observations', + }, + }, + // scheduleVisitDetail + { + '7w4fohoa': { + 'pt': 'Encerramento da Visita', + 'en': 'Closing of the Visit', + }, + 'snah4iet': { + 'pt': 'Início', + 'en': 'Start', + }, + '0cp1e31d': { + 'pt': 'dd/mm/yyyy', + 'en': 'dd/mm/yyyy', + }, + 'abppdgz3': { + 'pt': 'Término', + 'en': 'Termination', + }, + 'kqralft4': { + 'pt': 'dd/mm/yyyy', + 'en': 'dd/mm/yyyy', + }, + 'xjxhzqqm': { + 'pt': 'Motivo da Visita', + 'en': 'Start of the Visit', + }, + '47oezdm6': { + 'pt': 'Motivo', + 'en': 'Reason', + }, + '2ujg7u18': { + 'pt': 'Nível de Acesso', + 'en': 'Access Level', + }, + '3emmbbfv': { + 'pt': 'Nível de Acesso', + 'en': '', + }, + 'ritce5uw': { + 'pt': 'Observações da Visita', + 'en': 'Visit Observations', + }, + }, + // optionSelectionModal + { + 'omxabblt': { + 'pt': 'Agenda \nRápida', + 'en': 'Schedule \nQuick', + }, + 'vpy51li0': { + 'pt': 'Agenda\nProvisória', + 'en': 'Schedule\nProvisional', + }, + '8ad3hms9': { + 'pt': 'Agenda\nCompleta', + 'en': 'Schedule\nComplete', + }, + }, + // menuListViewComponent + { + 'utgue9a5': { + 'pt': 'Agendar \nVisita', + 'en': 'Schedule \nVisit', + }, + '82b5f8yz': { + 'pt': 'Cadastrar\nVisitante', + 'en': 'Register\nVisitor', + }, + 't4ie13ut': { + 'pt': 'Vincular \nCondomínio', + 'en': 'Link\nCondominium', + }, + 'n3n76pha': { + 'pt': 'Cadastrar \nPet', + 'en': 'Register\npet', + }, + 'l6b9o7yn': { + 'pt': 'QR Code \nde Acesso', + 'en': 'QR Code\nAccess', + }, + }, + // menuStaggeredViewComponent + { + 'ee33l0ms': { + 'pt': 'Agendar \nVisita', + 'en': 'Schedule \nVisit', + }, + 'ya37l3jt': { + 'pt': 'Cadastrar\n Visitante', + 'en': 'Register\n Visitor', + }, + 'h8s3adu8': { + 'pt': 'Vincular\nCondomínio', + 'en': 'Link\nCondominium', + }, + 'j6tfixen': { + 'pt': 'Cadastrar\nPet', + 'en': 'Register\npet', + }, + '9tli4i2x': { + 'pt': 'QR Code\nde Acesso', + 'en': 'QR Code\nAccess', + }, + }, + // messageWellComponent + { + '8fworxmb': { + 'pt': 'Mural de Mensagens', + 'en': 'Message Wall', + }, + 'yikill36': { + 'pt': 'Todos', + 'en': 'All', + }, + }, + // signInComponent + { + '9hbdjxrz': { + 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', + 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', + }, + '1ltg0ylb': { + 'pt': 'Email', + 'en': 'Email', + }, + '2x19ce8k': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'k44tm7wo': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + '14u7ipws': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + '1x926nsn': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'jwvd4ai1': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + '05dx91ku': { + 'pt': 'Você esqueceu a sua senha?', + 'en': 'Have you forgotten your password?', + }, + 'p5c6d54y': { + 'pt': ' Recupere aqui', + 'en': 'recover here', + }, + 'olf967cj': { + 'pt': 'Termo de Uso', + 'en': 'Terms of use', + }, + }, + // signUpComponent + { + '49609olv': { + 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', + 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', + }, + '3corpwhd': { + 'pt': 'Nome', + 'en': 'Name', + }, + '80wonb69': { + 'pt': 'Email', + 'en': 'Email', + }, + 'ws143wf4': { + 'pt': '', + 'en': '', + }, + '0firji8l': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'rnvdwzei': { + 'pt': 'Cadastrar-se', + 'en': 'Sign-Up', + }, + 'a9smhn5b': { + 'pt': 'Você já tem uma conta? ', + 'en': 'You already have an account?', + }, + '09xv5ctc': { + 'pt': 'Clique aqui', + 'en': 'Click here', + }, + 'huygnka2': { + 'pt': 'Termo de Uso', + 'en': '', + }, + }, + // welcomeComponent + { + 'dsc9tuc8': { + 'pt': 'UMA EXPERIÊCIA COMPLETA', + 'en': 'A COMPLETE EXPERIENCE', + }, + '5bgqn16z': { + 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', + 'en': 'WITH COMFORT WHEREVER YOU ARE.', + }, + 'dynet730': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'hha60cg7': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'zvtay8ee': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'o6zob50a': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + }, + // forgotPasswordComponent + { + 'xxm3ajsy': { + 'pt': 'ESQUECEU SUA SENHA?', + 'en': 'FORGOT YOUR PASSWORD?', + }, + 'wu2f7yzo': { + 'pt': + 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', + 'en': + 'Don\'t worry, we will help you, enter the email registered in the application and click send.', + }, + 'mtz8l7ft': { + 'pt': 'Email', + 'en': 'Email', + }, + 'w7y5wlnv': { + 'pt': 'digite o seu email.....', + 'en': 'enter your email.....', + }, + '74rnd5bu': { + 'pt': 'Enviar', + 'en': 'To send', + }, + }, + // selectHeaderComponent + { + '1gr8ztd5': { + 'pt': 'Criar Agendamento', + 'en': 'Create Schedule', + }, + 'xjahsbjw': { + 'pt': 'Histórico de Visitas', + 'en': 'Visit History', + }, + }, + // Miscellaneous + { + 'i5smty81': { + 'pt': '', + 'en': 'dd/mm/yyyy', + }, + 'kw89v4f5': { + 'pt': '', + 'en': '', + }, + '7zjyxhuq': { + 'pt': '', + 'en': '', + }, + 'd86ioepz': { + 'pt': '', + 'en': '', + }, + 'lt3ssl76': { + 'pt': '', + 'en': '', + }, + 'fng3jimx': { + 'pt': '', + 'en': '', + }, + 'fl5g3od1': { + 'pt': '', + 'en': '', + }, + 'ypvz2z2w': { + 'pt': '', + 'en': '', + }, + '8qc8ukp7': { + 'pt': '', + 'en': '', + }, + '2e7jypoo': { + 'pt': '', + 'en': '', + }, + '3ns1uuql': { + 'pt': '', + 'en': '', + }, + '6wpbd6qf': { + 'pt': '', + 'en': '', + }, + '8lujanjg': { + 'pt': '', + 'en': '', + }, + 'uteo7q4l': { + 'pt': '', + 'en': '', + }, + 'fddqwa3t': { + 'pt': '', + 'en': '', + }, + 'qt1hznnl': { + 'pt': '', + 'en': '', + }, + 'ifdxkz4h': { + 'pt': '', + 'en': '', + }, + 'mrvjp805': { + 'pt': '', + 'en': '', + }, + '9n5qf96i': { + 'pt': '', + 'en': '', + }, + 'lmtedmcu': { + 'pt': '', + 'en': '', + }, + 'a8q9pni2': { + 'pt': '', + 'en': '', + }, + 'awm7dfw0': { + 'pt': '', + 'en': '', + }, + 'lradbjb6': { + 'pt': '', + 'en': '', + }, + 'j9igyop7': { + 'pt': '', + 'en': '', + }, + '7wsvuydm': { + 'pt': '', + 'en': '', + }, + 'vm22i4rf': { + 'pt': '', + 'en': '', + }, + 'uirsdmbi': { + 'pt': '', + 'en': '', + }, + 'm6r7vsdc': { + 'pt': '', + 'en': '', + }, + 'mqw2z9f3': { + 'pt': '', + 'en': '', + }, + }, +].reduce((a, b) => a..addAll(b)); diff --git a/lib/flutter_flow/lat_lng.dart b/lib/flutter_flow/lat_lng.dart new file mode 100644 index 00000000..9e7b8ea8 --- /dev/null +++ b/lib/flutter_flow/lat_lng.dart @@ -0,0 +1,19 @@ +class LatLng { + const LatLng(this.latitude, this.longitude); + final double latitude; + final double longitude; + + @override + String toString() => 'LatLng(lat: $latitude, lng: $longitude)'; + + String serialize() => '$latitude,$longitude'; + + @override + int get hashCode => latitude.hashCode + longitude.hashCode; + + @override + bool operator ==(other) => + other is LatLng && + latitude == other.latitude && + longitude == other.longitude; +} diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart new file mode 100644 index 00000000..e3a792e2 --- /dev/null +++ b/lib/flutter_flow/nav/nav.dart @@ -0,0 +1,346 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '/backend/schema/structs/index.dart'; + +import '/index.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; + +export 'package:go_router/go_router.dart'; +export 'serialization_util.dart'; + +const kTransitionInfoKey = '__transition_info__'; + +class AppStateNotifier extends ChangeNotifier { + AppStateNotifier._(); + + static AppStateNotifier? _instance; + static AppStateNotifier get instance => _instance ??= AppStateNotifier._(); + + bool showSplashImage = true; + + void stopShowingSplashImage() { + showSplashImage = false; + notifyListeners(); + } +} + +GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( + initialLocation: '/', + debugLogDiagnostics: true, + refreshListenable: appStateNotifier, + errorBuilder: (context, state) => appStateNotifier.showSplashImage + ? Builder( + builder: (context) => Container( + color: FlutterFlowTheme.of(context).primary, + child: Image.asset( + 'assets/images/logo.svg', + fit: BoxFit.cover, + ), + ), + ) + : const OnBoardingPageWidget(), + routes: [ + FFRoute( + name: '_initialize', + path: '/', + builder: (context, _) => appStateNotifier.showSplashImage + ? Builder( + builder: (context) => Container( + color: FlutterFlowTheme.of(context).primary, + child: Image.asset( + 'assets/images/logo.svg', + fit: BoxFit.cover, + ), + ), + ) + : const OnBoardingPageWidget(), + ), + FFRoute( + name: 'LoginPage', + path: '/loginPage', + builder: (context, params) => LoginPageWidget( + device: params.getParam( + 'device', + ParamType.String, + ), + ), + ), + FFRoute( + name: 'ForgotPasswordPage', + path: '/forgotPasswordPage', + builder: (context, params) => const ForgotPasswordPageWidget(), + ), + FFRoute( + name: 'homePage', + path: '/homePage', + builder: (context, params) => const HomePageWidget(), + ), + FFRoute( + name: 'RegisterPage', + path: '/registerPage', + builder: (context, params) => const RegisterPageWidget(), + ), + FFRoute( + name: 'WelcomePage', + path: '/welcomePage', + builder: (context, params) => const WelcomePageWidget(), + ), + FFRoute( + name: 'registerVisitorPage', + path: '/registerVisitorPage', + builder: (context, params) => const RegisterVisitorPageWidget(), + ), + FFRoute( + name: 'scheduleCompleteVisitPage', + path: '/scheduleCompleteVisitPage', + builder: (context, params) => ScheduleCompleteVisitPageWidget( + visitorStrList: params.getParam( + 'visitorStrList', + ParamType.String, + ), + visitStartDateStr: params.getParam( + 'visitStartDateStr', + ParamType.String, + ), + visitEndDateStr: params.getParam( + 'visitEndDateStr', + ParamType.String, + ), + visitReasonStr: params.getParam( + 'visitReasonStr', + ParamType.String, + ), + visitLevelStr: params.getParam( + 'visitLevelStr', + ParamType.String, + ), + visitTempBol: params.getParam( + 'visitTempBol', + ParamType.bool, + ), + visitObsStr: params.getParam( + 'visitObsStr', + ParamType.String, + ), + visitorJsonList: params.getParam( + 'visitorJsonList', + ParamType.JSON, + isList: true, + ), + ), + ), + FFRoute( + name: 'scheduleProvisionalVisitPage', + path: '/scheduleProvisionalVisitPage', + builder: (context, params) => const ScheduleProvisionalVisitPageWidget(), + ), + FFRoute( + name: 'onBoardingPage', + path: '/onBoardingPage', + builder: (context, params) => const OnBoardingPageWidget(), + ), + FFRoute( + name: 'fastPassPage', + path: '/fastPassPage', + builder: (context, params) => const FastPassPageWidget(), + ) + ].map((r) => r.toRoute(appStateNotifier)).toList(), + ); + +extension NavParamExtensions on Map { + Map get withoutNulls => Map.fromEntries( + entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, e.value!)), + ); +} + +extension NavigationExtensions on BuildContext { + void safePop() { + // If there is only one route on the stack, navigate to the initial + // page instead of popping. + if (canPop()) { + pop(); + } else { + go('/'); + } + } +} + +extension _GoRouterStateExtensions on GoRouterState { + Map get extraMap => + extra != null ? extra as Map : {}; + Map get allParams => {} + ..addAll(pathParameters) + ..addAll(uri.queryParameters) + ..addAll(extraMap); + TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey) + ? extraMap[kTransitionInfoKey] as TransitionInfo + : TransitionInfo.appDefault(); +} + +class FFParameters { + FFParameters(this.state, [this.asyncParams = const {}]); + + final GoRouterState state; + final Map Function(String)> asyncParams; + + Map futureParamValues = {}; + + // Parameters are empty if the params map is empty or if the only parameter + // present is the special extra parameter reserved for the transition info. + bool get isEmpty => + state.allParams.isEmpty || + (state.allParams.length == 1 && + state.extraMap.containsKey(kTransitionInfoKey)); + bool isAsyncParam(MapEntry param) => + asyncParams.containsKey(param.key) && param.value is String; + bool get hasFutures => state.allParams.entries.any(isAsyncParam); + Future completeFutures() => Future.wait( + state.allParams.entries.where(isAsyncParam).map( + (param) async { + final doc = await asyncParams[param.key]!(param.value) + .onError((_, __) => null); + if (doc != null) { + futureParamValues[param.key] = doc; + return true; + } + return false; + }, + ), + ).onError((_, __) => [false]).then((v) => v.every((e) => e)); + + dynamic getParam( + String paramName, + ParamType type, { + bool isList = false, + StructBuilder? structBuilder, + }) { + if (futureParamValues.containsKey(paramName)) { + return futureParamValues[paramName]; + } + if (!state.allParams.containsKey(paramName)) { + return null; + } + final param = state.allParams[paramName]; + // Got parameter from `extras`, so just directly return it. + if (param is! String) { + return param; + } + // Return serialized value. + return deserializeParam( + param, + type, + isList, + structBuilder: structBuilder, + ); + } +} + +class FFRoute { + const FFRoute({ + required this.name, + required this.path, + required this.builder, + this.requireAuth = false, + this.asyncParams = const {}, + this.routes = const [], + }); + + final String name; + final String path; + final bool requireAuth; + final Map Function(String)> asyncParams; + final Widget Function(BuildContext, FFParameters) builder; + final List routes; + + GoRoute toRoute(AppStateNotifier appStateNotifier) => GoRoute( + name: name, + path: path, + pageBuilder: (context, state) { + fixStatusBarOniOS16AndBelow(context); + final ffParams = FFParameters(state, asyncParams); + final page = ffParams.hasFutures + ? FutureBuilder( + future: ffParams.completeFutures(), + builder: (context, _) => builder(context, ffParams), + ) + : builder(context, ffParams); + final child = page; + + final transitionInfo = state.transitionInfo; + return transitionInfo.hasTransition + ? CustomTransitionPage( + key: state.pageKey, + child: child, + transitionDuration: transitionInfo.duration, + transitionsBuilder: + (context, animation, secondaryAnimation, child) => + PageTransition( + type: transitionInfo.transitionType, + duration: transitionInfo.duration, + reverseDuration: transitionInfo.duration, + alignment: transitionInfo.alignment, + child: child, + ).buildTransitions( + context, + animation, + secondaryAnimation, + child, + ), + ) + : MaterialPage(key: state.pageKey, child: child); + }, + routes: routes, + ); +} + +class TransitionInfo { + const TransitionInfo({ + required this.hasTransition, + this.transitionType = PageTransitionType.fade, + this.duration = const Duration(milliseconds: 300), + this.alignment, + }); + + final bool hasTransition; + final PageTransitionType transitionType; + final Duration duration; + final Alignment? alignment; + + static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false); +} + +class RootPageContext { + const RootPageContext(this.isRootPage, [this.errorRoute]); + final bool isRootPage; + final String? errorRoute; + + static bool isInactiveRootPage(BuildContext context) { + final rootPageContext = context.read(); + final isRootPage = rootPageContext?.isRootPage ?? false; + final location = GoRouterState.of(context).uri.toString(); + return isRootPage && + location != '/' && + location != rootPageContext?.errorRoute; + } + + static Widget wrap(Widget child, {String? errorRoute}) => Provider.value( + value: RootPageContext(true, errorRoute), + child: child, + ); +} + +extension GoRouterLocationExtension on GoRouter { + String getCurrentLocation() { + final RouteMatch lastMatch = routerDelegate.currentConfiguration.last; + final RouteMatchList matchList = lastMatch is ImperativeRouteMatch + ? lastMatch.matches + : routerDelegate.currentConfiguration; + return matchList.uri.toString(); + } +} diff --git a/lib/flutter_flow/nav/serialization_util.dart b/lib/flutter_flow/nav/serialization_util.dart new file mode 100644 index 00000000..1de6e7b5 --- /dev/null +++ b/lib/flutter_flow/nav/serialization_util.dart @@ -0,0 +1,227 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; + +import '../../flutter_flow/lat_lng.dart'; +import '../../flutter_flow/place.dart'; +import '../../flutter_flow/uploaded_file.dart'; + +/// SERIALIZATION HELPERS + +String dateTimeRangeToString(DateTimeRange dateTimeRange) { + final startStr = dateTimeRange.start.millisecondsSinceEpoch.toString(); + final endStr = dateTimeRange.end.millisecondsSinceEpoch.toString(); + return '$startStr|$endStr'; +} + +String placeToString(FFPlace place) => jsonEncode({ + 'latLng': place.latLng.serialize(), + 'name': place.name, + 'address': place.address, + 'city': place.city, + 'state': place.state, + 'country': place.country, + 'zipCode': place.zipCode, + }); + +String uploadedFileToString(FFUploadedFile uploadedFile) => + uploadedFile.serialize(); + +String? serializeParam( + dynamic param, + ParamType paramType, [ + bool isList = false, +]) { + try { + if (param == null) { + return null; + } + if (isList) { + final serializedValues = (param as Iterable) + .map((p) => serializeParam(p, paramType, false)) + .where((p) => p != null) + .map((p) => p!) + .toList(); + return json.encode(serializedValues); + } + switch (paramType) { + case ParamType.int: + return param.toString(); + case ParamType.double: + return param.toString(); + case ParamType.String: + return param; + case ParamType.bool: + return param ? 'true' : 'false'; + case ParamType.DateTime: + return (param as DateTime).millisecondsSinceEpoch.toString(); + case ParamType.DateTimeRange: + return dateTimeRangeToString(param as DateTimeRange); + case ParamType.LatLng: + return (param as LatLng).serialize(); + case ParamType.Color: + return (param as Color).toCssString(); + case ParamType.FFPlace: + return placeToString(param as FFPlace); + case ParamType.FFUploadedFile: + return uploadedFileToString(param as FFUploadedFile); + case ParamType.JSON: + return json.encode(param); + + case ParamType.DataStruct: + return param is BaseStruct ? param.serialize() : null; + + case ParamType.Enum: + return (param is Enum) ? param.serialize() : null; + + default: + return null; + } + } catch (e) { + print('Error serializing parameter: $e'); + return null; + } +} + +/// END SERIALIZATION HELPERS + +/// DESERIALIZATION HELPERS + +DateTimeRange? dateTimeRangeFromString(String dateTimeRangeStr) { + final pieces = dateTimeRangeStr.split('|'); + if (pieces.length != 2) { + return null; + } + return DateTimeRange( + start: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.first)), + end: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.last)), + ); +} + +LatLng? latLngFromString(String? latLngStr) { + final pieces = latLngStr?.split(','); + if (pieces == null || pieces.length != 2) { + return null; + } + return LatLng( + double.parse(pieces.first.trim()), + double.parse(pieces.last.trim()), + ); +} + +FFPlace placeFromString(String placeStr) { + final serializedData = jsonDecode(placeStr) as Map; + final data = { + 'latLng': serializedData.containsKey('latLng') + ? latLngFromString(serializedData['latLng'] as String) + : const LatLng(0.0, 0.0), + 'name': serializedData['name'] ?? '', + 'address': serializedData['address'] ?? '', + 'city': serializedData['city'] ?? '', + 'state': serializedData['state'] ?? '', + 'country': serializedData['country'] ?? '', + 'zipCode': serializedData['zipCode'] ?? '', + }; + return FFPlace( + latLng: data['latLng'] as LatLng, + name: data['name'] as String, + address: data['address'] as String, + city: data['city'] as String, + state: data['state'] as String, + country: data['country'] as String, + zipCode: data['zipCode'] as String, + ); +} + +FFUploadedFile uploadedFileFromString(String uploadedFileStr) => + FFUploadedFile.deserialize(uploadedFileStr); + +enum ParamType { + int, + double, + String, + bool, + DateTime, + DateTimeRange, + LatLng, + Color, + FFPlace, + FFUploadedFile, + JSON, + DataStruct, + Enum, +} + +dynamic deserializeParam( + String? param, + ParamType paramType, + bool isList, { + StructBuilder? structBuilder, +}) { + try { + if (param == null) { + return null; + } + if (isList) { + final paramValues = json.decode(param); + if (paramValues is! Iterable || paramValues.isEmpty) { + return null; + } + return paramValues + .whereType() + .map((p) => p) + .map((p) => deserializeParam( + p, + paramType, + false, + structBuilder: structBuilder, + )) + .where((p) => p != null) + .map((p) => p! as T) + .toList(); + } + switch (paramType) { + case ParamType.int: + return int.tryParse(param); + case ParamType.double: + return double.tryParse(param); + case ParamType.String: + return param; + case ParamType.bool: + return param == 'true'; + case ParamType.DateTime: + final milliseconds = int.tryParse(param); + return milliseconds != null + ? DateTime.fromMillisecondsSinceEpoch(milliseconds) + : null; + case ParamType.DateTimeRange: + return dateTimeRangeFromString(param); + case ParamType.LatLng: + return latLngFromString(param); + case ParamType.Color: + return fromCssColor(param); + case ParamType.FFPlace: + return placeFromString(param); + case ParamType.FFUploadedFile: + return uploadedFileFromString(param); + case ParamType.JSON: + return json.decode(param); + + case ParamType.DataStruct: + final data = json.decode(param) as Map? ?? {}; + return structBuilder != null ? structBuilder(data) : null; + + case ParamType.Enum: + return deserializeEnum(param); + + default: + return null; + } + } catch (e) { + print('Error deserializing parameter: $e'); + return null; + } +} diff --git a/lib/flutter_flow/place.dart b/lib/flutter_flow/place.dart new file mode 100644 index 00000000..e3589b3b --- /dev/null +++ b/lib/flutter_flow/place.dart @@ -0,0 +1,46 @@ +import 'lat_lng.dart'; + +class FFPlace { + const FFPlace({ + this.latLng = const LatLng(0.0, 0.0), + this.name = '', + this.address = '', + this.city = '', + this.state = '', + this.country = '', + this.zipCode = '', + }); + + final LatLng latLng; + final String name; + final String address; + final String city; + final String state; + final String country; + final String zipCode; + + @override + String toString() => '''FFPlace( + latLng: $latLng, + name: $name, + address: $address, + city: $city, + state: $state, + country: $country, + zipCode: $zipCode, + )'''; + + @override + int get hashCode => latLng.hashCode; + + @override + bool operator ==(other) => + other is FFPlace && + latLng == other.latLng && + name == other.name && + address == other.address && + city == other.city && + state == other.state && + country == other.country && + zipCode == other.zipCode; +} diff --git a/lib/flutter_flow/random_data_util.dart b/lib/flutter_flow/random_data_util.dart new file mode 100644 index 00000000..6599e5a6 --- /dev/null +++ b/lib/flutter_flow/random_data_util.dart @@ -0,0 +1,51 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +final _random = Random(); + +int randomInteger(int min, int max) { + return _random.nextInt(max - min + 1) + min; +} + +double randomDouble(double min, double max) { + return _random.nextDouble() * (max - min) + min; +} + +String randomString( + int minLength, + int maxLength, + bool lowercaseAz, + bool uppercaseAz, + bool digits, +) { + var chars = ''; + if (lowercaseAz) { + chars += 'abcdefghijklmnopqrstuvwxyz'; + } + if (uppercaseAz) { + chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + } + if (digits) { + chars += '0123456789'; + } + return List.generate(randomInteger(minLength, maxLength), + (index) => chars[_random.nextInt(chars.length)]).join(); +} + +// Random date between 1970 and 2025. +DateTime randomDate() { + // Random max must be in range 0 < max <= 2^32. + // So we have to generate the time in seconds and then convert to milliseconds. + return DateTime.fromMillisecondsSinceEpoch( + randomInteger(0, 1735689600) * 1000); +} + +String randomImageUrl(int width, int height) { + return 'https://picsum.photos/seed/${_random.nextInt(1000)}/$width/$height'; +} + +Color randomColor() { + return Color.fromARGB( + 255, _random.nextInt(255), _random.nextInt(255), _random.nextInt(255)); +} diff --git a/lib/flutter_flow/upload_data.dart b/lib/flutter_flow/upload_data.dart new file mode 100644 index 00000000..11219e59 --- /dev/null +++ b/lib/flutter_flow/upload_data.dart @@ -0,0 +1,377 @@ +import 'dart:async'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:mime_type/mime_type.dart'; +import 'package:video_player/video_player.dart'; + +import 'flutter_flow_theme.dart'; +import 'flutter_flow_util.dart'; + +const allowedFormats = {'image/png', 'image/jpeg', 'video/mp4', 'image/gif'}; + +class SelectedFile { + const SelectedFile({ + this.storagePath = '', + this.filePath, + required this.bytes, + this.dimensions, + this.blurHash, + }); + final String storagePath; + final String? filePath; + final Uint8List bytes; + final MediaDimensions? dimensions; + final String? blurHash; +} + +class MediaDimensions { + const MediaDimensions({ + this.height, + this.width, + }); + final double? height; + final double? width; +} + +enum MediaSource { + photoGallery, + videoGallery, + camera, +} + +Future?> selectMediaWithSourceBottomSheet({ + required BuildContext context, + String? storageFolderPath, + double? maxWidth, + double? maxHeight, + int? imageQuality, + required bool allowPhoto, + bool allowVideo = false, + String pickerFontFamily = 'Roboto', + Color textColor = const Color(0xFF111417), + Color backgroundColor = const Color(0xFFF5F5F5), + bool includeDimensions = false, + bool includeBlurHash = false, +}) async { + createUploadMediaListTile(String label, MediaSource mediaSource) => ListTile( + title: Text( + label, + textAlign: TextAlign.center, + style: GoogleFonts.getFont( + pickerFontFamily, + color: textColor, + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + tileColor: backgroundColor, + dense: false, + onTap: () => Navigator.pop( + context, + mediaSource, + ), + ); + final mediaSource = await showModalBottomSheet( + context: context, + backgroundColor: backgroundColor, + builder: (context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!kIsWeb) ...[ + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 0), + child: ListTile( + title: Text( + 'Choose Source', + textAlign: TextAlign.center, + style: GoogleFonts.getFont( + pickerFontFamily, + color: textColor.withOpacity(0.65), + fontWeight: FontWeight.w500, + fontSize: 20, + ), + ), + tileColor: backgroundColor, + dense: false, + ), + ), + const Divider(), + ], + if (allowPhoto && allowVideo) ...[ + createUploadMediaListTile( + 'Gallery (Photo)', + MediaSource.photoGallery, + ), + const Divider(), + createUploadMediaListTile( + 'Gallery (Video)', + MediaSource.videoGallery, + ), + ] else if (allowPhoto) + createUploadMediaListTile( + 'Gallery', + MediaSource.photoGallery, + ) + else + createUploadMediaListTile( + 'Gallery', + MediaSource.videoGallery, + ), + if (!kIsWeb) ...[ + const Divider(), + createUploadMediaListTile('Camera', MediaSource.camera), + const Divider(), + ], + const SizedBox(height: 10), + ], + ); + }); + if (mediaSource == null) { + return null; + } + return selectMedia( + storageFolderPath: storageFolderPath, + maxWidth: maxWidth, + maxHeight: maxHeight, + imageQuality: imageQuality, + isVideo: mediaSource == MediaSource.videoGallery || + (mediaSource == MediaSource.camera && allowVideo && !allowPhoto), + mediaSource: mediaSource, + includeDimensions: includeDimensions, + includeBlurHash: includeBlurHash, + ); +} + +Future?> selectMedia({ + String? storageFolderPath, + double? maxWidth, + double? maxHeight, + int? imageQuality, + bool isVideo = false, + MediaSource mediaSource = MediaSource.camera, + bool multiImage = false, + bool includeDimensions = false, + bool includeBlurHash = false, +}) async { + final picker = ImagePicker(); + + if (multiImage) { + final pickedMediaFuture = picker.pickMultiImage( + maxWidth: maxWidth, + maxHeight: maxHeight, + imageQuality: imageQuality, + ); + final pickedMedia = await pickedMediaFuture; + if (pickedMedia.isEmpty) { + return null; + } + return Future.wait(pickedMedia.asMap().entries.map((e) async { + final index = e.key; + final media = e.value; + final mediaBytes = await media.readAsBytes(); + final path = _getStoragePath(storageFolderPath, media.name, false, index); + final dimensions = includeDimensions + ? isVideo + ? _getVideoDimensions(media.path) + : _getImageDimensions(mediaBytes) + : null; + + return SelectedFile( + storagePath: path, + filePath: media.path, + bytes: mediaBytes, + dimensions: await dimensions, + ); + })); + } + + final source = mediaSource == MediaSource.camera + ? ImageSource.camera + : ImageSource.gallery; + final pickedMediaFuture = isVideo + ? picker.pickVideo(source: source) + : picker.pickImage( + maxWidth: maxWidth, + maxHeight: maxHeight, + imageQuality: imageQuality, + source: source, + ); + final pickedMedia = await pickedMediaFuture; + final mediaBytes = await pickedMedia?.readAsBytes(); + if (mediaBytes == null) { + return null; + } + final path = _getStoragePath(storageFolderPath, pickedMedia!.name, isVideo); + final dimensions = includeDimensions + ? isVideo + ? _getVideoDimensions(pickedMedia.path) + : _getImageDimensions(mediaBytes) + : null; + + return [ + SelectedFile( + storagePath: path, + filePath: pickedMedia.path, + bytes: mediaBytes, + dimensions: await dimensions, + ), + ]; +} + +bool validateFileFormat(String filePath, BuildContext context) { + if (allowedFormats.contains(mime(filePath))) { + return true; + } + ScaffoldMessenger.of(context) + ..hideCurrentSnackBar() + ..showSnackBar(SnackBar( + content: Text('Invalid file format: ${mime(filePath)}'), + )); + return false; +} + +Future selectFile({ + String? storageFolderPath, + List? allowedExtensions, +}) => + selectFiles( + storageFolderPath: storageFolderPath, + allowedExtensions: allowedExtensions, + multiFile: false, + ).then((value) => value?.first); + +Future?> selectFiles({ + String? storageFolderPath, + List? allowedExtensions, + bool multiFile = false, +}) async { + final pickedFiles = await FilePicker.platform.pickFiles( + type: allowedExtensions != null ? FileType.custom : FileType.any, + allowedExtensions: allowedExtensions, + withData: true, + allowMultiple: multiFile, + ); + if (pickedFiles == null || pickedFiles.files.isEmpty) { + return null; + } + if (multiFile) { + return Future.wait(pickedFiles.files.asMap().entries.map((e) async { + final index = e.key; + final file = e.value; + final storagePath = + _getStoragePath(storageFolderPath, file.name, false, index); + return SelectedFile( + storagePath: storagePath, + filePath: isWeb ? null : file.path, + bytes: file.bytes!, + ); + })); + } + final file = pickedFiles.files.first; + if (file.bytes == null) { + return null; + } + final storagePath = _getStoragePath(storageFolderPath, file.name, false); + return [ + SelectedFile( + storagePath: storagePath, + filePath: isWeb ? null : file.path, + bytes: file.bytes!, + ) + ]; +} + +List selectedFilesFromUploadedFiles( + List uploadedFiles, { + String? storageFolderPath, + bool isMultiData = false, +}) => + uploadedFiles.asMap().entries.map( + (entry) { + final index = entry.key; + final file = entry.value; + return SelectedFile( + storagePath: _getStoragePath( + storageFolderPath, + file.name!, + false, + isMultiData ? index : null, + ), + bytes: file.bytes!); + }, + ).toList(); + +Future _getImageDimensions(Uint8List mediaBytes) async { + final image = await decodeImageFromList(mediaBytes); + return MediaDimensions( + width: image.width.toDouble(), + height: image.height.toDouble(), + ); +} + +Future _getVideoDimensions(String path) async { + final VideoPlayerController videoPlayerController = + VideoPlayerController.asset(path); + await videoPlayerController.initialize(); + final size = videoPlayerController.value.size; + return MediaDimensions(width: size.width, height: size.height); +} + +String _getStoragePath( + String? pathPrefix, + String filePath, + bool isVideo, [ + int? index, +]) { + pathPrefix = _removeTrailingSlash(pathPrefix); + final timestamp = DateTime.now().microsecondsSinceEpoch; + // Workaround fixed by https://github.com/flutter/plugins/pull/3685 + // (not yet in stable). + final ext = isVideo ? 'mp4' : filePath.split('.').last; + final indexStr = index != null ? '_$index' : ''; + return '$pathPrefix/$timestamp$indexStr.$ext'; +} + +String getSignatureStoragePath([String? pathPrefix]) { + pathPrefix = _removeTrailingSlash(pathPrefix); + final timestamp = DateTime.now().microsecondsSinceEpoch; + return '$pathPrefix/signature_$timestamp.png'; +} + +void showUploadMessage( + BuildContext context, + String message, { + bool showLoading = false, +}) { + ScaffoldMessenger.of(context) + ..hideCurrentSnackBar() + ..showSnackBar( + SnackBar( + content: Row( + children: [ + if (showLoading) + Padding( + padding: const EdgeInsetsDirectional.only(end: 10.0), + child: CircularProgressIndicator( + valueColor: Theme.of(context).brightness == Brightness.dark + ? AlwaysStoppedAnimation( + FlutterFlowTheme.of(context).accent4) + : null, + ), + ), + Text(message), + ], + ), + duration: showLoading ? const Duration(days: 1) : const Duration(seconds: 4), + ), + ); +} + +String? _removeTrailingSlash(String? path) => path != null && path.endsWith('/') + ? path.substring(0, path.length - 1) + : path; diff --git a/lib/flutter_flow/uploaded_file.dart b/lib/flutter_flow/uploaded_file.dart new file mode 100644 index 00000000..2dfd2ff1 --- /dev/null +++ b/lib/flutter_flow/uploaded_file.dart @@ -0,0 +1,68 @@ +import 'dart:convert'; +import 'dart:typed_data' show Uint8List; + +class FFUploadedFile { + const FFUploadedFile({ + this.name, + this.bytes, + this.height, + this.width, + this.blurHash, + }); + + final String? name; + final Uint8List? bytes; + final double? height; + final double? width; + final String? blurHash; + + @override + String toString() => + 'FFUploadedFile(name: $name, bytes: ${bytes?.length ?? 0}, height: $height, width: $width, blurHash: $blurHash,)'; + + String serialize() => jsonEncode( + { + 'name': name, + 'bytes': bytes, + 'height': height, + 'width': width, + 'blurHash': blurHash, + }, + ); + + static FFUploadedFile deserialize(String val) { + final serializedData = jsonDecode(val) as Map; + final data = { + 'name': serializedData['name'] ?? '', + 'bytes': serializedData['bytes'] ?? Uint8List.fromList([]), + 'height': serializedData['height'], + 'width': serializedData['width'], + 'blurHash': serializedData['blurHash'], + }; + return FFUploadedFile( + name: data['name'] as String, + bytes: Uint8List.fromList(data['bytes'].cast().toList()), + height: data['height'] as double?, + width: data['width'] as double?, + blurHash: data['blurHash'] as String?, + ); + } + + @override + int get hashCode => Object.hash( + name, + bytes, + height, + width, + blurHash, + ); + + @override + bool operator ==(other) => + other is FFUploadedFile && + name == other.name && + bytes == other.bytes && + height == other.height && + width == other.width && + blurHash == other.blurHash; +} diff --git a/lib/index.dart b/lib/index.dart new file mode 100644 index 00000000..d3cc0e80 --- /dev/null +++ b/lib/index.dart @@ -0,0 +1,20 @@ +// Export pages +export '/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart' + show LoginPageWidget; +export '/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart' + show ForgotPasswordPageWidget; +export '/application_pages/home_page/home_page_widget.dart' show HomePageWidget; +export '/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart' + show RegisterPageWidget; +export '/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart' + show WelcomePageWidget; +export '/application_pages/register_visitor_page/register_visitor_page_widget.dart' + show RegisterVisitorPageWidget; +export '/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart' + show ScheduleCompleteVisitPageWidget; +export '/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart' + show ScheduleProvisionalVisitPageWidget; +export '/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart' + show OnBoardingPageWidget; +export '/application_pages/fast_pass_page/fast_pass_page_widget.dart' + show FastPassPageWidget; diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 00000000..9431af7c --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,120 @@ +import 'package:provider/provider.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_web_plugins/url_strategy.dart'; +import 'flutter_flow/flutter_flow_theme.dart'; +import 'flutter_flow/flutter_flow_util.dart'; +import 'flutter_flow/internationalization.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + GoRouter.optionURLReflectsImperativeAPIs = true; + usePathUrlStrategy(); + + await FlutterFlowTheme.initialize(); + + await FFLocalizations.initialize(); + + final appState = FFAppState(); // Initialize FFAppState + await appState.initializePersistedState(); + + runApp(ChangeNotifierProvider( + create: (context) => appState, + child: const MyApp(), + )); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + State createState() => _MyAppState(); + + static _MyAppState of(BuildContext context) => + context.findAncestorStateOfType<_MyAppState>()!; +} + +class _MyAppState extends State { + Locale? _locale = FFLocalizations.getStoredLocale(); + ThemeMode _themeMode = FlutterFlowTheme.themeMode; + + late AppStateNotifier _appStateNotifier; + late GoRouter _router; + + bool displaySplashImage = true; + + @override + void initState() { + super.initState(); + + _appStateNotifier = AppStateNotifier.instance; + _router = createRouter(_appStateNotifier); + + Future.delayed(const Duration(milliseconds: 1000), + () => setState(() => _appStateNotifier.stopShowingSplashImage())); + } + + void setLocale(String language) { + setState(() => _locale = createLocale(language)); + FFLocalizations.storeLocale(language); + } + + void setThemeMode(ThemeMode mode) => setState(() { + _themeMode = mode; + FlutterFlowTheme.saveThemeMode(mode); + }); + + @override + Widget build(BuildContext context) { + return MaterialApp.router( + title: 'FREHub', + localizationsDelegates: const [ + FFLocalizationsDelegate(), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + locale: _locale, + supportedLocales: const [ + Locale('pt'), + Locale('en'), + ], + theme: ThemeData( + brightness: Brightness.light, + scrollbarTheme: ScrollbarThemeData( + thumbVisibility: MaterialStateProperty.all(false), + interactive: false, + thumbColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.dragged)) { + return const Color(0xff1aab5f); + } + if (states.contains(MaterialState.hovered)) { + return const Color(0xff1aab5f); + } + return const Color(0xff1aab5f); + }), + ), + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + scrollbarTheme: ScrollbarThemeData( + thumbVisibility: MaterialStateProperty.all(false), + interactive: false, + thumbColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.dragged)) { + return const Color(0xff1aab5f); + } + if (states.contains(MaterialState.hovered)) { + return const Color(0xff1aab5f); + } + return const Color(0xff1aab5f); + }), + ), + ), + themeMode: _themeMode, + routerConfig: _router, + ); + } +} diff --git a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart new file mode 100644 index 00000000..f82f5603 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart @@ -0,0 +1,26 @@ +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'forgot_password_component_widget.dart' + show ForgotPasswordComponentWidget; +import 'package:flutter/material.dart'; + +class ForgotPasswordComponentModel + extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget. + ApiCallResponse? req; + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + } +} diff --git a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart new file mode 100644 index 00000000..9f889f97 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart @@ -0,0 +1,292 @@ +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:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'forgot_password_component_model.dart'; +export 'forgot_password_component_model.dart'; + +class ForgotPasswordComponentWidget extends StatefulWidget { + const ForgotPasswordComponentWidget({super.key}); + + @override + State createState() => + _ForgotPasswordComponentWidgetState(); +} + +class _ForgotPasswordComponentWidgetState + extends State { + late ForgotPasswordComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => ForgotPasswordComponentModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + } + + @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: 300.0, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // This row exists for when the "app bar" is hidden on desktop, having a way back for the user can work well. + if (responsiveVisibility( + context: context, + phone: false, + tablet: false, + )) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + context.safePop(); + }, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: Icon( + Icons.arrow_back_rounded, + color: Color(0xFF15161E), + size: 24.0, + ), + ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), + child: Text( + '', + style: + FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: const Color(0xFF15161E), + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'xxm3ajsy' /* ESQUECEU SUA SENHA? */, + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Outfit', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), + child: Text( + FFLocalizations.of(context).getText( + 'wu2f7yzo' /* Não se preucupe nós vamos te a... */, + ), + style: 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'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model.emailAddressTextController, + focusNode: _model.emailAddressFocusNode, + autofillHints: const [AutofillHints.email], + obscureText: false, + decoration: InputDecoration( + labelText: FFLocalizations.of(context).getText( + 'mtz8l7ft' /* Email */, + ), + labelStyle: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + hintText: FFLocalizations.of(context).getText( + 'w7y5wlnv' /* digite o seu email..... */, + ), + hintStyle: + 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'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent1, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent3, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + filled: true, + fillColor: FlutterFlowTheme.of(context).primaryBackground, + contentPadding: + const EdgeInsetsDirectional.fromSTEB(24.0, 24.0, 20.0, 24.0), + suffixIcon: Icon( + Icons.email, + color: FlutterFlowTheme.of(context).accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + maxLines: null, + keyboardType: TextInputType.emailAddress, + cursorColor: const Color(0xFF6F61EF), + validator: _model.emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0), + child: FFButtonWidget( + onPressed: () async { + var shouldSetState = false; + _model.req = await PhpGroup.forgotPasswordCall.call( + email: _model.emailAddressTextController.text, + ); + shouldSetState = true; + if (PhpGroup.forgotPasswordCall.error( + (_model.req?.jsonBody ?? ''), + ) == + false) { + Navigator.pop(context); + } else { + if (shouldSetState) setState(() {}); + return; + } + + if (shouldSetState) setState(() {}); + }, + text: FFLocalizations.of(context).getText( + '74rnd5bu' /* Enviar */, + ), + options: FFButtonOptions( + width: 270.0, + height: 50.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(0xFF1AAB5F), + textStyle: FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Plus Jakarta Sans', + color: Colors.white, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + ), + showLoadingIndicator: false, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart new file mode 100644 index 00000000..f66a1974 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart @@ -0,0 +1,45 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import '/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart'; +import '/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart'; +import '/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart'; +import 'on_boarding_page_widget.dart' show OnBoardingPageWidget; +import 'package:flutter/material.dart'; + +class OnBoardingPageModel extends FlutterFlowModel { + /// Local state fields for this page. + + String toggleIdx = 'welcome'; + + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // Model for signInComponent component. + late SignInComponentModel signInComponentModel; + // Model for signUpComponent component. + late SignUpComponentModel signUpComponentModel; + // Model for welcomeComponent component. + late WelcomeComponentModel welcomeComponentModel; + + @override + void initState(BuildContext context) { + signInComponentModel = createModel(context, () => SignInComponentModel()); + signUpComponentModel = createModel(context, () => SignUpComponentModel()); + welcomeComponentModel = createModel(context, () => WelcomeComponentModel()); + } + + @override + void dispose() { + unfocusNode.dispose(); + signInComponentModel.dispose(); + signUpComponentModel.dispose(); + welcomeComponentModel.dispose(); + } + + /// Action blocks. + Future toggleOnBoardingActionPage( + BuildContext context, { + required String? toggleValue, + }) async { + toggleIdx = toggleValue!; + } +} diff --git a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart new file mode 100644 index 00000000..da799597 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart @@ -0,0 +1,131 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart'; +import '/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart'; +import '/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; +import 'on_boarding_page_model.dart'; +export 'on_boarding_page_model.dart'; + +class OnBoardingPageWidget extends StatefulWidget { + const OnBoardingPageWidget({super.key}); + + @override + State createState() => _OnBoardingPageWidgetState(); +} + +class _OnBoardingPageWidgetState extends State { + late OnBoardingPageModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => OnBoardingPageModel()); + + // On page load action. + SchedulerBinding.instance.addPostFrameCallback((_) async { + if (FFAppState().isLogged == true) { + context.pushNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + duration: Duration(milliseconds: 0), + ), + }, + ); + } else { + if (isAndroid == true) { + FFAppState().device = 'Android'; + setState(() {}); + } else if (isiOS == true) { + FFAppState().device = 'iOS'; + setState(() {}); + } else { + FFAppState().device = 'Web'; + setState(() {}); + } + } + }); + } + + @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: Stack( + children: [ + if (_model.toggleIdx == 'SignIn') + wrapWithModel( + model: _model.signInComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: SignInComponentWidget( + toggleOnBoardingPageAction: (toggleValueSignInParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueSignInParam, + ); + setState(() {}); + }, + ), + ), + if (_model.toggleIdx == 'SignUp') + wrapWithModel( + model: _model.signUpComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: SignUpComponentWidget( + toggleOnBoardingPageAction: (toggleValueSignUpParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueSignUpParam, + ); + setState(() {}); + }, + ), + ), + if (_model.toggleIdx == 'welcome') + wrapWithModel( + model: _model.welcomeComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: WelcomeComponentWidget( + toggleOnboardingPageAction: + (toggleValueWelcomeParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueWelcomeParam, + ); + setState(() {}); + }, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart b/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart new file mode 100644 index 00000000..9642203c --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart @@ -0,0 +1,31 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'sign_in_component_widget.dart' show SignInComponentWidget; +import 'package:flutter/material.dart'; + +class SignInComponentModel extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // State field(s) for password widget. + FocusNode? passwordFocusNode; + TextEditingController? passwordTextController; + late bool passwordVisibility; + String? Function(BuildContext, String?)? passwordTextControllerValidator; + + @override + void initState(BuildContext context) { + passwordVisibility = false; + } + + @override + void dispose() { + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + + passwordFocusNode?.dispose(); + passwordTextController?.dispose(); + } +} diff --git a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart b/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart new file mode 100644 index 00000000..b6955b01 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart @@ -0,0 +1,899 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'sign_in_component_model.dart'; +export 'sign_in_component_model.dart'; + +class SignInComponentWidget extends StatefulWidget { + const SignInComponentWidget({ + super.key, + required this.toggleOnBoardingPageAction, + }); + + final Future Function(String toggleValueSignInParam)? + toggleOnBoardingPageAction; + + @override + State createState() => _SignInComponentWidgetState(); +} + +class _SignInComponentWidgetState extends State + with TickerProviderStateMixin { + late SignInComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SignInComponentModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + + _model.passwordTextController ??= TextEditingController(); + _model.passwordFocusNode ??= FocusNode(); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: const BoxDecoration(), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 35.0), + child: Container( + width: 548.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(0.0, 1.0), + child: Padding( + padding: const EdgeInsets.all(3.0), + child: Text( + FFLocalizations.of(context).getText( + '9hbdjxrz' /* VAMOS LA! ENTRE COM A SUA CONT... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + 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/sr43ucngg4a4/Vector.png', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 34.0, 0.0, 34.0, 0.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: BorderRadius.circular(12.0), + shape: BoxShape.rectangle, + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailAddressTextController, + focusNode: + _model.emailAddressFocusNode, + autofocus: false, + textCapitalization: + TextCapitalization.none, + textInputAction: + TextInputAction.next, + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '1ltg0ylb' /* Email */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: + TextInputType.emailAddress, + validator: _model + .emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: + _model.passwordTextController, + focusNode: _model.passwordFocusNode, + autofocus: false, + textInputAction: + TextInputAction.send, + obscureText: + !_model.passwordVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '2x19ce8k' /* Senha */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordVisibility = + !_model + .passwordVisibility, + ), + focusNode: FocusNode( + skipTraversal: true), + child: Icon( + _model.passwordVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordTextControllerValidator + .asValidator(context), + ), + ), + ), + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: ((_model.emailAddressTextController + .text == + '') && + (_model.passwordTextController + .text == + '')) + ? null + : () async { + await action_blocks + .singInActionApp( + context, + emailAdress: _model + .emailAddressTextController + .text, + password: _model + .passwordTextController + .text, + ); + setState(() {}); + }, + text: FFLocalizations.of( + context) + .getText( + 'k44tm7wo' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: + FlutterFlowTheme.of( + context) + .primary, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .info, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: + Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + disabledColor: + const Color(0x951AAB5F), + ), + showLoadingIndicator: false, + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignUp', + ); + }, + text: FFLocalizations.of( + context) + .getText( + '14u7ipws' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: + FlutterFlowTheme.of( + context) + .customColor1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: + Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB(0.0, 0.0, + 0.0, 16.0), + child: FFButtonWidget( + onPressed: () { + print( + 'signInButtonLoginForm pressed ...'); + }, + text: FFLocalizations.of( + context) + .getText( + '1x926nsn' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: + FlutterFlowTheme.of( + context) + .accent1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB(0.0, 0.0, + 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'RegisterPage'); + }, + text: FFLocalizations.of( + context) + .getText( + 'jwvd4ai1' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: + FlutterFlowTheme.of( + context) + .customColor1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + ].divide(const SizedBox(width: 7.0)), + ); + } + }, + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: RichText( + textScaler: + MediaQuery.of(context).textScaler, + text: TextSpan( + children: [ + TextSpan( + text: + FFLocalizations.of(context) + .getText( + '05dx91ku' /* Você esqueceu a sua senha? */, + ), + style: TextStyle( + color: FlutterFlowTheme.of( + context) + .primaryText, + ), + ), + TextSpan( + text: + FFLocalizations.of(context) + .getText( + 'p5c6d54y' /* Recupere aqui */, + ), + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primary, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.normal, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + mouseCursor: + SystemMouseCursors.click, + recognizer: + TapGestureRecognizer() + ..onTap = () async { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + Colors + .transparent, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + const ForgotPasswordComponentWidget(), + ); + }, + ).then((value) => + safeSetState( + () {})); + }, + ) + ], + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Text( + FFLocalizations.of(context).getText( + 'olf967cj' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart new file mode 100644 index 00000000..48fa5cb4 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart @@ -0,0 +1,43 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'sign_up_component_widget.dart' show SignUpComponentWidget; +import 'package:flutter/material.dart'; + +class SignUpComponentModel extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for nameRegisterForm widget. + FocusNode? nameRegisterFormFocusNode; + TextEditingController? nameRegisterFormTextController; + String? Function(BuildContext, String?)? + nameRegisterFormTextControllerValidator; + // State field(s) for emailRegisterForm widget. + FocusNode? emailRegisterFormFocusNode; + TextEditingController? emailRegisterFormTextController; + String? Function(BuildContext, String?)? + emailRegisterFormTextControllerValidator; + // State field(s) for passwordRegisterForm widget. + FocusNode? passwordRegisterFormFocusNode; + TextEditingController? passwordRegisterFormTextController; + late bool passwordRegisterFormVisibility; + String? Function(BuildContext, String?)? + passwordRegisterFormTextControllerValidator; + // Stores action output result for [Action Block - signUpActionApp] action in SignUpButtonRegisterForm widget. + bool? signUp; + + @override + void initState(BuildContext context) { + passwordRegisterFormVisibility = false; + } + + @override + void dispose() { + nameRegisterFormFocusNode?.dispose(); + nameRegisterFormTextController?.dispose(); + + emailRegisterFormFocusNode?.dispose(); + emailRegisterFormTextController?.dispose(); + + passwordRegisterFormFocusNode?.dispose(); + passwordRegisterFormTextController?.dispose(); + } +} diff --git a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart new file mode 100644 index 00000000..db82a230 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart @@ -0,0 +1,770 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:easy_debounce/easy_debounce.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'sign_up_component_model.dart'; +export 'sign_up_component_model.dart'; + +class SignUpComponentWidget extends StatefulWidget { + const SignUpComponentWidget({ + super.key, + required this.toggleOnBoardingPageAction, + }); + + final Future Function(String toggleValueSignUpParam)? + toggleOnBoardingPageAction; + + @override + State createState() => _SignUpComponentWidgetState(); +} + +class _SignUpComponentWidgetState extends State + with TickerProviderStateMixin { + late SignUpComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SignUpComponentModel()); + + _model.nameRegisterFormTextController ??= TextEditingController(); + _model.nameRegisterFormFocusNode ??= FocusNode(); + _model.nameRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.emailRegisterFormTextController ??= TextEditingController(); + _model.emailRegisterFormFocusNode ??= FocusNode(); + _model.emailRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.passwordRegisterFormTextController ??= TextEditingController(); + _model.passwordRegisterFormFocusNode ??= FocusNode(); + _model.passwordRegisterFormFocusNode!.addListener(() => setState(() {})); + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + width: 669.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + FFLocalizations.of(context).getText( + '49609olv' /* INSIRA SEU EMAIL E SENHA, VAMO... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/ug2zlyhca2sh/Frame_5.svg', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .nameRegisterFormTextController, + focusNode: _model + .nameRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.nameRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [AutofillHints.name], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '3corpwhd' /* Nome */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: Icon( + Icons.person, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: TextInputType.name, + validator: _model + .nameRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailRegisterFormTextController, + focusNode: _model + .emailRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.emailRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.email + ], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '80wonb69' /* Email */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .primaryText, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .customColor1, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: + TextInputType.emailAddress, + validator: _model + .emailRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .passwordRegisterFormTextController, + focusNode: _model + .passwordRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.passwordRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.password + ], + obscureText: !_model + .passwordRegisterFormVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '0firji8l' /* Senha */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordRegisterFormVisibility = + !_model + .passwordRegisterFormVisibility, + ), + focusNode: FocusNode( + skipTraversal: true), + child: Icon( + _model.passwordRegisterFormVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + var shouldSetState = false; + _model.signUp = await action_blocks + .signUpActionApp( + context, + name: _model + .nameRegisterFormTextController + .text, + passwd: _model + .passwordRegisterFormTextController + .text, + email: _model + .emailRegisterFormTextController + .text, + device: FFAppState().device, + ); + shouldSetState = true; + if (_model.signUp == true) { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignIn', + ); + } else { + if (shouldSetState) { + setState(() {}); + } + return; + } + + if (shouldSetState) { + setState(() {}); + } + }, + text: FFLocalizations.of(context) + .getText( + 'rnvdwzei' /* Cadastrar-se */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context) + .accent1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignIn', + ); + }, + child: RichText( + textScaler: MediaQuery.of(context) + .textScaler, + text: TextSpan( + children: [ + TextSpan( + text: FFLocalizations.of( + context) + .getText( + 'a9smhn5b' /* Você já tem uma conta? */, + ), + style: TextStyle( + color: FlutterFlowTheme.of( + context) + .primaryText, + ), + ), + TextSpan( + text: FFLocalizations.of( + context) + .getText( + '09xv5ctc' /* Clique aqui */, + ), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .primary, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ) + ], + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + Text( + FFLocalizations.of(context).getText( + 'huygnka2' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart new file mode 100644 index 00000000..e794a1dc --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart @@ -0,0 +1,11 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'welcome_component_widget.dart' show WelcomeComponentWidget; +import 'package:flutter/material.dart'; + +class WelcomeComponentModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart new file mode 100644 index 00000000..125b6ee2 --- /dev/null +++ b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart @@ -0,0 +1,456 @@ +import '/flutter_flow/flutter_flow_animations.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_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'welcome_component_model.dart'; +export 'welcome_component_model.dart'; + +class WelcomeComponentWidget extends StatefulWidget { + const WelcomeComponentWidget({ + super.key, + required this.toggleOnboardingPageAction, + }); + + final Future Function(String toggleValueWelcomeParam)? + toggleOnboardingPageAction; + + @override + State createState() => _WelcomeComponentWidgetState(); +} + +class _WelcomeComponentWidgetState extends State + with TickerProviderStateMixin { + late WelcomeComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => WelcomeComponentModel()); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SafeArea( + child: Container( + width: 648.0, + height: 208.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + FFLocalizations.of(context).getText( + 'dsc9tuc8' /* UMA EXPERIÊCIA COMPLETA */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Text( + FFLocalizations.of(context).getText( + '5bgqn16z' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 15.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ), + Container( + width: 284.0, + height: 200.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/lv1waa0etd3j/undraw_appreciate_it_re_yc8h_(1)_1.svg', + width: 603.0, + height: double.infinity, + fit: BoxFit.contain, + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + blurRadius: 0.0, + color: Colors.transparent, + offset: Offset( + 0.0, + 0.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnboardingPageAction + ?.call( + 'SignIn', + ); + }, + text: + FFLocalizations.of(context).getText( + 'dynet730' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of(context) + .info, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnboardingPageAction + ?.call( + 'SignUp', + ); + }, + text: + FFLocalizations.of(context).getText( + 'hha60cg7' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context) + .customColor1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of(context) + .customColor3, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + }, + text: FFLocalizations.of(context) + .getText( + 'zvtay8ee' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed('RegisterPage'); + }, + text: FFLocalizations.of(context) + .getText( + 'o6zob50a' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + ].divide(const SizedBox(width: 7.0)), + ); + } + }, + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart b/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart new file mode 100644 index 00000000..9455c218 --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart @@ -0,0 +1,29 @@ +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'forgot_password_page_widget.dart' show ForgotPasswordPageWidget; +import 'package:flutter/material.dart'; + +class ForgotPasswordPageModel + extends FlutterFlowModel { + /// Local state fields for this page. + + String? email; + + /// State fields for stateful widgets in this page. + + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget. + ApiCallResponse? req; + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart b/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart new file mode 100644 index 00000000..51646517 --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart @@ -0,0 +1,335 @@ +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:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'forgot_password_page_model.dart'; +export 'forgot_password_page_model.dart'; + +class ForgotPasswordPageWidget extends StatefulWidget { + const ForgotPasswordPageWidget({super.key}); + + @override + State createState() => + _ForgotPasswordPageWidgetState(); +} + +class _ForgotPasswordPageWidgetState extends State { + late ForgotPasswordPageModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => ForgotPasswordPageModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + appBar: AppBar( + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + automaticallyImplyLeading: false, + actions: const [], + flexibleSpace: FlexibleSpaceBar( + title: Row( + mainAxisSize: MainAxisSize.max, + children: [ + if (isWeb == false) + Align( + alignment: const AlignmentDirectional(-1.0, 1.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 60.0, + icon: Icon( + Icons.arrow_back_rounded, + color: FlutterFlowTheme.of(context).customColor1, + size: 30.0, + ), + onPressed: () async { + context.pop(); + }, + ), + ), + ], + ), + centerTitle: true, + expandedTitleScale: 1.0, + ), + elevation: 0.0, + ), + body: Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: const BoxDecoration(), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // This row exists for when the "app bar" is hidden on desktop, having a way back for the user can work well. + if (responsiveVisibility( + context: context, + phone: false, + tablet: false, + )) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + context.safePop(); + }, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: Icon( + Icons.arrow_back_rounded, + color: Color(0xFF15161E), + size: 24.0, + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 12.0, 0.0, 0.0, 0.0), + child: Text( + '', + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Plus Jakarta Sans', + color: const Color(0xFF15161E), + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'gfvplb0h' /* ESQUECEU SUA SENHA? */, + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Outfit', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Outfit'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), + child: Text( + FFLocalizations.of(context).getText( + 'azssgpdi' /* Não se preucupe nós vamos te a... */, + ), + style: 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'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model.emailAddressTextController, + focusNode: _model.emailAddressFocusNode, + autofillHints: const [AutofillHints.email], + obscureText: false, + decoration: InputDecoration( + labelText: FFLocalizations.of(context).getText( + '0o139961' /* Email */, + ), + labelStyle: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + hintText: FFLocalizations.of(context).getText( + 'aanw1fp3' /* digite o seu email..... */, + ), + hintStyle: + 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'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent1, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent3, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + filled: true, + fillColor: FlutterFlowTheme.of(context).primaryBackground, + contentPadding: const EdgeInsetsDirectional.fromSTEB( + 24.0, 24.0, 20.0, 24.0), + suffixIcon: Icon( + Icons.email, + color: FlutterFlowTheme.of(context).accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + maxLines: null, + keyboardType: TextInputType.emailAddress, + cursorColor: const Color(0xFF6F61EF), + validator: _model.emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0), + child: FFButtonWidget( + onPressed: () async { + var shouldSetState = false; + _model.email = _model.emailAddressTextController.text; + setState(() {}); + _model.req = await PhpGroup.forgotPasswordCall.call( + email: _model.email, + ); + shouldSetState = true; + if (PhpGroup.forgotPasswordCall.error( + (_model.req?.jsonBody ?? ''), + ) == + false) { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + } else { + if (shouldSetState) setState(() {}); + return; + } + + if (shouldSetState) setState(() {}); + }, + text: FFLocalizations.of(context).getText( + 'e7hdgc4q' /* Enviar */, + ), + options: FFButtonOptions( + width: 270.0, + height: 50.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(0xFF1AAB5F), + textStyle: + FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Plus Jakarta Sans', + color: Colors.white, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + ), + showLoadingIndicator: false, + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart b/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart new file mode 100644 index 00000000..d56459f4 --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart @@ -0,0 +1,113 @@ +import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/custom_code/actions/index.dart' as actions; +import 'login_page_widget.dart' show LoginPageWidget; +import 'package:flutter/material.dart'; + +class LoginPageModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // State field(s) for password widget. + FocusNode? passwordFocusNode; + TextEditingController? passwordTextController; + late bool passwordVisibility; + String? Function(BuildContext, String?)? passwordTextControllerValidator; + + @override + void initState(BuildContext context) { + passwordVisibility = false; + } + + @override + void dispose() { + unfocusNode.dispose(); + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + + passwordFocusNode?.dispose(); + passwordTextController?.dispose(); + } + + /// Action blocks. + Future signInActionPage( + BuildContext context, { + required String? emailAdress, + required String? passwd, + }) async { + String? devUUID; + ApiCallResponse? loginCall; + + await Future.wait([ + Future(() async { + FFAppState().email = emailAdress!; + }), + Future(() async { + FFAppState().passwd = passwd!; + }), + ]); + 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: '', + ); + FFAppState().userUUID = FFAppState().userUUID; + 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 GestureDetector( + onTap: () => unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: PhpGroup.loginCall.msg( + (loginCall?.jsonBody ?? ''), + )!, + ), + ), + ); + }, + ); + + FFAppState().email = ''; + FFAppState().passwd = ''; + FFAppState().update(() {}); + } + } else { + FFAppState().email = ''; + FFAppState().passwd = ''; + } + } +} diff --git a/lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart b/lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart new file mode 100644 index 00000000..ab64048d --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart @@ -0,0 +1,971 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'login_page_model.dart'; +export 'login_page_model.dart'; + +class LoginPageWidget extends StatefulWidget { + const LoginPageWidget({ + super.key, + required this.device, + }); + + final String? device; + + @override + State createState() => _LoginPageWidgetState(); +} + +class _LoginPageWidgetState extends State + with TickerProviderStateMixin { + late LoginPageModel _model; + + final scaffoldKey = GlobalKey(); + + final animationsMap = {}; + + @override + void initState() { + super.initState(); + _model = createModel(context, () => LoginPageModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + + _model.passwordTextController ??= TextEditingController(); + _model.passwordFocusNode ??= FocusNode(); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @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: WillPopScope( + onWillPop: () async => false, + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: const BoxDecoration(), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 35.0, 0.0, 35.0), + child: Container( + width: 548.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(0.0, 1.0), + child: Padding( + padding: const EdgeInsets.all(3.0), + child: Text( + FFLocalizations.of(context) + .getText( + '0113wf5c' /* VAMOS LA! ENTRE COM A SUA CONT... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of( + context) + .displaySmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + 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/sr43ucngg4a4/Vector.png', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 34.0, 0.0, 34.0, 0.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: + BorderRadius.circular(12.0), + shape: BoxShape.rectangle, + ), + child: Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailAddressTextController, + focusNode: _model + .emailAddressFocusNode, + autofocus: false, + textCapitalization: + TextCapitalization.none, + textInputAction: + TextInputAction.next, + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of( + context) + .getText( + 'f2go5a71' /* Email */, + ), + labelStyle: + FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme + .of(context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme + .of(context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme + .of(context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme + .of(context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of( + context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: TextInputType + .emailAddress, + validator: _model + .emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .passwordTextController, + focusNode: _model + .passwordFocusNode, + autofocus: false, + textInputAction: + TextInputAction.send, + obscureText: !_model + .passwordVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of( + context) + .getText( + 'paon3y0v' /* Senha */, + ), + labelStyle: + FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme + .of(context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordVisibility = + !_model + .passwordVisibility, + ), + focusNode: FocusNode( + skipTraversal: + true), + child: Icon( + _model.passwordVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: FlutterFlowTheme + .of(context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of( + context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordTextControllerValidator + .asValidator(context), + ), + ), + ), + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context) + .width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: + MainAxisSize.max, + children: [ + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 16.0), + child: FFButtonWidget( + onPressed: + () async { + await action_blocks + .singInActionApp( + context, + emailAdress: _model + .emailAddressTextController + .text, + password: _model + .passwordTextController + .text, + ); + }, + text: FFLocalizations + .of(context) + .getText( + 'wmbzwstw' /* Entrar */, + ), + options: + FFButtonOptions( + width: double + .infinity, + height: 44.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: FlutterFlowTheme + .of(context) + .primary, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .info, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: + const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular( + 12.0), + ), + showLoadingIndicator: + false, + ), + ), + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 16.0), + child: FFButtonWidget( + onPressed: + () async { + context.pushNamed( + 'RegisterPage'); + }, + text: FFLocalizations + .of(context) + .getText( + 'j8567afe' /* Cadastrar */, + ), + options: + FFButtonOptions( + width: double + .infinity, + height: 44.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: FlutterFlowTheme + .of(context) + .customColor1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: + const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular( + 12.0), + ), + showLoadingIndicator: + false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: + MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 16.0), + child: + FFButtonWidget( + onPressed: () { + print( + 'signInButtonLoginForm pressed ...'); + }, + text: FFLocalizations + .of(context) + .getText( + 'y3wd9q18' /* Entrar */, + ), + options: + FFButtonOptions( + width: double + .infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .accent1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: + const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular( + 12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 16.0), + child: + FFButtonWidget( + onPressed: + () async { + context.pushNamed( + 'RegisterPage'); + }, + text: FFLocalizations + .of(context) + .getText( + 'j6ufb6sq' /* Cadastrar */, + ), + options: + FFButtonOptions( + width: double + .infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .customColor1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: + const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular( + 12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + ].divide( + const SizedBox(width: 7.0)), + ); + } + }, + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: InkWell( + splashColor: + Colors.transparent, + focusColor: + Colors.transparent, + hoverColor: + Colors.transparent, + highlightColor: + Colors.transparent, + onTap: () async { + context.pushNamed( + 'ForgotPasswordPage'); + }, + child: RichText( + textScaler: + MediaQuery.of(context) + .textScaler, + text: TextSpan( + children: [ + TextSpan( + text: FFLocalizations + .of(context) + .getText( + 'h85112qs' /* Você esqueceu a sua senha? */, + ), + style: TextStyle( + color: FlutterFlowTheme + .of(context) + .primaryText, + ), + ), + TextSpan( + text: FFLocalizations + .of(context) + .getText( + 'di48hdaj' /* Recupere aqui */, + ), + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primary, + fontSize: 14.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .normal, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + mouseCursor: + SystemMouseCursors + .click, + recognizer: + TapGestureRecognizer() + ..onTap = + () async { + context.pushNamed( + 'ForgotPasswordPage'); + }, + ) + ], + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad(animationsMap[ + 'containerOnPageLoadAnimation']!), + ), + ), + ], + ), + Text( + FFLocalizations.of(context).getText( + 'gx2fp6zq' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart b/lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart new file mode 100644 index 00000000..4583ef8e --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart @@ -0,0 +1,53 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'register_page_widget.dart' show RegisterPageWidget; +import 'package:flutter/material.dart'; + +class RegisterPageModel extends FlutterFlowModel { + /// Local state fields for this page. + + String? email = 'danielsan@confia.com'; + + String? passwd = '12345678'; + + String? device = 'android'; + + String? name = 'Daniel-San'; + + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // State field(s) for nameRegisterForm widget. + FocusNode? nameRegisterFormFocusNode; + TextEditingController? nameRegisterFormTextController; + String? Function(BuildContext, String?)? + nameRegisterFormTextControllerValidator; + // State field(s) for emailRegisterForm widget. + FocusNode? emailRegisterFormFocusNode; + TextEditingController? emailRegisterFormTextController; + String? Function(BuildContext, String?)? + emailRegisterFormTextControllerValidator; + // State field(s) for passwordRegisterForm widget. + FocusNode? passwordRegisterFormFocusNode; + TextEditingController? passwordRegisterFormTextController; + late bool passwordRegisterFormVisibility; + String? Function(BuildContext, String?)? + passwordRegisterFormTextControllerValidator; + + @override + void initState(BuildContext context) { + passwordRegisterFormVisibility = false; + } + + @override + void dispose() { + unfocusNode.dispose(); + nameRegisterFormFocusNode?.dispose(); + nameRegisterFormTextController?.dispose(); + + emailRegisterFormFocusNode?.dispose(); + emailRegisterFormTextController?.dispose(); + + passwordRegisterFormFocusNode?.dispose(); + passwordRegisterFormTextController?.dispose(); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart b/lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart new file mode 100644 index 00000000..da8f34cc --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart @@ -0,0 +1,867 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:easy_debounce/easy_debounce.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'register_page_model.dart'; +export 'register_page_model.dart'; + +class RegisterPageWidget extends StatefulWidget { + const RegisterPageWidget({super.key}); + + @override + State createState() => _RegisterPageWidgetState(); +} + +class _RegisterPageWidgetState extends State + with TickerProviderStateMixin { + late RegisterPageModel _model; + + final scaffoldKey = GlobalKey(); + + final animationsMap = {}; + + @override + void initState() { + super.initState(); + _model = createModel(context, () => RegisterPageModel()); + + // On page load action. + SchedulerBinding.instance.addPostFrameCallback((_) async { + await Future.wait([ + Future(() async {}), + Future(() async { + if (isAndroid == true) { + _model.device = 'android'; + setState(() {}); + } else if (isiOS == true) { + _model.device = 'ios'; + setState(() {}); + } else { + _model.device = 'web'; + setState(() {}); + } + }), + ]); + }); + + _model.nameRegisterFormTextController ??= TextEditingController(); + _model.nameRegisterFormFocusNode ??= FocusNode(); + _model.nameRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.emailRegisterFormTextController ??= TextEditingController(); + _model.emailRegisterFormFocusNode ??= FocusNode(); + _model.emailRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.passwordRegisterFormTextController ??= TextEditingController(); + _model.passwordRegisterFormFocusNode ??= FocusNode(); + _model.passwordRegisterFormFocusNode!.addListener(() => setState(() {})); + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @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: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + width: 669.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(0.0, -1.0), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + FFLocalizations.of(context).getText( + '2d8uulm3' /* INSIRA SEU EMAIL E SENHA, VAMO... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/ug2zlyhca2sh/Frame_5.svg', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .nameRegisterFormTextController, + focusNode: _model + .nameRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.nameRegisterFormTextController', + const Duration( + milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.name + ], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of( + context) + .getText( + '8kjhi406' /* Nome */, + ), + labelStyle: FlutterFlowTheme + .of(context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + suffixIcon: Icon( + Icons.person, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of( + context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: + TextInputType.name, + validator: _model + .nameRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailRegisterFormTextController, + focusNode: _model + .emailRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.emailRegisterFormTextController', + const Duration( + milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.email + ], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of( + context) + .getText( + 'ro4zkkxp' /* Email */, + ), + labelStyle: FlutterFlowTheme + .of(context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .primaryText, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of( + context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .customColor1, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: TextInputType + .emailAddress, + validator: _model + .emailRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .passwordRegisterFormTextController, + focusNode: _model + .passwordRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.passwordRegisterFormTextController', + const Duration( + milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.password + ], + obscureText: !_model + .passwordRegisterFormVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of( + context) + .getText( + 'lzgobioa' /* Senha */, + ), + labelStyle: FlutterFlowTheme + .of(context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: + Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordRegisterFormVisibility = + !_model + .passwordRegisterFormVisibility, + ), + focusNode: FocusNode( + skipTraversal: true), + child: Icon( + _model.passwordRegisterFormVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of( + context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await action_blocks + .signUpActionApp( + context, + name: _model + .nameRegisterFormTextController + .text, + passwd: _model + .passwordRegisterFormTextController + .text, + email: _model + .emailRegisterFormTextController + .text, + device: FFAppState().device, + ); + }, + text: + FFLocalizations.of(context) + .getText( + 'c7sfyeh8' /* Cadastrar-se */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .accent1, + textStyle: FlutterFlowTheme + .of(context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: + Colors.transparent, + onTap: () async { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + }, + child: RichText( + textScaler: + MediaQuery.of(context) + .textScaler, + text: TextSpan( + children: [ + TextSpan( + text: + FFLocalizations.of( + context) + .getText( + 'jglpa1tr' /* Você já tem uma conta? */, + ), + style: TextStyle( + color: FlutterFlowTheme + .of(context) + .primaryText, + ), + ), + TextSpan( + text: + FFLocalizations.of( + context) + .getText( + 'hfcm0td9' /* Clique aqui */, + ), + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primary, + fontSize: + 14.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ) + ], + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad(animationsMap[ + 'containerOnPageLoadAnimation']!), + ), + ), + ], + ), + Text( + FFLocalizations.of(context).getText( + 'c3kno4t9' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: FlutterFlowTheme.of(context) + .secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey(FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart b/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart new file mode 100644 index 00000000..974fc120 --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart @@ -0,0 +1,21 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'welcome_page_widget.dart' show WelcomePageWidget; +import 'package:flutter/material.dart'; + +class WelcomePageModel extends FlutterFlowModel { + /// Local state fields for this page. + + String? device; + + /// 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/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart b/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart new file mode 100644 index 00000000..1ec859fe --- /dev/null +++ b/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart @@ -0,0 +1,529 @@ +import '/flutter_flow/flutter_flow_animations.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:flutter_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'welcome_page_model.dart'; +export 'welcome_page_model.dart'; + +class WelcomePageWidget extends StatefulWidget { + const WelcomePageWidget({super.key}); + + @override + State createState() => _WelcomePageWidgetState(); +} + +class _WelcomePageWidgetState extends State + with TickerProviderStateMixin { + late WelcomePageModel _model; + + final scaffoldKey = GlobalKey(); + + final animationsMap = {}; + + @override + void initState() { + super.initState(); + _model = createModel(context, () => WelcomePageModel()); + + // On page load action. + SchedulerBinding.instance.addPostFrameCallback((_) async { + if (FFAppState().isLogged == true) { + context.pushNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + duration: Duration(milliseconds: 0), + ), + }, + ); + } else { + if (isAndroid == true) { + FFAppState().device = 'Android'; + setState(() {}); + } else if (isiOS == true) { + FFAppState().device = 'iOS'; + setState(() {}); + } else { + FFAppState().device = 'Web'; + setState(() {}); + } + } + }); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @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: WillPopScope( + onWillPop: () async => false, + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SafeArea( + child: Container( + width: 648.0, + height: 208.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + FFLocalizations.of(context).getText( + 'xflxvs9y' /* UMA EXPERIÊCIA COMPLETA */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .accent1, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Text( + FFLocalizations.of(context).getText( + '5a86wzd1' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 15.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ), + Container( + width: 284.0, + height: 200.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/lv1waa0etd3j/undraw_appreciate_it_re_yc8h_(1)_1.svg', + width: 603.0, + height: double.infinity, + fit: BoxFit.contain, + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + blurRadius: 0.0, + color: Colors.transparent, + offset: Offset( + 0.0, + 0.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + }, + text: + FFLocalizations.of(context) + .getText( + '65nuva6j' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .primary, + textStyle: FlutterFlowTheme + .of(context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .info, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'RegisterPage'); + }, + text: + FFLocalizations.of(context) + .getText( + '9u6oaw01' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .customColor1, + textStyle: FlutterFlowTheme + .of(context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .customColor3, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': + serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + }, + text: FFLocalizations.of( + context) + .getText( + 'd1qem43w' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .primary, + textStyle: FlutterFlowTheme + .of(context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'RegisterPage'); + }, + text: FFLocalizations.of( + context) + .getText( + 'bhowzv2u' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of( + context) + .primary, + textStyle: FlutterFlowTheme + .of(context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w500, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + ].divide(const SizedBox(width: 7.0)), + ); + } + }, + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 00000000..19887d02 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,171 @@ +name: f_r_e_hub +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + auto_size_text: 3.0.0 + cached_network_image: 3.3.1 + collection: 1.18.0 + crop_your_image: 1.0.0 + device_info_plus: 9.1.2 + dropdown_button2: 2.3.9 + easy_debounce: 2.0.1 + equatable: 2.0.5 + file_picker: 6.1.1 + flutter_animate: 4.1.1+1 + flutter_cache_manager: 3.3.1 + flutter_plugin_android_lifecycle: 2.0.17 + flutter_spinkit: 5.2.0 + flutter_staggered_grid_view: 0.7.0 + flutter_svg: 2.0.9 + font_awesome_flutter: 10.6.0 + from_css_color: 2.0.0 + go_router: 12.1.3 + google_fonts: 6.1.0 + http: 1.2.0 + image_picker: 1.0.4 + image_picker_android: 0.8.8 + image_picker_for_web: 3.0.1 + image_picker_ios: 0.8.8+2 + image_picker_platform_interface: 2.9.1 + intl: 0.18.1 + json_path: 0.6.2 + mime_type: 1.0.0 + page_transition: 2.1.0 + path_provider: 2.0.14 + path_provider_android: 2.0.25 + path_provider_foundation: 2.2.2 + path_provider_platform_interface: 2.0.6 + plugin_platform_interface: 2.1.8 + provider: 6.0.5 + shared_preferences: 2.2.2 + shared_preferences_android: 2.2.1 + shared_preferences_foundation: 2.3.4 + shared_preferences_platform_interface: 2.3.1 + shared_preferences_web: 2.2.1 + sqflite: 2.2.6 + timeago: 3.2.2 + url_launcher: 6.2.5 + url_launcher_android: 6.3.0 + url_launcher_ios: 6.2.5 + url_launcher_platform_interface: 2.3.2 + video_player: 2.8.1 + video_player_android: 2.4.10 + video_player_avfoundation: 2.5.1 + video_player_platform_interface: 6.2.1 + video_player_web: 2.1.2 + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.0 + +dependency_overrides: + http: 1.2.0 + uuid: ^4.0.0 + +dev_dependencies: + flutter_launcher_icons: 0.13.1 + flutter_lints: 3.0.0 + image: 4.0.17 + lints: 3.0.0 + + flutter_test: + sdk: flutter + + +flutter_launcher_icons: + android: 'launcher_icon' + ios: true + web: + generate: true + image_path: 'assets/images/app_launcher_icon.svg' + adaptive_icon_background: 'assets/images/adaptive_background_icon.svg' + adaptive_icon_foreground: 'assets/images/adaptive_foreground_icon.svg' + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - assets/fonts/ + - assets/images/ + - assets/videos/ + - assets/audios/ + - assets/lottie_animations/ + - assets/rive_animations/ + - assets/pdfs/ + fonts: + - family: 'SF Pro' + fonts: + - asset: assets/fonts/SFPRODISPLAYREGULAR.OTF + - asset: assets/fonts/SFPRODISPLAYMEDIUM.OTF + weight: 500 + - asset: assets/fonts/SFPRODISPLAYBOLD.OTF + weight: 700 + + - family: Icons + fonts: + - asset: assets/fonts/icons.ttf + - family: Menu + fonts: + - asset: assets/fonts/menu.ttf + + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 00000000..9e847a93 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,17 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +import 'package:f_r_e_hub/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + }); +} diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..300efaefa7d2bd34a221ffad6d778922d14bceb1 GIT binary patch literal 54361 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 GL;nxy#aciB literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/icons/app_launcher_icon.svg b/web/icons/app_launcher_icon.svg new file mode 100644 index 00000000..5e3c0b13 --- /dev/null +++ b/web/icons/app_launcher_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/index.html b/web/index.html new file mode 100644 index 00000000..4001623d --- /dev/null +++ b/web/index.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FREHub + + + + + + + + + + + + + + + + + + + + +

Cg|u*xfjw`p@N!J?^468a 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|@`5Yvhx`oR^)3{8uiJsK{ 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