├── lib ├── utilities │ ├── custom_image.dart │ ├── utilities.dart │ └── custom_validator.dart ├── providers │ └── entrepreneur_nav_bar_provider.dart ├── enums │ └── idea_status_enum.dart ├── widgets │ ├── show_loading.dart │ ├── custom_toast.dart │ ├── phone_number_field.dart │ ├── idea_feed_tile.dart │ ├── circular_profile_image.dart │ ├── custom_elevated_button.dart │ ├── password_textformfield.dart │ ├── user_type_widget.dart │ └── custom_textformfield.dart ├── screens │ ├── main_screen │ │ └── main_screen.dart │ ├── nav_bars │ │ └── entrepreneur_bottom_nav_bar.dart │ ├── pages │ │ ├── feed_page │ │ │ └── feed_page.dart │ │ ├── profile_page │ │ │ └── profile_page.dart │ │ └── add_page │ │ │ └── add_page.dart │ ├── idea_detail_screen │ │ ├── idea_detail_screen.dart │ │ └── pdf_view.dart │ └── auth │ │ ├── login_screen.dart │ │ └── register_screen.dart ├── Database │ └── user_api.dart ├── main.dart ├── models │ ├── app_user.dart │ └── idea.dart └── database │ ├── idea_api.dart │ ├── auth_methods.dart │ └── user_apisdsa.dart ├── ios ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── GoogleService-Info.plist │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── .gitignore ├── Podfile └── Podfile.lock ├── .gitattributes ├── assets └── logo.png ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── manifest.json └── index.html ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── fastnuces │ │ │ │ │ └── estartup │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── google-services.json │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── .metadata ├── README.md ├── .gitignore ├── test └── widget_test.dart ├── pubspec.yaml ├── analysis_options.yaml └── pubspec.lock /lib/utilities/custom_image.dart: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/assets/logo.png -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/e-starter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/fastnuces/estartup/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.fastnuces.estartup 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /lib/providers/entrepreneur_nav_bar_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class EntrepreneurNavBarProvider extends ChangeNotifier { 4 | int _currentIndex = 0; 5 | void onTabTapped(int index) { 6 | _currentIndex = index; 7 | notifyListeners(); 8 | } 9 | 10 | int get currentTap => _currentIndex; 11 | } 12 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /lib/enums/idea_status_enum.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | enum IdeaStatusEnum { AVAILABLE, INWORKING, COMPLETED } 4 | 5 | class IdeaStatusConvertor { 6 | static String fromEnum(IdeaStatusEnum status) { 7 | return 'AVAILABLE'; 8 | } 9 | 10 | static IdeaStatusEnum fromString(String status) { 11 | return IdeaStatusEnum.AVAILABLE; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | 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. -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # estartup 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /lib/widgets/show_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | // ignore: always_specify_types 4 | Future showLoadingDislog(BuildContext context) { 5 | return showDialog( 6 | context: context, 7 | builder: (BuildContext context) { 8 | return const Center( 9 | child: SizedBox( 10 | height: 30, 11 | width: 30, 12 | child: CircularProgressIndicator.adaptive(), 13 | ), 14 | ); 15 | }, 16 | ); 17 | } 18 | 19 | class ShowLoading extends StatelessWidget { 20 | const ShowLoading({Key? key}) : super(key: key); 21 | @override 22 | Widget build(BuildContext context) { 23 | return const Center(child: CircularProgressIndicator.adaptive()); 24 | } 25 | } -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.3.10' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | mavenCentral() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | } 26 | subprojects { 27 | project.evaluationDependsOn(':app') 28 | } 29 | 30 | task clean(type: Delete) { 31 | delete rootProject.buildDir 32 | } 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /lib/widgets/custom_toast.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:fluttertoast/fluttertoast.dart'; 3 | 4 | class CustomToast { 5 | static void successToast({required String message, int duration = 3}) { 6 | Fluttertoast.showToast( 7 | msg: message, 8 | timeInSecForIosWeb: duration, 9 | backgroundColor: Colors.green, 10 | ); 11 | } 12 | 13 | static void errorToast({required String message, int duration = 4}) { 14 | Fluttertoast.showToast( 15 | msg: message, 16 | timeInSecForIosWeb: duration, 17 | backgroundColor: Colors.red, 18 | ); 19 | } 20 | 21 | static void showSnackBar({ 22 | required BuildContext context, 23 | required String text, 24 | }) { 25 | final SnackBar snackBar = 26 | SnackBar(content: Text(text), backgroundColor: Colors.black); 27 | ScaffoldMessenger.of(context).showSnackBar(snackBar); 28 | } 29 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /lib/utilities/utilities.dart: -------------------------------------------------------------------------------- 1 | class Utilities { 2 | static double get padding => 16; 3 | static double get borderRadius => 16; 4 | static String get demoParagraph => 5 | 'Lahore - Search For Relevant Info & Results. Get Results from Multiple Engines. Get Results for Content Writing Services Usa. Find Quick Results from Multiple Sources. Discover us now! Easy Acces To Information. Simple in use. Multiple sources combined. All the Answers. Lahore - Search For Relevant Info & Results. Get Results from Multiple Engines. Get Results for Content Writing Services Usa. Find Quick Results from Multiple Sources. Discover us now! Easy Acces To Information. Simple in use. Multiple sources combined. All the Answers.'; 6 | static String getGreetingsText() { 7 | int hour = DateTime.now().hour; 8 | if (hour < 12) { 9 | return 'Good Morning'; 10 | } else if (hour < 17) { 11 | return 'Good Afternoon'; 12 | } 13 | return 'Good Evening'; 14 | } 15 | } -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "estartup", 3 | "short_name": "estartup", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /lib/screens/main_screen/main_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/providers/entrepreneur_nav_bar_provider.dart'; 2 | import 'package:estartup/screens/pages/add_page/add_page.dart'; 3 | import 'package:estartup/screens/pages/feed_page/feed_page.dart'; 4 | import 'package:estartup/screens/pages/profile_page/profile_page.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:provider/provider.dart'; 7 | 8 | import '../nav_bars/entrepreneur_bottom_nav_bar.dart'; 9 | 10 | class MainScreen extends StatelessWidget { 11 | const MainScreen({Key? key}) : super(key: key); 12 | static const String rotueName = '/MainScreen'; 13 | 14 | static const List _pages = [ 15 | FeedPage(), 16 | AddPage(), 17 | ProfilePage(), 18 | ]; 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | final int _currentIndex = 23 | Provider.of(context).currentTap; 24 | return Scaffold( 25 | body: _pages[_currentIndex], 26 | bottomNavigationBar: const EntrepreneurBottomNavBar(), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "1017382948091", 4 | "project_id": "e-stater", 5 | "storage_bucket": "e-stater.appspot.com" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "1:1017382948091:android:4a2b979129d9d87949b45e", 11 | "android_client_info": { 12 | "package_name": "com.fastnuces.estartup" 13 | } 14 | }, 15 | "oauth_client": [ 16 | { 17 | "client_id": "1017382948091-0da4kb8bkh0jtq7977bsomd8muqsh1ff.apps.googleusercontent.com", 18 | "client_type": 3 19 | } 20 | ], 21 | "api_key": [ 22 | { 23 | "current_key": "AIzaSyDNuYXWQaEI6lO9TX3pTY-RUF7OJuYfX3M" 24 | } 25 | ], 26 | "services": { 27 | "appinvite_service": { 28 | "other_platform_oauth_client": [ 29 | { 30 | "client_id": "1017382948091-0da4kb8bkh0jtq7977bsomd8muqsh1ff.apps.googleusercontent.com", 31 | "client_type": 3 32 | } 33 | ] 34 | } 35 | } 36 | } 37 | ], 38 | "configuration_version": "1" 39 | } -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:estartup/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/utilities/custom_validator.dart: -------------------------------------------------------------------------------- 1 | class CustomValidator { 2 | static String? email(String? value) { 3 | if (!RegExp( 4 | r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+") 5 | .hasMatch(value!)) { 6 | return 'Email is Invalide'; 7 | } 8 | return null; 9 | } 10 | 11 | static String? password(String? value) { 12 | if (value!.length < 6) { 13 | return 'Password should be greater then 6 digits'; 14 | } 15 | return null; 16 | } 17 | 18 | static String? isEmpty(String? value) { 19 | return (value!.isEmpty) ? 'Field could not be empty' : null; 20 | } 21 | 22 | static String? lessThen2(String? value) { 23 | return (value!.length < 2) ? 'Enter more then 1 characters' : null; 24 | } 25 | 26 | static String? lessThen3(String? value) { 27 | return (value!.length < 3) ? 'Enter more then 2 characters' : null; 28 | } 29 | 30 | static String? lessThen4(String? value) { 31 | return (value!.length < 4) ? 'Enter more then 3 characters' : null; 32 | } 33 | 34 | static String? lessThen5(String? value) { 35 | return (value!.length < 5) ? 'Enter more then 4 characters' : null; 36 | } 37 | 38 | static String? retaunNull(String? value) => null; 39 | } -------------------------------------------------------------------------------- /ios/Runner/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 1017382948091-1c5kua2scdkfoo62nrhkote57qe9s0cg.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.1017382948091-1c5kua2scdkfoo62nrhkote57qe9s0cg 9 | API_KEY 10 | AIzaSyAzkI4Ix6RPMaNN2wuXS8y3H17p8tVZ63k 11 | GCM_SENDER_ID 12 | 1017382948091 13 | PLIST_VERSION 14 | 1 15 | BUNDLE_ID 16 | com.fastnuces.estartup 17 | PROJECT_ID 18 | e-stater 19 | STORAGE_BUCKET 20 | e-stater.appspot.com 21 | IS_ADS_ENABLED 22 | 23 | IS_ANALYTICS_ENABLED 24 | 25 | IS_APPINVITE_ENABLED 26 | 27 | IS_GCM_ENABLED 28 | 29 | IS_SIGNIN_ENABLED 30 | 31 | GOOGLE_APP_ID 32 | 1:1017382948091:ios:9af622891f4bc24249b45e 33 | 34 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: estartup 2 | description: A new Flutter project. 3 | publish_to: "none" # Remove this line if you wish to publish to pub.dev 4 | version: 1.0.0+1 5 | 6 | environment: 7 | sdk: ">=2.15.0 <3.0.0" 8 | dependencies: 9 | flutter: 10 | sdk: flutter 11 | cupertino_icons: ^1.0.4 12 | 13 | firebase_auth: ^3.3.5 14 | cloud_firestore: ^3.1.6 15 | firebase_core: ^1.11.0 16 | firebase_storage: ^10.2.5 17 | 18 | shared_preferences: ^2.0.12 19 | provider: ^6.0.2 20 | 21 | fluttertoast: ^8.0.8 22 | intl_phone_field: ^3.0.0 23 | extended_image: ^6.0.1 24 | file_picker: 25 | 26 | flutter_pdfview: 27 | http: 28 | path_provider: any 29 | permission_handler: 30 | dev_dependencies: 31 | flutter_test: 32 | sdk: flutter 33 | flutter_lints: ^1.0.4 34 | flutter: 35 | uses-material-design: true 36 | assets: 37 | - assets/ 38 | # - images/a_dot_ham.jpeg 39 | # example: 40 | # fonts: 41 | # - family: Schyler 42 | # fonts: 43 | # - asset: fonts/Schyler-Regular.ttf 44 | # - asset: fonts/Schyler-Italic.ttf 45 | # style: italic 46 | # - family: Trajan Pro 47 | # fonts: 48 | # - asset: fonts/TrajanPro.ttf 49 | # - asset: fonts/TrajanPro_Bold.ttf 50 | # weight: 700 51 | -------------------------------------------------------------------------------- /lib/widgets/phone_number_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:intl_phone_field/intl_phone_field.dart'; 3 | import 'package:intl_phone_field/phone_number.dart'; 4 | import '../utilities/utilities.dart'; 5 | 6 | class PhoneNumberField extends StatefulWidget { 7 | const PhoneNumberField({Key? key, required this.onChange}) : super(key: key); 8 | final Function(PhoneNumber)? onChange; 9 | @override 10 | State createState() => _PhoneNumberFieldState(); 11 | } 12 | 13 | class _PhoneNumberFieldState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return IntlPhoneField( 17 | decoration: InputDecoration( 18 | enabledBorder: OutlineInputBorder( 19 | borderSide: const BorderSide(color: Colors.grey), 20 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 21 | ), 22 | labelText: 'Mobile number', 23 | border: OutlineInputBorder( 24 | borderSide: const BorderSide(color: Colors.grey), 25 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 26 | ), 27 | ), 28 | initialCountryCode: 'PK', 29 | keyboardType: TextInputType.number, 30 | onChanged: (PhoneNumber phone) => widget.onChange!(phone), 31 | ); 32 | } 33 | } -------------------------------------------------------------------------------- /lib/Database/user_api.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:estartup/database/auth_methods.dart'; 3 | import 'package:estartup/models/app_user.dart'; 4 | import 'package:extended_image/extended_image.dart'; 5 | import 'package:firebase_storage/firebase_storage.dart'; 6 | 7 | class UserAPI { 8 | static const String _collection = 'users'; 9 | static final FirebaseFirestore _instance = FirebaseFirestore.instance; 10 | 11 | Future addUser(AppUser appUser) async { 12 | try { 13 | await _instance 14 | .collection(_collection) 15 | .doc(appUser.uid) 16 | .set(appUser.toMap()); 17 | return true; 18 | } catch (e) { 19 | return false; 20 | } 21 | } 22 | 23 | Future getInfo({required String uid}) async { 24 | final DocumentSnapshot> doc = 25 | await _instance.collection(_collection).doc(uid).get(); 26 | if (!doc.exists) return null; 27 | return AppUser.fromDoc(doc); 28 | } 29 | 30 | Future uploadImage({required File file}) async { 31 | try { 32 | TaskSnapshot snapshot = await FirebaseStorage.instance 33 | .ref( 34 | 'users/${AuthMethods.uid()}/${DateTime.now().microsecondsSinceEpoch}') 35 | .putFile(file); 36 | String url = await snapshot.ref.getDownloadURL(); 37 | return url; 38 | } catch (e) { 39 | return null; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | platform :ios, '13.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/database/auth_methods.dart'; 2 | import 'package:estartup/screens/main_screen/main_screen.dart'; 3 | import 'package:firebase_core/firebase_core.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:provider/provider.dart'; 6 | import 'providers/entrepreneur_nav_bar_provider.dart'; 7 | import 'screens/auth/login_screen.dart'; 8 | import 'screens/auth/register_screen.dart'; 9 | 10 | Future main() async { 11 | WidgetsFlutterBinding.ensureInitialized(); 12 | await Firebase.initializeApp(); 13 | runApp(const MyApp()); 14 | } 15 | 16 | class MyApp extends StatelessWidget { 17 | const MyApp({Key? key}) : super(key: key); 18 | @override 19 | Widget build(BuildContext context) { 20 | return MultiProvider( 21 | providers: [ 22 | ChangeNotifierProvider( 23 | create: (BuildContext context) => EntrepreneurNavBarProvider(), 24 | ), 25 | ], 26 | child: MaterialApp( 27 | title: 'E-Stater', 28 | theme: ThemeData( 29 | primarySwatch: Colors.blue, 30 | ), 31 | home: (AuthMethods.getCurrentUser() == null) 32 | ? const LoginScreen() 33 | : const MainScreen(), 34 | routes: { 35 | LoginScreen.routeName: (_) => const LoginScreen(), 36 | RegisterScreen.routeName: (_) => const RegisterScreen(), 37 | MainScreen.rotueName: (_) => const MainScreen(), 38 | }, 39 | ), 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/widgets/idea_feed_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/models/idea.dart'; 2 | import 'package:estartup/screens/idea_detail_screen/idea_detail_screen.dart'; 3 | import 'package:estartup/utilities/utilities.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class IdeaFeedTile extends StatelessWidget { 7 | const IdeaFeedTile({required this.idea, Key? key}) : super(key: key); 8 | final Idea idea; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return InkWell( 13 | onTap: () { 14 | Navigator.of(context).push( 15 | MaterialPageRoute( 16 | builder: (context) => IdeaDetailScreen(idea: idea), 17 | ), 18 | ); 19 | }, 20 | child: Container( 21 | padding: EdgeInsets.symmetric(horizontal: Utilities.padding), 22 | child: Column( 23 | crossAxisAlignment: CrossAxisAlignment.start, 24 | children: [ 25 | Text( 26 | idea.title, 27 | maxLines: 2, 28 | overflow: TextOverflow.ellipsis, 29 | style: TextStyle( 30 | fontWeight: FontWeight.bold, 31 | fontSize: 16, 32 | color: Theme.of(context).primaryColor, 33 | ), 34 | ), 35 | const Divider(thickness: 1), 36 | Text( 37 | idea.description, 38 | maxLines: 4, 39 | overflow: TextOverflow.ellipsis, 40 | ) 41 | ], 42 | ), 43 | ), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/widgets/circular_profile_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:extended_image/extended_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class CircularProfileImage extends StatelessWidget { 5 | const CircularProfileImage({ 6 | required this.imageURL, 7 | this.radius = 30, 8 | Key? key, 9 | }) : super(key: key); 10 | final String imageURL; 11 | final double radius; 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return CircleAvatar( 16 | radius: radius, 17 | backgroundColor: Theme.of(context).primaryColor, 18 | child: CircleAvatar( 19 | radius: radius - 2, 20 | backgroundColor: Theme.of(context).scaffoldBackgroundColor, 21 | child: CircleAvatar( 22 | radius: radius - 4, 23 | backgroundColor: Theme.of(context).primaryColor, 24 | child: imageURL.isEmpty 25 | ? const FittedBox( 26 | child: Padding( 27 | padding: EdgeInsets.all(10), 28 | child: Text( 29 | 'No\nImage', 30 | maxLines: 2, 31 | textAlign: TextAlign.center, 32 | ), 33 | )) 34 | : ExtendedImage.network( 35 | imageURL, 36 | width: radius * 2, 37 | height: radius * 2, 38 | fit: BoxFit.cover, 39 | cache: true, 40 | shape: BoxShape.circle, 41 | ), 42 | ), 43 | ), 44 | ); 45 | } 46 | } -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /lib/models/app_user.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:cloud_firestore/cloud_firestore.dart'; 4 | import 'package:estartup/enums/idea_status_enum.dart'; 5 | import 'package:estartup/models/idea.dart'; 6 | 7 | class AppUser { 8 | AppUser({ 9 | required this.uid, 10 | required this.name, 11 | required this.email, 12 | this.isEntrepreneur = true, 13 | this.rating = 0, 14 | this.status = true, 15 | this.imageURL = '', 16 | required this.ideas, 17 | }); 18 | final String uid; 19 | final String name; 20 | final String email; 21 | final bool isEntrepreneur; 22 | final String? imageURL; 23 | final double? rating; 24 | final bool? status; 25 | final List? ideas; 26 | 27 | Map toMap() { 28 | return { 29 | 'uid': uid, 30 | 'name': name, 31 | 'email': email, 32 | 'isEntrepreneur': isEntrepreneur, 33 | 'imageURL': imageURL, 34 | 'rating': rating, 35 | 'status': status, 36 | 'ideas': [], 37 | }; 38 | } 39 | 40 | factory AppUser.fromDoc(DocumentSnapshot> doc) { 41 | return AppUser( 42 | uid: doc.data()!['uid'] ?? '', 43 | name: doc.data()!['name'] ?? '', 44 | email: doc.data()!['email'] ?? '', 45 | isEntrepreneur: doc.data()!['isEntrepreneur'] ?? true, 46 | imageURL: doc.data()!['imageURL'], 47 | rating: double.parse(doc.data()!['rating'].toString()), 48 | status: doc.data()!['status'] ?? true, 49 | ideas: doc.data()!['ideas'] != null ? [] : null, 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/screens/nav_bars/entrepreneur_bottom_nav_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/providers/entrepreneur_nav_bar_provider.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | class EntrepreneurBottomNavBar extends StatelessWidget { 6 | const EntrepreneurBottomNavBar({Key? key}) : super(key: key); 7 | @override 8 | Widget build(BuildContext context) { 9 | EntrepreneurNavBarProvider _navBar = 10 | Provider.of(context); 11 | return BottomNavigationBar( 12 | backgroundColor: Theme.of(context).scaffoldBackgroundColor, 13 | selectedLabelStyle: TextStyle(color: Theme.of(context).primaryColor), 14 | selectedItemColor: Theme.of(context).primaryColor, 15 | showUnselectedLabels: false, 16 | showSelectedLabels: true, 17 | unselectedItemColor: Colors.grey, 18 | currentIndex: _navBar.currentTap, 19 | onTap: (int index) => _navBar.onTabTapped(index), 20 | items: const [ 21 | BottomNavigationBarItem( 22 | icon: Icon(Icons.feed_outlined), 23 | activeIcon: Icon(Icons.feed), 24 | label: 'Feed', 25 | ), 26 | BottomNavigationBarItem( 27 | icon: Icon(Icons.add_box_outlined), 28 | activeIcon: Icon(Icons.add_box), 29 | label: 'New', 30 | ), 31 | BottomNavigationBarItem( 32 | icon: Icon(Icons.person_pin_outlined), 33 | activeIcon: Icon(Icons.person_pin_rounded), 34 | label: 'Profile', 35 | ), 36 | ], 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Estartup 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | estartup 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /lib/widgets/custom_elevated_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CustomElevatedButton extends StatelessWidget { 4 | const CustomElevatedButton({ 5 | required this.title, 6 | required this.onTap, 7 | this.margin, 8 | this.padding, 9 | this.bgColor, 10 | this.borderRadius, 11 | this.border, 12 | this.textStyle, 13 | Key? key, 14 | }) : super(key: key); 15 | final String title; 16 | final VoidCallback onTap; 17 | final EdgeInsetsGeometry? margin; 18 | final EdgeInsetsGeometry? padding; 19 | final Color? bgColor; 20 | final BorderRadius? borderRadius; 21 | final BoxBorder? border; 22 | final TextStyle? textStyle; 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Container( 27 | margin: margin ?? const EdgeInsets.symmetric(vertical: 6), 28 | decoration: BoxDecoration( 29 | color: bgColor ?? Theme.of(context).primaryColor, 30 | borderRadius: borderRadius ?? BorderRadius.circular(20), 31 | border: border, 32 | ), 33 | child: Material( 34 | borderRadius: borderRadius ?? BorderRadius.circular(20), 35 | color: bgColor ?? Theme.of(context).primaryColor, 36 | child: InkWell( 37 | borderRadius: borderRadius ?? BorderRadius.circular(20), 38 | onTap: onTap, 39 | child: Container( 40 | padding: padding ?? const EdgeInsets.symmetric(vertical: 10), 41 | alignment: Alignment.center, 42 | child: Text( 43 | title, 44 | style: textStyle ?? 45 | const TextStyle( 46 | color: Colors.white, 47 | fontSize: 18, 48 | ), 49 | ), 50 | ), 51 | ), 52 | ), 53 | ); 54 | } 55 | } -------------------------------------------------------------------------------- /lib/database/idea_api.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:estartup/models/idea.dart'; 3 | import 'package:estartup/widgets/custom_toast.dart'; 4 | 5 | class IdeaAPI { 6 | static const String _collection = 'ideas'; 7 | static final FirebaseFirestore _instance = FirebaseFirestore.instance; 8 | 9 | Future addIdea(Idea idea) async { 10 | try { 11 | await _instance.collection(_collection).doc().set(idea.toMap()); 12 | return true; 13 | } catch (e) { 14 | return false; 15 | } 16 | } 17 | 18 | Future> feed() async { 19 | List _idea = []; 20 | try { 21 | QuerySnapshot> _docs = await _instance 22 | .collection(_collection) 23 | .orderBy("timestamp", descending: false) 24 | .get(); 25 | for (DocumentSnapshot> element in _docs.docs) { 26 | _idea.add(Idea.fromDoc(element)); 27 | } 28 | } catch (e) { 29 | CustomToast.errorToast(message: e.toString()); 30 | } 31 | 32 | return _idea; 33 | } 34 | 35 | Future idea({required String id}) async { 36 | final DocumentSnapshot> doc = 37 | await _instance.collection(_collection).doc(id).get(); 38 | if (!doc.exists) return null; 39 | return Idea.fromDoc(doc); 40 | } 41 | 42 | Future> userIdeas({required String uid}) async { 43 | List _idea = []; 44 | try { 45 | QuerySnapshot> _docs = await _instance 46 | .collection(_collection) 47 | .where("uid", isEqualTo: uid) 48 | .get(); 49 | for (DocumentSnapshot> element in _docs.docs) { 50 | _idea.add(Idea.fromDoc(element)); 51 | } 52 | } catch (e) { 53 | CustomToast.errorToast(message: e.toString()); 54 | } 55 | return _idea; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/database/auth_methods.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import '../models/app_user.dart'; 3 | import '../widgets/custom_toast.dart'; 4 | import 'user_apisdsa.dart'; 5 | 6 | class AuthMethods { 7 | static final FirebaseAuth _auth = FirebaseAuth.instance; 8 | 9 | static User? getCurrentUser() { 10 | return _auth.currentUser; 11 | } 12 | 13 | static String? uid() { 14 | return _auth.currentUser?.uid; 15 | } 16 | 17 | Future signupWithEmailAndPassword({ 18 | required String email, 19 | required String password, 20 | }) async { 21 | try { 22 | final UserCredential result = await _auth 23 | .createUserWithEmailAndPassword( 24 | email: email.toLowerCase().trim(), 25 | password: password.trim(), 26 | ) 27 | .catchError((Object obj) { 28 | CustomToast.errorToast(message: obj.toString()); 29 | }); 30 | final User? user = result.user; 31 | assert(user != null); 32 | return user; 33 | } catch (signUpError) { 34 | CustomToast.errorToast(message: signUpError.toString()); 35 | return null; 36 | } 37 | } 38 | 39 | Future loginWithEmailAndPassword(String email, String password) async { 40 | try { 41 | final UserCredential result = await _auth 42 | .signInWithEmailAndPassword( 43 | email: email.trim(), 44 | password: password.trim(), 45 | ) 46 | .catchError((Object obj) { 47 | CustomToast.errorToast(message: obj.toString()); 48 | }); 49 | final User? user = result.user; 50 | // final AppUser appUser = await UserAPI().getInfo(uid: user!.uid); 51 | // TODO: add info 52 | return user; 53 | } catch (signUpError) { 54 | CustomToast.errorToast(message: signUpError.toString()); 55 | return null; 56 | } 57 | } 58 | 59 | Future signOut() async { 60 | await _auth.signOut(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 9 | 17 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /lib/models/idea.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:estartup/database/auth_methods.dart'; 3 | import 'package:estartup/enums/idea_status_enum.dart'; 4 | 5 | class Idea { 6 | final String? ideaID; 7 | final String? uid; 8 | final String title; 9 | final String description; 10 | final List documents; 11 | final IdeaStatusEnum? status; 12 | final String? timestamp; 13 | final List? interested; 14 | final List? chats; 15 | final List? keywords; 16 | final String? fileUrl; 17 | Idea({ 18 | this.ideaID, 19 | this.uid, 20 | this.fileUrl, 21 | required this.title, 22 | required this.description, 23 | required this.documents, 24 | this.status, 25 | this.timestamp, 26 | this.interested, 27 | this.chats, 28 | this.keywords, 29 | }); 30 | 31 | Map toMap() { 32 | final _time = DateTime.now().microsecondsSinceEpoch.toString(); 33 | final String? _uid = AuthMethods.uid(); 34 | return { 35 | 'ideaID': '${_uid!}$_time', 36 | 'uid': _uid, 37 | 'title': title, 38 | 'description': description, 39 | 'fileUrl': fileUrl, 40 | 'documents': documents, 41 | 'status': 42 | IdeaStatusConvertor.fromEnum(status ?? IdeaStatusEnum.AVAILABLE), 43 | 'timestamp': timestamp ?? _time, 44 | 'interested': interested ?? [], 45 | 'chats': chats ?? [], 46 | 'keywords': keywords ?? [], 47 | }; 48 | } 49 | 50 | factory Idea.fromDoc(DocumentSnapshot> doc) { 51 | return Idea( 52 | ideaID: doc.data()!['ideaID'] ?? '', 53 | uid: doc.data()!['uid'] ?? '', 54 | title: doc.data()!['title'] ?? '', 55 | fileUrl: doc.data()!['fileUrl'] ?? '', 56 | description: doc.data()!['description'] ?? '', 57 | documents: List.from(doc.data()!['documents']), 58 | status: doc.data()!['status'] != null 59 | ? IdeaStatusConvertor.fromString((doc.data()!['status'])) 60 | : null, 61 | timestamp: doc.data()!['timestamp'] ?? '', 62 | interested: List.from(doc.data()!['interested']), 63 | chats: List.from(doc.data()!['chats']), 64 | keywords: List.from(doc.data()!['keywords']), 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'com.google.gms.google-services' 26 | apply plugin: 'kotlin-android' 27 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 28 | 29 | android { 30 | compileSdkVersion flutter.compileSdkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.fastnuces.estartup" 48 | minSdkVersion 21 49 | targetSdkVersion flutter.targetSdkVersion 50 | versionCode flutterVersionCode.toInteger() 51 | versionName flutterVersionName 52 | } 53 | 54 | buildTypes { 55 | release { 56 | // TODO: Add your own signing config for the release build. 57 | // Signing with the debug keys for now, so `flutter run --release` works. 58 | signingConfig signingConfigs.debug 59 | } 60 | } 61 | } 62 | 63 | flutter { 64 | source '../..' 65 | } 66 | 67 | dependencies { 68 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 69 | implementation platform('com.google.firebase:firebase-bom:29.0.3') 70 | implementation 'com.google.firebase:firebase-analytics' 71 | } 72 | -------------------------------------------------------------------------------- /lib/screens/pages/feed_page/feed_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/database/idea_api.dart'; 2 | import 'package:estartup/models/idea.dart'; 3 | import 'package:estartup/utilities/utilities.dart'; 4 | import 'package:estartup/widgets/idea_feed_tile.dart'; 5 | import 'package:estartup/widgets/show_loading.dart'; 6 | import 'package:flutter/material.dart'; 7 | 8 | class FeedPage extends StatelessWidget { 9 | const FeedPage({Key? key}) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | appBar: AppBar( 15 | title: const Text('Feed'), 16 | centerTitle: true, 17 | ), 18 | body: FutureBuilder>( 19 | future: IdeaAPI().feed(), 20 | builder: (BuildContext context, AsyncSnapshot> snapshot) { 21 | if (snapshot.hasError) { 22 | return const _ErrorWidget(); 23 | } else { 24 | if (snapshot.connectionState == ConnectionState.waiting) { 25 | return const ShowLoading(); 26 | } else { 27 | List _ideass = snapshot.data!; 28 | return Column( 29 | children: [ 30 | const SizedBox(height: 10), 31 | Expanded( 32 | child: ListView.separated( 33 | itemCount: _ideass.length, 34 | separatorBuilder: (BuildContext context, int index) => 35 | Divider( 36 | color: Colors.grey[200], 37 | thickness: 4, 38 | ), 39 | itemBuilder: (BuildContext context, int index) { 40 | return IdeaFeedTile(idea: _ideass[index]); 41 | }, 42 | ), 43 | ), 44 | ], 45 | ); 46 | } 47 | } 48 | }, 49 | ), 50 | ); 51 | } 52 | } 53 | 54 | class _ErrorWidget extends StatelessWidget { 55 | const _ErrorWidget({ 56 | Key? key, 57 | }) : super(key: key); 58 | 59 | @override 60 | Widget build(BuildContext context) { 61 | return Center( 62 | child: Column( 63 | children: const [ 64 | Text( 65 | 'Some thing goes wrong', 66 | style: TextStyle(color: Colors.grey), 67 | ), 68 | ], 69 | ), 70 | ); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /lib/database/user_apisdsa.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:typed_data'; 2 | // import 'package:cloud_firestore/cloud_firestore.dart'; 3 | // import 'package:firebase_storage/firebase_storage.dart'; 4 | // import '../models/entrepreneur.dart'; 5 | // import '../widgets/custom_toast.dart'; 6 | // import 'user_local_data.dart'; 7 | 8 | // class UserAPI { 9 | // static const String _collection = 'users'; 10 | // static final FirebaseFirestore _instance = FirebaseFirestore.instance; 11 | // // functions 12 | // Future getInfo({required String uid}) async { 13 | // final DocumentSnapshot> doc = 14 | // await _instance.collection(_collection).doc(uid).get(); 15 | // return AppUser.fromDocument(doc); 16 | // } 17 | 18 | // Future addUser(AppUser appUser) async { 19 | // await _instance 20 | // .collection(_collection) 21 | // .doc(appUser.uid) 22 | // .set(appUser.toMap()) 23 | // .catchError((Object e) { 24 | // CustomToast.errorToast(message: e.toString()); 25 | // // ignore: invalid_return_type_for_catch_error 26 | // return false; 27 | // }); 28 | // return true; 29 | // } 30 | 31 | // Future uploadImage(Uint8List? imageBytes, String uid) async { 32 | // TaskSnapshot snapshot = await FirebaseStorage.instance 33 | // .ref() 34 | // .child('profile_images/$uid') 35 | // .putData(imageBytes!); 36 | // String url = (await snapshot.ref.getDownloadURL()).toString(); 37 | // return url; 38 | // } 39 | 40 | // Future> getallfirebaseusersbyname(String name) async { 41 | // List users = []; 42 | // QuerySnapshot> snapshot = 43 | // await FirebaseFirestore.instance.collection(_collection).get(); 44 | 45 | // List>> docs = snapshot.docs; 46 | // for (DocumentSnapshot> doc in docs) { 47 | // AppUser appUser = AppUser.fromDocument(doc); 48 | // if (appUser.name.contains(name)) { 49 | // users.add(appUser); 50 | // } 51 | // } 52 | // return users; 53 | // } 54 | 55 | // Future addpostcount(String digilogId) async { 56 | // List posts = UserLocalData.getPost; 57 | // posts.add(digilogId); 58 | // await _instance 59 | // .collection(_collection) 60 | // .doc(UserLocalData.getUID) 61 | // .update({'posts': posts}); 62 | // } 63 | // } -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/screens/idea_detail_screen/idea_detail_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/database/auth_methods.dart'; 2 | import 'package:estartup/models/idea.dart'; 3 | import 'package:estartup/screens/idea_detail_screen/pdf_view.dart'; 4 | import 'package:estartup/utilities/utilities.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class IdeaDetailScreen extends StatelessWidget { 8 | const IdeaDetailScreen({required this.idea, Key? key}) : super(key: key); 9 | final Idea idea; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | appBar: AppBar( 15 | title: const Text('Detail'), 16 | centerTitle: true, 17 | ), 18 | body: Padding( 19 | padding: EdgeInsets.symmetric(horizontal: Utilities.padding), 20 | child: Column( 21 | crossAxisAlignment: CrossAxisAlignment.start, 22 | children: [ 23 | const SizedBox(height: 10), 24 | Text( 25 | idea.title, 26 | maxLines: 3, 27 | overflow: TextOverflow.ellipsis, 28 | style: TextStyle( 29 | fontSize: 20, 30 | color: Theme.of(context).primaryColor, 31 | ), 32 | ), 33 | const Divider(thickness: 1), 34 | Text( 35 | idea.description, 36 | ), 37 | ElevatedButton( 38 | onPressed: () { 39 | Navigator.of(context).push(MaterialPageRoute( 40 | builder: (context) => PdfViewer( 41 | idea: idea, 42 | title: idea.title, 43 | ), 44 | )); 45 | }, 46 | child: Text('View Proposal')) 47 | ], 48 | ), 49 | ), 50 | floatingActionButton: Row( 51 | mainAxisAlignment: MainAxisAlignment.center, 52 | children: [ 53 | (idea.uid == AuthMethods.uid()) 54 | ? const SizedBox() 55 | : (idea.interested!.contains(AuthMethods.uid() ?? '')) 56 | ? FloatingActionButton( 57 | onPressed: () {}, 58 | child: const Icon(Icons.thumb_up_alt), 59 | ) 60 | : FloatingActionButton( 61 | onPressed: () {}, 62 | child: const Icon(Icons.thumb_up_alt_outlined), 63 | ), 64 | ], 65 | ), 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /lib/widgets/password_textformfield.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import '../utilities/custom_validator.dart'; 4 | import '../utilities/utilities.dart'; 5 | 6 | class PasswordTextFormField extends StatefulWidget { 7 | const PasswordTextFormField({ 8 | required TextEditingController controller, 9 | this.title = 'Password', 10 | Key? key, 11 | }) : _controller = controller, 12 | super(key: key); 13 | final TextEditingController _controller; 14 | final String title; 15 | @override 16 | PasswordTextFormFieldState createState() => PasswordTextFormFieldState(); 17 | } 18 | 19 | class PasswordTextFormFieldState extends State { 20 | bool _notVisible = true; 21 | void _onListener() => setState(() {}); 22 | @override 23 | void initState() { 24 | widget._controller.addListener(_onListener); 25 | super.initState(); 26 | } 27 | 28 | @override 29 | void dispose() { 30 | widget._controller.removeListener(_onListener); 31 | super.dispose(); 32 | } 33 | 34 | @override 35 | Widget build(BuildContext context) { 36 | return Container( 37 | margin: const EdgeInsets.symmetric(vertical: 6), 38 | child: TextFormField( 39 | controller: widget._controller, 40 | obscureText: _notVisible, 41 | textInputAction: TextInputAction.done, 42 | cursorColor: Theme.of(context).colorScheme.secondary, 43 | validator: (String? value) => CustomValidator.password(value), 44 | decoration: InputDecoration( 45 | labelText: widget.title, 46 | hintText: widget.title, 47 | suffixIcon: IconButton( 48 | onPressed: () => setState(() { 49 | _notVisible = !_notVisible; 50 | }), 51 | splashRadius: Utilities.padding, 52 | icon: (_notVisible == true) 53 | ? const Icon(CupertinoIcons.eye) 54 | : const Icon(CupertinoIcons.eye_slash), 55 | ), 56 | focusColor: Theme.of(context).primaryColor, 57 | enabledBorder: OutlineInputBorder( 58 | borderSide: const BorderSide(color: Colors.grey), 59 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 60 | ), 61 | border: OutlineInputBorder( 62 | borderSide: BorderSide(color: Theme.of(context).primaryColor), 63 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 64 | ), 65 | ), 66 | ), 67 | ); 68 | } 69 | } -------------------------------------------------------------------------------- /lib/widgets/user_type_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | // ignore_for_file: constant_identifier_names 4 | enum UserTypeEnum { ENTREPRENEUR, INVESTOR } 5 | 6 | class UserTypeWidget extends StatefulWidget { 7 | const UserTypeWidget({ 8 | required this.isENTREPRENEUR, 9 | required this.onChanged, 10 | Key? key, 11 | }) : super(key: key); 12 | final bool isENTREPRENEUR; 13 | final void Function(bool)? onChanged; 14 | @override 15 | State createState() => _UserTypeWidgetState(); 16 | } 17 | 18 | class _UserTypeWidgetState extends State { 19 | late UserTypeEnum _usetEnum = (widget.isENTREPRENEUR) 20 | ? UserTypeEnum.ENTREPRENEUR 21 | : UserTypeEnum.INVESTOR; 22 | @override 23 | Widget build(BuildContext context) { 24 | return Row( 25 | children: [ 26 | InkWell( 27 | onTap: () { 28 | setState(() { 29 | _usetEnum = UserTypeEnum.ENTREPRENEUR; 30 | }); 31 | widget.onChanged!(true); 32 | }, 33 | child: Row( 34 | mainAxisSize: MainAxisSize.min, 35 | children: [ 36 | Radio( 37 | value: UserTypeEnum.ENTREPRENEUR, 38 | activeColor: Theme.of(context).primaryColor, 39 | groupValue: _usetEnum, 40 | onChanged: (UserTypeEnum? value) { 41 | setState(() { 42 | _usetEnum = value!; 43 | }); 44 | widget.onChanged!(true); 45 | }, 46 | ), 47 | const Text('ENTREPRENEUR'), 48 | ], 49 | ), 50 | ), 51 | InkWell( 52 | onTap: () { 53 | setState(() { 54 | _usetEnum = UserTypeEnum.INVESTOR; 55 | }); 56 | widget.onChanged!(false); 57 | }, 58 | child: Row( 59 | mainAxisSize: MainAxisSize.min, 60 | children: [ 61 | Radio( 62 | value: UserTypeEnum.INVESTOR, 63 | groupValue: _usetEnum, 64 | activeColor: Theme.of(context).primaryColor, 65 | onChanged: (UserTypeEnum? value) { 66 | setState(() { 67 | _usetEnum = value!; 68 | }); 69 | widget.onChanged!(false); 70 | }, 71 | ), 72 | const Text('INVESTOR'), 73 | ], 74 | ), 75 | ), 76 | ], 77 | ); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/widgets/custom_textformfield.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import '../utilities/utilities.dart'; 4 | 5 | class CustomTextFormField extends StatefulWidget { 6 | const CustomTextFormField({ 7 | required TextEditingController controller, 8 | this.keyboardType = TextInputType.text, 9 | this.textInputAction, 10 | this.title, 11 | this.validator, 12 | this.initialValue, 13 | this.minLines = 1, 14 | this.maxLines = 1, 15 | this.hint, 16 | this.readOnly = false, 17 | this.autoFocus = false, 18 | this.textAlign = TextAlign.start, 19 | Key? key, 20 | }) : _controller = controller, 21 | super(key: key); 22 | final TextEditingController _controller; 23 | final TextInputType? keyboardType; 24 | final TextInputAction? textInputAction; 25 | final String? Function(String? value)? validator; 26 | final String? initialValue; 27 | final int? minLines; 28 | final int? maxLines; 29 | final String? title; 30 | final String? hint; 31 | final bool readOnly; 32 | final bool autoFocus; 33 | final TextAlign textAlign; 34 | @override 35 | CustomTextFormFieldState createState() => CustomTextFormFieldState(); 36 | } 37 | 38 | class CustomTextFormFieldState extends State { 39 | void _onListen() => setState(() {}); 40 | @override 41 | void initState() { 42 | widget._controller.addListener(_onListen); 43 | super.initState(); 44 | } 45 | 46 | @override 47 | void dispose() { 48 | widget._controller.removeListener(_onListen); 49 | super.dispose(); 50 | } 51 | 52 | @override 53 | Widget build(BuildContext context) { 54 | return Container( 55 | margin: const EdgeInsets.symmetric(vertical: 6), 56 | child: TextFormField( 57 | initialValue: widget.initialValue, 58 | controller: widget._controller, 59 | readOnly: widget.readOnly, 60 | keyboardType: widget.keyboardType ?? TextInputType.text, 61 | textInputAction: widget.textInputAction ?? TextInputAction.next, 62 | autofocus: widget.autoFocus, 63 | textAlign: widget.textAlign, 64 | minLines: widget.minLines, 65 | maxLines: widget.maxLines, 66 | validator: (String? value) => widget.validator!(value), 67 | cursorColor: Theme.of(context).colorScheme.secondary, 68 | decoration: InputDecoration( 69 | labelText: widget.title, 70 | hintText: widget.hint, 71 | suffixIcon: (widget._controller.text.isEmpty) 72 | ? const SizedBox() 73 | : IconButton( 74 | splashRadius: Utilities.padding, 75 | onPressed: () => setState(() { 76 | widget._controller.clear(); 77 | }), 78 | icon: const Icon(CupertinoIcons.clear, size: 18), 79 | ), 80 | focusColor: Theme.of(context).primaryColor, 81 | enabledBorder: OutlineInputBorder( 82 | borderSide: const BorderSide(color: Colors.grey), 83 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 84 | ), 85 | border: OutlineInputBorder( 86 | borderSide: BorderSide(color: Theme.of(context).primaryColor), 87 | borderRadius: BorderRadius.circular(Utilities.borderRadius), 88 | ), 89 | ), 90 | ), 91 | ); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /lib/screens/auth/login_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/screens/main_screen/main_screen.dart'; 2 | import 'package:estartup/widgets/custom_elevated_button.dart'; 3 | import 'package:estartup/widgets/show_loading.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:firebase_auth/firebase_auth.dart'; 6 | import '../../database/auth_methods.dart'; 7 | import '../../utilities/custom_image.dart'; 8 | import '../../utilities/custom_validator.dart'; 9 | import '../../utilities/utilities.dart'; 10 | import '../../widgets/custom_textformfield.dart'; 11 | import '../../widgets/custom_toast.dart'; 12 | import '../../widgets/password_textformfield.dart'; 13 | import 'register_screen.dart'; 14 | 15 | class LoginScreen extends StatefulWidget { 16 | const LoginScreen({Key? key}) : super(key: key); 17 | static const String routeName = '/LoginScreen'; 18 | @override 19 | _LoginScreenState createState() => _LoginScreenState(); 20 | } 21 | 22 | class _LoginScreenState extends State { 23 | final TextEditingController _email = TextEditingController(); 24 | final TextEditingController _password = TextEditingController(); 25 | final GlobalKey _key = GlobalKey(); 26 | @override 27 | Widget build(BuildContext context) { 28 | return Scaffold( 29 | resizeToAvoidBottomInset: false, 30 | appBar: AppBar(backgroundColor: Colors.transparent, elevation: 0), 31 | body: Padding( 32 | padding: EdgeInsets.all(Utilities.padding), 33 | child: Form( 34 | key: _key, 35 | child: Column( 36 | children: [ 37 | SizedBox( 38 | height: 100, 39 | width: 100, 40 | child: Image.asset('assets/logo.png'), 41 | ), 42 | const SizedBox(height: 20), 43 | CustomTextFormField( 44 | title: 'Email', 45 | controller: _email, 46 | hint: 'test@test.com', 47 | validator: (String? value) => CustomValidator.email(value), 48 | ), 49 | PasswordTextFormField( 50 | controller: _password, 51 | ), 52 | CustomElevatedButton( 53 | title: 'Login', 54 | onTap: () => _submitForm(), 55 | ), 56 | const Spacer(), 57 | Row( 58 | mainAxisAlignment: MainAxisAlignment.center, 59 | children: [ 60 | const Text( 61 | '''Don't have an account?''', 62 | style: TextStyle(color: Colors.grey), 63 | ), 64 | TextButton( 65 | onPressed: () { 66 | Navigator.of(context).pushNamed(RegisterScreen.routeName); 67 | }, 68 | child: Text('Sign Up'.toUpperCase()), 69 | ), 70 | ], 71 | ), 72 | ], 73 | ), 74 | ), 75 | ), 76 | ); 77 | } 78 | 79 | Future _submitForm() async { 80 | if (_key.currentState!.validate()) { 81 | showLoadingDislog(context); 82 | final User? _user = await AuthMethods().loginWithEmailAndPassword( 83 | _email.text, 84 | _password.text, 85 | ); 86 | if (_user != null) { 87 | Navigator.of(context).pushNamedAndRemoveUntil( 88 | MainScreen.rotueName, (Route route) => false); 89 | } else { 90 | Navigator.of(context).pop(); 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | estartup 33 | 34 | 35 | 36 | 39 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /lib/screens/idea_detail_screen/pdf_view.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:estartup/models/idea.dart'; 3 | import 'package:http/http.dart' as http; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_pdfview/flutter_pdfview.dart'; 6 | import 'package:path_provider/path_provider.dart'; 7 | import 'package:permission_handler/permission_handler.dart'; 8 | 9 | class PdfViewer extends StatefulWidget { 10 | PdfViewer({Key? key, this.title, this.idea}) : super(key: key); 11 | final Idea? idea; 12 | final String? title; 13 | 14 | @override 15 | _MyHomePageState createState() => _MyHomePageState(); 16 | } 17 | 18 | class _MyHomePageState extends State { 19 | String urlPDFPath = ""; 20 | bool exists = true; 21 | int _totalPages = 0; 22 | int _currentPage = 0; 23 | bool pdfReady = false; 24 | PDFViewController? _pdfViewController; 25 | bool loaded = false; 26 | 27 | Future getFileFromUrl(String? url, {name}) async { 28 | var fileName = 'testonline'; 29 | if (name != null) { 30 | fileName = name; 31 | } 32 | try { 33 | var data = await http.get(Uri.parse(url!)); 34 | var bytes = data.bodyBytes; 35 | var dir = await getApplicationDocumentsDirectory(); 36 | File file = File("${dir.path}/" + fileName + ".pdf"); 37 | print(dir.path); 38 | File urlFile = await file.writeAsBytes(bytes); 39 | return urlFile; 40 | } catch (e) { 41 | throw Exception("Error opening url file"); 42 | } 43 | } 44 | 45 | void requestPersmission() async { 46 | Permission.storage; 47 | } 48 | 49 | @override 50 | void initState() { 51 | requestPersmission(); 52 | getFileFromUrl(widget.idea!.fileUrl).then( 53 | (value) => { 54 | setState(() { 55 | if (value != null) { 56 | urlPDFPath = value.path; 57 | loaded = true; 58 | exists = true; 59 | } else { 60 | exists = false; 61 | } 62 | }) 63 | }, 64 | ); 65 | super.initState(); 66 | } 67 | 68 | @override 69 | Widget build(BuildContext context) { 70 | print(urlPDFPath); 71 | if (loaded) { 72 | return Scaffold( 73 | body: PDFView( 74 | filePath: urlPDFPath, 75 | autoSpacing: true, 76 | enableSwipe: true, 77 | pageSnap: true, 78 | swipeHorizontal: true, 79 | nightMode: false, 80 | onError: (e) { 81 | //Show some error message or UI 82 | }, 83 | onRender: (_pages) { 84 | setState(() { 85 | _totalPages = _pages!; 86 | pdfReady = true; 87 | }); 88 | }, 89 | onViewCreated: (PDFViewController vc) { 90 | setState(() { 91 | _pdfViewController = vc; 92 | }); 93 | }, 94 | onPageChanged: (int? page, int? total) { 95 | setState(() { 96 | _currentPage = page!; 97 | }); 98 | }, 99 | onPageError: (page, e) {}, 100 | ), 101 | floatingActionButton: Row( 102 | mainAxisAlignment: MainAxisAlignment.end, 103 | children: [ 104 | IconButton( 105 | icon: Icon(Icons.chevron_left), 106 | iconSize: 50, 107 | color: Colors.black, 108 | onPressed: () { 109 | setState(() { 110 | if (_currentPage > 0) { 111 | _currentPage--; 112 | _pdfViewController!.setPage(_currentPage); 113 | } 114 | }); 115 | }, 116 | ), 117 | Text( 118 | "${_currentPage + 1}/$_totalPages", 119 | style: TextStyle(color: Colors.black, fontSize: 20), 120 | ), 121 | IconButton( 122 | icon: Icon(Icons.chevron_right), 123 | iconSize: 50, 124 | color: Colors.black, 125 | onPressed: () { 126 | setState(() { 127 | if (_currentPage < _totalPages - 1) { 128 | _currentPage++; 129 | _pdfViewController!.setPage(_currentPage); 130 | } 131 | }); 132 | }, 133 | ), 134 | ], 135 | ), 136 | ); 137 | } else { 138 | if (exists) { 139 | //Replace with your loading UI 140 | return Scaffold( 141 | appBar: AppBar( 142 | title: Text(widget.title!), 143 | ), 144 | body: Text( 145 | "Loading..", 146 | style: TextStyle(fontSize: 20), 147 | ), 148 | ); 149 | } else { 150 | //Replace Error UI 151 | return Scaffold( 152 | appBar: AppBar( 153 | title: Text(widget.title!), 154 | ), 155 | body: Text( 156 | "PDF Not Available", 157 | style: TextStyle(fontSize: 20), 158 | ), 159 | ); 160 | } 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /lib/screens/pages/profile_page/profile_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/database/auth_methods.dart'; 2 | import 'package:estartup/database/idea_api.dart'; 3 | import 'package:estartup/database/user_api.dart'; 4 | import 'package:estartup/models/app_user.dart'; 5 | import 'package:estartup/models/idea.dart'; 6 | import 'package:estartup/screens/auth/login_screen.dart'; 7 | import 'package:estartup/widgets/circular_profile_image.dart'; 8 | import 'package:estartup/widgets/idea_feed_tile.dart'; 9 | import 'package:estartup/widgets/show_loading.dart'; 10 | import 'package:flutter/material.dart'; 11 | 12 | class ProfilePage extends StatelessWidget { 13 | const ProfilePage({Key? key}) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return Scaffold( 18 | appBar: AppBar( 19 | title: const Text('Profile'), 20 | actions: [ 21 | IconButton( 22 | onPressed: () async { 23 | await AuthMethods().signOut(); 24 | Navigator.of(context).pushNamedAndRemoveUntil( 25 | LoginScreen.routeName, 26 | (route) => false, 27 | ); 28 | }, 29 | icon: const Icon(Icons.logout)) 30 | ], 31 | ), 32 | body: FutureBuilder( 33 | future: UserAPI().getInfo(uid: AuthMethods.uid() ?? ''), 34 | builder: (BuildContext context, AsyncSnapshot snapshot) { 35 | if (snapshot.hasError) { 36 | return const _ErrorWidget(); 37 | } else { 38 | if (snapshot.connectionState == ConnectionState.waiting) { 39 | return const ShowLoading(); 40 | } else { 41 | AppUser? _user = snapshot.data; 42 | return (_user == null) 43 | ? const _ErrorWidget() 44 | : Column( 45 | children: [ 46 | const SizedBox(height: 10), 47 | Center( 48 | child: CircularProfileImage( 49 | imageURL: _user.imageURL ?? '', 50 | radius: 48, 51 | ), 52 | ), 53 | const SizedBox(height: 8), 54 | Text( 55 | _user.name, 56 | maxLines: 1, 57 | overflow: TextOverflow.ellipsis, 58 | style: const TextStyle( 59 | fontWeight: FontWeight.bold, 60 | fontSize: 18, 61 | ), 62 | ), 63 | const Divider(thickness: 1), 64 | Expanded( 65 | child: FutureBuilder>( 66 | future: IdeaAPI().feed(), 67 | builder: (BuildContext context, 68 | AsyncSnapshot> snapshot) { 69 | if (snapshot.hasError) { 70 | return const _ErrorWidget(); 71 | } else { 72 | if (snapshot.connectionState == 73 | ConnectionState.waiting) { 74 | return const ShowLoading(); 75 | } else { 76 | List _ideass = snapshot.data!; 77 | return Column( 78 | children: [ 79 | const SizedBox(height: 10), 80 | Expanded( 81 | child: ListView.separated( 82 | shrinkWrap: true, 83 | itemCount: _ideass.length, 84 | separatorBuilder: 85 | (BuildContext context, 86 | int index) => 87 | Divider( 88 | color: Colors.grey[200], 89 | thickness: 4, 90 | ), 91 | itemBuilder: (BuildContext context, 92 | int index) { 93 | return IdeaFeedTile( 94 | idea: _ideass[index], 95 | ); 96 | }, 97 | ), 98 | ), 99 | ], 100 | ); 101 | } 102 | } 103 | }, 104 | ), 105 | ) 106 | ], 107 | ); 108 | } 109 | } 110 | }, 111 | ), 112 | ); 113 | } 114 | } 115 | 116 | class _ErrorWidget extends StatelessWidget { 117 | const _ErrorWidget({ 118 | Key? key, 119 | }) : super(key: key); 120 | 121 | @override 122 | Widget build(BuildContext context) { 123 | return Center( 124 | child: Column( 125 | children: const [ 126 | Text( 127 | 'Some thing goes wrong', 128 | style: TextStyle(color: Colors.grey), 129 | ), 130 | ], 131 | ), 132 | ); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /lib/screens/auth/register_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:estartup/database/user_api.dart'; 2 | import 'package:estartup/widgets/custom_elevated_button.dart'; 3 | import 'package:estartup/widgets/user_type_widget.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:firebase_auth/firebase_auth.dart'; 6 | import '../../database/auth_methods.dart'; 7 | import '../../database/user_apisdsa.dart'; 8 | import '../../models/app_user.dart'; 9 | import '../../utilities/custom_validator.dart'; 10 | import '../../utilities/utilities.dart'; 11 | import '../../widgets/custom_textformfield.dart'; 12 | import '../../widgets/custom_toast.dart'; 13 | import '../../widgets/password_textformfield.dart'; 14 | import '../../widgets/show_loading.dart'; 15 | import 'login_screen.dart'; 16 | 17 | class RegisterScreen extends StatefulWidget { 18 | const RegisterScreen({Key? key}) : super(key: key); 19 | static const String routeName = '/RegisterScreen'; 20 | @override 21 | _RegisterScreenState createState() => _RegisterScreenState(); 22 | } 23 | 24 | class _RegisterScreenState extends State { 25 | final TextEditingController _name = TextEditingController(); 26 | final TextEditingController _email = TextEditingController(); 27 | final TextEditingController _password = TextEditingController(); 28 | final TextEditingController _confPassword = TextEditingController(); 29 | // ignore: prefer_final_fields 30 | bool _isEntrepreneur = true; 31 | final GlobalKey _key = GlobalKey(); 32 | @override 33 | Widget build(BuildContext context) { 34 | return Scaffold( 35 | appBar: AppBar( 36 | backgroundColor: Colors.transparent, 37 | elevation: 0, 38 | ), 39 | body: Padding( 40 | padding: EdgeInsets.all(Utilities.padding), 41 | child: Form( 42 | key: _key, 43 | child: Column( 44 | children: [ 45 | Expanded( 46 | child: ListView( 47 | shrinkWrap: true, 48 | children: [ 49 | SizedBox( 50 | height: 100, 51 | width: 100, 52 | child: Image.asset('assets/logo.png'), 53 | ), 54 | const SizedBox(height: 20), 55 | CustomTextFormField( 56 | title: 'Full Name', 57 | controller: _name, 58 | validator: (String? value) => 59 | CustomValidator.lessThen3(value), 60 | ), 61 | CustomTextFormField( 62 | title: 'email', 63 | hint: 'test@test.com', 64 | controller: _email, 65 | validator: (String? value) => 66 | CustomValidator.email(value), 67 | ), 68 | PasswordTextFormField(controller: _password), 69 | PasswordTextFormField( 70 | controller: _confPassword, 71 | title: 'Confirm Password', 72 | ), 73 | const SizedBox(height: 10), 74 | UserTypeWidget( 75 | isENTREPRENEUR: true, 76 | onChanged: (p0) {}, 77 | ), 78 | CustomElevatedButton( 79 | title: 'Register', 80 | onTap: () => _submitForm(), 81 | ), 82 | const SizedBox(height: 20), 83 | ], 84 | ), 85 | ), 86 | Row( 87 | mainAxisAlignment: MainAxisAlignment.center, 88 | children: [ 89 | const Text( 90 | '''Already have an account?''', 91 | style: TextStyle(color: Colors.grey), 92 | ), 93 | TextButton( 94 | onPressed: () { 95 | Navigator.of(context).pushNamedAndRemoveUntil( 96 | LoginScreen.routeName, 97 | (Route route) => false); 98 | }, 99 | child: const Text('Login'), 100 | ), 101 | ], 102 | ), 103 | ], 104 | ), 105 | ), 106 | ), 107 | ); 108 | } 109 | 110 | void _submitForm() async { 111 | if (_key.currentState!.validate()) { 112 | if (_password.text != _confPassword.text) { 113 | CustomToast.errorToast( 114 | message: 'Password and Confirm password is not same', 115 | ); 116 | return; 117 | } 118 | showLoadingDislog(context); 119 | final User? _myUser = await AuthMethods().signupWithEmailAndPassword( 120 | email: _email.text, 121 | password: _password.text, 122 | ); 123 | if (_myUser != null) { 124 | final AppUser _appUser = AppUser( 125 | uid: _myUser.uid, 126 | email: _email.text.trim(), 127 | name: _name.text.trim(), 128 | ideas: [], 129 | imageURL: '', 130 | rating: 0, 131 | status: true, 132 | isEntrepreneur: _isEntrepreneur, 133 | ); 134 | final bool _okay = await UserAPI().addUser(_appUser); 135 | if (_okay) { 136 | CustomToast.successToast(message: 'Register Successfully'); 137 | Navigator.of(context).pushNamedAndRemoveUntil( 138 | LoginScreen.routeName, 139 | (Route route) => false, 140 | ); 141 | } else { 142 | Navigator.of(context).pop(); 143 | } 144 | } 145 | } 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /lib/screens/pages/add_page/add_page.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:estartup/database/auth_methods.dart'; 4 | import 'package:estartup/database/idea_api.dart'; 5 | import 'package:estartup/models/idea.dart'; 6 | import 'package:estartup/utilities/custom_validator.dart'; 7 | import 'package:estartup/utilities/utilities.dart'; 8 | import 'package:estartup/widgets/custom_elevated_button.dart'; 9 | import 'package:estartup/widgets/custom_textformfield.dart'; 10 | import 'package:estartup/widgets/custom_toast.dart'; 11 | import 'package:estartup/widgets/show_loading.dart'; 12 | import 'package:firebase_storage/firebase_storage.dart'; 13 | import 'package:flutter/material.dart'; 14 | import 'package:file_picker/file_picker.dart'; 15 | 16 | class AddPage extends StatefulWidget { 17 | const AddPage({Key? key}) : super(key: key); 18 | @override 19 | State createState() => _AddPageState(); 20 | } 21 | 22 | class _AddPageState extends State { 23 | final TextEditingController _title = TextEditingController(); 24 | final TextEditingController _description = TextEditingController(); 25 | final List _files = []; 26 | final GlobalKey _key = GlobalKey(); 27 | UploadTask? task; 28 | File? file; 29 | 30 | String? fileUrl; 31 | @override 32 | Widget build(BuildContext context) { 33 | return Scaffold( 34 | appBar: AppBar( 35 | title: Text( 36 | 'Add Idea', 37 | style: TextStyle(color: Theme.of(context).primaryColor), 38 | ), 39 | centerTitle: true, 40 | backgroundColor: Colors.transparent, 41 | elevation: 0, 42 | ), 43 | body: Padding( 44 | padding: EdgeInsets.symmetric(horizontal: Utilities.padding), 45 | child: SingleChildScrollView( 46 | child: Form( 47 | key: _key, 48 | child: Column( 49 | children: [ 50 | CustomTextFormField( 51 | controller: _title, 52 | hint: 'Title of your idea', 53 | validator: (value) => CustomValidator.isEmpty(value), 54 | ), 55 | CustomTextFormField( 56 | controller: _description, 57 | hint: 'Describe your business idea', 58 | maxLines: 6, 59 | textInputAction: TextInputAction.newline, 60 | keyboardType: TextInputType.multiline, 61 | validator: (value) => CustomValidator.isEmpty(value), 62 | ), 63 | const SizedBox(height: 6), 64 | Row( 65 | children: [ 66 | const Spacer(), 67 | InkWell( 68 | onTap: () => _fetchFile(), 69 | child: Row( 70 | mainAxisSize: MainAxisSize.min, 71 | mainAxisAlignment: MainAxisAlignment.end, 72 | children: [ 73 | Text('${_files.length} Files attached'), 74 | const SizedBox(width: 6), 75 | const Icon(Icons.attachment_rounded), 76 | ], 77 | ), 78 | ), 79 | ], 80 | ), 81 | CustomElevatedButton( 82 | title: 'Post', 83 | onTap: () async { 84 | if (_key.currentState!.validate()) { 85 | showLoadingDislog(context); 86 | await uploadFile(); 87 | Idea _idea = Idea( 88 | title: _title.text.trim(), 89 | description: _description.text.trim(), 90 | documents: [], 91 | fileUrl: fileUrl); 92 | final bool _done = await IdeaAPI().addIdea(_idea); 93 | Navigator.of(context).pop(); 94 | if (_done) { 95 | _title.text = ''; 96 | _description.text = ''; 97 | _files.clear(); 98 | CustomToast.successToast(message: 'Idea Posted'); 99 | } else { 100 | CustomToast.errorToast(message: 'Some Error Found!!'); 101 | } 102 | } 103 | }, 104 | ) 105 | ], 106 | ), 107 | ), 108 | ), 109 | ), 110 | ); 111 | } 112 | 113 | static UploadTask? uploadFileFirebase(String destination, File file) { 114 | try { 115 | final ref = FirebaseStorage.instance.ref(destination); 116 | 117 | return ref.putFile(file); 118 | } on FirebaseException catch (e) { 119 | return null; 120 | } 121 | } 122 | 123 | _fetchFile() async { 124 | // final FilePickerResult? _result = await FilePicker.platform.pickFiles( 125 | // allowMultiple: false, 126 | // type: FileType.custom, 127 | // allowedExtensions: ['pdf', 'doc', 'docx'], 128 | // ); 129 | // if (_result == null) return; 130 | // _files.clear(); 131 | // for (PlatformFile element in _result.files) { 132 | // _files.add(element); 133 | // } 134 | 135 | final result = await FilePicker.platform.pickFiles( 136 | allowMultiple: false, 137 | type: FileType.custom, 138 | allowedExtensions: ['pdf', 'doc', 'docx'], 139 | ); 140 | 141 | if (result == null) return; 142 | final path = result.files.single.path!; 143 | 144 | setState(() { 145 | file = File(path); 146 | }); 147 | } 148 | 149 | Future uploadFile() async { 150 | if (file == null) return; 151 | final fileName = _title.text; 152 | final destination = 'ideaFiles/$fileName'; 153 | 154 | task = uploadFileFirebase(destination, file!); 155 | 156 | setState(() {}); 157 | 158 | if (task == null) return; 159 | 160 | final snapshot = await task!.whenComplete(() {}); 161 | final urlDownload = await snapshot.ref.getDownloadURL(); 162 | // fullPath = destination; 163 | setState(() { 164 | fileUrl = urlDownload; 165 | }); 166 | CustomToast.successToast(message: "File Uploaded SuccessFully"); 167 | print('Download-Link: $urlDownload'); 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.8.2" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.2.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.3.1" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | cloud_firestore: 40 | dependency: "direct main" 41 | description: 42 | name: cloud_firestore 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "3.1.6" 46 | cloud_firestore_platform_interface: 47 | dependency: transitive 48 | description: 49 | name: cloud_firestore_platform_interface 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "5.4.11" 53 | cloud_firestore_web: 54 | dependency: transitive 55 | description: 56 | name: cloud_firestore_web 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.6.6" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.15.0" 67 | crypto: 68 | dependency: transitive 69 | description: 70 | name: crypto 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "3.0.1" 74 | cupertino_icons: 75 | dependency: "direct main" 76 | description: 77 | name: cupertino_icons 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.0.4" 81 | extended_image: 82 | dependency: "direct main" 83 | description: 84 | name: extended_image 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "6.0.1" 88 | extended_image_library: 89 | dependency: transitive 90 | description: 91 | name: extended_image_library 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "3.1.2" 95 | fake_async: 96 | dependency: transitive 97 | description: 98 | name: fake_async 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "1.2.0" 102 | ffi: 103 | dependency: transitive 104 | description: 105 | name: ffi 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "1.1.2" 109 | file: 110 | dependency: transitive 111 | description: 112 | name: file 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "6.1.2" 116 | file_picker: 117 | dependency: "direct main" 118 | description: 119 | name: file_picker 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "4.3.2" 123 | firebase_auth: 124 | dependency: "direct main" 125 | description: 126 | name: firebase_auth 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "3.3.5" 130 | firebase_auth_platform_interface: 131 | dependency: transitive 132 | description: 133 | name: firebase_auth_platform_interface 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "6.1.10" 137 | firebase_auth_web: 138 | dependency: transitive 139 | description: 140 | name: firebase_auth_web 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "3.3.6" 144 | firebase_core: 145 | dependency: "direct main" 146 | description: 147 | name: firebase_core 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "1.11.0" 151 | firebase_core_platform_interface: 152 | dependency: transitive 153 | description: 154 | name: firebase_core_platform_interface 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "4.2.3" 158 | firebase_core_web: 159 | dependency: transitive 160 | description: 161 | name: firebase_core_web 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "1.5.3" 165 | firebase_storage: 166 | dependency: "direct main" 167 | description: 168 | name: firebase_storage 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "10.2.5" 172 | firebase_storage_platform_interface: 173 | dependency: transitive 174 | description: 175 | name: firebase_storage_platform_interface 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "4.0.12" 179 | firebase_storage_web: 180 | dependency: transitive 181 | description: 182 | name: firebase_storage_web 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "3.2.6" 186 | flutter: 187 | dependency: "direct main" 188 | description: flutter 189 | source: sdk 190 | version: "0.0.0" 191 | flutter_lints: 192 | dependency: "direct dev" 193 | description: 194 | name: flutter_lints 195 | url: "https://pub.dartlang.org" 196 | source: hosted 197 | version: "1.0.4" 198 | flutter_pdfview: 199 | dependency: "direct main" 200 | description: 201 | name: flutter_pdfview 202 | url: "https://pub.dartlang.org" 203 | source: hosted 204 | version: "1.2.1" 205 | flutter_plugin_android_lifecycle: 206 | dependency: transitive 207 | description: 208 | name: flutter_plugin_android_lifecycle 209 | url: "https://pub.dartlang.org" 210 | source: hosted 211 | version: "2.0.5" 212 | flutter_test: 213 | dependency: "direct dev" 214 | description: flutter 215 | source: sdk 216 | version: "0.0.0" 217 | flutter_web_plugins: 218 | dependency: transitive 219 | description: flutter 220 | source: sdk 221 | version: "0.0.0" 222 | fluttertoast: 223 | dependency: "direct main" 224 | description: 225 | name: fluttertoast 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "8.0.8" 229 | http: 230 | dependency: "direct main" 231 | description: 232 | name: http 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.13.4" 236 | http_client_helper: 237 | dependency: transitive 238 | description: 239 | name: http_client_helper 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "2.0.2" 243 | http_parser: 244 | dependency: transitive 245 | description: 246 | name: http_parser 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "4.0.0" 250 | intl: 251 | dependency: transitive 252 | description: 253 | name: intl 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "0.17.0" 257 | intl_phone_field: 258 | dependency: "direct main" 259 | description: 260 | name: intl_phone_field 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "3.0.0" 264 | js: 265 | dependency: transitive 266 | description: 267 | name: js 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "0.6.3" 271 | lints: 272 | dependency: transitive 273 | description: 274 | name: lints 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "1.0.1" 278 | matcher: 279 | dependency: transitive 280 | description: 281 | name: matcher 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "0.12.11" 285 | meta: 286 | dependency: transitive 287 | description: 288 | name: meta 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "1.7.0" 292 | nested: 293 | dependency: transitive 294 | description: 295 | name: nested 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "1.0.0" 299 | path: 300 | dependency: transitive 301 | description: 302 | name: path 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "1.8.0" 306 | path_provider: 307 | dependency: "direct main" 308 | description: 309 | name: path_provider 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "2.0.8" 313 | path_provider_android: 314 | dependency: transitive 315 | description: 316 | name: path_provider_android 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "2.0.11" 320 | path_provider_ios: 321 | dependency: transitive 322 | description: 323 | name: path_provider_ios 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "2.0.7" 327 | path_provider_linux: 328 | dependency: transitive 329 | description: 330 | name: path_provider_linux 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "2.1.5" 334 | path_provider_macos: 335 | dependency: transitive 336 | description: 337 | name: path_provider_macos 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "2.0.5" 341 | path_provider_platform_interface: 342 | dependency: transitive 343 | description: 344 | name: path_provider_platform_interface 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "2.0.3" 348 | path_provider_windows: 349 | dependency: transitive 350 | description: 351 | name: path_provider_windows 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "2.0.5" 355 | permission_handler: 356 | dependency: "direct main" 357 | description: 358 | name: permission_handler 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "8.3.0" 362 | permission_handler_platform_interface: 363 | dependency: transitive 364 | description: 365 | name: permission_handler_platform_interface 366 | url: "https://pub.dartlang.org" 367 | source: hosted 368 | version: "3.7.0" 369 | platform: 370 | dependency: transitive 371 | description: 372 | name: platform 373 | url: "https://pub.dartlang.org" 374 | source: hosted 375 | version: "3.1.0" 376 | plugin_platform_interface: 377 | dependency: transitive 378 | description: 379 | name: plugin_platform_interface 380 | url: "https://pub.dartlang.org" 381 | source: hosted 382 | version: "2.1.2" 383 | process: 384 | dependency: transitive 385 | description: 386 | name: process 387 | url: "https://pub.dartlang.org" 388 | source: hosted 389 | version: "4.2.4" 390 | provider: 391 | dependency: "direct main" 392 | description: 393 | name: provider 394 | url: "https://pub.dartlang.org" 395 | source: hosted 396 | version: "6.0.2" 397 | shared_preferences: 398 | dependency: "direct main" 399 | description: 400 | name: shared_preferences 401 | url: "https://pub.dartlang.org" 402 | source: hosted 403 | version: "2.0.12" 404 | shared_preferences_android: 405 | dependency: transitive 406 | description: 407 | name: shared_preferences_android 408 | url: "https://pub.dartlang.org" 409 | source: hosted 410 | version: "2.0.10" 411 | shared_preferences_ios: 412 | dependency: transitive 413 | description: 414 | name: shared_preferences_ios 415 | url: "https://pub.dartlang.org" 416 | source: hosted 417 | version: "2.0.9" 418 | shared_preferences_linux: 419 | dependency: transitive 420 | description: 421 | name: shared_preferences_linux 422 | url: "https://pub.dartlang.org" 423 | source: hosted 424 | version: "2.0.4" 425 | shared_preferences_macos: 426 | dependency: transitive 427 | description: 428 | name: shared_preferences_macos 429 | url: "https://pub.dartlang.org" 430 | source: hosted 431 | version: "2.0.2" 432 | shared_preferences_platform_interface: 433 | dependency: transitive 434 | description: 435 | name: shared_preferences_platform_interface 436 | url: "https://pub.dartlang.org" 437 | source: hosted 438 | version: "2.0.0" 439 | shared_preferences_web: 440 | dependency: transitive 441 | description: 442 | name: shared_preferences_web 443 | url: "https://pub.dartlang.org" 444 | source: hosted 445 | version: "2.0.3" 446 | shared_preferences_windows: 447 | dependency: transitive 448 | description: 449 | name: shared_preferences_windows 450 | url: "https://pub.dartlang.org" 451 | source: hosted 452 | version: "2.0.4" 453 | sky_engine: 454 | dependency: transitive 455 | description: flutter 456 | source: sdk 457 | version: "0.0.99" 458 | source_span: 459 | dependency: transitive 460 | description: 461 | name: source_span 462 | url: "https://pub.dartlang.org" 463 | source: hosted 464 | version: "1.8.1" 465 | stack_trace: 466 | dependency: transitive 467 | description: 468 | name: stack_trace 469 | url: "https://pub.dartlang.org" 470 | source: hosted 471 | version: "1.10.0" 472 | stream_channel: 473 | dependency: transitive 474 | description: 475 | name: stream_channel 476 | url: "https://pub.dartlang.org" 477 | source: hosted 478 | version: "2.1.0" 479 | string_scanner: 480 | dependency: transitive 481 | description: 482 | name: string_scanner 483 | url: "https://pub.dartlang.org" 484 | source: hosted 485 | version: "1.1.0" 486 | term_glyph: 487 | dependency: transitive 488 | description: 489 | name: term_glyph 490 | url: "https://pub.dartlang.org" 491 | source: hosted 492 | version: "1.2.0" 493 | test_api: 494 | dependency: transitive 495 | description: 496 | name: test_api 497 | url: "https://pub.dartlang.org" 498 | source: hosted 499 | version: "0.4.3" 500 | typed_data: 501 | dependency: transitive 502 | description: 503 | name: typed_data 504 | url: "https://pub.dartlang.org" 505 | source: hosted 506 | version: "1.3.0" 507 | vector_math: 508 | dependency: transitive 509 | description: 510 | name: vector_math 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "2.1.1" 514 | win32: 515 | dependency: transitive 516 | description: 517 | name: win32 518 | url: "https://pub.dartlang.org" 519 | source: hosted 520 | version: "2.3.6" 521 | xdg_directories: 522 | dependency: transitive 523 | description: 524 | name: xdg_directories 525 | url: "https://pub.dartlang.org" 526 | source: hosted 527 | version: "0.2.0" 528 | sdks: 529 | dart: ">=2.15.0 <3.0.0" 530 | flutter: ">=2.8.0" 531 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - abseil/algorithm (0.20200225.0): 3 | - abseil/algorithm/algorithm (= 0.20200225.0) 4 | - abseil/algorithm/container (= 0.20200225.0) 5 | - abseil/algorithm/algorithm (0.20200225.0): 6 | - abseil/base/config 7 | - abseil/algorithm/container (0.20200225.0): 8 | - abseil/algorithm/algorithm 9 | - abseil/base/core_headers 10 | - abseil/meta/type_traits 11 | - abseil/base (0.20200225.0): 12 | - abseil/base/atomic_hook (= 0.20200225.0) 13 | - abseil/base/base (= 0.20200225.0) 14 | - abseil/base/base_internal (= 0.20200225.0) 15 | - abseil/base/bits (= 0.20200225.0) 16 | - abseil/base/config (= 0.20200225.0) 17 | - abseil/base/core_headers (= 0.20200225.0) 18 | - abseil/base/dynamic_annotations (= 0.20200225.0) 19 | - abseil/base/endian (= 0.20200225.0) 20 | - abseil/base/errno_saver (= 0.20200225.0) 21 | - abseil/base/exponential_biased (= 0.20200225.0) 22 | - abseil/base/log_severity (= 0.20200225.0) 23 | - abseil/base/malloc_internal (= 0.20200225.0) 24 | - abseil/base/periodic_sampler (= 0.20200225.0) 25 | - abseil/base/pretty_function (= 0.20200225.0) 26 | - abseil/base/raw_logging_internal (= 0.20200225.0) 27 | - abseil/base/spinlock_wait (= 0.20200225.0) 28 | - abseil/base/throw_delegate (= 0.20200225.0) 29 | - abseil/base/atomic_hook (0.20200225.0): 30 | - abseil/base/config 31 | - abseil/base/core_headers 32 | - abseil/base/base (0.20200225.0): 33 | - abseil/base/atomic_hook 34 | - abseil/base/base_internal 35 | - abseil/base/config 36 | - abseil/base/core_headers 37 | - abseil/base/dynamic_annotations 38 | - abseil/base/log_severity 39 | - abseil/base/raw_logging_internal 40 | - abseil/base/spinlock_wait 41 | - abseil/meta/type_traits 42 | - abseil/base/base_internal (0.20200225.0): 43 | - abseil/base/config 44 | - abseil/meta/type_traits 45 | - abseil/base/bits (0.20200225.0): 46 | - abseil/base/config 47 | - abseil/base/core_headers 48 | - abseil/base/config (0.20200225.0) 49 | - abseil/base/core_headers (0.20200225.0): 50 | - abseil/base/config 51 | - abseil/base/dynamic_annotations (0.20200225.0) 52 | - abseil/base/endian (0.20200225.0): 53 | - abseil/base/config 54 | - abseil/base/core_headers 55 | - abseil/base/errno_saver (0.20200225.0): 56 | - abseil/base/config 57 | - abseil/base/exponential_biased (0.20200225.0): 58 | - abseil/base/config 59 | - abseil/base/core_headers 60 | - abseil/base/log_severity (0.20200225.0): 61 | - abseil/base/config 62 | - abseil/base/core_headers 63 | - abseil/base/malloc_internal (0.20200225.0): 64 | - abseil/base/base 65 | - abseil/base/base_internal 66 | - abseil/base/config 67 | - abseil/base/core_headers 68 | - abseil/base/dynamic_annotations 69 | - abseil/base/raw_logging_internal 70 | - abseil/base/periodic_sampler (0.20200225.0): 71 | - abseil/base/core_headers 72 | - abseil/base/exponential_biased 73 | - abseil/base/pretty_function (0.20200225.0) 74 | - abseil/base/raw_logging_internal (0.20200225.0): 75 | - abseil/base/atomic_hook 76 | - abseil/base/config 77 | - abseil/base/core_headers 78 | - abseil/base/log_severity 79 | - abseil/base/spinlock_wait (0.20200225.0): 80 | - abseil/base/base_internal 81 | - abseil/base/core_headers 82 | - abseil/base/errno_saver 83 | - abseil/base/throw_delegate (0.20200225.0): 84 | - abseil/base/config 85 | - abseil/base/raw_logging_internal 86 | - abseil/container/common (0.20200225.0): 87 | - abseil/meta/type_traits 88 | - abseil/types/optional 89 | - abseil/container/compressed_tuple (0.20200225.0): 90 | - abseil/utility/utility 91 | - abseil/container/container_memory (0.20200225.0): 92 | - abseil/memory/memory 93 | - abseil/utility/utility 94 | - abseil/container/fixed_array (0.20200225.0): 95 | - abseil/algorithm/algorithm 96 | - abseil/base/core_headers 97 | - abseil/base/dynamic_annotations 98 | - abseil/base/throw_delegate 99 | - abseil/container/compressed_tuple 100 | - abseil/memory/memory 101 | - abseil/container/flat_hash_map (0.20200225.0): 102 | - abseil/algorithm/container 103 | - abseil/container/container_memory 104 | - abseil/container/hash_function_defaults 105 | - abseil/container/raw_hash_map 106 | - abseil/memory/memory 107 | - abseil/container/hash_function_defaults (0.20200225.0): 108 | - abseil/base/config 109 | - abseil/hash/hash 110 | - abseil/strings/strings 111 | - abseil/container/hash_policy_traits (0.20200225.0): 112 | - abseil/meta/type_traits 113 | - abseil/container/hashtable_debug_hooks (0.20200225.0): 114 | - abseil/base/config 115 | - abseil/container/hashtablez_sampler (0.20200225.0): 116 | - abseil/base/base 117 | - abseil/base/core_headers 118 | - abseil/base/exponential_biased 119 | - abseil/container/have_sse 120 | - abseil/debugging/stacktrace 121 | - abseil/memory/memory 122 | - abseil/synchronization/synchronization 123 | - abseil/utility/utility 124 | - abseil/container/have_sse (0.20200225.0) 125 | - abseil/container/inlined_vector (0.20200225.0): 126 | - abseil/algorithm/algorithm 127 | - abseil/base/core_headers 128 | - abseil/base/throw_delegate 129 | - abseil/container/inlined_vector_internal 130 | - abseil/memory/memory 131 | - abseil/container/inlined_vector_internal (0.20200225.0): 132 | - abseil/base/core_headers 133 | - abseil/container/compressed_tuple 134 | - abseil/memory/memory 135 | - abseil/meta/type_traits 136 | - abseil/types/span 137 | - abseil/container/layout (0.20200225.0): 138 | - abseil/base/core_headers 139 | - abseil/meta/type_traits 140 | - abseil/strings/strings 141 | - abseil/types/span 142 | - abseil/utility/utility 143 | - abseil/container/raw_hash_map (0.20200225.0): 144 | - abseil/base/throw_delegate 145 | - abseil/container/container_memory 146 | - abseil/container/raw_hash_set 147 | - abseil/container/raw_hash_set (0.20200225.0): 148 | - abseil/base/bits 149 | - abseil/base/config 150 | - abseil/base/core_headers 151 | - abseil/base/endian 152 | - abseil/container/common 153 | - abseil/container/compressed_tuple 154 | - abseil/container/container_memory 155 | - abseil/container/hash_policy_traits 156 | - abseil/container/hashtable_debug_hooks 157 | - abseil/container/hashtablez_sampler 158 | - abseil/container/have_sse 159 | - abseil/container/layout 160 | - abseil/memory/memory 161 | - abseil/meta/type_traits 162 | - abseil/utility/utility 163 | - abseil/debugging/debugging_internal (0.20200225.0): 164 | - abseil/base/config 165 | - abseil/base/core_headers 166 | - abseil/base/dynamic_annotations 167 | - abseil/base/errno_saver 168 | - abseil/base/raw_logging_internal 169 | - abseil/debugging/demangle_internal (0.20200225.0): 170 | - abseil/base/base 171 | - abseil/base/config 172 | - abseil/base/core_headers 173 | - abseil/debugging/stacktrace (0.20200225.0): 174 | - abseil/base/config 175 | - abseil/base/core_headers 176 | - abseil/debugging/debugging_internal 177 | - abseil/debugging/symbolize (0.20200225.0): 178 | - abseil/base/base 179 | - abseil/base/config 180 | - abseil/base/core_headers 181 | - abseil/base/dynamic_annotations 182 | - abseil/base/malloc_internal 183 | - abseil/base/raw_logging_internal 184 | - abseil/debugging/debugging_internal 185 | - abseil/debugging/demangle_internal 186 | - abseil/hash/city (0.20200225.0): 187 | - abseil/base/config 188 | - abseil/base/core_headers 189 | - abseil/base/endian 190 | - abseil/hash/hash (0.20200225.0): 191 | - abseil/base/core_headers 192 | - abseil/base/endian 193 | - abseil/container/fixed_array 194 | - abseil/hash/city 195 | - abseil/meta/type_traits 196 | - abseil/numeric/int128 197 | - abseil/strings/strings 198 | - abseil/types/optional 199 | - abseil/types/variant 200 | - abseil/utility/utility 201 | - abseil/memory (0.20200225.0): 202 | - abseil/memory/memory (= 0.20200225.0) 203 | - abseil/memory/memory (0.20200225.0): 204 | - abseil/base/core_headers 205 | - abseil/meta/type_traits 206 | - abseil/meta (0.20200225.0): 207 | - abseil/meta/type_traits (= 0.20200225.0) 208 | - abseil/meta/type_traits (0.20200225.0): 209 | - abseil/base/config 210 | - abseil/numeric/int128 (0.20200225.0): 211 | - abseil/base/config 212 | - abseil/base/core_headers 213 | - abseil/strings/internal (0.20200225.0): 214 | - abseil/base/config 215 | - abseil/base/core_headers 216 | - abseil/base/endian 217 | - abseil/base/raw_logging_internal 218 | - abseil/meta/type_traits 219 | - abseil/strings/str_format (0.20200225.0): 220 | - abseil/strings/str_format_internal 221 | - abseil/strings/str_format_internal (0.20200225.0): 222 | - abseil/base/config 223 | - abseil/base/core_headers 224 | - abseil/meta/type_traits 225 | - abseil/numeric/int128 226 | - abseil/strings/strings 227 | - abseil/types/span 228 | - abseil/strings/strings (0.20200225.0): 229 | - abseil/base/base 230 | - abseil/base/bits 231 | - abseil/base/config 232 | - abseil/base/core_headers 233 | - abseil/base/endian 234 | - abseil/base/raw_logging_internal 235 | - abseil/base/throw_delegate 236 | - abseil/memory/memory 237 | - abseil/meta/type_traits 238 | - abseil/numeric/int128 239 | - abseil/strings/internal 240 | - abseil/synchronization/graphcycles_internal (0.20200225.0): 241 | - abseil/base/base 242 | - abseil/base/base_internal 243 | - abseil/base/config 244 | - abseil/base/core_headers 245 | - abseil/base/malloc_internal 246 | - abseil/base/raw_logging_internal 247 | - abseil/synchronization/kernel_timeout_internal (0.20200225.0): 248 | - abseil/base/core_headers 249 | - abseil/base/raw_logging_internal 250 | - abseil/time/time 251 | - abseil/synchronization/synchronization (0.20200225.0): 252 | - abseil/base/atomic_hook 253 | - abseil/base/base 254 | - abseil/base/base_internal 255 | - abseil/base/config 256 | - abseil/base/core_headers 257 | - abseil/base/dynamic_annotations 258 | - abseil/base/malloc_internal 259 | - abseil/base/raw_logging_internal 260 | - abseil/debugging/stacktrace 261 | - abseil/debugging/symbolize 262 | - abseil/synchronization/graphcycles_internal 263 | - abseil/synchronization/kernel_timeout_internal 264 | - abseil/time/time 265 | - abseil/time (0.20200225.0): 266 | - abseil/time/internal (= 0.20200225.0) 267 | - abseil/time/time (= 0.20200225.0) 268 | - abseil/time/internal (0.20200225.0): 269 | - abseil/time/internal/cctz (= 0.20200225.0) 270 | - abseil/time/internal/cctz (0.20200225.0): 271 | - abseil/time/internal/cctz/civil_time (= 0.20200225.0) 272 | - abseil/time/internal/cctz/time_zone (= 0.20200225.0) 273 | - abseil/time/internal/cctz/civil_time (0.20200225.0): 274 | - abseil/base/config 275 | - abseil/time/internal/cctz/time_zone (0.20200225.0): 276 | - abseil/base/config 277 | - abseil/time/internal/cctz/civil_time 278 | - abseil/time/time (0.20200225.0): 279 | - abseil/base/base 280 | - abseil/base/core_headers 281 | - abseil/base/raw_logging_internal 282 | - abseil/numeric/int128 283 | - abseil/strings/strings 284 | - abseil/time/internal/cctz/civil_time 285 | - abseil/time/internal/cctz/time_zone 286 | - abseil/types (0.20200225.0): 287 | - abseil/types/any (= 0.20200225.0) 288 | - abseil/types/bad_any_cast (= 0.20200225.0) 289 | - abseil/types/bad_any_cast_impl (= 0.20200225.0) 290 | - abseil/types/bad_optional_access (= 0.20200225.0) 291 | - abseil/types/bad_variant_access (= 0.20200225.0) 292 | - abseil/types/compare (= 0.20200225.0) 293 | - abseil/types/optional (= 0.20200225.0) 294 | - abseil/types/span (= 0.20200225.0) 295 | - abseil/types/variant (= 0.20200225.0) 296 | - abseil/types/any (0.20200225.0): 297 | - abseil/base/config 298 | - abseil/base/core_headers 299 | - abseil/meta/type_traits 300 | - abseil/types/bad_any_cast 301 | - abseil/utility/utility 302 | - abseil/types/bad_any_cast (0.20200225.0): 303 | - abseil/base/config 304 | - abseil/types/bad_any_cast_impl 305 | - abseil/types/bad_any_cast_impl (0.20200225.0): 306 | - abseil/base/config 307 | - abseil/base/raw_logging_internal 308 | - abseil/types/bad_optional_access (0.20200225.0): 309 | - abseil/base/config 310 | - abseil/base/raw_logging_internal 311 | - abseil/types/bad_variant_access (0.20200225.0): 312 | - abseil/base/config 313 | - abseil/base/raw_logging_internal 314 | - abseil/types/compare (0.20200225.0): 315 | - abseil/base/core_headers 316 | - abseil/meta/type_traits 317 | - abseil/types/optional (0.20200225.0): 318 | - abseil/base/base_internal 319 | - abseil/base/config 320 | - abseil/base/core_headers 321 | - abseil/memory/memory 322 | - abseil/meta/type_traits 323 | - abseil/types/bad_optional_access 324 | - abseil/utility/utility 325 | - abseil/types/span (0.20200225.0): 326 | - abseil/algorithm/algorithm 327 | - abseil/base/core_headers 328 | - abseil/base/throw_delegate 329 | - abseil/meta/type_traits 330 | - abseil/types/variant (0.20200225.0): 331 | - abseil/base/base_internal 332 | - abseil/base/config 333 | - abseil/base/core_headers 334 | - abseil/meta/type_traits 335 | - abseil/types/bad_variant_access 336 | - abseil/utility/utility 337 | - abseil/utility/utility (0.20200225.0): 338 | - abseil/base/base_internal 339 | - abseil/base/config 340 | - abseil/meta/type_traits 341 | - BoringSSL-GRPC (0.0.7): 342 | - BoringSSL-GRPC/Implementation (= 0.0.7) 343 | - BoringSSL-GRPC/Interface (= 0.0.7) 344 | - BoringSSL-GRPC/Implementation (0.0.7): 345 | - BoringSSL-GRPC/Interface (= 0.0.7) 346 | - BoringSSL-GRPC/Interface (0.0.7) 347 | - cloud_firestore (3.1.6): 348 | - Firebase/Firestore (= 8.10.0) 349 | - firebase_core 350 | - Flutter 351 | - Firebase/Auth (8.10.0): 352 | - Firebase/CoreOnly 353 | - FirebaseAuth (~> 8.10.0) 354 | - Firebase/CoreOnly (8.10.0): 355 | - FirebaseCore (= 8.10.0) 356 | - Firebase/Firestore (8.10.0): 357 | - Firebase/CoreOnly 358 | - FirebaseFirestore (~> 8.10.0) 359 | - Firebase/Storage (8.10.0): 360 | - Firebase/CoreOnly 361 | - FirebaseStorage (~> 8.10.0) 362 | - firebase_auth (3.3.5): 363 | - Firebase/Auth (= 8.10.0) 364 | - firebase_core 365 | - Flutter 366 | - firebase_core (1.11.0): 367 | - Firebase/CoreOnly (= 8.10.0) 368 | - Flutter 369 | - firebase_storage (10.2.5): 370 | - Firebase/Storage (= 8.10.0) 371 | - firebase_core 372 | - Flutter 373 | - FirebaseAuth (8.10.0): 374 | - FirebaseCore (~> 8.0) 375 | - GoogleUtilities/AppDelegateSwizzler (~> 7.6) 376 | - GoogleUtilities/Environment (~> 7.6) 377 | - GTMSessionFetcher/Core (~> 1.5) 378 | - FirebaseCore (8.10.0): 379 | - FirebaseCoreDiagnostics (~> 8.0) 380 | - GoogleUtilities/Environment (~> 7.6) 381 | - GoogleUtilities/Logger (~> 7.6) 382 | - FirebaseCoreDiagnostics (8.11.0): 383 | - GoogleDataTransport (~> 9.1) 384 | - GoogleUtilities/Environment (~> 7.7) 385 | - GoogleUtilities/Logger (~> 7.7) 386 | - nanopb (~> 2.30908.0) 387 | - FirebaseFirestore (8.10.0): 388 | - abseil/algorithm (= 0.20200225.0) 389 | - abseil/base (= 0.20200225.0) 390 | - abseil/container/flat_hash_map (= 0.20200225.0) 391 | - abseil/memory (= 0.20200225.0) 392 | - abseil/meta (= 0.20200225.0) 393 | - abseil/strings/strings (= 0.20200225.0) 394 | - abseil/time (= 0.20200225.0) 395 | - abseil/types (= 0.20200225.0) 396 | - FirebaseCore (~> 8.0) 397 | - "gRPC-C++ (~> 1.28.0)" 398 | - leveldb-library (~> 1.22) 399 | - nanopb (~> 2.30908.0) 400 | - FirebaseStorage (8.10.0): 401 | - FirebaseCore (~> 8.0) 402 | - GTMSessionFetcher/Core (~> 1.5) 403 | - Flutter (1.0.0) 404 | - fluttertoast (0.0.2): 405 | - Flutter 406 | - Toast 407 | - GoogleDataTransport (9.1.2): 408 | - GoogleUtilities/Environment (~> 7.2) 409 | - nanopb (~> 2.30908.0) 410 | - PromisesObjC (< 3.0, >= 1.2) 411 | - GoogleUtilities/AppDelegateSwizzler (7.7.0): 412 | - GoogleUtilities/Environment 413 | - GoogleUtilities/Logger 414 | - GoogleUtilities/Network 415 | - GoogleUtilities/Environment (7.7.0): 416 | - PromisesObjC (< 3.0, >= 1.2) 417 | - GoogleUtilities/Logger (7.7.0): 418 | - GoogleUtilities/Environment 419 | - GoogleUtilities/Network (7.7.0): 420 | - GoogleUtilities/Logger 421 | - "GoogleUtilities/NSData+zlib" 422 | - GoogleUtilities/Reachability 423 | - "GoogleUtilities/NSData+zlib (7.7.0)" 424 | - GoogleUtilities/Reachability (7.7.0): 425 | - GoogleUtilities/Logger 426 | - "gRPC-C++ (1.28.2)": 427 | - "gRPC-C++/Implementation (= 1.28.2)" 428 | - "gRPC-C++/Interface (= 1.28.2)" 429 | - "gRPC-C++/Implementation (1.28.2)": 430 | - abseil/container/inlined_vector (= 0.20200225.0) 431 | - abseil/memory/memory (= 0.20200225.0) 432 | - abseil/strings/str_format (= 0.20200225.0) 433 | - abseil/strings/strings (= 0.20200225.0) 434 | - abseil/types/optional (= 0.20200225.0) 435 | - "gRPC-C++/Interface (= 1.28.2)" 436 | - gRPC-Core (= 1.28.2) 437 | - "gRPC-C++/Interface (1.28.2)" 438 | - gRPC-Core (1.28.2): 439 | - gRPC-Core/Implementation (= 1.28.2) 440 | - gRPC-Core/Interface (= 1.28.2) 441 | - gRPC-Core/Implementation (1.28.2): 442 | - abseil/container/inlined_vector (= 0.20200225.0) 443 | - abseil/memory/memory (= 0.20200225.0) 444 | - abseil/strings/str_format (= 0.20200225.0) 445 | - abseil/strings/strings (= 0.20200225.0) 446 | - abseil/types/optional (= 0.20200225.0) 447 | - BoringSSL-GRPC (= 0.0.7) 448 | - gRPC-Core/Interface (= 1.28.2) 449 | - gRPC-Core/Interface (1.28.2) 450 | - GTMSessionFetcher/Core (1.7.0) 451 | - leveldb-library (1.22.1) 452 | - nanopb (2.30908.0): 453 | - nanopb/decode (= 2.30908.0) 454 | - nanopb/encode (= 2.30908.0) 455 | - nanopb/decode (2.30908.0) 456 | - nanopb/encode (2.30908.0) 457 | - path_provider_ios (0.0.1): 458 | - Flutter 459 | - PromisesObjC (2.0.0) 460 | - shared_preferences_ios (0.0.1): 461 | - Flutter 462 | - Toast (4.0.0) 463 | 464 | DEPENDENCIES: 465 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 466 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) 467 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 468 | - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) 469 | - Flutter (from `Flutter`) 470 | - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) 471 | - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) 472 | - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) 473 | 474 | SPEC REPOS: 475 | trunk: 476 | - abseil 477 | - BoringSSL-GRPC 478 | - Firebase 479 | - FirebaseAuth 480 | - FirebaseCore 481 | - FirebaseCoreDiagnostics 482 | - FirebaseFirestore 483 | - FirebaseStorage 484 | - GoogleDataTransport 485 | - GoogleUtilities 486 | - "gRPC-C++" 487 | - gRPC-Core 488 | - GTMSessionFetcher 489 | - leveldb-library 490 | - nanopb 491 | - PromisesObjC 492 | - Toast 493 | 494 | EXTERNAL SOURCES: 495 | cloud_firestore: 496 | :path: ".symlinks/plugins/cloud_firestore/ios" 497 | firebase_auth: 498 | :path: ".symlinks/plugins/firebase_auth/ios" 499 | firebase_core: 500 | :path: ".symlinks/plugins/firebase_core/ios" 501 | firebase_storage: 502 | :path: ".symlinks/plugins/firebase_storage/ios" 503 | Flutter: 504 | :path: Flutter 505 | fluttertoast: 506 | :path: ".symlinks/plugins/fluttertoast/ios" 507 | path_provider_ios: 508 | :path: ".symlinks/plugins/path_provider_ios/ios" 509 | shared_preferences_ios: 510 | :path: ".symlinks/plugins/shared_preferences_ios/ios" 511 | 512 | SPEC CHECKSUMS: 513 | abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f 514 | BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 515 | cloud_firestore: 03020d987c2828e9b2d87f6940d365ddb089394f 516 | Firebase: 44213362f1dcc52555b935dc925ed35ac55f1b20 517 | firebase_auth: 9d959bddc3b255ddfb67cf630a5bbb6186964356 518 | firebase_core: 2ca2d6cc8a11693e701b37126afae4800be5dbac 519 | firebase_storage: 740e81d4bef3360d50447dda37da9b8914a2acc0 520 | FirebaseAuth: 59a2d2b933b5b79e18fb1e6ad230c6abdaa73d26 521 | FirebaseCore: 04186597c095da37d90ff9fd3e53bc61a1ff2440 522 | FirebaseCoreDiagnostics: 64d9709d804a6c25bd77841371c1fcfd909d5601 523 | FirebaseFirestore: 0e7321a508cc9de54316ec45400caba6b5719beb 524 | FirebaseStorage: 815410224b548172c578f02554a86bbc8f817f50 525 | Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a 526 | fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58 527 | GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 528 | GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1 529 | "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 530 | gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 531 | GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91 532 | leveldb-library: 50c7b45cbd7bf543c81a468fe557a16ae3db8729 533 | nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 534 | path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 535 | PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 536 | shared_preferences_ios: aef470a42dc4675a1cdd50e3158b42e3d1232b32 537 | Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 538 | 539 | PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b 540 | 541 | COCOAPODS: 1.11.2 542 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 04867B68279846EF003A5A15 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04867B67279846EF003A5A15 /* GoogleService-Info.plist */; }; 11 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | EEC29635D463F3005B9E7CB5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4CCE0E1AF24980E27B9B2DF /* Pods_Runner.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXCopyFilesBuildPhase section */ 21 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 22 | isa = PBXCopyFilesBuildPhase; 23 | buildActionMask = 2147483647; 24 | dstPath = ""; 25 | dstSubfolderSpec = 10; 26 | files = ( 27 | ); 28 | name = "Embed Frameworks"; 29 | runOnlyForDeploymentPostprocessing = 0; 30 | }; 31 | /* End PBXCopyFilesBuildPhase section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 04867B67279846EF003A5A15 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 35 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 36 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 37 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 38 | 426C5A738D084665F89CE8E1 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 42 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 43 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 44 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 46 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | BDC7EC3D52A326360A4E51AB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 50 | CBB1A06169DDF8A48D6D299E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 51 | F4CCE0E1AF24980E27B9B2DF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | EEC29635D463F3005B9E7CB5 /* Pods_Runner.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | 9740EEB11CF90186004384FC /* Flutter */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 70 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 71 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 72 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 73 | ); 74 | name = Flutter; 75 | sourceTree = ""; 76 | }; 77 | 97C146E51CF9000F007C117D = { 78 | isa = PBXGroup; 79 | children = ( 80 | 9740EEB11CF90186004384FC /* Flutter */, 81 | 97C146F01CF9000F007C117D /* Runner */, 82 | 97C146EF1CF9000F007C117D /* Products */, 83 | C462766EAD352C0E6FAC23F6 /* Pods */, 84 | A038230A696ED964883E137F /* Frameworks */, 85 | ); 86 | sourceTree = ""; 87 | }; 88 | 97C146EF1CF9000F007C117D /* Products */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 97C146EE1CF9000F007C117D /* Runner.app */, 92 | ); 93 | name = Products; 94 | sourceTree = ""; 95 | }; 96 | 97C146F01CF9000F007C117D /* Runner */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 100 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 101 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 102 | 97C147021CF9000F007C117D /* Info.plist */, 103 | 04867B67279846EF003A5A15 /* GoogleService-Info.plist */, 104 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 105 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 106 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 107 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 108 | ); 109 | path = Runner; 110 | sourceTree = ""; 111 | }; 112 | A038230A696ED964883E137F /* Frameworks */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | F4CCE0E1AF24980E27B9B2DF /* Pods_Runner.framework */, 116 | ); 117 | name = Frameworks; 118 | sourceTree = ""; 119 | }; 120 | C462766EAD352C0E6FAC23F6 /* Pods */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 426C5A738D084665F89CE8E1 /* Pods-Runner.debug.xcconfig */, 124 | BDC7EC3D52A326360A4E51AB /* Pods-Runner.release.xcconfig */, 125 | CBB1A06169DDF8A48D6D299E /* Pods-Runner.profile.xcconfig */, 126 | ); 127 | path = Pods; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | 97C146ED1CF9000F007C117D /* Runner */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 136 | buildPhases = ( 137 | 7B64C744FAAD80166CC9ADFB /* [CP] Check Pods Manifest.lock */, 138 | 9740EEB61CF901F6004384FC /* Run Script */, 139 | 97C146EA1CF9000F007C117D /* Sources */, 140 | 97C146EB1CF9000F007C117D /* Frameworks */, 141 | 97C146EC1CF9000F007C117D /* Resources */, 142 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 143 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 144 | 5C267B9D0231093D4DAD4EBF /* [CP] Embed Pods Frameworks */, 145 | ); 146 | buildRules = ( 147 | ); 148 | dependencies = ( 149 | ); 150 | name = Runner; 151 | productName = Runner; 152 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 153 | productType = "com.apple.product-type.application"; 154 | }; 155 | /* End PBXNativeTarget section */ 156 | 157 | /* Begin PBXProject section */ 158 | 97C146E61CF9000F007C117D /* Project object */ = { 159 | isa = PBXProject; 160 | attributes = { 161 | LastUpgradeCheck = 1300; 162 | ORGANIZATIONNAME = ""; 163 | TargetAttributes = { 164 | 97C146ED1CF9000F007C117D = { 165 | CreatedOnToolsVersion = 7.3.1; 166 | LastSwiftMigration = 1100; 167 | }; 168 | }; 169 | }; 170 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 171 | compatibilityVersion = "Xcode 9.3"; 172 | developmentRegion = en; 173 | hasScannedForEncodings = 0; 174 | knownRegions = ( 175 | en, 176 | Base, 177 | ); 178 | mainGroup = 97C146E51CF9000F007C117D; 179 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 180 | projectDirPath = ""; 181 | projectRoot = ""; 182 | targets = ( 183 | 97C146ED1CF9000F007C117D /* Runner */, 184 | ); 185 | }; 186 | /* End PBXProject section */ 187 | 188 | /* Begin PBXResourcesBuildPhase section */ 189 | 97C146EC1CF9000F007C117D /* Resources */ = { 190 | isa = PBXResourcesBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 194 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 195 | 04867B68279846EF003A5A15 /* GoogleService-Info.plist in Resources */, 196 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 197 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | }; 201 | /* End PBXResourcesBuildPhase section */ 202 | 203 | /* Begin PBXShellScriptBuildPhase section */ 204 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 205 | isa = PBXShellScriptBuildPhase; 206 | buildActionMask = 2147483647; 207 | files = ( 208 | ); 209 | inputPaths = ( 210 | ); 211 | name = "Thin Binary"; 212 | outputPaths = ( 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | shellPath = /bin/sh; 216 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 217 | }; 218 | 5C267B9D0231093D4DAD4EBF /* [CP] Embed Pods Frameworks */ = { 219 | isa = PBXShellScriptBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | inputFileListPaths = ( 224 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 225 | ); 226 | name = "[CP] Embed Pods Frameworks"; 227 | outputFileListPaths = ( 228 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | shellPath = /bin/sh; 232 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 233 | showEnvVarsInLog = 0; 234 | }; 235 | 7B64C744FAAD80166CC9ADFB /* [CP] Check Pods Manifest.lock */ = { 236 | isa = PBXShellScriptBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | inputFileListPaths = ( 241 | ); 242 | inputPaths = ( 243 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 244 | "${PODS_ROOT}/Manifest.lock", 245 | ); 246 | name = "[CP] Check Pods Manifest.lock"; 247 | outputFileListPaths = ( 248 | ); 249 | outputPaths = ( 250 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | shellPath = /bin/sh; 254 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 255 | showEnvVarsInLog = 0; 256 | }; 257 | 9740EEB61CF901F6004384FC /* Run Script */ = { 258 | isa = PBXShellScriptBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | inputPaths = ( 263 | ); 264 | name = "Run Script"; 265 | outputPaths = ( 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | shellPath = /bin/sh; 269 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 270 | }; 271 | /* End PBXShellScriptBuildPhase section */ 272 | 273 | /* Begin PBXSourcesBuildPhase section */ 274 | 97C146EA1CF9000F007C117D /* Sources */ = { 275 | isa = PBXSourcesBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 279 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | /* End PBXSourcesBuildPhase section */ 284 | 285 | /* Begin PBXVariantGroup section */ 286 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 287 | isa = PBXVariantGroup; 288 | children = ( 289 | 97C146FB1CF9000F007C117D /* Base */, 290 | ); 291 | name = Main.storyboard; 292 | sourceTree = ""; 293 | }; 294 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 295 | isa = PBXVariantGroup; 296 | children = ( 297 | 97C147001CF9000F007C117D /* Base */, 298 | ); 299 | name = LaunchScreen.storyboard; 300 | sourceTree = ""; 301 | }; 302 | /* End PBXVariantGroup section */ 303 | 304 | /* Begin XCBuildConfiguration section */ 305 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | ALWAYS_SEARCH_USER_PATHS = NO; 309 | CLANG_ANALYZER_NONNULL = YES; 310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 311 | CLANG_CXX_LIBRARY = "libc++"; 312 | CLANG_ENABLE_MODULES = YES; 313 | CLANG_ENABLE_OBJC_ARC = YES; 314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 315 | CLANG_WARN_BOOL_CONVERSION = YES; 316 | CLANG_WARN_COMMA = YES; 317 | CLANG_WARN_CONSTANT_CONVERSION = YES; 318 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 319 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 320 | CLANG_WARN_EMPTY_BODY = YES; 321 | CLANG_WARN_ENUM_CONVERSION = YES; 322 | CLANG_WARN_INFINITE_RECURSION = YES; 323 | CLANG_WARN_INT_CONVERSION = YES; 324 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 326 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 327 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 328 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 329 | CLANG_WARN_STRICT_PROTOTYPES = YES; 330 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 331 | CLANG_WARN_UNREACHABLE_CODE = YES; 332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 333 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 334 | COPY_PHASE_STRIP = NO; 335 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 336 | ENABLE_NS_ASSERTIONS = NO; 337 | ENABLE_STRICT_OBJC_MSGSEND = YES; 338 | GCC_C_LANGUAGE_STANDARD = gnu99; 339 | GCC_NO_COMMON_BLOCKS = YES; 340 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 341 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 342 | GCC_WARN_UNDECLARED_SELECTOR = YES; 343 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 344 | GCC_WARN_UNUSED_FUNCTION = YES; 345 | GCC_WARN_UNUSED_VARIABLE = YES; 346 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 347 | MTL_ENABLE_DEBUG_INFO = NO; 348 | SDKROOT = iphoneos; 349 | SUPPORTED_PLATFORMS = iphoneos; 350 | TARGETED_DEVICE_FAMILY = "1,2"; 351 | VALIDATE_PRODUCT = YES; 352 | }; 353 | name = Profile; 354 | }; 355 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 356 | isa = XCBuildConfiguration; 357 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 358 | buildSettings = { 359 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 360 | CLANG_ENABLE_MODULES = YES; 361 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 362 | ENABLE_BITCODE = NO; 363 | INFOPLIST_FILE = Runner/Info.plist; 364 | LD_RUNPATH_SEARCH_PATHS = ( 365 | "$(inherited)", 366 | "@executable_path/Frameworks", 367 | ); 368 | PRODUCT_BUNDLE_IDENTIFIER = com.fastnuces.estartup; 369 | PRODUCT_NAME = "$(TARGET_NAME)"; 370 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 371 | SWIFT_VERSION = 5.0; 372 | VERSIONING_SYSTEM = "apple-generic"; 373 | }; 374 | name = Profile; 375 | }; 376 | 97C147031CF9000F007C117D /* Debug */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | ALWAYS_SEARCH_USER_PATHS = NO; 380 | CLANG_ANALYZER_NONNULL = YES; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_MODULES = YES; 384 | CLANG_ENABLE_OBJC_ARC = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INFINITE_RECURSION = YES; 394 | CLANG_WARN_INT_CONVERSION = YES; 395 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 397 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 399 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 400 | CLANG_WARN_STRICT_PROTOTYPES = YES; 401 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 402 | CLANG_WARN_UNREACHABLE_CODE = YES; 403 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 404 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 405 | COPY_PHASE_STRIP = NO; 406 | DEBUG_INFORMATION_FORMAT = dwarf; 407 | ENABLE_STRICT_OBJC_MSGSEND = YES; 408 | ENABLE_TESTABILITY = YES; 409 | GCC_C_LANGUAGE_STANDARD = gnu99; 410 | GCC_DYNAMIC_NO_PIC = NO; 411 | GCC_NO_COMMON_BLOCKS = YES; 412 | GCC_OPTIMIZATION_LEVEL = 0; 413 | GCC_PREPROCESSOR_DEFINITIONS = ( 414 | "DEBUG=1", 415 | "$(inherited)", 416 | ); 417 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 418 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 419 | GCC_WARN_UNDECLARED_SELECTOR = YES; 420 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 421 | GCC_WARN_UNUSED_FUNCTION = YES; 422 | GCC_WARN_UNUSED_VARIABLE = YES; 423 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 424 | MTL_ENABLE_DEBUG_INFO = YES; 425 | ONLY_ACTIVE_ARCH = YES; 426 | SDKROOT = iphoneos; 427 | TARGETED_DEVICE_FAMILY = "1,2"; 428 | }; 429 | name = Debug; 430 | }; 431 | 97C147041CF9000F007C117D /* Release */ = { 432 | isa = XCBuildConfiguration; 433 | buildSettings = { 434 | ALWAYS_SEARCH_USER_PATHS = NO; 435 | CLANG_ANALYZER_NONNULL = YES; 436 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 437 | CLANG_CXX_LIBRARY = "libc++"; 438 | CLANG_ENABLE_MODULES = YES; 439 | CLANG_ENABLE_OBJC_ARC = YES; 440 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 441 | CLANG_WARN_BOOL_CONVERSION = YES; 442 | CLANG_WARN_COMMA = YES; 443 | CLANG_WARN_CONSTANT_CONVERSION = YES; 444 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 445 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 446 | CLANG_WARN_EMPTY_BODY = YES; 447 | CLANG_WARN_ENUM_CONVERSION = YES; 448 | CLANG_WARN_INFINITE_RECURSION = YES; 449 | CLANG_WARN_INT_CONVERSION = YES; 450 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 451 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 452 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 453 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 454 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 455 | CLANG_WARN_STRICT_PROTOTYPES = YES; 456 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 457 | CLANG_WARN_UNREACHABLE_CODE = YES; 458 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 459 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 460 | COPY_PHASE_STRIP = NO; 461 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 462 | ENABLE_NS_ASSERTIONS = NO; 463 | ENABLE_STRICT_OBJC_MSGSEND = YES; 464 | GCC_C_LANGUAGE_STANDARD = gnu99; 465 | GCC_NO_COMMON_BLOCKS = YES; 466 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 467 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 468 | GCC_WARN_UNDECLARED_SELECTOR = YES; 469 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 470 | GCC_WARN_UNUSED_FUNCTION = YES; 471 | GCC_WARN_UNUSED_VARIABLE = YES; 472 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 473 | MTL_ENABLE_DEBUG_INFO = NO; 474 | SDKROOT = iphoneos; 475 | SUPPORTED_PLATFORMS = iphoneos; 476 | SWIFT_COMPILATION_MODE = wholemodule; 477 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 478 | TARGETED_DEVICE_FAMILY = "1,2"; 479 | VALIDATE_PRODUCT = YES; 480 | }; 481 | name = Release; 482 | }; 483 | 97C147061CF9000F007C117D /* Debug */ = { 484 | isa = XCBuildConfiguration; 485 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 486 | buildSettings = { 487 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 488 | CLANG_ENABLE_MODULES = YES; 489 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 490 | ENABLE_BITCODE = NO; 491 | INFOPLIST_FILE = Runner/Info.plist; 492 | LD_RUNPATH_SEARCH_PATHS = ( 493 | "$(inherited)", 494 | "@executable_path/Frameworks", 495 | ); 496 | PRODUCT_BUNDLE_IDENTIFIER = com.fastnuces.estartup; 497 | PRODUCT_NAME = "$(TARGET_NAME)"; 498 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 499 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 500 | SWIFT_VERSION = 5.0; 501 | VERSIONING_SYSTEM = "apple-generic"; 502 | }; 503 | name = Debug; 504 | }; 505 | 97C147071CF9000F007C117D /* Release */ = { 506 | isa = XCBuildConfiguration; 507 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 508 | buildSettings = { 509 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 510 | CLANG_ENABLE_MODULES = YES; 511 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 512 | ENABLE_BITCODE = NO; 513 | INFOPLIST_FILE = Runner/Info.plist; 514 | LD_RUNPATH_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "@executable_path/Frameworks", 517 | ); 518 | PRODUCT_BUNDLE_IDENTIFIER = com.fastnuces.estartup; 519 | PRODUCT_NAME = "$(TARGET_NAME)"; 520 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 521 | SWIFT_VERSION = 5.0; 522 | VERSIONING_SYSTEM = "apple-generic"; 523 | }; 524 | name = Release; 525 | }; 526 | /* End XCBuildConfiguration section */ 527 | 528 | /* Begin XCConfigurationList section */ 529 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 530 | isa = XCConfigurationList; 531 | buildConfigurations = ( 532 | 97C147031CF9000F007C117D /* Debug */, 533 | 97C147041CF9000F007C117D /* Release */, 534 | 249021D3217E4FDB00AE95B9 /* Profile */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 97C147061CF9000F007C117D /* Debug */, 543 | 97C147071CF9000F007C117D /* Release */, 544 | 249021D4217E4FDB00AE95B9 /* Profile */, 545 | ); 546 | defaultConfigurationIsVisible = 0; 547 | defaultConfigurationName = Release; 548 | }; 549 | /* End XCConfigurationList section */ 550 | }; 551 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 552 | } 553 | --------------------------------------------------------------------------------