diff --git a/Application Product/Source/README.md b/Application Product/Source/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Application Product/Source/source/.gitignore b/Application Product/Source/source/.gitignore new file mode 100755 index 0000000..d009f5a --- /dev/null +++ b/Application Product/Source/source/.gitignore @@ -0,0 +1,50 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Firebase – this is necessary if you use Firebase since it could otherwise +# lead to leaking of private certificates to your repository, which is no bueno. +.firebase/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/Application Product/Source/source/.metadata b/Application Product/Source/source/.metadata new file mode 100755 index 0000000..140b929 --- /dev/null +++ b/Application Product/Source/source/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 4d7946a68d26794349189cf21b3f68cc6fe61dcb + channel: stable + +project_type: app diff --git a/Application Product/Source/source/README.md b/Application Product/Source/source/README.md new file mode 100755 index 0000000..805480a --- /dev/null +++ b/Application Product/Source/source/README.md @@ -0,0 +1,7 @@ +# UVita + +A new Flutter project. + +## Getting Started + +FlutterFlow projects are built to run on the Flutter _stable_ release. diff --git a/Application Product/Source/source/analysis_options.yaml b/Application Product/Source/source/analysis_options.yaml new file mode 100755 index 0000000..102df89 --- /dev/null +++ b/Application Product/Source/source/analysis_options.yaml @@ -0,0 +1,29 @@ +# 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 \ No newline at end of file diff --git a/Application Product/Source/source/android/.gitignore b/Application Product/Source/source/android/.gitignore new file mode 100755 index 0000000..0a741cb --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/android/app/build.gradle b/Application Product/Source/source/android/app/build.gradle new file mode 100755 index 0000000..39385be --- /dev/null +++ b/Application Product/Source/source/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.mycompany.uvita" + 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.8.10" +} diff --git a/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml b/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml new file mode 100755 index 0000000..a9118bb --- /dev/null +++ b/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Application Product/Source/source/android/app/src/main/AndroidManifest.xml b/Application Product/Source/source/android/app/src/main/AndroidManifest.xml new file mode 100755 index 0000000..1e54b39 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt b/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt new file mode 100755 index 0000000..b00eced --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt @@ -0,0 +1,6 @@ +package com.mycompany.uvita + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml b/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml new file mode 100755 index 0000000..f74085f --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml new file mode 100755 index 0000000..f93aa34 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml new file mode 100755 index 0000000..f93aa34 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml new file mode 100755 index 0000000..d74aa35 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/Application Product/Source/source/android/app/src/main/res/values/strings.xml b/Application Product/Source/source/android/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..ae55af4 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + UVita + + \ No newline at end of file diff --git a/Application Product/Source/source/android/app/src/main/res/values/styles.xml b/Application Product/Source/source/android/app/src/main/res/values/styles.xml new file mode 100755 index 0000000..d74aa35 --- /dev/null +++ b/Application Product/Source/source/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml b/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml new file mode 100755 index 0000000..a9118bb --- /dev/null +++ b/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Application Product/Source/source/android/build.gradle b/Application Product/Source/source/android/build.gradle new file mode 100755 index 0000000..cf9fba7 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/android/gradle.properties b/Application Product/Source/source/android/gradle.properties new file mode 100755 index 0000000..498c33b --- /dev/null +++ b/Application Product/Source/source/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx4608m +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/Application Product/Source/source/android/gradle/wrapper/gradle-wrapper.properties b/Application Product/Source/source/android/gradle/wrapper/gradle-wrapper.properties new file mode 100755 index 0000000..6b66533 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/android/settings.gradle b/Application Product/Source/source/android/settings.gradle new file mode 100755 index 0000000..6153427 --- /dev/null +++ b/Application Product/Source/source/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.8.10" apply false + + +} + +include ":app" \ No newline at end of file diff --git a/Application Product/Source/source/assets/audios/favicon.png b/Application Product/Source/source/assets/audios/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/audios/favicon.png differ diff --git a/Application Product/Source/source/assets/fonts/favicon.png b/Application Product/Source/source/assets/fonts/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/fonts/favicon.png differ diff --git a/Application Product/Source/source/assets/images/230302-AWS-services.jpg b/Application Product/Source/source/assets/images/230302-AWS-services.jpg new file mode 100755 index 0000000..563f414 Binary files /dev/null and b/Application Product/Source/source/assets/images/230302-AWS-services.jpg differ diff --git a/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp b/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp new file mode 100755 index 0000000..89f794b Binary files /dev/null and b/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp differ diff --git a/Application Product/Source/source/assets/images/Settings_(4).png b/Application Product/Source/source/assets/images/Settings_(4).png new file mode 100755 index 0000000..517457e Binary files /dev/null and b/Application Product/Source/source/assets/images/Settings_(4).png differ diff --git a/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg b/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg new file mode 100755 index 0000000..5936be8 Binary files /dev/null and b/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg differ diff --git a/Application Product/Source/source/assets/images/app_launcher_icon.png b/Application Product/Source/source/assets/images/app_launcher_icon.png new file mode 100755 index 0000000..fef18ef Binary files /dev/null and b/Application Product/Source/source/assets/images/app_launcher_icon.png differ diff --git a/Application Product/Source/source/assets/images/favicon.png b/Application Product/Source/source/assets/images/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/images/favicon.png differ diff --git a/Application Product/Source/source/assets/images/images.jpg b/Application Product/Source/source/assets/images/images.jpg new file mode 100755 index 0000000..2854232 Binary files /dev/null and b/Application Product/Source/source/assets/images/images.jpg differ diff --git a/Application Product/Source/source/assets/images/sun-eye.jpg b/Application Product/Source/source/assets/images/sun-eye.jpg new file mode 100755 index 0000000..d524e08 Binary files /dev/null and b/Application Product/Source/source/assets/images/sun-eye.jpg differ diff --git a/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg b/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg new file mode 100755 index 0000000..833541e Binary files /dev/null and b/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg differ diff --git a/Application Product/Source/source/assets/lottie_animations/favicon.png b/Application Product/Source/source/assets/lottie_animations/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/lottie_animations/favicon.png differ diff --git a/Application Product/Source/source/assets/pdfs/favicon.png b/Application Product/Source/source/assets/pdfs/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/pdfs/favicon.png differ diff --git a/Application Product/Source/source/assets/rive_animations/favicon.png b/Application Product/Source/source/assets/rive_animations/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/rive_animations/favicon.png differ diff --git a/Application Product/Source/source/assets/videos/favicon.png b/Application Product/Source/source/assets/videos/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/Application Product/Source/source/assets/videos/favicon.png differ diff --git a/Application Product/Source/source/ios/.gitignore b/Application Product/Source/source/ios/.gitignore new file mode 100755 index 0000000..eb86478 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Flutter/AppFrameworkInfo.plist b/Application Product/Source/source/ios/Flutter/AppFrameworkInfo.plist new file mode 100755 index 0000000..748aee7 --- /dev/null +++ b/Application Product/Source/source/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 + 14.0.0 + + diff --git a/Application Product/Source/source/ios/Flutter/Debug.xcconfig b/Application Product/Source/source/ios/Flutter/Debug.xcconfig new file mode 100755 index 0000000..e8efba1 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Flutter/Release.xcconfig b/Application Product/Source/source/ios/Flutter/Release.xcconfig new file mode 100755 index 0000000..399e934 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/ImageNotification/Info.plist b/Application Product/Source/source/ios/ImageNotification/Info.plist new file mode 100755 index 0000000..9f28060 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/ImageNotification/NotificationService.swift b/Application Product/Source/source/ios/ImageNotification/NotificationService.swift new file mode 100755 index 0000000..d16342e --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Podfile b/Application Product/Source/source/ios/Podfile new file mode 100755 index 0000000..8f4bfd9 --- /dev/null +++ b/Application Product/Source/source/ios/Podfile @@ -0,0 +1,45 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '14.0.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/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj b/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj new file mode 100755 index 0000000..af6066a --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,513 @@ +// !$*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 = ""; }; + 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 = en; + hasScannedForEncodings = 0; + knownRegions = ( + 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 = ( + + ); + 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 = 14.0.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_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + 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.mycompany.uvita; + 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 = 14.0.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 = 14.0.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_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + 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.mycompany.uvita; + 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_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + 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.mycompany.uvita; + 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/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..1d526a1 --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100755 index 0000000..18d9810 --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100755 index 0000000..f9b0d7c --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100755 index 0000000..a28140c --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata b/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..1d526a1 --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100755 index 0000000..18d9810 --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100755 index 0000000..f9b0d7c --- /dev/null +++ b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/Application Product/Source/source/ios/Runner/AppDelegate.swift b/Application Product/Source/source/ios/Runner/AppDelegate.swift new file mode 100755 index 0000000..f52eb22 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..d36b1fa --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..28c6bf0 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..f091b6b Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cde121 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d0ef06e Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..dcdc230 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..c8f9ed8 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..75b2d16 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c4df70d Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..6a84f41 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..d0e1f58 Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100755 index 0000000..0bedcf2 --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100755 index 0000000..89c2725 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard b/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100755 index 0000000..f2e259c --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard b/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard new file mode 100755 index 0000000..f3c2851 --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application Product/Source/source/ios/Runner/Info.plist b/Application Product/Source/source/ios/Runner/Info.plist new file mode 100755 index 0000000..8a08a46 --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + UVita + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + UVita + CFBundlePackageType + APPL + + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + CFBundleTypeRole + Editor + CFBundleURLName + uvita.com + CFBundleURLSchemes + + uvita + + + + FlutterDeepLinkingEnabled + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + + diff --git a/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy b/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy new file mode 100755 index 0000000..0c67376 --- /dev/null +++ b/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy @@ -0,0 +1,5 @@ + + + + + diff --git a/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h b/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h new file mode 100755 index 0000000..308a2a5 --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/Application Product/Source/source/ios/Runner/Runner.entitlements b/Application Product/Source/source/ios/Runner/Runner.entitlements new file mode 100755 index 0000000..6631ffa --- /dev/null +++ b/Application Product/Source/source/ios/Runner/Runner.entitlements @@ -0,0 +1,6 @@ + + + + + + diff --git a/Application Product/Source/source/lib/analyst/analyst_model.dart b/Application Product/Source/source/lib/analyst/analyst_model.dart new file mode 100755 index 0000000..5571f77 --- /dev/null +++ b/Application Product/Source/source/lib/analyst/analyst_model.dart @@ -0,0 +1,66 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/widget/advice/advice_widget.dart'; +import '/widget/advice_copy/advice_copy_widget.dart'; +import '/widget/box/box_widget.dart'; +import '/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart'; +import '/widget/healthy/healthy_widget.dart'; +import '/widget/healthy_copy/healthy_copy_widget.dart'; +import '/widget/material_card2/material_card2_widget.dart'; +import '/widget/temp_and_u_v/temp_and_u_v_widget.dart'; +import '/widget/time_count/time_count_widget.dart'; +import 'analyst_widget.dart' show AnalystWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class AnalystModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + // Model for Time_Count component. + late TimeCountModel timeCountModel; + // Model for box component. + late BoxModel boxModel; + // Model for TempAndUV component. + late TempAndUVModel tempAndUVModel; + // Model for Dashboard01RecentActivity component. + late Dashboard01RecentActivityModel dashboard01RecentActivityModel; + // Model for MaterialCard2 component. + late MaterialCard2Model materialCard2Model; + // Model for Advice component. + late AdviceModel adviceModel; + // Model for AdviceCopy component. + late AdviceCopyModel adviceCopyModel; + // Model for HealthyCopy component. + late HealthyCopyModel healthyCopyModel; + // Model for Healthy component. + late HealthyModel healthyModel; + + @override + void initState(BuildContext context) { + timeCountModel = createModel(context, () => TimeCountModel()); + boxModel = createModel(context, () => BoxModel()); + tempAndUVModel = createModel(context, () => TempAndUVModel()); + dashboard01RecentActivityModel = + createModel(context, () => Dashboard01RecentActivityModel()); + materialCard2Model = createModel(context, () => MaterialCard2Model()); + adviceModel = createModel(context, () => AdviceModel()); + adviceCopyModel = createModel(context, () => AdviceCopyModel()); + healthyCopyModel = createModel(context, () => HealthyCopyModel()); + healthyModel = createModel(context, () => HealthyModel()); + } + + @override + void dispose() { + timeCountModel.dispose(); + boxModel.dispose(); + tempAndUVModel.dispose(); + dashboard01RecentActivityModel.dispose(); + materialCard2Model.dispose(); + adviceModel.dispose(); + adviceCopyModel.dispose(); + healthyCopyModel.dispose(); + healthyModel.dispose(); + } +} diff --git a/Application Product/Source/source/lib/analyst/analyst_widget.dart b/Application Product/Source/source/lib/analyst/analyst_widget.dart new file mode 100755 index 0000000..a833983 --- /dev/null +++ b/Application Product/Source/source/lib/analyst/analyst_widget.dart @@ -0,0 +1,127 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/widget/advice/advice_widget.dart'; +import '/widget/advice_copy/advice_copy_widget.dart'; +import '/widget/box/box_widget.dart'; +import '/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart'; +import '/widget/healthy/healthy_widget.dart'; +import '/widget/healthy_copy/healthy_copy_widget.dart'; +import '/widget/material_card2/material_card2_widget.dart'; +import '/widget/temp_and_u_v/temp_and_u_v_widget.dart'; +import '/widget/time_count/time_count_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'analyst_model.dart'; +export 'analyst_model.dart'; + +class AnalystWidget extends StatefulWidget { + const AnalystWidget({super.key}); + + @override + State createState() => _AnalystWidgetState(); +} + +class _AnalystWidgetState extends State { + late AnalystModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => AnalystModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: Color(0xFFDDDCDC), + body: SafeArea( + top: true, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsets.all(22.0), + child: wrapWithModel( + model: _model.timeCountModel, + updateCallback: () => safeSetState(() {}), + child: TimeCountWidget(), + ), + ), + Padding( + padding: EdgeInsets.all(2.0), + child: wrapWithModel( + model: _model.boxModel, + updateCallback: () => safeSetState(() {}), + child: BoxWidget(), + ), + ), + Padding( + padding: EdgeInsets.all(6.0), + child: wrapWithModel( + model: _model.tempAndUVModel, + updateCallback: () => safeSetState(() {}), + child: TempAndUVWidget(), + ), + ), + Padding( + padding: EdgeInsets.all(4.0), + child: wrapWithModel( + model: _model.dashboard01RecentActivityModel, + updateCallback: () => safeSetState(() {}), + child: Dashboard01RecentActivityWidget(), + ), + ), + wrapWithModel( + model: _model.materialCard2Model, + updateCallback: () => safeSetState(() {}), + child: MaterialCard2Widget(), + ), + Padding( + padding: EdgeInsets.all(20.0), + child: wrapWithModel( + model: _model.adviceModel, + updateCallback: () => safeSetState(() {}), + child: AdviceWidget(), + ), + ), + Padding( + padding: EdgeInsets.all(20.0), + child: wrapWithModel( + model: _model.adviceCopyModel, + updateCallback: () => safeSetState(() {}), + child: AdviceCopyWidget(), + ), + ), + wrapWithModel( + model: _model.healthyCopyModel, + updateCallback: () => safeSetState(() {}), + child: HealthyCopyWidget(), + ), + wrapWithModel( + model: _model.healthyModel, + updateCallback: () => safeSetState(() {}), + child: HealthyWidget(), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/components/card35_news_article_model.dart b/Application Product/Source/source/lib/components/card35_news_article_model.dart new file mode 100755 index 0000000..c63b57e --- /dev/null +++ b/Application Product/Source/source/lib/components/card35_news_article_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'card35_news_article_widget.dart' show Card35NewsArticleWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class Card35NewsArticleModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/components/card35_news_article_widget.dart b/Application Product/Source/source/lib/components/card35_news_article_widget.dart new file mode 100755 index 0000000..db0e1d9 --- /dev/null +++ b/Application Product/Source/source/lib/components/card35_news_article_widget.dart @@ -0,0 +1,184 @@ +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 'package:provider/provider.dart'; +import 'card35_news_article_model.dart'; +export 'card35_news_article_model.dart'; + +class Card35NewsArticleWidget extends StatefulWidget { + const Card35NewsArticleWidget({super.key}); + + @override + State createState() => + _Card35NewsArticleWidgetState(); +} + +class _Card35NewsArticleWidgetState extends State { + late Card35NewsArticleModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => Card35NewsArticleModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + borderRadius: BorderRadius.circular(8.0), + ), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 160.0, + child: Stack( + alignment: AlignmentDirectional(0.0, 1.0), + children: [ + Align( + alignment: AlignmentDirectional(0.0, -1.0), + child: ClipRRect( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(8.0), + topRight: Radius.circular(8.0), + ), + child: Image.asset( + 'assets/images/230302-AWS-services.jpg', + width: double.infinity, + height: 130.0, + fit: BoxFit.cover, + ), + ), + ), + Align( + alignment: AlignmentDirectional(0.0, 1.0), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 24.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Icon( + Icons.grid_on_rounded, + color: Color(0xFF9A0F0F), + size: 24.0, + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Text( + 'NASA NEWS', + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Inter', + color: Color(0xFFAE1010), + fontSize: 23.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 12.0), + child: Container( + width: 40.0, + height: 40.0, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + FlutterFlowTheme.of(context).primary, + FlutterFlowTheme.of(context).secondary, + FlutterFlowTheme.of(context).alternate + ], + stops: [0.0, 0.3, 1.0], + begin: AlignmentDirectional(1.0, 0.98), + end: AlignmentDirectional(-1.0, -0.98), + ), + shape: BoxShape.circle, + ), + child: Padding( + padding: EdgeInsets.all(2.0), + child: Container( + width: 40.0, + height: 40.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .secondaryBackground, + shape: BoxShape.circle, + ), + child: Icon( + Icons.chevron_right_rounded, + color: FlutterFlowTheme.of(context) + .primaryText, + size: 32.0, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 8.0, 0.0, 0.0), + child: Text( + 'Explore Open Data on AWS', + style: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Inter Tight', + fontSize: 24.0, + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 0.0), + child: Text( + 'NASA partners with Amazon Web Services (AWS) to offer high-value scientific datasets for faster research. The data spans multiple fields and is suitable for AI training, supporting NASA\'s commitment to open science.sss', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + fontSize: 19.0, + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/components/card38_location_details_model.dart b/Application Product/Source/source/lib/components/card38_location_details_model.dart new file mode 100755 index 0000000..7c78c0d --- /dev/null +++ b/Application Product/Source/source/lib/components/card38_location_details_model.dart @@ -0,0 +1,16 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'card38_location_details_widget.dart' show Card38LocationDetailsWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class Card38LocationDetailsModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/components/card38_location_details_widget.dart b/Application Product/Source/source/lib/components/card38_location_details_widget.dart new file mode 100755 index 0000000..710a466 --- /dev/null +++ b/Application Product/Source/source/lib/components/card38_location_details_widget.dart @@ -0,0 +1,208 @@ +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 'package:provider/provider.dart'; +import 'card38_location_details_model.dart'; +export 'card38_location_details_model.dart'; + +class Card38LocationDetailsWidget extends StatefulWidget { + const Card38LocationDetailsWidget({super.key}); + + @override + State createState() => + _Card38LocationDetailsWidgetState(); +} + +class _Card38LocationDetailsWidgetState + extends State { + late Card38LocationDetailsModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => Card38LocationDetailsModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 12.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 3.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: EdgeInsets.all(12.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: Image.asset( + 'assets/images/VZIc6KAR_400x400.jpg', + width: 94.0, + height: 93.0, + fit: BoxFit.cover, + ), + ), + Expanded( + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(12.0, 8.0, 0.0, 0.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'NASA NEWS', + style: + FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + fontSize: 21.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: SelectionArea( + child: Text( + 'Astromaterials Data System', + style: FlutterFlowTheme.of(context) + .bodySmall + .override( + fontFamily: 'Inter', + color: Color(0xFFB40404), + fontSize: 23.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + ), + )), + ), + ], + ), + ), + ), + Icon( + Icons.check_circle_outline_rounded, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + ], + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 0.0), + child: Text( + 'OSIRIS-REx has returned samples from asteroid Bennu, now available in NASA\'s Astromaterials Data System (Astromat). Explore data from Bennu, lunar samples, meteorites, and more with 40+ years of searchable archives', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + fontSize: 21.0, + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 4.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 0.0), + child: SelectionArea( + child: Text( + 'Last Activity', + style: FlutterFlowTheme.of(context).labelSmall.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + )), + ), + Expanded( + child: Align( + alignment: AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 4.0, 8.0, 0.0, 0.0), + child: SelectionArea( + child: Text( + 'Yesterday, 4:21pm', + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context).bodySmall.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + )), + ), + ), + ), + ], + ), + ), + FFButtonWidget( + onPressed: () { + print('Button pressed ...'); + }, + text: 'NEWS', + options: FFButtonOptions( + height: 40.0, + padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 0.0), + iconPadding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), + color: Color(0xFFFFCF00), + textStyle: FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + elevation: 2.0, + borderSide: BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: BorderRadius.circular(8.0), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/components/notifi_model.dart b/Application Product/Source/source/lib/components/notifi_model.dart new file mode 100755 index 0000000..949062b --- /dev/null +++ b/Application Product/Source/source/lib/components/notifi_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'notifi_widget.dart' show NotifiWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class NotifiModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/components/notifi_widget.dart b/Application Product/Source/source/lib/components/notifi_widget.dart new file mode 100755 index 0000000..8f4b37a --- /dev/null +++ b/Application Product/Source/source/lib/components/notifi_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 'package:provider/provider.dart'; +import 'notifi_model.dart'; +export 'notifi_model.dart'; + +class NotifiWidget extends StatefulWidget { + const NotifiWidget({super.key}); + + @override + State createState() => _NotifiWidgetState(); +} + +class _NotifiWidgetState extends State { + late NotifiModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => NotifiModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 1.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 0.0, + color: FlutterFlowTheme.of(context).primaryBackground, + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 12.0, 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 44.0, + height: 44.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + shape: BoxShape.circle, + ), + child: Padding( + padding: EdgeInsets.all(2.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(40.0), + child: Image.network( + 'https://images.unsplash.com/photo-1474176857210-7287d38d27c6?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NTB8fHVzZXJzfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=900&q=60', + width: 36.0, + height: 36.0, + fit: BoxFit.cover, + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 12.0, 0.0, 0.0, 0.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: Text( + 'Andrew Hernandez', + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Text( + 'Jan. 28th, 4:30pm', + style: FlutterFlowTheme.of(context) + .labelSmall + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ], + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: Text( + '@username', + style: FlutterFlowTheme.of(context) + .bodySmall + .override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context) + .primary, + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: Text( + 'FlutterFlow is a visual development platform that allows you to easily create beautiful and responsive user interfaces for your mobile and web applications. ', + style: FlutterFlowTheme.of(context) + .labelSmall + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 20.0, 0.0, 0.0), + child: Container( + width: 12.0, + height: 12.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondary, + shape: BoxShape.circle, + ), + alignment: AlignmentDirectional(0.0, 0.0), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart new file mode 100755 index 0000000..81dd980 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart @@ -0,0 +1,112 @@ +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) { + animations.forEach((animation) => 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({ + Duration? delay, + Duration? duration, + Curve? curve, + Offset? begin, + Offset? end, + }) : super( + delay: delay, + duration: duration, + curve: curve, + 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/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart new file mode 100755 index 0000000..bcbe673 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart @@ -0,0 +1,325 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:intl/intl.dart'; +import 'package:table_calendar/table_calendar.dart'; + +DateTime kFirstDay = DateTime(1970, 1, 1); +DateTime kLastDay = DateTime(2100, 1, 1); + +extension DateTimeExtension on DateTime { + DateTime get startOfDay => DateTime(year, month, day); + + DateTime get endOfDay => DateTime(year, month, day, 23, 59); +} + +class FlutterFlowCalendar extends StatefulWidget { + const FlutterFlowCalendar({ + Key? key, + required this.color, + this.onChange, + this.initialDate, + this.weekFormat = false, + this.weekStartsMonday = false, + this.twoRowHeader = false, + this.iconColor, + this.dateStyle, + this.dayOfWeekStyle, + this.inactiveDateStyle, + this.selectedDateStyle, + this.titleStyle, + this.rowHeight, + this.locale, + }) : super(key: key); + + final bool weekFormat; + final bool weekStartsMonday; + final bool twoRowHeader; + final Color color; + final void Function(DateTimeRange?)? onChange; + final DateTime? initialDate; + final Color? iconColor; + final TextStyle? dateStyle; + final TextStyle? dayOfWeekStyle; + final TextStyle? inactiveDateStyle; + final TextStyle? selectedDateStyle; + final TextStyle? titleStyle; + final double? rowHeight; + final String? locale; + + @override + State createState() => _FlutterFlowCalendarState(); +} + +class _FlutterFlowCalendarState extends State { + late DateTime focusedDay; + late DateTime selectedDay; + late DateTimeRange selectedRange; + + @override + void initState() { + super.initState(); + focusedDay = widget.initialDate ?? DateTime.now(); + selectedDay = widget.initialDate ?? DateTime.now(); + selectedRange = DateTimeRange( + start: selectedDay.startOfDay, + end: selectedDay.endOfDay, + ); + SchedulerBinding.instance + .addPostFrameCallback((_) => setSelectedDay(selectedRange.start)); + } + + CalendarFormat get calendarFormat => + widget.weekFormat ? CalendarFormat.week : CalendarFormat.month; + + StartingDayOfWeek get startingDayOfWeek => widget.weekStartsMonday + ? StartingDayOfWeek.monday + : StartingDayOfWeek.sunday; + + Color get color => widget.color; + + Color get lightColor => widget.color.withOpacity(0.85); + + Color get lighterColor => widget.color.withOpacity(0.60); + + void setSelectedDay( + DateTime? newSelectedDay, [ + DateTime? newSelectedEnd, + ]) { + final newRange = newSelectedDay == null + ? null + : DateTimeRange( + start: newSelectedDay.startOfDay, + end: newSelectedEnd ?? newSelectedDay.endOfDay, + ); + setState(() { + selectedDay = newSelectedDay ?? selectedDay; + selectedRange = newRange ?? selectedRange; + if (widget.onChange != null) { + widget.onChange!(newRange); + } + }); + } + + @override + Widget build(BuildContext context) => Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + CalendarHeader( + focusedDay: focusedDay, + onLeftChevronTap: () => setState( + () => focusedDay = widget.weekFormat + ? _previousWeek(focusedDay) + : _previousMonth(focusedDay), + ), + onRightChevronTap: () => setState( + () => focusedDay = widget.weekFormat + ? _nextWeek(focusedDay) + : _nextMonth(focusedDay), + ), + onTodayButtonTap: () => setState(() => focusedDay = DateTime.now()), + titleStyle: widget.titleStyle, + iconColor: widget.iconColor, + locale: widget.locale, + twoRowHeader: widget.twoRowHeader, + ), + TableCalendar( + focusedDay: focusedDay, + selectedDayPredicate: (date) => isSameDay(selectedDay, date), + firstDay: kFirstDay, + lastDay: kLastDay, + calendarFormat: calendarFormat, + headerVisible: false, + locale: widget.locale, + rowHeight: widget.rowHeight ?? MediaQuery.sizeOf(context).width / 7, + calendarStyle: CalendarStyle( + defaultTextStyle: + widget.dateStyle ?? const TextStyle(color: Color(0xFF5A5A5A)), + weekendTextStyle: widget.dateStyle ?? + const TextStyle(color: const Color(0xFF5A5A5A)), + holidayTextStyle: widget.dateStyle ?? + const TextStyle(color: const Color(0xFF5C6BC0)), + selectedTextStyle: + const TextStyle(color: Color(0xFFFAFAFA), fontSize: 16.0) + .merge(widget.selectedDateStyle), + todayTextStyle: + const TextStyle(color: Color(0xFFFAFAFA), fontSize: 16.0) + .merge(widget.selectedDateStyle), + outsideTextStyle: const TextStyle(color: Color(0xFF9E9E9E)) + .merge(widget.inactiveDateStyle), + selectedDecoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + ), + todayDecoration: BoxDecoration( + color: lighterColor, + shape: BoxShape.circle, + ), + markerDecoration: BoxDecoration( + color: lightColor, + shape: BoxShape.circle, + ), + markersMaxCount: 3, + canMarkersOverflow: true, + ), + availableGestures: AvailableGestures.horizontalSwipe, + startingDayOfWeek: startingDayOfWeek, + daysOfWeekStyle: DaysOfWeekStyle( + weekdayStyle: const TextStyle(color: Color(0xFF616161)) + .merge(widget.dayOfWeekStyle), + weekendStyle: const TextStyle(color: Color(0xFF616161)) + .merge(widget.dayOfWeekStyle), + ), + onPageChanged: (focused) { + if (focusedDay.startOfDay != focused.startOfDay) { + setState(() => focusedDay = focused); + } + }, + onDaySelected: (newSelectedDay, focused) { + if (!isSameDay(selectedDay, newSelectedDay)) { + setSelectedDay(newSelectedDay); + if (focusedDay.startOfDay != focused.startOfDay) { + setState(() => focusedDay = focused); + } + } + }, + ), + ], + ); +} + +class CalendarHeader extends StatelessWidget { + const CalendarHeader({ + Key? key, + required this.focusedDay, + required this.onLeftChevronTap, + required this.onRightChevronTap, + required this.onTodayButtonTap, + this.iconColor, + this.titleStyle, + this.locale, + this.twoRowHeader = false, + }) : super(key: key); + + final DateTime focusedDay; + final VoidCallback onLeftChevronTap; + final VoidCallback onRightChevronTap; + final VoidCallback onTodayButtonTap; + final Color? iconColor; + final TextStyle? titleStyle; + final String? locale; + final bool twoRowHeader; + + @override + Widget build(BuildContext context) => Container( + decoration: const BoxDecoration(), + margin: const EdgeInsets.all(0), + padding: const EdgeInsets.symmetric(vertical: 8), + child: twoRowHeader ? _buildTwoRowHeader() : _buildOneRowHeader(), + ); + + Widget _buildTwoRowHeader() => Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + const SizedBox(width: 16), + _buildDateWidget(), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: _buildCustomIconButtons(), + ), + ], + ); + + Widget _buildOneRowHeader() => Row( + mainAxisSize: MainAxisSize.max, + children: [ + const SizedBox(width: 16), + _buildDateWidget(), + ..._buildCustomIconButtons(), + ], + ); + + Widget _buildDateWidget() => Expanded( + child: Text( + DateFormat.yMMMM(locale).format(focusedDay), + style: const TextStyle(fontSize: 17).merge(titleStyle), + ), + ); + + List _buildCustomIconButtons() => [ + CustomIconButton( + icon: Icon(Icons.calendar_today, color: iconColor), + onTap: onTodayButtonTap, + ), + CustomIconButton( + icon: Icon(Icons.chevron_left, color: iconColor), + onTap: onLeftChevronTap, + ), + CustomIconButton( + icon: Icon(Icons.chevron_right, color: iconColor), + onTap: onRightChevronTap, + ), + ]; +} + +class CustomIconButton extends StatelessWidget { + const CustomIconButton({ + Key? key, + required this.icon, + required this.onTap, + this.margin = const EdgeInsets.symmetric(horizontal: 4), + this.padding = const EdgeInsets.all(10), + }) : super(key: key); + + final Icon icon; + final VoidCallback onTap; + final EdgeInsetsGeometry margin; + final EdgeInsetsGeometry padding; + + @override + Widget build(BuildContext context) => Padding( + padding: margin, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(100), + child: Padding( + padding: padding, + child: Icon( + icon.icon, + color: icon.color, + size: icon.size, + ), + ), + ), + ); +} + +DateTime _previousWeek(DateTime week) { + return week.subtract(const Duration(days: 7)); +} + +DateTime _nextWeek(DateTime week) { + return week.add(const Duration(days: 7)); +} + +DateTime _previousMonth(DateTime month) { + if (month.month == 1) { + return DateTime(month.year - 1, 12); + } else { + return DateTime(month.year, month.month - 1); + } +} + +DateTime _nextMonth(DateTime month) { + if (month.month == 12) { + return DateTime(month.year + 1, 1); + } else { + return DateTime(month.year, month.month + 1); + } +} diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart new file mode 100755 index 0000000..159d769 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart @@ -0,0 +1,547 @@ +import 'dart:math'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +export 'package:fl_chart/fl_chart.dart' + show BarAreaData, FlDotData, LineChartBarData, BarChartAlignment; + +class FlutterFlowLineChart extends StatelessWidget { + const FlutterFlowLineChart({ + Key? key, + required this.data, + required this.xAxisLabelInfo, + required this.yAxisLabelInfo, + required this.axisBounds, + this.chartStylingInfo = const ChartStylingInfo(), + }) : super(key: key); + + final List data; + final AxisLabelInfo xAxisLabelInfo; + final AxisLabelInfo yAxisLabelInfo; + final AxisBounds axisBounds; + final ChartStylingInfo chartStylingInfo; + + List get dataWithSpots => + data.map((d) => d.settings.copyWith(spots: d.spots)).toList(); + + @override + Widget build(BuildContext context) => LineChart( + LineChartData( + lineTouchData: LineTouchData( + handleBuiltInTouches: chartStylingInfo.enableTooltip, + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (group) => + chartStylingInfo.tooltipBackgroundColor ?? Colors.black, + ), + ), + gridData: FlGridData(show: chartStylingInfo.showGrid), + borderData: FlBorderData( + border: Border.all( + color: chartStylingInfo.borderColor, + width: chartStylingInfo.borderWidth, + ), + show: chartStylingInfo.showBorder, + ), + titlesData: getTitlesData( + xAxisLabelInfo, + yAxisLabelInfo, + ), + lineBarsData: dataWithSpots, + minX: axisBounds.minX, + minY: axisBounds.minY, + maxX: axisBounds.maxX, + maxY: axisBounds.maxY, + backgroundColor: chartStylingInfo.backgroundColor, + ), + ); +} + +class FlutterFlowBarChart extends StatelessWidget { + const FlutterFlowBarChart({ + Key? key, + required this.barData, + required this.xLabels, + required this.xAxisLabelInfo, + required this.yAxisLabelInfo, + required this.axisBounds, + this.stacked = false, + this.barWidth, + this.barBorderRadius, + this.barSpace, + this.groupSpace, + this.alignment = BarChartAlignment.center, + this.chartStylingInfo = const ChartStylingInfo(), + }) : super(key: key); + + final List barData; + final List xLabels; + final AxisLabelInfo xAxisLabelInfo; + final AxisLabelInfo yAxisLabelInfo; + final AxisBounds axisBounds; + final bool stacked; + final double? barWidth; + final BorderRadius? barBorderRadius; + final double? barSpace; + final double? groupSpace; + final BarChartAlignment alignment; + final ChartStylingInfo chartStylingInfo; + + Map> get dataMap => xLabels.asMap().map((key, value) => + MapEntry(key, barData.map((data) => data.data[key]).toList())); + + List get groups => dataMap.entries.map((entry) { + final groupInt = entry.key; + final groupData = entry.value; + return BarChartGroupData( + x: groupInt, + barsSpace: barSpace, + barRods: groupData.asMap().entries.map((rod) { + final rodInt = rod.key; + final rodSettings = barData[rodInt]; + final rodValue = rod.value; + return BarChartRodData( + toY: rodValue, + color: rodSettings.color, + width: barWidth, + borderRadius: barBorderRadius, + borderSide: BorderSide( + width: rodSettings.borderWidth, + color: rodSettings.borderColor, + ), + ); + }).toList()); + }).toList(); + + List get stacks => dataMap.entries.map((entry) { + final groupInt = entry.key; + final stackData = entry.value; + return BarChartGroupData( + x: groupInt, + barsSpace: barSpace, + barRods: [ + BarChartRodData( + toY: sum(stackData), + width: barWidth, + borderRadius: barBorderRadius, + rodStackItems: stackData.asMap().entries.map((stack) { + final stackInt = stack.key; + final stackSettings = barData[stackInt]; + final start = + stackInt == 0 ? 0.0 : sum(stackData.sublist(0, stackInt)); + return BarChartRodStackItem( + start, + start + stack.value, + stackSettings.color, + BorderSide( + width: stackSettings.borderWidth, + color: stackSettings.borderColor, + ), + ); + }).toList(), + ) + ], + ); + }).toList(); + + double sum(List list) => list.reduce((a, b) => a + b); + + @override + Widget build(BuildContext context) { + return BarChart( + BarChartData( + barTouchData: BarTouchData( + handleBuiltInTouches: chartStylingInfo.enableTooltip, + touchTooltipData: BarTouchTooltipData( + getTooltipColor: (group) => + chartStylingInfo.tooltipBackgroundColor ?? Colors.black, + ), + ), + alignment: alignment, + gridData: FlGridData(show: chartStylingInfo.showGrid), + borderData: FlBorderData( + border: Border.all( + color: chartStylingInfo.borderColor, + width: chartStylingInfo.borderWidth, + ), + show: chartStylingInfo.showBorder, + ), + titlesData: getTitlesData( + xAxisLabelInfo, + yAxisLabelInfo, + getXTitlesWidget: (val, _) => Text( + xLabels[val.toInt()], + style: xAxisLabelInfo.labelTextStyle, + ), + ), + barGroups: stacked ? stacks : groups, + groupsSpace: groupSpace, + minY: axisBounds.minY, + maxY: axisBounds.maxY, + backgroundColor: chartStylingInfo.backgroundColor, + ), + ); + } +} + +enum PieChartSectionLabelType { + none, + value, + percent, +} + +class FlutterFlowPieChart extends StatelessWidget { + const FlutterFlowPieChart({ + Key? key, + required this.data, + this.donutHoleRadius = 0, + this.donutHoleColor = Colors.transparent, + this.sectionLabelType = PieChartSectionLabelType.none, + this.sectionLabelStyle, + this.labelFormatter = const LabelFormatter(), + }) : super(key: key); + + final FFPieChartData data; + final double donutHoleRadius; + final Color donutHoleColor; + final PieChartSectionLabelType sectionLabelType; + final TextStyle? sectionLabelStyle; + final LabelFormatter labelFormatter; + + double get sumOfValues => data.data.reduce((a, b) => a + b); + + @override + Widget build(BuildContext context) => PieChart( + PieChartData( + centerSpaceRadius: donutHoleRadius, + centerSpaceColor: donutHoleColor, + sectionsSpace: 0, + sections: data.data.asMap().entries.map( + (section) { + String? title; + final index = section.key; + final sectionData = section.value; + final colorsLength = data.colors.length; + final otherPropsLength = data.radius.length; + switch (sectionLabelType) { + case PieChartSectionLabelType.value: + title = formatLabel(labelFormatter, sectionData); + break; + case PieChartSectionLabelType.percent: + title = + '${formatLabel(labelFormatter, sectionData / sumOfValues * 100)}%'; + break; + default: + break; + } + return PieChartSectionData( + value: sectionData, + color: data.colors[index % colorsLength], + radius: otherPropsLength == 1 + ? data.radius.first + : data.radius[index], + borderSide: BorderSide( + color: (otherPropsLength == 1 + ? data.borderColor?.first + : data.borderColor?.elementAt(index)) ?? + Colors.transparent, + width: (otherPropsLength == 1 + ? data.borderWidth?.first + : data.borderWidth?.elementAt(index)) ?? + 0.0, + ), + showTitle: sectionLabelType != PieChartSectionLabelType.none, + titleStyle: sectionLabelStyle, + title: title, + ); + }, + ).toList(), + ), + ); +} + +class FlutterFlowChartLegendWidget extends StatelessWidget { + const FlutterFlowChartLegendWidget({ + Key? key, + required this.entries, + this.width, + this.height, + this.textStyle, + this.padding, + this.backgroundColor = Colors.transparent, + this.borderRadius, + this.borderWidth = 1.0, + this.borderColor = const Color(0xFF000000), + this.indicatorSize = 10, + this.indicatorBorderRadius, + this.textPadding = const EdgeInsets.all(0), + }) : super(key: key); + + final List entries; + final double? width; + final double? height; + final TextStyle? textStyle; + final EdgeInsetsGeometry? padding; + final Color backgroundColor; + final BorderRadius? borderRadius; + final double borderWidth; + final Color borderColor; + final double indicatorSize; + final BorderRadius? indicatorBorderRadius; + final EdgeInsetsGeometry textPadding; + + @override + Widget build(BuildContext context) => Container( + width: width, + height: height, + padding: padding, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: borderRadius, + border: Border.all( + color: borderColor, + width: borderWidth, + ), + ), + child: Column( + children: entries + .map( + (entry) => Row( + children: [ + Container( + height: indicatorSize, + width: indicatorSize, + decoration: BoxDecoration( + color: entry.color, + borderRadius: indicatorBorderRadius, + ), + ), + Padding( + padding: textPadding, + child: Text( + entry.name, + style: textStyle, + ), + ) + ], + ), + ) + .toList(), + ), + ); +} + +class LegendEntry { + const LegendEntry(this.color, this.name); + + final Color color; + final String name; +} + +class ChartStylingInfo { + const ChartStylingInfo({ + this.backgroundColor = Colors.white, + this.showGrid = false, + this.enableTooltip = false, + this.tooltipBackgroundColor, + this.borderColor = Colors.black, + this.borderWidth = 1.0, + this.showBorder = true, + }); + + final Color backgroundColor; + final bool showGrid; + final bool enableTooltip; + final Color? tooltipBackgroundColor; + final Color borderColor; + final double borderWidth; + final bool showBorder; +} + +class AxisLabelInfo { + const AxisLabelInfo({ + this.title = '', + this.titleTextStyle, + this.showLabels = false, + this.labelTextStyle, + this.labelInterval, + this.labelFormatter = const LabelFormatter(), + this.reservedSize, + }); + + final String title; + final TextStyle? titleTextStyle; + final bool showLabels; + final TextStyle? labelTextStyle; + final double? labelInterval; + final LabelFormatter labelFormatter; + final double? reservedSize; +} + +class LabelFormatter { + const LabelFormatter({ + this.numberFormat, + }); + + final String Function(double)? numberFormat; + NumberFormat get defaultFormat => NumberFormat()..significantDigits = 2; +} + +class AxisBounds { + const AxisBounds({this.minX, this.minY, this.maxX, this.maxY}); + + final double? minX; + final double? minY; + final double? maxX; + final double? maxY; +} + +class FFLineChartData { + const FFLineChartData({ + required this.xData, + required this.yData, + required this.settings, + }); + + final List xData; + final List yData; + final LineChartBarData settings; + + List get spots { + final x = _dataToDouble(xData); + final y = _dataToDouble(yData); + assert(x.length == y.length, 'X and Y data must be the same length'); + + return Iterable.generate(min(x.length, y.length)) + .where((i) => x[i] != null && y[i] != null) + .map((i) => FlSpot(x[i]!, y[i]!)) + .toList(); + } +} + +class FFBarChartData { + const FFBarChartData({ + required this.yData, + required this.color, + this.borderWidth = 0, + this.borderColor = Colors.transparent, + }); + + final List yData; + final Color color; + final double borderWidth; + final Color borderColor; + + List get data => _dataToDouble(yData).map((e) => e ?? 0.0).toList(); +} + +class FFPieChartData { + const FFPieChartData({ + required this.values, + required this.colors, + required this.radius, + this.borderWidth, + this.borderColor, + }); + + final List values; + final List colors; + final List radius; + final List? borderWidth; + final List? borderColor; + + List get data => _dataToDouble(values).map((e) => e ?? 0.0).toList(); +} + +List _dataToDouble(List data) { + if (data.isEmpty) { + return []; + } + if (data.first is double) { + return data.map((d) => d as double).toList(); + } + if (data.first is int) { + return data.map((d) => (d as int).toDouble()).toList(); + } + if (data.first is DateTime) { + return data + .map((d) => (d as DateTime).millisecondsSinceEpoch.toDouble()) + .toList(); + } + if (data.first is String) { + // First try to parse as doubles + if (double.tryParse(data.first as String) != null) { + return data.map((d) => double.tryParse(d as String)).toList(); + } + if (int.tryParse(data.first as String) != null) { + return data.map((d) => int.tryParse(d as String)?.toDouble()).toList(); + } + if (DateTime.tryParse(data.first as String) != null) { + return data + .map((d) => + DateTime.tryParse(d as String)?.millisecondsSinceEpoch.toDouble()) + .toList(); + } + } + return []; +} + +FlTitlesData getTitlesData( + AxisLabelInfo xAxisLabelInfo, + AxisLabelInfo yAxisLabelInfo, { + Widget Function(double, TitleMeta)? getXTitlesWidget, +}) => + FlTitlesData( + bottomTitles: AxisTitles( + axisNameWidget: xAxisLabelInfo.title.isEmpty + ? null + : Text( + xAxisLabelInfo.title, + style: xAxisLabelInfo.titleTextStyle, + ), + axisNameSize: xAxisLabelInfo.titleTextStyle?.fontSize != null + ? xAxisLabelInfo.titleTextStyle!.fontSize! + 12 + : 16, + sideTitles: SideTitles( + getTitlesWidget: (val, _) => getXTitlesWidget != null + ? getXTitlesWidget(val, _) + : Text( + formatLabel(xAxisLabelInfo.labelFormatter, val), + style: xAxisLabelInfo.labelTextStyle, + ), + showTitles: xAxisLabelInfo.showLabels, + interval: xAxisLabelInfo.labelInterval, + reservedSize: xAxisLabelInfo.reservedSize ?? 22, + ), + ), + rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + leftTitles: AxisTitles( + axisNameWidget: yAxisLabelInfo.title.isEmpty + ? null + : Text( + yAxisLabelInfo.title, + style: yAxisLabelInfo.titleTextStyle, + ), + axisNameSize: yAxisLabelInfo.titleTextStyle?.fontSize != null + ? yAxisLabelInfo.titleTextStyle!.fontSize! + 12 + : 16, + sideTitles: SideTitles( + getTitlesWidget: (val, _) => Text( + formatLabel(yAxisLabelInfo.labelFormatter, val), + style: yAxisLabelInfo.labelTextStyle, + ), + showTitles: yAxisLabelInfo.showLabels, + interval: yAxisLabelInfo.labelInterval, + reservedSize: yAxisLabelInfo.reservedSize ?? 22, + ), + ), + ); + +String formatLabel(LabelFormatter formatter, double value) { + if (formatter.numberFormat != null) { + return formatter.numberFormat!(value); + } + return formatter.defaultFormat.format(value); +} diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_icon_button.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_icon_button.dart new file mode 100755 index 0000000..50f339f --- /dev/null +++ b/Application Product/Source/source/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({ + Key? 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, + }) : super(key: key); + + 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) + ? Container( + 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/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart new file mode 100755 index 0000000..a2bf7f8 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart @@ -0,0 +1,168 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; +import 'flutter_flow_util.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; + 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/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart new file mode 100755 index 0000000..6bb4cbe --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart @@ -0,0 +1,353 @@ +// 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; + +abstract class FlutterFlowTheme { + 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) { + 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; + + @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 => ThemeTypography(this); +} + +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(0xFF4B39EF); + late Color secondary = const Color(0xFF39D2C0); + late Color tertiary = const Color(0xFFEE8B60); + late Color alternate = const Color(0xFFE0E3E7); + late Color primaryText = const Color(0xFF14181B); + late Color secondaryText = const Color(0xFF57636C); + late Color primaryBackground = const Color(0xFFF1F4F8); + late Color secondaryBackground = const Color(0xFFFFFFFF); + late Color accent1 = const Color(0x4C4B39EF); + late Color accent2 = const Color(0x4D39D2C0); + late Color accent3 = const Color(0x4DEE8B60); + late Color accent4 = const Color(0xCCFFFFFF); + late Color success = const Color(0xFF249689); + late Color warning = const Color(0xFFF9CF58); + late Color error = const Color(0xFFFF5963); + late Color info = const Color(0xFFFFFFFF); +} + +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 ThemeTypography extends Typography { + ThemeTypography(this.theme); + + final FlutterFlowTheme theme; + + String get displayLargeFamily => 'Inter Tight'; + TextStyle get displayLarge => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 64.0, + ); + String get displayMediumFamily => 'Inter Tight'; + TextStyle get displayMedium => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 44.0, + ); + String get displaySmallFamily => 'Inter Tight'; + TextStyle get displaySmall => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 36.0, + ); + String get headlineLargeFamily => 'Inter Tight'; + TextStyle get headlineLarge => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 32.0, + ); + String get headlineMediumFamily => 'Inter Tight'; + TextStyle get headlineMedium => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 28.0, + ); + String get headlineSmallFamily => 'Inter Tight'; + TextStyle get headlineSmall => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 24.0, + ); + String get titleLargeFamily => 'Inter Tight'; + TextStyle get titleLarge => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 20.0, + ); + String get titleMediumFamily => 'Inter Tight'; + TextStyle get titleMedium => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 18.0, + ); + String get titleSmallFamily => 'Inter Tight'; + TextStyle get titleSmall => GoogleFonts.getFont( + 'Inter Tight', + color: theme.primaryText, + fontWeight: FontWeight.w600, + fontSize: 16.0, + ); + String get labelLargeFamily => 'Inter'; + TextStyle get labelLarge => GoogleFonts.getFont( + 'Inter', + color: theme.secondaryText, + fontWeight: FontWeight.normal, + fontSize: 16.0, + ); + String get labelMediumFamily => 'Inter'; + TextStyle get labelMedium => GoogleFonts.getFont( + 'Inter', + color: theme.secondaryText, + fontWeight: FontWeight.normal, + fontSize: 14.0, + ); + String get labelSmallFamily => 'Inter'; + TextStyle get labelSmall => GoogleFonts.getFont( + 'Inter', + color: theme.secondaryText, + fontWeight: FontWeight.normal, + fontSize: 12.0, + ); + String get bodyLargeFamily => 'Inter'; + TextStyle get bodyLarge => GoogleFonts.getFont( + 'Inter', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 16.0, + ); + String get bodyMediumFamily => 'Inter'; + TextStyle get bodyMedium => GoogleFonts.getFont( + 'Inter', + color: theme.primaryText, + fontWeight: FontWeight.normal, + fontSize: 14.0, + ); + String get bodySmallFamily => 'Inter'; + TextStyle get bodySmall => GoogleFonts.getFont( + 'Inter', + 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(0xFF4B39EF); + late Color secondary = const Color(0xFF39D2C0); + late Color tertiary = const Color(0xFFEE8B60); + late Color alternate = const Color(0xFF262D34); + late Color primaryText = const Color(0xFFFFFFFF); + late Color secondaryText = const Color(0xFF95A1AC); + late Color primaryBackground = const Color(0xFF1D2428); + late Color secondaryBackground = const Color(0xFF14181B); + late Color accent1 = const Color(0x4C4B39EF); + late Color accent2 = const Color(0x4D39D2C0); + late Color accent3 = const Color(0x4DEE8B60); + late Color accent4 = const Color(0xB2262D34); + late Color success = const Color(0xFF249689); + late Color warning = const Color(0xFFF9CF58); + late Color error = const Color(0xFFFF5963); + late Color info = const Color(0xFFFFFFFF); +} + +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, + List? shadows, + }) => + 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, + shadows: shadows, + ) + : copyWith( + fontFamily: fontFamily, + color: color, + fontSize: fontSize, + letterSpacing: letterSpacing, + fontWeight: fontWeight, + fontStyle: fontStyle, + decoration: decoration, + height: lineHeight, + shadows: shadows, + ); +} diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart new file mode 100755 index 0000000..7728c0f --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart @@ -0,0 +1,427 @@ +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'; + +import 'lat_lng.dart'; + +export 'lat_lng.dart'; +export 'place.dart'; +export 'uploaded_file.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 'nav/nav.dart'; + +T valueOrDefault(T? value, T defaultValue) => + (value is String && value.isEmpty) || value == null ? defaultValue : value; + +String dateTimeFormat(String format, DateTime? dateTime, {String? locale}) { + if (dateTime == null) { + return ''; + } + if (format == 'relative') { + return timeago.format(dateTime, locale: locale, allowFromNow: true); + } + return DateFormat(format, locale).format(dateTime); +} + +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: + if (currency != null) { + formattedValue = NumberFormat('#,##0.00', 'en_US').format(value); + } else { + formattedValue = NumberFormat.decimalPattern('en_US').format(value); + } + break; + case DecimalType.commaDecimal: + if (currency != null) { + formattedValue = NumberFormat('#,##0.00', 'es_PA').format(value); + } else { + 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, bool desc = false}) { + final sortedAscending = toList() + ..sort(keyOf == null ? null : ((a, b) => keyOf(a).compareTo(keyOf(b)))); + if (desc) { + return sortedAscending.reversed.toList(); + } + return sortedAscending; + } + + List mapIndexed(S Function(int, T) func) => toList() + .asMap() + .map((index, value) => MapEntry(index, func(index, value))) + .values + .toList(); +} + +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) + Padding( + padding: EdgeInsetsDirectional.only(end: 10.0), + child: Container( + height: 20, + width: 20, + child: const 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 MapFilterExtensions on Map { + Map get withoutNulls => Map.fromEntries( + entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, e.value as T)), + ); +} + +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/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart new file mode 100755 index 0000000..e9a76da --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart @@ -0,0 +1,119 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart' hide NavigationDecision; +import 'package:webview_flutter_android/webview_flutter_android.dart'; +import 'package:webviewx_plus/webviewx_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:file_picker/file_picker.dart'; + +import 'flutter_flow_util.dart'; + +class FlutterFlowWebView extends StatefulWidget { + const FlutterFlowWebView({ + Key? key, + required this.content, + this.width, + this.height, + this.bypass = false, + this.horizontalScroll = false, + this.verticalScroll = false, + this.html = false, + }) : super(key: key); + + final String content; + final double? height; + final double? width; + final bool bypass; + final bool horizontalScroll; + final bool verticalScroll; + final bool html; + + @override + _FlutterFlowWebViewState createState() => _FlutterFlowWebViewState(); +} + +class _FlutterFlowWebViewState extends State { + @override + Widget build(BuildContext context) => WebViewX( + key: webviewKey, + width: widget.width ?? MediaQuery.sizeOf(context).width, + height: widget.height ?? MediaQuery.sizeOf(context).height, + ignoreAllGestures: false, + initialContent: widget.content, + initialMediaPlaybackPolicy: + AutoMediaPlaybackPolicy.requireUserActionForAllMediaTypes, + initialSourceType: widget.html + ? SourceType.html + : widget.bypass + ? SourceType.urlBypass + : SourceType.url, + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (controller) async { + if (controller.connector is WebViewController && isAndroid) { + final androidController = + controller.connector.platform as AndroidWebViewController; + await androidController.setOnShowFileSelector(_androidFilePicker); + } + }, + navigationDelegate: (request) async { + if (isAndroid) { + if (request.content.source + .startsWith('https://api.whatsapp.com/send?phone')) { + String url = request.content.source; + + await launchUrl( + Uri.parse(url), + mode: LaunchMode.externalApplication, + ); + return NavigationDecision.prevent; + } + } + return NavigationDecision.navigate; + }, + webSpecificParams: const WebSpecificParams( + webAllowFullscreenContent: true, + ), + mobileSpecificParams: MobileSpecificParams( + debuggingEnabled: false, + gestureNavigationEnabled: true, + mobileGestureRecognizers: { + if (widget.verticalScroll) + Factory( + () => VerticalDragGestureRecognizer(), + ), + if (widget.horizontalScroll) + Factory( + () => HorizontalDragGestureRecognizer(), + ), + }, + androidEnableHybridComposition: true, + ), + ); + + Key get webviewKey => Key( + [ + widget.content, + widget.width, + widget.height, + widget.bypass, + widget.horizontalScroll, + widget.verticalScroll, + widget.html, + ].map((s) => s?.toString() ?? '').join(), + ); + + Future> _androidFilePicker( + final FileSelectorParams params, + ) async { + final result = await FilePicker.platform.pickFiles(); + + if (result != null && result.files.single.path != null) { + final file = File(result.files.single.path!); + return [file.uri.toString()]; + } + return []; + } +} diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart new file mode 100755 index 0000000..64401b5 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart @@ -0,0 +1,288 @@ +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.textAlign, + 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 TextAlign? textAlign; + 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(), + textAlign: widget.options.textAlign, + 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/Application Product/Source/source/lib/flutter_flow/lat_lng.dart b/Application Product/Source/source/lib/flutter_flow/lat_lng.dart new file mode 100755 index 0000000..9e7b8ea --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/lib/flutter_flow/nav/nav.dart b/Application Product/Source/source/lib/flutter_flow/nav/nav.dart new file mode 100755 index 0000000..763ba80 --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/nav/nav.dart @@ -0,0 +1,293 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:page_transition/page_transition.dart'; +import 'package:provider/provider.dart'; + +import '/index.dart'; +import '/main.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/lat_lng.dart'; +import '/flutter_flow/place.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'serialization_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: Colors.transparent, + child: Image.asset( + 'assets/images/Settings_(4).png', + fit: BoxFit.cover, + ), + ), + ) + : NavBarPage(), + routes: [ + FFRoute( + name: '_initialize', + path: '/', + builder: (context, _) => appStateNotifier.showSplashImage + ? Builder( + builder: (context) => Container( + color: Colors.transparent, + child: Image.asset( + 'assets/images/Settings_(4).png', + fit: BoxFit.cover, + ), + ), + ) + : NavBarPage(), + ), + FFRoute( + name: 'HomePage', + path: '/homePage', + builder: (context, params) => params.isEmpty + ? NavBarPage(initialPage: 'HomePage') + : HomePageWidget(), + ), + FFRoute( + name: 'Analyst', + path: '/analyst', + builder: (context, params) => params.isEmpty + ? NavBarPage(initialPage: 'Analyst') + : AnalystWidget(), + ), + FFRoute( + name: 'Infomation', + path: '/infomation', + builder: (context, params) => params.isEmpty + ? NavBarPage(initialPage: 'Infomation') + : InfomationWidget(), + ), + FFRoute( + name: 'setting', + path: '/setting', + builder: (context, params) => params.isEmpty + ? NavBarPage(initialPage: 'setting') + : SettingWidget(), + ), + FFRoute( + name: 'NEWS', + path: '/news', + builder: (context, params) => + params.isEmpty ? NavBarPage(initialPage: 'NEWS') : NewsWidget(), + ) + ].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, + }) { + 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, + ); + } +} + +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() => 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/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart b/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart new file mode 100755 index 0000000..959e30a --- /dev/null +++ b/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart @@ -0,0 +1,206 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:from_css_color/from_css_color.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, isList: false)) + .where((p) => p != null) + .map((p) => p!) + .toList(); + return json.encode(serializedValues); + } + String? data; + switch (paramType) { + case ParamType.int: + data = param.toString(); + case ParamType.double: + data = param.toString(); + case ParamType.String: + data = param; + case ParamType.bool: + data = param ? 'true' : 'false'; + case ParamType.DateTime: + data = (param as DateTime).millisecondsSinceEpoch.toString(); + case ParamType.DateTimeRange: + data = dateTimeRangeToString(param as DateTimeRange); + case ParamType.LatLng: + data = (param as LatLng).serialize(); + case ParamType.Color: + data = (param as Color).toCssString(); + case ParamType.FFPlace: + data = placeToString(param as FFPlace); + case ParamType.FFUploadedFile: + data = uploadedFileToString(param as FFUploadedFile); + case ParamType.JSON: + data = json.encode(param); + + default: + data = null; + } + return data; + } 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, +} + +dynamic deserializeParam( + String? param, + ParamType paramType, + bool isList, +) { + try { + if (param == null) { + return null; + } + if (isList) { + final paramValues = json.decode(param); + if (paramValues is! Iterable || paramValues.isEmpty) { + return null; + } + return paramValues + .where((p) => p is String) + .map((p) => p as String) + .map((p) => deserializeParam(p, paramType, false)) + .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); + + default: + return null; + } + } catch (e) { + print('Error deserializing parameter: $e'); + return null; + } +} diff --git a/Application Product/Source/source/lib/flutter_flow/place.dart b/Application Product/Source/source/lib/flutter_flow/place.dart new file mode 100755 index 0000000..e3589b3 --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/lib/flutter_flow/random_data_util.dart b/Application Product/Source/source/lib/flutter_flow/random_data_util.dart new file mode 100755 index 0000000..6599e5a --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/lib/flutter_flow/uploaded_file.dart b/Application Product/Source/source/lib/flutter_flow/uploaded_file.dart new file mode 100755 index 0000000..2dfd2ff --- /dev/null +++ b/Application Product/Source/source/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/Application Product/Source/source/lib/home_page/home_page_model.dart b/Application Product/Source/source/lib/home_page/home_page_model.dart new file mode 100755 index 0000000..4ecfd24 --- /dev/null +++ b/Application Product/Source/source/lib/home_page/home_page_model.dart @@ -0,0 +1,16 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_web_view.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'home_page_widget.dart' show HomePageWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class HomePageModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/home_page/home_page_widget.dart b/Application Product/Source/source/lib/home_page/home_page_widget.dart new file mode 100755 index 0000000..ae3a806 --- /dev/null +++ b/Application Product/Source/source/lib/home_page/home_page_widget.dart @@ -0,0 +1,56 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_web_view.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'package:flutter/material.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()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: FlutterFlowWebView( + content: 'https://phong12hexdockwork.github.io/UVita-Mapping/', + width: 390.0, + height: 844.0, + verticalScroll: false, + horizontalScroll: false, + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/index.dart b/Application Product/Source/source/lib/index.dart new file mode 100755 index 0000000..7c658a0 --- /dev/null +++ b/Application Product/Source/source/lib/index.dart @@ -0,0 +1,6 @@ +// Export pages +export '/home_page/home_page_widget.dart' show HomePageWidget; +export '/analyst/analyst_widget.dart' show AnalystWidget; +export '/infomation/infomation_widget.dart' show InfomationWidget; +export '/setting/setting_widget.dart' show SettingWidget; +export '/news/news_widget.dart' show NewsWidget; diff --git a/Application Product/Source/source/lib/infomation/infomation_model.dart b/Application Product/Source/source/lib/infomation/infomation_model.dart new file mode 100755 index 0000000..d0e7b30 --- /dev/null +++ b/Application Product/Source/source/lib/infomation/infomation_model.dart @@ -0,0 +1,36 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/widget/battery/battery_widget.dart'; +import '/widget/daily_trackers/daily_trackers_widget.dart'; +import '/widget/team/team_widget.dart'; +import 'infomation_widget.dart' show InfomationWidget; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class InfomationModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + // Model for DailyTrackers component. + late DailyTrackersModel dailyTrackersModel; + // Model for Battery component. + late BatteryModel batteryModel; + // Model for team component. + late TeamModel teamModel; + + @override + void initState(BuildContext context) { + dailyTrackersModel = createModel(context, () => DailyTrackersModel()); + batteryModel = createModel(context, () => BatteryModel()); + teamModel = createModel(context, () => TeamModel()); + } + + @override + void dispose() { + dailyTrackersModel.dispose(); + batteryModel.dispose(); + teamModel.dispose(); + } +} diff --git a/Application Product/Source/source/lib/infomation/infomation_widget.dart b/Application Product/Source/source/lib/infomation/infomation_widget.dart new file mode 100755 index 0000000..3d68f2d --- /dev/null +++ b/Application Product/Source/source/lib/infomation/infomation_widget.dart @@ -0,0 +1,77 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/widget/battery/battery_widget.dart'; +import '/widget/daily_trackers/daily_trackers_widget.dart'; +import '/widget/team/team_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'infomation_model.dart'; +export 'infomation_model.dart'; + +class InfomationWidget extends StatefulWidget { + const InfomationWidget({super.key}); + + @override + State createState() => _InfomationWidgetState(); +} + +class _InfomationWidgetState extends State { + late InfomationModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => InfomationModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + wrapWithModel( + model: _model.dailyTrackersModel, + updateCallback: () => safeSetState(() {}), + child: DailyTrackersWidget(), + ), + Align( + alignment: AlignmentDirectional(0.0, -1.0), + child: wrapWithModel( + model: _model.batteryModel, + updateCallback: () => safeSetState(() {}), + child: BatteryWidget(), + ), + ), + wrapWithModel( + model: _model.teamModel, + updateCallback: () => safeSetState(() {}), + child: TeamWidget(), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/main.dart b/Application Product/Source/source/lib/main.dart new file mode 100755 index 0000000..bf206f0 --- /dev/null +++ b/Application Product/Source/source/lib/main.dart @@ -0,0 +1,244 @@ +import 'package:flutter/gestures.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 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:floating_bottom_navigation_bar/floating_bottom_navigation_bar.dart'; +import 'flutter_flow/nav/nav.dart'; +import 'index.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + GoRouter.optionURLReflectsImperativeAPIs = true; + usePathUrlStrategy(); + + await FlutterFlowTheme.initialize(); + + runApp(MyApp()); +} + +class MyApp extends StatefulWidget { + // This widget is the root of your application. + @override + State createState() => _MyAppState(); + + static _MyAppState of(BuildContext context) => + context.findAncestorStateOfType<_MyAppState>()!; +} + +class _MyAppState extends State { + 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(Duration(milliseconds: 1000), + () => safeSetState(() => _appStateNotifier.stopShowingSplashImage())); + } + + void setThemeMode(ThemeMode mode) => safeSetState(() { + _themeMode = mode; + FlutterFlowTheme.saveThemeMode(mode); + }); + + @override + Widget build(BuildContext context) { + return MaterialApp.router( + title: 'UVita', + localizationsDelegates: [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: const [Locale('en', '')], + theme: ThemeData( + brightness: Brightness.light, + useMaterial3: false, + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + useMaterial3: false, + ), + themeMode: _themeMode, + routerConfig: _router, + ); + } +} + +class NavBarPage extends StatefulWidget { + NavBarPage({Key? key, this.initialPage, this.page}) : super(key: key); + + final String? initialPage; + final Widget? page; + + @override + _NavBarPageState createState() => _NavBarPageState(); +} + +/// This is the private State class that goes with NavBarPage. +class _NavBarPageState extends State { + String _currentPageName = 'HomePage'; + late Widget? _currentPage; + + @override + void initState() { + super.initState(); + _currentPageName = widget.initialPage ?? _currentPageName; + _currentPage = widget.page; + } + + @override + Widget build(BuildContext context) { + final tabs = { + 'HomePage': HomePageWidget(), + 'Analyst': AnalystWidget(), + 'Infomation': InfomationWidget(), + 'setting': SettingWidget(), + 'NEWS': NewsWidget(), + }; + final currentIndex = tabs.keys.toList().indexOf(_currentPageName); + + final MediaQueryData queryData = MediaQuery.of(context); + + return Scaffold( + body: MediaQuery( + data: queryData + .removeViewInsets(removeBottom: true) + .removeViewPadding(removeBottom: true), + child: _currentPage ?? tabs[_currentPageName]!), + extendBody: true, + bottomNavigationBar: FloatingNavbar( + currentIndex: currentIndex, + onTap: (i) => safeSetState(() { + _currentPage = null; + _currentPageName = tabs.keys.toList()[i]; + }), + backgroundColor: Color(0xD5AB0C0C), + selectedItemColor: Color(0x9EFFF8F8), + unselectedItemColor: Colors.white, + selectedBackgroundColor: Color(0x00000000), + borderRadius: 8.0, + itemBorderRadius: 8.0, + margin: EdgeInsets.all(12.0), + padding: EdgeInsets.all(2.0), + width: double.infinity, + elevation: 0.0, + items: [ + FloatingNavbarItem( + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.home_outlined, + color: currentIndex == 0 ? Color(0x9EFFF8F8) : Colors.white, + size: 24.0, + ), + Text( + 'Home', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: currentIndex == 0 ? Color(0x9EFFF8F8) : Colors.white, + fontSize: 11.0, + ), + ), + ], + ), + ), + FloatingNavbarItem( + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.pie_chart, + color: currentIndex == 1 ? Color(0x9EFFF8F8) : Colors.white, + size: 24.0, + ), + Text( + 'Analyst', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: currentIndex == 1 ? Color(0x9EFFF8F8) : Colors.white, + fontSize: 11.0, + ), + ), + ], + ), + ), + FloatingNavbarItem( + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + FontAwesomeIcons.info, + color: currentIndex == 2 ? Color(0x9EFFF8F8) : Colors.white, + size: 24.0, + ), + Text( + 'Infomations', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: currentIndex == 2 ? Color(0x9EFFF8F8) : Colors.white, + fontSize: 11.0, + ), + ), + ], + ), + ), + FloatingNavbarItem( + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.settings_sharp, + color: currentIndex == 3 ? Color(0x9EFFF8F8) : Colors.white, + size: 24.0, + ), + Text( + 'Settings', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: currentIndex == 3 ? Color(0x9EFFF8F8) : Colors.white, + fontSize: 11.0, + ), + ), + ], + ), + ), + FloatingNavbarItem( + customWidget: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + FontAwesomeIcons.solidNewspaper, + color: currentIndex == 4 ? Color(0x9EFFF8F8) : Colors.white, + size: 24.0, + ), + Text( + 'News', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: currentIndex == 4 ? Color(0x9EFFF8F8) : Colors.white, + fontSize: 11.0, + ), + ), + ], + ), + ) + ], + ), + ); + } +} diff --git a/Application Product/Source/source/lib/news/news_model.dart b/Application Product/Source/source/lib/news/news_model.dart new file mode 100755 index 0000000..cce78e6 --- /dev/null +++ b/Application Product/Source/source/lib/news/news_model.dart @@ -0,0 +1,33 @@ +import '/components/card35_news_article_widget.dart'; +import '/components/card38_location_details_widget.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'news_widget.dart' show NewsWidget; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class NewsModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + // Model for Card38LocationDetails component. + late Card38LocationDetailsModel card38LocationDetailsModel; + // Model for Card35NewsArticle component. + late Card35NewsArticleModel card35NewsArticleModel; + + @override + void initState(BuildContext context) { + card38LocationDetailsModel = + createModel(context, () => Card38LocationDetailsModel()); + card35NewsArticleModel = + createModel(context, () => Card35NewsArticleModel()); + } + + @override + void dispose() { + card38LocationDetailsModel.dispose(); + card35NewsArticleModel.dispose(); + } +} diff --git a/Application Product/Source/source/lib/news/news_widget.dart b/Application Product/Source/source/lib/news/news_widget.dart new file mode 100755 index 0000000..05155a8 --- /dev/null +++ b/Application Product/Source/source/lib/news/news_widget.dart @@ -0,0 +1,68 @@ +import '/components/card35_news_article_widget.dart'; +import '/components/card38_location_details_widget.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:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'news_model.dart'; +export 'news_model.dart'; + +class NewsWidget extends StatefulWidget { + const NewsWidget({super.key}); + + @override + State createState() => _NewsWidgetState(); +} + +class _NewsWidgetState extends State { + late NewsModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => NewsModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + wrapWithModel( + model: _model.card38LocationDetailsModel, + updateCallback: () => safeSetState(() {}), + child: Card38LocationDetailsWidget(), + ), + wrapWithModel( + model: _model.card35NewsArticleModel, + updateCallback: () => safeSetState(() {}), + child: Card35NewsArticleWidget(), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/setting/setting_model.dart b/Application Product/Source/source/lib/setting/setting_model.dart new file mode 100755 index 0000000..3586c06 --- /dev/null +++ b/Application Product/Source/source/lib/setting/setting_model.dart @@ -0,0 +1,24 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'setting_widget.dart' show SettingWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class SettingModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + // State field(s) for SwitchListTile widget. + bool? switchListTileValue1; + // State field(s) for SwitchListTile widget. + bool? switchListTileValue2; + // State field(s) for SwitchListTile widget. + bool? switchListTileValue3; + + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/setting/setting_widget.dart b/Application Product/Source/source/lib/setting/setting_widget.dart new file mode 100755 index 0000000..c3a0ae6 --- /dev/null +++ b/Application Product/Source/source/lib/setting/setting_widget.dart @@ -0,0 +1,168 @@ +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 'package:provider/provider.dart'; +import 'setting_model.dart'; +export 'setting_model.dart'; + +class SettingWidget extends StatefulWidget { + const SettingWidget({super.key}); + + @override + State createState() => _SettingWidgetState(); +} + +class _SettingWidgetState extends State { + late SettingModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SettingModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).secondaryBackground, + appBar: AppBar( + backgroundColor: FlutterFlowTheme.of(context).secondaryBackground, + automaticallyImplyLeading: false, + title: Text( + 'Settings Page', + style: FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + actions: [], + centerTitle: false, + elevation: 0.0, + ), + body: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(20.0, 0.0, 20.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + 'Choose what notifcations you want to recieve below and we will update the settings.', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), + child: SwitchListTile.adaptive( + value: _model.switchListTileValue1 ??= true, + onChanged: (newValue) async { + safeSetState(() => _model.switchListTileValue1 = newValue!); + }, + title: Text( + 'Push Notifications', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + lineHeight: 2.0, + ), + ), + subtitle: Text( + 'Receive Push notifications from our application on a semi regular basis.', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFF8B97A2), + letterSpacing: 0.0, + ), + ), + tileColor: FlutterFlowTheme.of(context).secondaryBackground, + activeColor: Color(0xFFEF3939), + activeTrackColor: Color(0x4CEF3939), + dense: false, + controlAffinity: ListTileControlAffinity.trailing, + contentPadding: + EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0), + ), + ), + SwitchListTile.adaptive( + value: _model.switchListTileValue2 ??= true, + onChanged: (newValue) async { + safeSetState(() => _model.switchListTileValue2 = newValue!); + }, + title: Text( + 'Email Notifications', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + lineHeight: 2.0, + ), + ), + subtitle: Text( + 'Receive email notifications from our marketing team about new features.', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFF8B97A2), + letterSpacing: 0.0, + ), + ), + tileColor: FlutterFlowTheme.of(context).secondaryBackground, + activeColor: Color(0xFFEF3939), + activeTrackColor: Color(0x4CEF3939), + dense: false, + controlAffinity: ListTileControlAffinity.trailing, + contentPadding: + EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0), + ), + SwitchListTile.adaptive( + value: _model.switchListTileValue3 ??= true, + onChanged: (newValue) async { + safeSetState(() => _model.switchListTileValue3 = newValue!); + }, + title: Text( + 'Location Services', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + lineHeight: 2.0, + ), + ), + subtitle: Text( + 'Allow us to track your location, this helps keep track of spending and keeps you safe.', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFF8B97A2), + letterSpacing: 0.0, + ), + ), + tileColor: FlutterFlowTheme.of(context).secondaryBackground, + activeColor: Color(0xFFEF3939), + activeTrackColor: Color(0x4CEF5239), + dense: false, + controlAffinity: ListTileControlAffinity.trailing, + contentPadding: + EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0), + ), + ], + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/advice/advice_model.dart b/Application Product/Source/source/lib/widget/advice/advice_model.dart new file mode 100755 index 0000000..3e1c938 --- /dev/null +++ b/Application Product/Source/source/lib/widget/advice/advice_model.dart @@ -0,0 +1,16 @@ +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 'advice_widget.dart' show AdviceWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class AdviceModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/advice/advice_widget.dart b/Application Product/Source/source/lib/widget/advice/advice_widget.dart new file mode 100755 index 0000000..7e137e1 --- /dev/null +++ b/Application Product/Source/source/lib/widget/advice/advice_widget.dart @@ -0,0 +1,241 @@ +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 'package:provider/provider.dart'; +import 'advice_model.dart'; +export 'advice_model.dart'; + +class AdviceWidget extends StatefulWidget { + const AdviceWidget({super.key}); + + @override + State createState() => _AdviceWidgetState(); +} + +class _AdviceWidgetState extends State { + late AdviceModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => AdviceModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + FlutterFlowTheme.of(context).primaryBackground, + FlutterFlowTheme.of(context).secondaryBackground + ], + stops: [0.0, 1.0], + begin: AlignmentDirectional(0.0, -1.0), + end: AlignmentDirectional(0, 1.0), + ), + borderRadius: BorderRadius.circular(16.0), + shape: BoxShape.rectangle, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 1.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(12.0), + child: Image.asset( + 'assets/images/images.jpg', + width: 120.0, + height: 120.0, + fit: BoxFit.cover, + ), + ), + Expanded( + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'USING SUNSCREEN', + style: FlutterFlowTheme.of(context) + .headlineSmall + .override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 8.0, 0.0, 0.0), + child: Text( + 'SPF requirements 50+', + style: FlutterFlowTheme.of(context) + .labelLarge + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( + children: [ + FFButtonWidget( + onPressed: () { + print('followButton pressed ...'); + }, + text: 'Follow', + options: FFButtonOptions( + width: 90.0, + height: 36.0, + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context).primaryText, + textStyle: + FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Inter Tight', + color: FlutterFlowTheme.of(context) + .secondaryBackground, + fontSize: 14.0, + letterSpacing: 0.0, + ), + elevation: 2.0, + borderSide: BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: BorderRadius.circular(40.0), + ), + ), + FFButtonWidget( + onPressed: () { + print('following pressed ...'); + }, + text: 'Following', + options: FFButtonOptions( + width: 90.0, + height: 36.0, + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: + FlutterFlowTheme.of(context).secondaryBackground, + textStyle: + FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + elevation: 0.0, + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context).primaryBackground, + width: 2.0, + ), + borderRadius: BorderRadius.circular(40.0), + ), + ), + ], + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.notifications_none, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.settings_outlined, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.keyboard_control, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart new file mode 100755 index 0000000..735e7e2 --- /dev/null +++ b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart @@ -0,0 +1,16 @@ +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 'advice_copy_widget.dart' show AdviceCopyWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class AdviceCopyModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart new file mode 100755 index 0000000..3994572 --- /dev/null +++ b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart @@ -0,0 +1,241 @@ +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 'package:provider/provider.dart'; +import 'advice_copy_model.dart'; +export 'advice_copy_model.dart'; + +class AdviceCopyWidget extends StatefulWidget { + const AdviceCopyWidget({super.key}); + + @override + State createState() => _AdviceCopyWidgetState(); +} + +class _AdviceCopyWidgetState extends State { + late AdviceCopyModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => AdviceCopyModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + FlutterFlowTheme.of(context).primaryBackground, + FlutterFlowTheme.of(context).secondaryBackground + ], + stops: [0.0, 1.0], + begin: AlignmentDirectional(0.0, -1.0), + end: AlignmentDirectional(0, 1.0), + ), + borderRadius: BorderRadius.circular(16.0), + shape: BoxShape.rectangle, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 1.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(12.0), + child: Image.asset( + 'assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp', + width: 120.0, + height: 120.0, + fit: BoxFit.cover, + ), + ), + Expanded( + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'WEAR A COAT', + style: FlutterFlowTheme.of(context) + .headlineSmall + .override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 8.0, 0.0, 0.0), + child: Text( + 'Long-sleeved and thick', + style: FlutterFlowTheme.of(context) + .labelLarge + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( + children: [ + FFButtonWidget( + onPressed: () { + print('followButton pressed ...'); + }, + text: 'Follow', + options: FFButtonOptions( + width: 90.0, + height: 36.0, + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context).primaryText, + textStyle: + FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Inter Tight', + color: FlutterFlowTheme.of(context) + .secondaryBackground, + fontSize: 14.0, + letterSpacing: 0.0, + ), + elevation: 2.0, + borderSide: BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: BorderRadius.circular(40.0), + ), + ), + FFButtonWidget( + onPressed: () { + print('following pressed ...'); + }, + text: 'Following', + options: FFButtonOptions( + width: 90.0, + height: 36.0, + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: + FlutterFlowTheme.of(context).secondaryBackground, + textStyle: + FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + elevation: 0.0, + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context).primaryBackground, + width: 2.0, + ), + borderRadius: BorderRadius.circular(40.0), + ), + ), + ], + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.notifications_none, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.settings_outlined, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 44.0, + icon: Icon( + Icons.keyboard_control, + color: FlutterFlowTheme.of(context).secondaryText, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/battery/battery_model.dart b/Application Product/Source/source/lib/widget/battery/battery_model.dart new file mode 100755 index 0000000..2b7b5b3 --- /dev/null +++ b/Application Product/Source/source/lib/widget/battery/battery_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'battery_widget.dart' show BatteryWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class BatteryModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/battery/battery_widget.dart b/Application Product/Source/source/lib/widget/battery/battery_widget.dart new file mode 100755 index 0000000..759b075 --- /dev/null +++ b/Application Product/Source/source/lib/widget/battery/battery_widget.dart @@ -0,0 +1,155 @@ +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 'package:provider/provider.dart'; +import 'battery_model.dart'; +export 'battery_model.dart'; + +class BatteryWidget extends StatefulWidget { + const BatteryWidget({super.key}); + + @override + State createState() => _BatteryWidgetState(); +} + +class _BatteryWidgetState extends State { + late BatteryModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => BatteryModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: 349.0, + height: 150.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 2.0, + ), + spreadRadius: 0.0, + ) + ], + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Battery Case', + style: + FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + Text( + 'PhoBroth\'s Case', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + ], + ), + Container( + width: 60.0, + height: 60.0, + decoration: BoxDecoration( + color: Color(0x4DD23939), + borderRadius: BorderRadius.circular(30.0), + ), + child: Icon( + Icons.battery_charging_full, + color: Color(0xFFDD7272), + size: 30.0, + ), + ), + ], + ), + Align( + alignment: AlignmentDirectional(-1.0, 0.0), + child: Text( + 'Charge Level', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + width: 200.0, + height: 20.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).alternate, + borderRadius: BorderRadius.circular(10.0), + ), + child: Container( + width: 160.0, + height: 20.0, + decoration: BoxDecoration( + color: Color(0xFFD42525), + borderRadius: BorderRadius.circular(10.0), + ), + ), + ), + Text( + '80%', + style: FlutterFlowTheme.of(context).bodySmall.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + ].divide(SizedBox(width: 8.0)), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/box/box_model.dart b/Application Product/Source/source/lib/widget/box/box_model.dart new file mode 100755 index 0000000..91eb715 --- /dev/null +++ b/Application Product/Source/source/lib/widget/box/box_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'box_widget.dart' show BoxWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class BoxModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/box/box_widget.dart b/Application Product/Source/source/lib/widget/box/box_widget.dart new file mode 100755 index 0000000..58a4283 --- /dev/null +++ b/Application Product/Source/source/lib/widget/box/box_widget.dart @@ -0,0 +1,118 @@ +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 'package:provider/provider.dart'; +import 'box_model.dart'; +export 'box_model.dart'; + +class BoxWidget extends StatefulWidget { + const BoxWidget({super.key}); + + @override + State createState() => _BoxWidgetState(); +} + +class _BoxWidgetState extends State { + late BoxModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => BoxModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + borderRadius: BorderRadius.circular(14.0), + ), + child: Padding( + padding: EdgeInsets.all(12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 150.0, + height: 47.0, + decoration: BoxDecoration( + color: Color(0xFFD41818), + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(12.0, 12.0, 12.0, 12.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Call doctor', + style: + FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + color: FlutterFlowTheme.of(context).info, + fontSize: 18.0, + letterSpacing: 0.0, + ), + ), + ], + ), + ), + ), + Container( + width: 150.0, + height: 50.0, + decoration: BoxDecoration( + color: Color(0xFFF64C4C), + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(12.0, 12.0, 12.0, 12.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Hopital', + style: + FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + color: FlutterFlowTheme.of(context).info, + fontSize: 18.0, + letterSpacing: 0.0, + ), + ), + ], + ), + ), + ), + ].divide(SizedBox(width: 16.0)), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/calendar/calendar_model.dart b/Application Product/Source/source/lib/widget/calendar/calendar_model.dart new file mode 100755 index 0000000..001f9d4 --- /dev/null +++ b/Application Product/Source/source/lib/widget/calendar/calendar_model.dart @@ -0,0 +1,25 @@ +import '/flutter_flow/flutter_flow_calendar.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'calendar_widget.dart' show CalendarWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class CalendarModel extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for Calendar widget. + DateTimeRange? calendarSelectedDay; + + @override + void initState(BuildContext context) { + calendarSelectedDay = DateTimeRange( + start: DateTime.now().startOfDay, + end: DateTime.now().endOfDay, + ); + } + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart b/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart new file mode 100755 index 0000000..8fb3c22 --- /dev/null +++ b/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart @@ -0,0 +1,72 @@ +import '/flutter_flow/flutter_flow_calendar.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 'package:provider/provider.dart'; +import 'calendar_model.dart'; +export 'calendar_model.dart'; + +class CalendarWidget extends StatefulWidget { + const CalendarWidget({super.key}); + + @override + State createState() => _CalendarWidgetState(); +} + +class _CalendarWidgetState extends State { + late CalendarModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => CalendarModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return FlutterFlowCalendar( + color: FlutterFlowTheme.of(context).primary, + iconColor: FlutterFlowTheme.of(context).secondaryText, + weekFormat: false, + weekStartsMonday: false, + rowHeight: 48.0, + onChange: (DateTimeRange? newSelectedDate) { + safeSetState(() => _model.calendarSelectedDay = newSelectedDate); + }, + titleStyle: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + dayOfWeekStyle: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + dateStyle: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + selectedDateStyle: FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + inactiveDateStyle: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart new file mode 100755 index 0000000..4b6b767 --- /dev/null +++ b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'daily_trackers_widget.dart' show DailyTrackersWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class DailyTrackersModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart new file mode 100755 index 0000000..89fd2d7 --- /dev/null +++ b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart @@ -0,0 +1,174 @@ +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 'package:provider/provider.dart'; +import 'daily_trackers_model.dart'; +export 'daily_trackers_model.dart'; + +class DailyTrackersWidget extends StatefulWidget { + const DailyTrackersWidget({super.key}); + + @override + State createState() => _DailyTrackersWidgetState(); +} + +class _DailyTrackersWidgetState extends State { + late DailyTrackersModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => DailyTrackersModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(24.0, 16.0, 16.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Hello,', + style: FlutterFlowTheme.of(context).displaySmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + fontWeight: FontWeight.normal, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(2.0, 0.0, 0.0, 0.0), + child: Text( + 'Phong', + style: FlutterFlowTheme.of(context).displaySmall.override( + fontFamily: 'Inter Tight', + color: Color(0xFFBF0404), + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0), + child: Text( + 'Below is the progress you have made this week.', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(20.0, 12.0, 20.0, 12.0), + child: Container( + width: double.infinity, + height: 110.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: Color(0x34090F13), + offset: Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(12.0, 8.0, 12.0, 8.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 4.0), + child: Text( + 'Goals', + style: FlutterFlowTheme.of(context).labelSmall.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Text( + 'UV exposure today', + style: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: Text( + 'Minitues', + style: FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 4.0, 0.0, 0.0), + child: Text( + '30/20', + style: FlutterFlowTheme.of(context) + .headlineLarge + .override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart new file mode 100755 index 0000000..bda438b --- /dev/null +++ b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart @@ -0,0 +1,22 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_charts.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'dart:math'; +import '/flutter_flow/random_data_util.dart' as random_data; +import 'dashboard01_recent_activity_widget.dart' + show Dashboard01RecentActivityWidget; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class Dashboard01RecentActivityModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart new file mode 100755 index 0000000..bc5c575 --- /dev/null +++ b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart @@ -0,0 +1,294 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_charts.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'dart:math'; +import '/flutter_flow/random_data_util.dart' as random_data; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'dashboard01_recent_activity_model.dart'; +export 'dashboard01_recent_activity_model.dart'; + +class Dashboard01RecentActivityWidget extends StatefulWidget { + const Dashboard01RecentActivityWidget({super.key}); + + @override + State createState() => + _Dashboard01RecentActivityWidgetState(); +} + +class _Dashboard01RecentActivityWidgetState + extends State + with TickerProviderStateMixin { + late Dashboard01RecentActivityModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => Dashboard01RecentActivityModel()); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + 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: Offset(0.0, 20.0), + end: Offset(0.0, 0.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: Offset(0.698, 0), + end: Offset(0, 0), + ), + ], + ), + }); + setupAnimations( + animationsMap.values.where((anim) => + anim.trigger == AnimationTrigger.onActionTrigger || + !anim.applyInitialState), + this, + ); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 24.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 3.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 12.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 0.0, 0.0), + child: Text( + 'Recent Activity', + style: FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 0.0, 0.0), + child: Text( + 'Below is an overview of tasks & activity completed.', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 32.0, + constraints: BoxConstraints( + maxHeight: 32.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + borderRadius: BorderRadius.circular(30.0), + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.radio_button_checked_sharp, + color: Color(0xFFEF3939), + size: 20.0, + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Text( + 'UV', + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + Container( + height: 32.0, + constraints: BoxConstraints( + maxHeight: 32.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + borderRadius: BorderRadius.circular(30.0), + ), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.radio_button_checked_sharp, + color: Color(0xFFD2AE39), + size: 20.0, + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Text( + 'Temperature', + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(10.0), + ), + alignment: AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 16.0, 0.0, 0.0), + child: Container( + width: double.infinity, + height: 300.0, + child: FlutterFlowLineChart( + data: [ + FFLineChartData( + xData: List.generate( + random_data.randomInteger(5, 5), + (index) => random_data.randomDate()), + yData: List.generate( + random_data.randomInteger(5, 5), + (index) => + random_data.randomInteger(0, 1000)), + settings: LineChartBarData( + color: Color(0xFFEF3939), + barWidth: 2.0, + isCurved: true, + preventCurveOverShooting: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + color: Color(0x4CEF3939), + ), + ), + ), + FFLineChartData( + xData: List.generate( + random_data.randomInteger(5, 5), + (index) => random_data.randomInteger(0, 10)), + yData: List.generate( + random_data.randomInteger(5, 5), + (index) => random_data.randomInteger(0, 10)), + settings: LineChartBarData( + color: Color(0xFFD2AE39), + barWidth: 2.0, + isCurved: true, + preventCurveOverShooting: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + color: Color(0x4CD2AE39), + ), + ), + ) + ], + chartStylingInfo: ChartStylingInfo( + backgroundColor: + FlutterFlowTheme.of(context).primaryBackground, + showBorder: false, + ), + axisBounds: AxisBounds(), + xAxisLabelInfo: AxisLabelInfo(), + yAxisLabelInfo: AxisLabelInfo(), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ).animateOnPageLoad(animationsMap['containerOnPageLoadAnimation']!), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/healthy/healthy_model.dart b/Application Product/Source/source/lib/widget/healthy/healthy_model.dart new file mode 100755 index 0000000..02dc008 --- /dev/null +++ b/Application Product/Source/source/lib/widget/healthy/healthy_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'healthy_widget.dart' show HealthyWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class HealthyModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart b/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart new file mode 100755 index 0000000..8e5fce9 --- /dev/null +++ b/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart @@ -0,0 +1,107 @@ +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 'package:provider/provider.dart'; +import 'healthy_model.dart'; +export 'healthy_model.dart'; + +class HealthyWidget extends StatefulWidget { + const HealthyWidget({super.key}); + + @override + State createState() => _HealthyWidgetState(); +} + +class _HealthyWidgetState extends State { + late HealthyModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => HealthyModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 7.0, + color: Color(0x2F1D2429), + offset: Offset( + 0.0, + 3.0, + ), + ) + ], + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: EdgeInsets.all(12.0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.asset( + 'assets/images/ultraviolet_radiation_hero_image.jpg', + width: double.infinity, + height: 100.0, + fit: BoxFit.cover, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 8.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Text( + 'UV Damage Skin cells', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ], + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + 'UV rays can damage skin cells, leading to DNA mutations, which increase the risk of skin cancers such as melanoma', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart new file mode 100755 index 0000000..5ee9744 --- /dev/null +++ b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'healthy_copy_widget.dart' show HealthyCopyWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class HealthyCopyModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart new file mode 100755 index 0000000..8abd6eb --- /dev/null +++ b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart @@ -0,0 +1,107 @@ +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 'package:provider/provider.dart'; +import 'healthy_copy_model.dart'; +export 'healthy_copy_model.dart'; + +class HealthyCopyWidget extends StatefulWidget { + const HealthyCopyWidget({super.key}); + + @override + State createState() => _HealthyCopyWidgetState(); +} + +class _HealthyCopyWidgetState extends State { + late HealthyCopyModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => HealthyCopyModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 7.0, + color: Color(0x2F1D2429), + offset: Offset( + 0.0, + 3.0, + ), + ) + ], + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: EdgeInsets.all(12.0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.asset( + 'assets/images/sun-eye.jpg', + width: double.infinity, + height: 100.0, + fit: BoxFit.cover, + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 8.0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Text( + 'The Eyes', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ], + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + 'UV exposure can contribute to macular degeneration, a leading cause of age-related blindness.', + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart b/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart new file mode 100755 index 0000000..391d1d6 --- /dev/null +++ b/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'material_card2_widget.dart' show MaterialCard2Widget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class MaterialCard2Model extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart b/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart new file mode 100755 index 0000000..77b57f7 --- /dev/null +++ b/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart @@ -0,0 +1,140 @@ +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 'package:provider/provider.dart'; +import 'material_card2_model.dart'; +export 'material_card2_model.dart'; + +class MaterialCard2Widget extends StatefulWidget { + const MaterialCard2Widget({super.key}); + + @override + State createState() => _MaterialCard2WidgetState(); +} + +class _MaterialCard2WidgetState extends State { + late MaterialCard2Model _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => MaterialCard2Model()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Align( + alignment: AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0), + child: Container( + width: double.infinity, + constraints: BoxConstraints( + maxWidth: 530.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 3.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + border: Border.all( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1.0, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Container( + width: 44.0, + height: 44.0, + decoration: BoxDecoration( + color: Color(0xFFEF3939), + shape: BoxShape.circle, + ), + alignment: AlignmentDirectional(0.0, 0.0), + child: Text( + 'AD', + style: FlutterFlowTheme.of(context).titleMedium.override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Our Advice ', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 4.0, 0.0, 0.0), + child: Text( + 'Pay Attention', + style: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + ), + ], + ), + ), + ), + Container( + width: 100.0, + height: 80.0, + decoration: BoxDecoration( + color: Color(0xFFF4D23D), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(12.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(12.0), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/team/team_model.dart b/Application Product/Source/source/lib/widget/team/team_model.dart new file mode 100755 index 0000000..2e2f1ef --- /dev/null +++ b/Application Product/Source/source/lib/widget/team/team_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'team_widget.dart' show TeamWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class TeamModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/team/team_widget.dart b/Application Product/Source/source/lib/widget/team/team_widget.dart new file mode 100755 index 0000000..eff825e --- /dev/null +++ b/Application Product/Source/source/lib/widget/team/team_widget.dart @@ -0,0 +1,179 @@ +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 'package:provider/provider.dart'; +import 'team_model.dart'; +export 'team_model.dart'; + +class TeamWidget extends StatefulWidget { + const TeamWidget({super.key}); + + @override + State createState() => _TeamWidgetState(); +} + +class _TeamWidgetState extends State { + late TeamModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => TeamModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Align( + alignment: AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: EdgeInsets.all(16.0), + child: Container( + width: double.infinity, + constraints: BoxConstraints( + maxWidth: 1170.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 3.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + borderRadius: BorderRadius.circular(8.0), + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 1.0, + ), + ), + child: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 12.0, 0.0), + child: AnimatedDefaultTextStyle( + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Roboto', + color: Colors.black, + fontSize: 28.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + ), + duration: Duration(milliseconds: 600), + curve: Curves.easeInOut, + child: Text( + 'Meet Our Team', + ), + ), + ), + ListView( + padding: EdgeInsets.zero, + shrinkWrap: true, + scrollDirection: Axis.vertical, + children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0), + child: Container( + width: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 0.0, + color: FlutterFlowTheme.of(context) + .primaryBackground, + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + ), + ), + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0), + child: Container( + width: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 0.0, + color: FlutterFlowTheme.of(context) + .primaryBackground, + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + ), + ), + ), + Padding( + padding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0), + child: Container( + width: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 0.0, + color: FlutterFlowTheme.of(context) + .primaryBackground, + offset: Offset( + 0.0, + 1.0, + ), + ) + ], + ), + ), + ), + ], + ), + ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.asset( + 'assets/images/White_Purple_Modern_Meet_Our_Team_LinkedIn_Post_(2).png', + width: 1194.0, + height: 620.0, + fit: BoxFit.contain, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/temp/temp_model.dart b/Application Product/Source/source/lib/widget/temp/temp_model.dart new file mode 100755 index 0000000..580c2c6 --- /dev/null +++ b/Application Product/Source/source/lib/widget/temp/temp_model.dart @@ -0,0 +1,19 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'temp_widget.dart' show TempWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class TempModel extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for Slider widget. + double? sliderValue; + + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/temp/temp_widget.dart b/Application Product/Source/source/lib/widget/temp/temp_widget.dart new file mode 100755 index 0000000..134936b --- /dev/null +++ b/Application Product/Source/source/lib/widget/temp/temp_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 'package:provider/provider.dart'; +import 'temp_model.dart'; +export 'temp_model.dart'; + +class TempWidget extends StatefulWidget { + const TempWidget({super.key}); + + @override + State createState() => _TempWidgetState(); +} + +class _TempWidgetState extends State { + late TempModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => TempModel()); + + WidgetsBinding.instance.addPostFrameCallback((_) => safeSetState(() {})); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Container( + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 2.0, + ), + spreadRadius: 0.0, + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Heating', + style: + FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + letterSpacing: 0.0, + ), + ), + Text( + 'Current temperature', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + ], + ), + Container( + width: 60.0, + height: 60.0, + decoration: BoxDecoration( + color: Color(0xFFEF3939), + borderRadius: BorderRadius.circular(30.0), + ), + child: Icon( + Icons.thermostat, + color: FlutterFlowTheme.of(context).info, + size: 30.0, + ), + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '22°C', + style: FlutterFlowTheme.of(context).displaySmall.override( + fontFamily: 'Inter Tight', + color: Color(0xFFA10808), + letterSpacing: 0.0, + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + 'Target', + style: FlutterFlowTheme.of(context).bodySmall.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + Text( + '24°C', + style: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Inter Tight', + color: Color(0xFFA10808), + letterSpacing: 0.0, + ), + ), + ], + ), + ].divide(SizedBox(width: 16.0)), + ), + Container( + width: double.infinity, + child: Slider( + activeColor: Color(0xFFA10808), + inactiveColor: Color(0x33000000), + min: 15.0, + max: 30.0, + value: _model.sliderValue ??= 24.0, + onChanged: (newValue) { + newValue = double.parse(newValue.toStringAsFixed(4)); + safeSetState(() => _model.sliderValue = newValue); + }, + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '15°C', + style: FlutterFlowTheme.of(context).bodySmall.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + Text( + '30°C', + style: FlutterFlowTheme.of(context).bodySmall.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + ], + ), + ].divide(SizedBox(height: 16.0)), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart new file mode 100755 index 0000000..a149abe --- /dev/null +++ b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart @@ -0,0 +1,21 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'temp_and_u_v_widget.dart' show TempAndUVWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class TempAndUVModel extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for Slider widget. + double? sliderValue1; + // State field(s) for Slider widget. + double? sliderValue2; + + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart new file mode 100755 index 0000000..13b0a8d --- /dev/null +++ b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart @@ -0,0 +1,182 @@ +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 'package:provider/provider.dart'; +import 'temp_and_u_v_model.dart'; +export 'temp_and_u_v_model.dart'; + +class TempAndUVWidget extends StatefulWidget { + const TempAndUVWidget({super.key}); + + @override + State createState() => _TempAndUVWidgetState(); +} + +class _TempAndUVWidgetState extends State { + late TempAndUVModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => TempAndUVModel()); + + WidgetsBinding.instance.addPostFrameCallback((_) => safeSetState(() {})); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Opacity( + opacity: 0.8, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: Color(0xFF710F0F), + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'UV Index', + style: FlutterFlowTheme.of(context) + .headlineSmall + .override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + ), + Text( + 'Moderate', + style: + FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFF96989C), + letterSpacing: 0.0, + ), + ), + ], + ), + Text( + '5.6', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFFFDFAF9), + fontSize: 29.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + Container( + width: double.infinity, + child: Slider( + activeColor: Color(0xFF00FFFD), + inactiveColor: Color(0xFFE0E0E0), + min: 0.0, + max: 11.0, + value: _model.sliderValue1 ??= 5.0, + onChanged: (newValue) { + newValue = double.parse(newValue.toStringAsFixed(4)); + safeSetState(() => _model.sliderValue1 = newValue); + }, + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Temperature', + style: FlutterFlowTheme.of(context) + .headlineSmall + .override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + ), + Text( + 'Warm', + style: + FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: Color(0xFF9EA1A3), + letterSpacing: 0.0, + ), + ), + ], + ), + Text( + '28°C', + style: + FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + ), + ], + ), + Container( + width: double.infinity, + child: Slider( + activeColor: Color(0xFFFFC122), + inactiveColor: Color(0xFFE0E0E0), + min: -10.0, + max: 40.0, + value: _model.sliderValue2 ??= 28.0, + onChanged: (newValue) { + newValue = double.parse(newValue.toStringAsFixed(4)); + safeSetState(() => _model.sliderValue2 = newValue); + }, + ), + ), + Text( + '28°C', + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Inter Tight', + color: Colors.white, + letterSpacing: 0.0, + ), + ), + ].divide(SizedBox(height: 16.0)), + ), + ), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/time_count/time_count_model.dart b/Application Product/Source/source/lib/widget/time_count/time_count_model.dart new file mode 100755 index 0000000..ca63603 --- /dev/null +++ b/Application Product/Source/source/lib/widget/time_count/time_count_model.dart @@ -0,0 +1,15 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'time_count_widget.dart' show TimeCountWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class TimeCountModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart b/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart new file mode 100755 index 0000000..3f5bf1a --- /dev/null +++ b/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart @@ -0,0 +1,136 @@ +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 'package:provider/provider.dart'; +import 'time_count_model.dart'; +export 'time_count_model.dart'; + +class TimeCountWidget extends StatefulWidget { + const TimeCountWidget({super.key}); + + @override + State createState() => _TimeCountWidgetState(); +} + +class _TimeCountWidgetState extends State { + late TimeCountModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => TimeCountModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 2.0, + ), + spreadRadius: 0.0, + ) + ], + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '30 Minutes', + style: FlutterFlowTheme.of(context).headlineLarge.override( + fontFamily: 'Inter Tight', + color: Color(0xFFEF3939), + letterSpacing: 0.0, + ), + ), + Icon( + Icons.access_time, + color: Color(0xFFEF3939), + size: 32.0, + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Monday', + style: FlutterFlowTheme.of(context).bodyLarge.override( + fontFamily: 'Inter', + letterSpacing: 0.0, + ), + ), + Text( + 'May 15, 2023', + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: FlutterFlowTheme.of(context).secondaryText, + letterSpacing: 0.0, + ), + ), + ], + ), + FFButtonWidget( + onPressed: () { + print('Button pressed ...'); + }, + text: 'Dangerous!', + options: FFButtonOptions( + width: 120.0, + height: 40.0, + padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), + iconPadding: + EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), + color: Color(0x63ECCC44), + textStyle: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Open Sans', + color: Colors.black, + fontSize: 17.0, + letterSpacing: 0.0, + ), + elevation: 0.0, + borderRadius: BorderRadius.circular(20.0), + ), + ), + ], + ), + ].divide(SizedBox(height: 12.0)), + ), + ), + ); + } +} diff --git a/Application Product/Source/source/lib/widget/what/what_model.dart b/Application Product/Source/source/lib/widget/what/what_model.dart new file mode 100755 index 0000000..8177507 --- /dev/null +++ b/Application Product/Source/source/lib/widget/what/what_model.dart @@ -0,0 +1,14 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'what_widget.dart' show WhatWidget; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +class WhatModel extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/Application Product/Source/source/lib/widget/what/what_widget.dart b/Application Product/Source/source/lib/widget/what/what_widget.dart new file mode 100755 index 0000000..d74df4b --- /dev/null +++ b/Application Product/Source/source/lib/widget/what/what_widget.dart @@ -0,0 +1,78 @@ +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 'package:provider/provider.dart'; +import 'what_model.dart'; +export 'what_model.dart'; + +class WhatWidget extends StatefulWidget { + const WhatWidget({super.key}); + + @override + State createState() => _WhatWidgetState(); +} + +class _WhatWidgetState extends State { + late WhatModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => WhatModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: 248.0, + height: 100.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: Color(0x33000000), + offset: Offset( + 0.0, + 2.0, + ), + spreadRadius: 0.0, + ) + ], + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'WHAT TODAY ?', + style: FlutterFlowTheme.of(context).headlineSmall.override( + fontFamily: 'Inter Tight', + color: FlutterFlowTheme.of(context).primaryText, + letterSpacing: 0.0, + ), + ), + ], + ), + ), + ); + } +} diff --git a/Application Product/Source/source/pubspec.yaml b/Application Product/Source/source/pubspec.yaml new file mode 100755 index 0000000..01232a9 --- /dev/null +++ b/Application Product/Source/source/pubspec.yaml @@ -0,0 +1,146 @@ +name: u_vita +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 + file_picker: 8.0.3 + fl_chart: 0.68.0 + floating_bottom_navigation_bar: 1.5.2 + flutter_animate: 4.5.0 + flutter_cache_manager: 3.3.1 + flutter_plugin_android_lifecycle: 2.0.20 + font_awesome_flutter: 10.7.0 + from_css_color: 2.0.0 + go_router: 12.1.3 + google_fonts: 6.1.0 + intl: 0.19.0 + json_path: 0.7.2 + page_transition: 2.1.0 + path_provider: 2.1.3 + path_provider_android: 2.2.5 + path_provider_foundation: 2.4.0 + path_provider_platform_interface: 2.1.2 + plugin_platform_interface: 2.1.8 + pointer_interceptor: 0.10.1 + provider: 6.1.2 + 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 + table_calendar: 3.1.1 + timeago: 3.6.1 + url_launcher: 6.3.0 + url_launcher_android: 6.3.4 + url_launcher_ios: 6.3.1 + url_launcher_platform_interface: 2.3.2 + uuid: ^4.0.0 + webview_flutter: 4.7.0 + webview_flutter_android: 3.15.0 + webview_flutter_platform_interface: 2.10.0 + webview_flutter_wkwebview: 3.12.0 + webviewx_plus: 0.5.0 + + # 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.1 + pointer_interceptor: 0.10.1 + uuid: ^4.0.0 + win32: 5.5.1 + +dev_dependencies: + flutter_launcher_icons: 0.13.1 + flutter_lints: 4.0.0 + image: 4.0.17 + lints: 4.0.0 + flutter_test: + sdk: flutter + + +flutter_launcher_icons: + android: true + ios: true + remove_alpha_ios: true + web: + generate: true + image_path: 'assets/images/app_launcher_icon.png' + + +# 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/ + + + + # 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/Application Product/Source/source/test/widget_test.dart b/Application Product/Source/source/test/widget_test.dart new file mode 100755 index 0000000..0275d6d --- /dev/null +++ b/Application Product/Source/source/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:u_vita/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/Application Product/Source/source/web/favicon.png b/Application Product/Source/source/web/favicon.png new file mode 100644 index 0000000..300efae Binary files /dev/null and b/Application Product/Source/source/web/favicon.png differ diff --git a/Application Product/Source/source/web/icons/Icon-192.png b/Application Product/Source/source/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/Application Product/Source/source/web/icons/Icon-192.png differ diff --git a/Application Product/Source/source/web/icons/Icon-512.png b/Application Product/Source/source/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/Application Product/Source/source/web/icons/Icon-512.png differ diff --git a/Application Product/Source/source/web/icons/app_launcher_icon.png b/Application Product/Source/source/web/icons/app_launcher_icon.png new file mode 100755 index 0000000..fef18ef Binary files /dev/null and b/Application Product/Source/source/web/icons/app_launcher_icon.png differ diff --git a/Application Product/Source/source/web/index.html b/Application Product/Source/source/web/index.html new file mode 100755 index 0000000..943d10a --- /dev/null +++ b/Application Product/Source/source/web/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UVita + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application Product/Source/u_vita.zip b/Application Product/Source/u_vita.zip deleted file mode 100644 index cbd7dee..0000000 Binary files a/Application Product/Source/u_vita.zip and /dev/null differ