├── .prettierignore ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 180.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── 1024.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj └── .gitignore ├── flutter_native_splash.yaml ├── assets └── images │ ├── gfg.png │ ├── logo.jpeg │ └── login-design.png ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── drawable-hdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── 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 │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── gfg │ │ │ │ │ └── our_gfg │ │ │ │ │ └── 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 ├── lib ├── utils │ └── tools.dart ├── services │ ├── firebase_auth_service.dart │ ├── one_signal_service.dart │ └── firebase_storage_service.dart ├── models │ ├── members.dart │ ├── announcement.dart │ ├── event.dart │ └── individual_member.dart ├── components │ ├── embedded_map.dart │ ├── my_cached_network_image.dart │ ├── announcement_card.dart │ ├── my_text_field.dart │ ├── upcoming_event_card.dart │ └── newsletter.dart ├── screens │ ├── testNotifications.dart │ ├── upcoming_events_screen.dart │ ├── homepage.dart │ ├── members.dart │ ├── about_screen.dart │ ├── social_media.dart │ ├── mission.dart │ ├── contact_us_screen.dart │ ├── EventRegistration.dart │ ├── sign_up.dart │ └── LoginScreen.dart ├── main.dart └── widgets │ └── CustomAppDrawer.dart ├── .github ├── ISSUE_TEMPLATE │ ├── custom.md │ ├── bug_report.md │ └── feature_request.md ├── workflows │ └── test.yml └── pull_request_template.md ├── .gitignore ├── LICENSE ├── test └── widget_test.dart ├── pubspec.yaml ├── CODE_OF_CONDUCT.md ├── README.md ├── CONTRIBUTING.md └── pubspec.lock /.prettierignore: -------------------------------------------------------------------------------- 1 | *.yaml -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /flutter_native_splash.yaml: -------------------------------------------------------------------------------- 1 | flutter_native_splash: 2 | image : 'assets/images/gfg.png' 3 | color: "ffffff" -------------------------------------------------------------------------------- /assets/images/gfg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/assets/images/gfg.png -------------------------------------------------------------------------------- /assets/images/logo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/assets/images/logo.jpeg -------------------------------------------------------------------------------- /assets/images/login-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/assets/images/login-design.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/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/GameofSource-GFG/Android-Development/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/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/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/GameofSource-GFG/Android-Development/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameofSource-GFG/Android-Development/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/gfg/our_gfg/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.gfg.our_gfg 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | import android.os.Build 6 | import android.view.ViewTreeObserver 7 | import android.view.WindowManager 8 | class MainActivity: FlutterActivity() { 9 | } -------------------------------------------------------------------------------- /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-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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: f30b7f4db93ee747cd727df747941a28ead25ff5 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /lib/utils/tools.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Tools { 4 | static Color hexToColor(String code) { 5 | return Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); 6 | } 7 | 8 | static List multiColors = [ 9 | Colors.red, 10 | Colors.amber, 11 | Colors.green, 12 | Colors.blue, 13 | ]; 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | #### Please Describe the issue: 11 | A clear and concise description 12 | 13 | #### Solution you'd suggest 14 | A brief description of the solution in your mind 15 | 16 | #### Additional Contents? 17 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | var flutter_native_splash = 1 11 | UIApplication.shared.isStatusBarHidden = false 12 | 13 | GeneratedPluginRegistrant.register(with: self) 14 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 15 | } 16 | } -------------------------------------------------------------------------------- /lib/services/firebase_auth_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/foundation.dart'; 3 | 4 | class FirebaseAuthService { 5 | FirebaseAuthService._(); 6 | 7 | static final FirebaseAuth _auth = FirebaseAuth.instance; 8 | 9 | static Future loginUser( 10 | {@required String email, @required String password}) async { 11 | return await _auth.signInWithEmailAndPassword( 12 | email: email, 13 | password: password, 14 | ); 15 | } 16 | 17 | static Future logoutUser() async { 18 | return await _auth.signOut(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lib/models/members.dart: -------------------------------------------------------------------------------- 1 | class Member { 2 | String speakerName; 3 | String speakerDesc; 4 | String speakerImage; 5 | String speakerInfo; 6 | String speakerId; 7 | String fbUrl; 8 | String twitterUrl; 9 | String linkedinUrl; 10 | String githubUrl; 11 | String speakerSession; 12 | String instagramUrl; 13 | 14 | Member({ 15 | this.speakerName, 16 | this.speakerDesc, 17 | this.speakerImage, 18 | this.speakerInfo, 19 | this.speakerId, 20 | this.fbUrl, 21 | this.twitterUrl, 22 | this.linkedinUrl, 23 | this.githubUrl, 24 | this.speakerSession, 25 | this.instagramUrl, 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See the error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Additional context** 27 | Add any other context about the problem here. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Please describe the feature you're requesting** 11 | A clear and concise description of what the feature is and what purpose it serves. 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.3.4' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | jcenter() 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | .env 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Web related 36 | lib/generated_plugin_registrant.dart 37 | 38 | # Symbolication related 39 | app.*.symbols 40 | 41 | # Obfuscation related 42 | app.*.map.json 43 | -------------------------------------------------------------------------------- /lib/models/announcement.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:cloud_firestore/cloud_firestore.dart'; 3 | import 'package:timeago/timeago.dart' as timeago; 4 | 5 | class Announcement { 6 | final String id; 7 | final String title; 8 | final String description; 9 | final String relativeTime; 10 | 11 | Announcement({ 12 | @required this.id, 13 | @required this.title, 14 | @required this.description, 15 | @required this.relativeTime, 16 | }); 17 | 18 | factory Announcement.fromDocumentSnapshot(DocumentSnapshot snapshot) { 19 | final Map data = snapshot.data(); 20 | 21 | return Announcement( 22 | id: snapshot.id, 23 | title: data['title'] as String, 24 | description: data['description'] as String, 25 | relativeTime: timeago.format(data['timestamp'].toDate()) 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/components/embedded_map.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:webview_flutter/webview_flutter.dart'; 3 | 4 | class EmbeddedMap extends StatelessWidget { 5 | @override 6 | Widget build(BuildContext context) { 7 | return Container( 8 | height: 215, 9 | child: WebView( 10 | initialUrl: Uri.dataFromString( 11 | '', 12 | mimeType: 'text/html', 13 | ).toString(), 14 | javascriptMode: JavascriptMode.unrestricted, 15 | ), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Flutter CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - development 8 | pull_request: 9 | branches: 10 | - main 11 | - development 12 | 13 | jobs: 14 | build: 15 | 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: actions/setup-java@v1 21 | with: 22 | java-version: '12.x' 23 | - uses: subosito/flutter-action@v1 24 | with: 25 | channel: 'stable' 26 | - name: Install dependencies 27 | run: flutter pub get 28 | - name: Analyze the Dart code for any errors 29 | run: flutter analyze 30 | # - name: Run tests 31 | # run: pub run test 32 | - name: Build APK 33 | run: flutter build apk 34 | - name: Upload generated apk to the artifacts. 35 | uses: actions/upload-artifact@v1 36 | with: 37 | name: release-apk 38 | path: build/app/outputs/apk/release/app-release.apk 39 | 40 | 41 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Game of Source - GeeksforGeeks 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /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 | import 'package:our_gfg/main.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(MyApp()); 16 | 17 | // Verify that our counter starts at 0. 18 | expect(find.text('0'), findsOneWidget); 19 | expect(find.text('1'), findsNothing); 20 | 21 | // Tap the '+' icon and trigger a frame. 22 | await tester.tap(find.byIcon(Icons.add)); 23 | await tester.pump(); 24 | 25 | // Verify that our counter has incremented. 26 | expect(find.text('0'), findsNothing); 27 | expect(find.text('1'), findsOneWidget); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /lib/screens/testNotifications.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:our_gfg/services/one_signal_service.dart'; 3 | 4 | class TestNotifications extends StatelessWidget { 5 | final String name = "Test event"; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | body: SafeArea( 11 | child: Center( 12 | child: Column( 13 | mainAxisAlignment: MainAxisAlignment.center, 14 | children: [ 15 | Text("Event name: $name"), 16 | SizedBox( 17 | height: 25, 18 | ), 19 | Text("Event starts in 4 hours!"), 20 | SizedBox( 21 | height: 100, 22 | ), 23 | RaisedButton( 24 | onPressed: () { 25 | DateTime date = DateTime.now() 26 | .toUtc() 27 | .add(Duration(hours: 4)); 28 | OneSignalService.scheduleNotification(name, date, 4); 29 | }, 30 | child: Text("Register!"), 31 | ), 32 | ], 33 | ), 34 | ), 35 | ), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: our_gfg 2 | description: A new Flutter application. 3 | publish_to: none 4 | version: 1.0.0+1 5 | environment: 6 | sdk: ">=2.7.0 <3.0.0" 7 | dependencies: 8 | flutter: 9 | sdk: flutter 10 | cloud_firestore: ^0.14.1+3 11 | 12 | firebase_core: ^0.5.0+1 13 | cupertino_icons: ^1.0.0 14 | animated_text_kit: ^2.4.1 15 | url_launcher: ^5.7.5 16 | webview_flutter: ^1.0.4 17 | font_awesome_flutter: ^8.10.0 18 | intl: ^0.16.1 19 | cached_network_image: ^2.3.3 20 | shimmer: ^1.1.2 21 | firebase_auth: ^0.18.1+2 22 | google_sign_in: ^4.5.5 23 | firebase_database: ^4.1.1 24 | fluttertoast: ^7.1.1 25 | onesignal_flutter: ^2.6.1 26 | timeago: ^2.0.28 27 | modal_progress_hud: ^0.1.3 28 | share: ^0.6.5+4 29 | 30 | dev_dependencies: 31 | google_fonts: ^1.1.1 32 | flutter_native_splash: ^0.1.9 33 | flutter_test: 34 | sdk: flutter 35 | flutter: 36 | # The following line ensures that the Material Icons font is 37 | # included with your application, so that you can use the icons in 38 | # the material Icons class. 39 | uses-material-design: true 40 | 41 | # To add assets to your application, add an assets section, like this: 42 | assets: 43 | - assets/images/ 44 | -------------------------------------------------------------------------------- /lib/services/one_signal_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:onesignal_flutter/onesignal_flutter.dart'; 2 | 3 | class OneSignalService { 4 | static initializeOneSignal() { 5 | OneSignal.shared.init("1d4d027b-73b3-4af0-8381-87a4a6d06a27", iOSSettings: { 6 | OSiOSSettings.autoPrompt: false, 7 | OSiOSSettings.inAppLaunchUrl: false 8 | }); 9 | OneSignal.shared 10 | .setInFocusDisplayType(OSNotificationDisplayType.notification); 11 | } 12 | 13 | // call this function to schedule notification when an user registers for an event 14 | // parameters required: event name, event date, hoursBefore 15 | // will have to modify the function to accept event map once event registration is working 16 | 17 | static scheduleNotification( 18 | String eventName, DateTime eventDate, int hoursBefore) async { 19 | var status = await OneSignal.shared.getPermissionSubscriptionState(); 20 | var playerId = status.subscriptionStatus.userId; 21 | OneSignal.shared.postNotification( 22 | OSCreateNotification( 23 | playerIds: [playerId], 24 | heading: eventName, 25 | content: "Event starts in 4 hours!", 26 | sendAfter: eventDate.subtract(Duration(hours: hoursBefore)), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/components/my_cached_network_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:shimmer/shimmer.dart'; 4 | 5 | class MyCachedNetworkImage extends StatelessWidget { 6 | final String url; 7 | final double borderRadius; 8 | final double imageWidth; 9 | final double imageHeight; 10 | 11 | MyCachedNetworkImage({ 12 | @required this.url, 13 | this.borderRadius = 0, 14 | this.imageWidth, 15 | this.imageHeight, 16 | }); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return ClipRRect( 21 | borderRadius: BorderRadius.only( 22 | topLeft: Radius.circular(this.borderRadius), 23 | topRight: Radius.circular(this.borderRadius) 24 | ), 25 | child: CachedNetworkImage( 26 | height: this.imageHeight, 27 | width: this.imageWidth, 28 | imageUrl: this.url, 29 | fit: BoxFit.cover, 30 | placeholder: (context, _) => Shimmer.fromColors( 31 | child: Container(color: Colors.white, height: 250), 32 | baseColor: Colors.white, 33 | highlightColor: Colors.grey, 34 | ), 35 | errorWidget: (context, _, __) => Icon( 36 | Icons.error, 37 | color: Color(0xFF2F8D46), 38 | size: 50, 39 | ), 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | #### Issue Number 2 | ISSUE # 3 | 7 | 8 | #### Describe the changes you've made 9 | A clear and concise description of what you have done to successfully close your assigned issue. Any new files? or anything you feel to let us know! 10 | 11 | #### Describe if there is any unusual behaviour of your code(Write `NA` if there isn't) 12 | A clear and concise description of it. 13 | 14 | #### Additional context (OPTIONAL) 15 | Add any other context or screenshots about the feature request here. 16 | 17 | #### Test plan (OPTIONAL) 18 | A good test plan should give instructions that someone else can easily follow. 19 | How someone can test your code? 20 | 21 | #### Checklist 22 | 26 | - [ ] My code follows the code style of this project. 27 | - [ ] My change requires a change to the documentation. 28 | - [ ] I have updated the documentation accordingly. 29 | - [ ] I have read the **[CONTRIBUTING](https://github.com/GameofSource-GFG/Web-Development/blob/main/CONTRIBUTING.md)** document. 30 | - [ ] I have added tests to cover my changes. 31 | - [ ] All new and existing tests passed. 32 | - [ ] The title of my pull request is a short description of the requested changes. 33 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "479187269373", 4 | "firebase_url": "https://gfgscdb.firebaseio.com", 5 | "project_id": "gfgscdb", 6 | "storage_bucket": "gfgscdb.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:479187269373:android:7259f8e10f4c0acdedf094", 12 | "android_client_info": { 13 | "package_name": "com.gfg.our_gfg" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "479187269373-m985bc1kikpl3f95dvede48pbodg9rba.apps.googleusercontent.com", 19 | "client_type": 1, 20 | "android_info": { 21 | "package_name": "com.gfg.our_gfg", 22 | "certificate_hash": "bd6ea38864049253bc1575f522810fbcd68e8c6a" 23 | } 24 | }, 25 | { 26 | "client_id": "479187269373-fabggkcgcqe2a87uh138nsfnskuq7tc6.apps.googleusercontent.com", 27 | "client_type": 3 28 | } 29 | ], 30 | "api_key": [ 31 | { 32 | "current_key": "AIzaSyAJfI7BsbEiFs3sVNNYvsS2WhkBYqfk_pc" 33 | } 34 | ], 35 | "services": { 36 | "appinvite_service": { 37 | "other_platform_oauth_client": [ 38 | { 39 | "client_id": "479187269373-fabggkcgcqe2a87uh138nsfnskuq7tc6.apps.googleusercontent.com", 40 | "client_type": 3 41 | } 42 | ] 43 | } 44 | } 45 | } 46 | ], 47 | "configuration_version": "1" 48 | } -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]} -------------------------------------------------------------------------------- /lib/models/event.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:intl/intl.dart' show DateFormat; 4 | 5 | class Event { 6 | final String id; 7 | final String title; 8 | final String photoUrl; 9 | final String description; 10 | final String date; 11 | final String time; 12 | 13 | Event({ 14 | @required this.id, 15 | @required this.title, 16 | @required this.photoUrl, 17 | @required this.description, 18 | @required this.date, 19 | @required this.time, 20 | }); 21 | 22 | factory Event.fromDocumentSnapshot(DocumentSnapshot snapshot) { 23 | final Map data = snapshot.data(); 24 | final Map _displayDateAndTime = 25 | getDisplayDateAndTime(snapshot['timestamp'] as Timestamp); 26 | return Event( 27 | id: snapshot.id, 28 | photoUrl: data['url'] as String, 29 | description: data['description'] as String, 30 | date: _displayDateAndTime['displayDate'], 31 | time: _displayDateAndTime['displayTime'], 32 | title: data['title'] as String, 33 | ); 34 | } 35 | 36 | static Map getDisplayDateAndTime(Timestamp timestamp) { 37 | final DateTime dateTime = timestamp.toDate(); 38 | DateFormat formatter; 39 | String displayTime; 40 | String displayDate; 41 | 42 | formatter = DateFormat('h:mm a'); 43 | displayTime = formatter.format(dateTime); 44 | 45 | formatter = DateFormat('d MMMM yyyy'); 46 | displayDate = formatter.format(dateTime); 47 | 48 | return { 49 | 'displayTime': displayTime, 50 | 'displayDate': displayDate, 51 | }; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/services/firebase_storage_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | 3 | import '../models/event.dart'; 4 | import '../models/announcement.dart'; 5 | 6 | class FirebaseStorageService { 7 | FirebaseStorageService._(); 8 | 9 | static final FirebaseFirestore _firestore = FirebaseFirestore.instance; 10 | 11 | static Future> getUpcomingEvents() async { 12 | List _events = []; 13 | QuerySnapshot snapshot = await _firestore 14 | .collection("event-data") 15 | .where("finished", isEqualTo: false) 16 | .get(); 17 | for (QueryDocumentSnapshot docSnapshot in snapshot.docs) 18 | _events.add(Event.fromDocumentSnapshot(docSnapshot)); 19 | return _events; 20 | } 21 | 22 | static Future> getAnnouncements() async { 23 | List _announcements = []; 24 | QuerySnapshot snapshot = await _firestore.collection("announcements").get(); 25 | for (QueryDocumentSnapshot docSnapshot in snapshot.docs) 26 | _announcements.add(Announcement.fromDocumentSnapshot(docSnapshot)); 27 | return _announcements; 28 | } 29 | 30 | static Future contactFormHandler( 31 | String name, String email, String phoneNumber, String message) async { 32 | return _firestore.collection('contact-form-responses').add({ 33 | "name": name, 34 | "email": email, 35 | "phoneNumber": phoneNumber, 36 | "message": message 37 | }); 38 | } 39 | 40 | static Future subscribeToNewsletter(String email) async { 41 | return await _firestore.collection("newsletter").doc("users").set({ 42 | 'emails': FieldValue.arrayUnion([email]) 43 | }, SetOptions(merge: true)); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/components/announcement_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../models/announcement.dart'; 4 | 5 | class AnnouncementCard extends StatelessWidget { 6 | final Announcement announcement; 7 | 8 | AnnouncementCard(this.announcement); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Container( 13 | margin: EdgeInsets.all(5), 14 | padding: EdgeInsets.all(15), 15 | decoration: BoxDecoration( 16 | color: Colors.white, 17 | borderRadius: BorderRadius.circular(5), 18 | boxShadow: [BoxShadow(color: Colors.grey, blurRadius: 5)], 19 | ), 20 | child: Column( 21 | crossAxisAlignment: CrossAxisAlignment.start, 22 | children: [ 23 | SizedBox(height: 10), 24 | Text( 25 | announcement.title, 26 | maxLines: 1, 27 | overflow: TextOverflow.ellipsis, 28 | style: TextStyle( 29 | fontWeight: FontWeight.w700, 30 | fontSize: 22, 31 | ), 32 | ), 33 | SizedBox(height: 5), 34 | Text( 35 | announcement.description, 36 | maxLines: 3, 37 | softWrap: true, 38 | overflow: TextOverflow.ellipsis, 39 | style: TextStyle( 40 | fontSize: 15, 41 | ), 42 | ), 43 | SizedBox(height: 10), 44 | Row( 45 | children: [ 46 | Icon( 47 | Icons.access_time, 48 | color: Colors.green, 49 | ), 50 | Text(" "+announcement.relativeTime) 51 | ], 52 | 53 | ), 54 | ], 55 | ), 56 | ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | our_gfg 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | UIStatusBarHidden 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /lib/screens/upcoming_events_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../components/upcoming_event_card.dart'; 4 | import '../models/event.dart'; 5 | import '../services/firebase_storage_service.dart'; 6 | import '../widgets/CustomAppDrawer.dart'; 7 | 8 | class UpcomingEventsScreen extends StatefulWidget { 9 | static final String routeName = "/upcoming_events"; 10 | 11 | @override 12 | _UpcomingEventsScreenState createState() => _UpcomingEventsScreenState(); 13 | } 14 | 15 | class _UpcomingEventsScreenState extends State { 16 | Future> _upcomingEvents; 17 | 18 | @override 19 | void initState() { 20 | super.initState(); 21 | _upcomingEvents = FirebaseStorageService.getUpcomingEvents(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return SafeArea( 27 | child: Scaffold( 28 | drawer: CustomAppDrawer(), 29 | appBar: AppBar( 30 | title: Text("Upcoming Events"), 31 | ), 32 | body: FutureBuilder>( 33 | future: this._upcomingEvents, 34 | builder: (context, snapshot) { 35 | if (snapshot.hasError) { 36 | return Center( 37 | child: Icon( 38 | Icons.error, 39 | color: Color(0xFF2F8D46), 40 | )); 41 | } else if (snapshot.hasData) { 42 | return ListView.builder( 43 | physics: BouncingScrollPhysics(), 44 | padding: EdgeInsets.all(5), 45 | itemBuilder: (context, index) { 46 | return UpcomingEventCard(event: snapshot.data[index]); 47 | }, 48 | itemCount: snapshot.data.length, 49 | ); 50 | } else 51 | return Center(child: CircularProgressIndicator()); 52 | }, 53 | ), 54 | ), 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/screens/homepage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../services/firebase_storage_service.dart'; 4 | import '../components/announcement_card.dart'; 5 | import '../models/announcement.dart'; 6 | import '../widgets/CustomAppDrawer.dart'; 7 | 8 | class HomePage extends StatefulWidget { 9 | static final String routeName = "/home"; 10 | 11 | @override 12 | _HomePageState createState() => _HomePageState(); 13 | } 14 | 15 | class _HomePageState extends State { 16 | Future> _announcements; 17 | 18 | @override 19 | void initState() { 20 | super.initState(); 21 | _announcements = FirebaseStorageService.getAnnouncements(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return SafeArea( 27 | child: Scaffold( 28 | appBar: AppBar( 29 | title: Text("Announcements"), 30 | backgroundColor: Color(0xFF2F8D46), 31 | ), 32 | drawer: CustomAppDrawer(), 33 | body: FutureBuilder>( 34 | future: this._announcements, 35 | builder: (context, snapshot) { 36 | if (snapshot.hasError) { 37 | return Center( 38 | child: Icon( 39 | Icons.error, 40 | color: Color(0xFF2F8D46), 41 | ), 42 | ); 43 | } else if (snapshot.hasData) { 44 | return ListView.builder( 45 | physics: BouncingScrollPhysics(), 46 | itemBuilder: (context, index) { 47 | return AnnouncementCard(snapshot.data[index]); 48 | }, 49 | itemCount: snapshot.data.length, 50 | ); 51 | } else { 52 | return Center( 53 | child: CircularProgressIndicator(), 54 | ); 55 | } 56 | }, 57 | ), 58 | ), 59 | ); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_core/firebase_core.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import 'screens/LoginScreen.dart'; 5 | import 'screens/about_screen.dart'; 6 | import 'screens/contact_us_screen.dart'; 7 | import 'screens/homepage.dart'; 8 | import 'screens/members.dart'; 9 | import 'screens/mission.dart'; 10 | import 'screens/sign_up.dart'; 11 | import 'screens/social_media.dart'; 12 | import 'screens/upcoming_events_screen.dart'; 13 | import 'services/one_signal_service.dart'; 14 | import 'screens/EventRegistration.dart'; 15 | 16 | void main() async { 17 | WidgetsFlutterBinding.ensureInitialized(); 18 | await Firebase.initializeApp(); 19 | 20 | // to register the device with OneSignal 21 | OneSignalService.initializeOneSignal(); 22 | runApp(MyApp()); 23 | } 24 | 25 | class MyApp extends StatelessWidget { 26 | final kMainColor = Color(0xFF2F8D46); 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | return MaterialApp( 31 | debugShowCheckedModeBanner: false, 32 | theme: ThemeData( 33 | appBarTheme: AppBarTheme(color: kMainColor), 34 | accentColor: kMainColor, 35 | primaryColor: Colors.white, 36 | visualDensity: VisualDensity.adaptivePlatformDensity, 37 | ), 38 | routes: { 39 | About.routeName: (context) => About(), 40 | LoginScreen.routeName: (context) => LoginScreen(), 41 | Members.routeName: (context) => Members(), 42 | MissionAndVision.routeName: (context) => MissionAndVision(), 43 | SignUp.routeName: (context) => SignUp(), 44 | SocialMediaLinks.routeName: (context) => SocialMediaLinks(), 45 | UpcomingEventsScreen.routeName: (context) => UpcomingEventsScreen(), 46 | ContactUs.routeName: (context) => ContactUs(), 47 | EventRegistration.routeName: (context) => EventRegistration(), 48 | HomePage.routeName: (context) => HomePage(), 49 | }, 50 | home: LoginScreen(), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/components/my_text_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MyTextField extends StatelessWidget { 4 | final String labelText; 5 | final Function onChanged; 6 | final Function validator; 7 | final IconData prefixIconData; 8 | final TextInputType keyboardType; 9 | final bool enableMultilineText; 10 | final TextCapitalization textCapitalization; 11 | 12 | const MyTextField({ 13 | @required this.labelText, 14 | @required this.onChanged, 15 | @required this.validator, 16 | @required this.prefixIconData, 17 | this.keyboardType = TextInputType.text, 18 | this.enableMultilineText = false, 19 | this.textCapitalization = TextCapitalization.none, 20 | }); 21 | 22 | static final kBackgroundColor = const Color(0xFF2F8D46); 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Container( 27 | alignment: Alignment.center, 28 | padding: EdgeInsets.all(10), 29 | margin: EdgeInsets.all(10), 30 | decoration: BoxDecoration( 31 | color: kBackgroundColor, 32 | borderRadius: BorderRadius.circular(10), 33 | boxShadow: [ 34 | BoxShadow( 35 | color: kBackgroundColor.withOpacity(0.7), 36 | blurRadius: 10, 37 | offset: Offset(0, 5), 38 | ), 39 | ], 40 | ), 41 | child: TextFormField( 42 | validator: this.validator, 43 | keyboardType: this.keyboardType, 44 | textAlignVertical: TextAlignVertical.center, 45 | textCapitalization: this.textCapitalization, 46 | onChanged: this.onChanged, 47 | cursorColor: Colors.tealAccent, 48 | style: TextStyle(color: Colors.white), 49 | maxLines: this.enableMultilineText ? null : 1, 50 | decoration: InputDecoration( 51 | contentPadding: EdgeInsets.symmetric(horizontal: 10), 52 | prefixIcon: Icon( 53 | this.prefixIconData, 54 | size: 25, 55 | color: Colors.white, 56 | ), 57 | border: InputBorder.none, 58 | hintText: "Enter ${this.labelText}", 59 | hintStyle: TextStyle(color: Colors.white, fontSize: 15), 60 | ), 61 | ), 62 | ); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | buildscript { 25 | repositories { 26 | // ... 27 | maven { url 'https://plugins.gradle.org/m2/' } // Gradle Plugin Portal 28 | } 29 | dependencies { 30 | // ... 31 | // OneSignal-Gradle-Plugin 32 | classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.6, 0.99.99]' 33 | } 34 | } 35 | 36 | apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin' 37 | apply plugin: 'com.android.application' 38 | apply plugin: 'kotlin-android' 39 | apply plugin: 'com.google.gms.google-services' 40 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 41 | 42 | android { 43 | compileSdkVersion 29 44 | 45 | sourceSets { 46 | main.java.srcDirs += 'src/main/kotlin' 47 | } 48 | 49 | lintOptions { 50 | disable 'InvalidPackage' 51 | } 52 | 53 | defaultConfig { 54 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 55 | applicationId "com.gfg.our_gfg" 56 | minSdkVersion 21 57 | targetSdkVersion 29 58 | versionCode flutterVersionCode.toInteger() 59 | versionName flutterVersionName 60 | } 61 | 62 | buildTypes { 63 | release { 64 | // TODO: Add your own signing config for the release build. 65 | // Signing with the debug keys for now, so `flutter run --release` works. 66 | signingConfig signingConfigs.debug 67 | } 68 | } 69 | } 70 | 71 | flutter { 72 | source '../..' 73 | } 74 | 75 | dependencies { 76 | implementation platform('com.google.firebase:firebase-bom:25.12.0') 77 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 78 | implementation 'com.google.firebase:firebase-analytics' 79 | } 80 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 9 | 10 | 11 | 15 | 22 | 26 | 30 | 35 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /lib/components/upcoming_event_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../screens/EventRegistration.dart'; 4 | import 'my_cached_network_image.dart'; 5 | import '../models/event.dart'; 6 | 7 | class UpcomingEventCard extends StatelessWidget { 8 | final Event event; 9 | final Color _textColor = Colors.black; 10 | 11 | UpcomingEventCard({@required this.event}); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Container( 16 | margin: EdgeInsets.all(5), 17 | padding: EdgeInsets.all(15), 18 | decoration: BoxDecoration( 19 | color: Colors.white, 20 | borderRadius: BorderRadius.circular(5), 21 | boxShadow: [BoxShadow(color: Colors.grey, blurRadius: 5)], 22 | ), 23 | child: Column( 24 | crossAxisAlignment: CrossAxisAlignment.start, 25 | children: [ 26 | MyCachedNetworkImage( 27 | url: event.photoUrl, 28 | borderRadius: 5, 29 | imageWidth: double.infinity, 30 | imageHeight: 250, 31 | ), 32 | SizedBox(height: 10), 33 | Text( 34 | event.title, 35 | maxLines: 1, 36 | overflow: TextOverflow.ellipsis, 37 | style: TextStyle( 38 | fontWeight: FontWeight.w600, 39 | fontSize: 20, 40 | color: _textColor, 41 | ), 42 | ), 43 | SizedBox(height: 5), 44 | Text( 45 | event.description, 46 | maxLines: 3, 47 | softWrap: true, 48 | overflow: TextOverflow.ellipsis, 49 | style: TextStyle( 50 | color: _textColor.withOpacity(0.7), 51 | fontSize: 15, 52 | ), 53 | ), 54 | SizedBox(height: 5), 55 | RichText( 56 | text: TextSpan( 57 | style: TextStyle( 58 | color: _textColor.withOpacity(0.8), 59 | fontSize: 17, 60 | ), 61 | children: [ 62 | TextSpan( 63 | text: "Date : ", 64 | style: TextStyle( 65 | fontWeight: FontWeight.bold, color: Color(0xFF2F8D46)), 66 | ), 67 | TextSpan(text: event.date), 68 | ], 69 | ), 70 | ), 71 | SizedBox(height: 5), 72 | RichText( 73 | text: TextSpan( 74 | style: TextStyle( 75 | color: _textColor.withOpacity(0.8), 76 | fontSize: 17, 77 | ), 78 | children: [ 79 | TextSpan( 80 | text: "Time : ", 81 | style: TextStyle( 82 | fontWeight: FontWeight.bold, color: Color(0xFF2F8D46)), 83 | ), 84 | TextSpan(text: event.time), 85 | ], 86 | ), 87 | ), 88 | RaisedButton( 89 | child: Text('Register Now'), 90 | onPressed: () { 91 | Navigator.pushNamed(context, EventRegistration.routeName); 92 | }, 93 | ) 94 | ], 95 | ), 96 | ); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /lib/screens/members.dart: -------------------------------------------------------------------------------- 1 | //committee members page 2 | import 'package:flutter/material.dart'; 3 | import 'package:cloud_firestore/cloud_firestore.dart'; 4 | 5 | import '../models/individual_member.dart'; 6 | import '../models/members.dart'; 7 | import '../widgets/CustomAppDrawer.dart'; 8 | 9 | class Members extends StatefulWidget { 10 | static final String routeName = "/members"; 11 | 12 | @override 13 | _MembersState createState() => _MembersState(); 14 | } 15 | 16 | class _MembersState extends State { 17 | List _recordFromSnapshots(QuerySnapshot snapshot) { 18 | return snapshot.docs.map((doc) { 19 | return Member( 20 | speakerImage: doc.data()["speakerImage"] ?? "Not Available", 21 | speakerName: doc.data()["speakerName"] ?? "Not Available", 22 | speakerDesc: doc.data()["speakerDesc"] ?? "Not Available", 23 | speakerSession: doc.data()["speakerSession"] ?? "Not Available", 24 | fbUrl: doc.data()["fbUrl"] ?? "Not Available", 25 | githubUrl: doc.data()["githubUrl"] ?? "Not Available", 26 | linkedinUrl: doc.data()["linkedinUrl"] ?? "Not Available", 27 | twitterUrl: doc.data()["twitterUrl"] ?? "Not Available", 28 | instagramUrl: doc.data()["twitterUrl"] ?? "Not Available"); 29 | }).toList(); 30 | } 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | return Scaffold( 35 | drawer: CustomAppDrawer(), 36 | appBar: AppBar( 37 | title: Text( 38 | 'Members', 39 | ), 40 | centerTitle: true, 41 | ), 42 | body: StreamBuilder>( 43 | stream: FirebaseFirestore.instance 44 | .collection("members") 45 | .orderBy("speakerName") 46 | .snapshots() 47 | .map(_recordFromSnapshots), 48 | // ignore: missing_return 49 | builder: (context, snapshot) { 50 | switch (snapshot.connectionState) { 51 | case ConnectionState.active: 52 | { 53 | if (snapshot.hasData) { 54 | return Container( 55 | child: ListView.builder( 56 | itemBuilder: (context, i) { 57 | return IndividualMember(member: snapshot.data[i]); 58 | }, 59 | itemCount: snapshot.data.length, 60 | ), 61 | ); 62 | } 63 | if (snapshot.hasError) { 64 | return Center( 65 | child: Text(snapshot.error.toString()), 66 | ); 67 | } 68 | } 69 | break; 70 | case ConnectionState.none: 71 | return Center( 72 | child: Text("Nothing Happening"), 73 | ); 74 | break; 75 | case ConnectionState.waiting: 76 | return Center( 77 | child: CircularProgressIndicator(), 78 | ); 79 | break; 80 | case ConnectionState.done: 81 | return Center( 82 | child: Text("Connection Established"), 83 | ); 84 | break; 85 | default: 86 | return Center( 87 | child: CircularProgressIndicator(), 88 | ); 89 | } 90 | }, 91 | ), 92 | ); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Game Of Source Code of Conduct 2 | 3 | ## Pledge 4 | 5 | We as contributors and maintainers pledge to making participation in the project and our community a harassment-free and hassle-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Game of Source Standards 8 | 9 |

Acceptable Behaviour

10 | Contributors and maintainers must maintain a postive attire which includes: 11 | 12 | - Welcoming and inclusive language 13 | - Being respectful of differing viewpoints and experiences 14 | - Gracefully accepting constructive criticism 15 | - Focusing on what is best for the community 16 | - Showing empathy towards other community members 17 | 18 |

Unacceptable Behaviour:

19 | 20 | - The use of sexualized language or imagery and unwelcome sexual attention or 21 | advances 22 | - Trolling, insulting/derogatory comments, and personal or political attacks 23 | - Public or private harassment 24 | - Publishing others' private information, such as a physical or electronic 25 | address, without explicit permission 26 | - Other conduct which could reasonably be considered inappropriate in a 27 | professional setting 28 | 29 | These unacceptable behaviours once identified from contributors / members participation is hereby stand cancelled. 30 | 31 | ## Our Responsibilities 32 | 33 | Maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions 34 | that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 35 | 36 | ## Scope 37 | 38 | This Code of Conduct applies both within project spaces and in public spaces 39 | when an individual is representing the project or its community. Examples of 40 | representing a project or community include using an official project e-mail 41 | address, posting via an official social media account, or acting as an appointed 42 | representative at an online or offline event. Representation of a project may be 43 | further defined and clarified by project maintainers. 44 | 45 | ## Enforcement 46 | 47 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 48 | reported by contacting the project team at . All 49 | complaints will be reviewed and investigated and will result in a response that 50 | is deemed necessary and appropriate to the circumstances. The project team is 51 | obligated to maintain confidentiality with regard to the reporter of an incident. 52 | Further details of specific enforcement policies may be posted separately. 53 | 54 | Project maintainers who do not follow or enforce the Code of Conduct in good 55 | faith may face temporary or permanent repercussions as determined by other 56 | members of the project's leadership. 57 | 58 | ## Attribution 59 | 60 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 61 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 62 | 63 | [homepage]: https://www.contributor-covenant.org 64 | 65 | For answers to common questions about this code of conduct, see 66 | https://www.contributor-covenant.org/faq 67 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /lib/screens/about_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:animated_text_kit/animated_text_kit.dart'; 3 | import 'package:url_launcher/url_launcher.dart'; 4 | 5 | import '../widgets/CustomAppDrawer.dart'; 6 | 7 | class About extends StatelessWidget { 8 | static final String routeName = "/about"; 9 | 10 | Future urlLauncher(String url) async // function for launching url 11 | { 12 | if (await canLaunch(url)) { 13 | return await launch(url); 14 | } else { 15 | throw 'Cannot launch $url'; 16 | } 17 | } 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Scaffold( 22 | backgroundColor: Colors.white, 23 | appBar: AppBar( 24 | title: Text("About Us"), 25 | ), 26 | drawer: CustomAppDrawer(), 27 | body: SafeArea( 28 | child: SingleChildScrollView( 29 | child: Column(children: [ 30 | Container( 31 | margin: EdgeInsets.only(top: 20), 32 | child: Center( 33 | child: Text( 34 | 'GeeksForGeeks Student Chapter', 35 | textAlign: TextAlign.center, 36 | style: TextStyle( 37 | color: Color(0xFF2F8D46), 38 | fontSize: 30, 39 | fontWeight: FontWeight.bold), 40 | ), 41 | ), 42 | ), 43 | SizedBox( 44 | height: 10, 45 | ), 46 | Container( 47 | margin: EdgeInsets.only(top: 20), 48 | child: Center( 49 | child: CircleAvatar( 50 | backgroundColor: Color(0xFF2F8D46), 51 | radius: 70, 52 | child: CircleAvatar( 53 | backgroundImage: AssetImage('assets/images/logo.jpeg'), 54 | radius: 67, 55 | foregroundColor: Color(0xFF2F8D46), 56 | ), 57 | )), 58 | ), 59 | SizedBox( 60 | height: 20, 61 | ), 62 | Row( 63 | mainAxisAlignment: MainAxisAlignment.center, 64 | children: [ 65 | TypewriterAnimatedTextKit( 66 | text: ['About Us'], 67 | speed: Duration(milliseconds: 100), 68 | repeatForever: true, 69 | textStyle: TextStyle( 70 | color: Color(0xFF2F8D46), 71 | fontSize: 30, 72 | )), 73 | Icon( 74 | Icons.info, 75 | color: Color(0xFF2F8D46), 76 | size: 30, 77 | ), 78 | ], 79 | ), 80 | SizedBox( 81 | height: 20, 82 | ), 83 | Container( 84 | margin: EdgeInsets.only(left: 20, right: 20), 85 | child: Text( 86 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 87 | style: TextStyle(fontSize: 18), 88 | textAlign: TextAlign.start, 89 | )), 90 | SizedBox( 91 | height: 20, 92 | ), 93 | ]), 94 | ), 95 | ), 96 | ); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |

6 | 7 | 8 | 9 | PRs Welcome 10 | 11 | GitHub pull requests 12 | 13 | 14 | GitHub issues 15 | 16 | 17 | Github All Contributors 18 | 19 | Beginner Friendly 20 |

21 | 22 | 23 | Welcome to GameofSource Mobile Application Development Arena. 24 | 25 |

About Event

26 | Game of Source is a Open-Source Contribution event being organized by GeeksForGeeks and its student chapters across PAN India. 27 | The event is going to witness the participation from students of over 100+ colleges in various cities and will provide a plethora of opportunities to budding developers to directly learn from the domain experts and try their hands on practical execution of events in this celebration of learning. 28 | 29 |

What participants must do

30 | Participants will be given an issue as a feature to develop in the web development template. Issues will be opened in github repository at a time specified earlier in the whatsapp group. Once going through the issues published participants must request the issue to be assigned to them. We check the participants github when there are many requests and assign an issue to a single participant only. Once assigned participants must solve that issue within 48 hours and make a pull request to repository from the branch. Our repo maintainers will go through the pull request thoroughly and can merge once satisfied all the rules mentioned in CONTRIBUTING.md file. If a participant is failed to make pull request and didn't show any prorgress on that issue within 24 hours, the issue will be cancelled and we assign that issue to another participant. 31 | 32 | Participants will be given an issue as a feature to develop in the ios and android application template. Issues will be opened in github repository at a time specified earlier in the slack channel. Once going through that issue participants must request the issue to be assigned to them. Once assigned participants must solve that issue within two days and make a push request to repository as a branch. Our event handlers will go through the pull request thoroughly and can merge once satisfied all the rules mentioned in CONTRIBUTING.md file. 33 | 34 |

Important Resources

35 | Guide to Fork A repository : Click Here
36 | Guide to make a Pull request: Click Here
37 | 38 |

Contact Us

39 | All the participant queries will be resolved in whatsapp group. 40 | Link to join https://chat.whatsapp.com/L9QKq3rqJKE3BfAV1yfFz4 41 | -------------------------------------------------------------------------------- /lib/screens/social_media.dart: -------------------------------------------------------------------------------- 1 | // page for social media links of geeks for geeks 2 | import 'package:flutter/material.dart'; 3 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 4 | import 'package:url_launcher/url_launcher.dart'; 5 | 6 | import '../widgets/CustomAppDrawer.dart'; 7 | 8 | class SocialMediaLinks extends StatefulWidget { 9 | static final String routeName = "/socialmedia"; 10 | 11 | @override 12 | _SocialMediaLinksState createState() => _SocialMediaLinksState(); 13 | } 14 | 15 | class _SocialMediaLinksState extends State { 16 | //urls for gfg different social media 17 | String fburl = "https://www.facebook.com/geeksforgeeks.org/"; 18 | String websiteurl = "https://www.geeksforgeeks.org/"; 19 | String twitterUrl = "https://twitter.com/geeksforgeeks"; 20 | String linkedinUrl = "https://www.linkedin.com/company/geeksforgeeks/"; 21 | String youtubeUrl = "https://www.youtube.com/geeksforgeeksvideos"; 22 | String instagramUrl = "https://www.instagram.com/geeks_for_geeks/"; 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Scaffold( 27 | drawer: CustomAppDrawer(), 28 | appBar: AppBar( 29 | title: Text('GFG Social media'), 30 | centerTitle: true, 31 | ), 32 | body: Center( 33 | child: FittedBox( 34 | child: Row( 35 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 36 | children: [ 37 | if (fburl != null) 38 | IconButton( 39 | icon: Icon( 40 | FontAwesomeIcons.facebookF, 41 | size: 20, 42 | ), 43 | onPressed: () { 44 | launch(fburl); 45 | }, 46 | ), 47 | if (instagramUrl != null) 48 | IconButton( 49 | icon: Icon( 50 | FontAwesomeIcons.instagram, 51 | size: 20, 52 | ), 53 | onPressed: () { 54 | launch(instagramUrl); 55 | }, 56 | ), 57 | if (twitterUrl != null) 58 | IconButton( 59 | icon: Icon( 60 | FontAwesomeIcons.twitter, 61 | size: 20, 62 | ), 63 | onPressed: () { 64 | launch(twitterUrl); 65 | }, 66 | ), 67 | if (linkedinUrl != null) 68 | IconButton( 69 | icon: Icon( 70 | FontAwesomeIcons.linkedinIn, 71 | size: 20, 72 | ), 73 | onPressed: () { 74 | launch(linkedinUrl); 75 | }, 76 | ), 77 | if (youtubeUrl != null) 78 | IconButton( 79 | icon: Icon( 80 | FontAwesomeIcons.youtube, 81 | size: 20, 82 | ), 83 | onPressed: () { 84 | launch(youtubeUrl); 85 | }, 86 | ), 87 | if (websiteurl != null) 88 | IconButton( 89 | icon: Icon( 90 | FontAwesomeIcons.chrome, 91 | size: 20, 92 | ), 93 | onPressed: () { 94 | launch(websiteurl); 95 | }, 96 | ) 97 | //in case of null 98 | else 99 | IconButton( 100 | icon: Icon( 101 | FontAwesomeIcons.question, 102 | size: 20, 103 | ), 104 | onPressed: () { 105 | CircularProgressIndicator(); 106 | }, 107 | ), 108 | ], 109 | ), 110 | ), 111 | ), 112 | ); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /lib/screens/mission.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:animated_text_kit/animated_text_kit.dart'; 3 | 4 | import '../widgets/CustomAppDrawer.dart'; 5 | 6 | class MissionAndVision extends StatefulWidget { 7 | static final String routeName = "/mission"; 8 | 9 | @override 10 | _MissionAndVisionState createState() => _MissionAndVisionState(); 11 | } 12 | 13 | class _MissionAndVisionState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | drawer: CustomAppDrawer(), 18 | appBar: AppBar( 19 | title: Text( 20 | "Mission & Vision", 21 | ), 22 | centerTitle: true, 23 | ), 24 | body: SingleChildScrollView( 25 | child: Container( 26 | child: Column( 27 | children: [ 28 | SizedBox( 29 | height: 20.0, 30 | ), 31 | SizedBox( 32 | height: 80.0, 33 | child: TextLiquidFill( 34 | text: 'Mission Of GFG', 35 | waveColor: Colors.white, 36 | boxBackgroundColor: Color.fromRGBO(128, 199, 131, 1), 37 | textStyle: TextStyle( 38 | fontSize: 40.0, 39 | fontWeight: FontWeight.bold, 40 | ), 41 | boxHeight: 80.0, 42 | ), 43 | ), 44 | SizedBox( 45 | height: 550.0, 46 | child: Padding( 47 | padding: EdgeInsets.all(20.0), 48 | child: Text( 49 | "With the idea ofg imparting programming knowledge, Mr. Sandeep Jain, an IIT Roorkee alumnus started a dream, GeeksforGeeks. Whether programming excites you or you feel stifled, wondering how to prepare for interview questions or how to ace data structures and algorithms, GeeksforGeeks is a one-stop solution. With every tick of time, we are adding arrows in our quiver. From articles on various computer science subjects to programming problems for practice, from basic to premium courses, from technologies to entrance examinations, we have been building ample content with superior quality.", 50 | style: TextStyle( 51 | fontSize: 22.0, 52 | color: Colors.black, 53 | ), 54 | ), 55 | ), 56 | ), 57 | SizedBox( 58 | height: 20.0, 59 | ), 60 | SizedBox( 61 | height: 80.0, 62 | child: TextLiquidFill( 63 | text: 'Vision Of GFG', 64 | waveColor: Colors.white, 65 | boxBackgroundColor: Color.fromRGBO(128, 199, 131, 1), 66 | textStyle: TextStyle( 67 | fontSize: 40.0, 68 | fontWeight: FontWeight.bold, 69 | ), 70 | boxHeight: 80.0, 71 | ), 72 | ), 73 | SizedBox( 74 | height: 550.0, 75 | child: Padding( 76 | padding: EdgeInsets.all(20.0), 77 | child: Text( 78 | "Lorem ipsum is a pseudo-Latin text used in web design, typography, layout, and printing in place of English to emphasise design elements over content. It's also called placeholder (or filler) text. It's a convenient tool for mock-ups. It helps to outline the visual elements of a document or presentation, eg typography, font, or layout. Lorem ipsum is mostly a part of a Latin text by the classical author and philosopher Cicero. Its words and letters have been changed by addition or removal, so to deliberately render its content nonsensical; it's not genuine, correct, or comprehensible Latin anymore.", 79 | style: TextStyle( 80 | fontSize: 22.0, 81 | color: Colors.black, 82 | ), 83 | ), 84 | ), 85 | ), 86 | ], 87 | ), 88 | ), 89 | ), 90 | ); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /lib/screens/contact_us_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:fluttertoast/fluttertoast.dart'; 3 | 4 | import '../components/embedded_map.dart'; 5 | import '../services/firebase_storage_service.dart'; 6 | import '../components/my_text_field.dart'; 7 | import '../widgets/CustomAppDrawer.dart'; 8 | 9 | // ignore: must_be_immutable 10 | class ContactUs extends StatelessWidget { 11 | static final String routeName = "/contact_us"; 12 | 13 | final GlobalKey _formKey = GlobalKey(); 14 | 15 | String _name, _email, _phone, _message; 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return SafeArea( 20 | child: Scaffold( 21 | drawer: CustomAppDrawer(), 22 | appBar: AppBar( 23 | title: Text("Contact Us"), 24 | backgroundColor: Color(0xFF2F8D46), 25 | actions: [ 26 | // submit form button 27 | IconButton( 28 | icon: Icon(Icons.send), 29 | onPressed: () { 30 | if (_formKey.currentState.validate()) { 31 | FirebaseStorageService.contactFormHandler( 32 | _name, _email, _phone, _message) 33 | .then((value) { 34 | _formKey.currentState.reset(); 35 | Fluttertoast.showToast( 36 | backgroundColor: Color(0xFF2F8D46), 37 | msg: "Your response has been recorded!"); 38 | }).catchError((error) { 39 | print(error); 40 | }); 41 | } else { 42 | Fluttertoast.showToast( 43 | msg: "Please enter valid data!", 44 | backgroundColor: Color(0xFF2F8D46)); 45 | } 46 | }), 47 | ], 48 | ), 49 | body: Form( 50 | key: _formKey, 51 | child: ListView( 52 | physics: BouncingScrollPhysics(), 53 | children: [ 54 | MyTextField( 55 | labelText: "Name", 56 | onChanged: (String name) => _name = name, 57 | textCapitalization: TextCapitalization.words, 58 | validator: (String value) { 59 | if (value == null || value.trim() == "") 60 | return "Please enter your name"; 61 | }, 62 | prefixIconData: Icons.person, 63 | ), 64 | MyTextField( 65 | labelText: "Email", 66 | onChanged: (String email) => _email = email, 67 | keyboardType: TextInputType.emailAddress, 68 | validator: (String value) { 69 | if (value == null || value.trim() == "") 70 | return "Please enter an email address"; 71 | else if (!(value.contains("@") && value.contains("."))) 72 | return "Please enter a valid email address"; 73 | }, 74 | prefixIconData: Icons.alternate_email, 75 | ), 76 | MyTextField( 77 | labelText: "Phone", 78 | onChanged: (String phone) => _phone = phone, 79 | keyboardType: TextInputType.phone, 80 | validator: (String value) { 81 | if (value == null || value.trim() == "") 82 | return "Please enter your phone number"; 83 | }, 84 | prefixIconData: Icons.phone, 85 | ), 86 | MyTextField( 87 | labelText: "Message", 88 | onChanged: (String message) => _message = message, 89 | textCapitalization: TextCapitalization.sentences, 90 | validator: (String value) { 91 | if (value == null || value.trim() == "") 92 | return "Please enter the message"; 93 | }, 94 | enableMultilineText: true, 95 | prefixIconData: Icons.message, 96 | ), 97 | SizedBox( 98 | height: 20.0, 99 | ), 100 | Column( 101 | children: [ 102 | EmbeddedMap(), 103 | ], 104 | ) 105 | ], 106 | ), 107 | ), 108 | ), 109 | ); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /lib/screens/EventRegistration.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:our_gfg/models/event.dart'; 4 | import 'package:our_gfg/services/firebase_storage_service.dart'; 5 | 6 | import '../widgets/CustomAppDrawer.dart'; 7 | 8 | class EventRegistration extends StatefulWidget { 9 | static final String routeName = "/event_registration"; 10 | @override 11 | _EventRegistrationState createState() => _EventRegistrationState(); 12 | } 13 | 14 | class _EventRegistrationState extends State { 15 | TextEditingController name = TextEditingController(); 16 | TextEditingController usn = TextEditingController(); 17 | TextEditingController email = TextEditingController(); 18 | TextEditingController event = TextEditingController(); 19 | final _formKey = GlobalKey(); 20 | 21 | String dropDownHint = 'Select Event'; 22 | List eventList = []; 23 | 24 | @override 25 | void initState() { 26 | fetchEvents(); 27 | super.initState(); 28 | } 29 | 30 | void fetchEvents() async { 31 | List event = await FirebaseStorageService.getUpcomingEvents(); 32 | setState(() { 33 | for (Event i in event) { 34 | eventList.add(i.title); 35 | } 36 | }); 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | return Scaffold( 42 | appBar: AppBar( 43 | title: Text( 44 | "Register", 45 | style: TextStyle(fontSize: null), 46 | ), 47 | ), 48 | drawer: CustomAppDrawer(), 49 | body: SafeArea( 50 | top: false, 51 | bottom: false, 52 | child: Form( 53 | key: _formKey, 54 | child: ListView( 55 | padding: const EdgeInsets.symmetric(horizontal: 16.0), 56 | children: [ 57 | Divider(), 58 | TextFormField( 59 | decoration: const InputDecoration( 60 | border: OutlineInputBorder(), 61 | prefixIcon: const Icon(Icons.person), 62 | hintText: 'Enter your first and last name', 63 | labelText: 'Name', 64 | ), 65 | controller: name, 66 | ), 67 | TextFormField( 68 | decoration: const InputDecoration( 69 | border: OutlineInputBorder(), 70 | prefixIcon: const Icon(Icons.carpenter_rounded), 71 | hintText: 'Enter your USN', 72 | labelText: 'USN', 73 | ), 74 | controller: usn, 75 | ), 76 | TextFormField( 77 | decoration: const InputDecoration( 78 | border: OutlineInputBorder(), 79 | prefixIcon: const Icon(Icons.email), 80 | hintText: 'Enter a email address', 81 | labelText: 'Email', 82 | ), 83 | controller: email, 84 | keyboardType: TextInputType.emailAddress, 85 | ), 86 | DropdownButton( 87 | hint: Text( 88 | dropDownHint, 89 | style: TextStyle( 90 | color: Colors.grey, 91 | ), 92 | ), 93 | items: eventList.map((String value) { 94 | return DropdownMenuItem( 95 | value: value, 96 | child: Text(value), 97 | ); 98 | }).toList(), 99 | onChanged: (val) { 100 | setState(() { 101 | dropDownHint = val; 102 | }); 103 | }, 104 | ), 105 | Container( 106 | padding: const EdgeInsets.only(left: 40.0, top: 20.0), 107 | child: RaisedButton( 108 | child: const Text('Submit'), 109 | onPressed: () async { 110 | await FirebaseFirestore.instance 111 | .collection('EventRegistration') 112 | .add({ 113 | 'Name': name.text, 114 | 'usn': usn.text, 115 | 'email': email.text, 116 | 'event': event.text 117 | }).then( 118 | (value) { 119 | Navigator.of(context).pop(); 120 | }, 121 | ); 122 | }, 123 | ), 124 | ), 125 | ], 126 | ), 127 | ), 128 | ), 129 | ); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /lib/components/newsletter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:fluttertoast/fluttertoast.dart'; 3 | 4 | import '../services/firebase_storage_service.dart'; 5 | 6 | class Newsletter extends StatefulWidget { 7 | @override 8 | _NewsletterState createState() => _NewsletterState(); 9 | } 10 | 11 | class _NewsletterState extends State { 12 | final _formKey = GlobalKey(); 13 | 14 | final TextEditingController _emailController = TextEditingController(); 15 | 16 | @override 17 | void dispose() { 18 | super.dispose(); 19 | _emailController.dispose(); 20 | } 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Container( 25 | alignment: Alignment.center, 26 | color: Color.fromRGBO(47, 141, 70, 1), 27 | child: Container( 28 | height: 300, 29 | child: Card( 30 | elevation: 18.0, 31 | shape: RoundedRectangleBorder( 32 | borderRadius: BorderRadius.circular(58.0), 33 | ), 34 | child: Padding( 35 | padding: EdgeInsets.all(8.8), 36 | child: Center( 37 | child: Column( 38 | children: [ 39 | SizedBox( 40 | height: 12.0, 41 | ), 42 | Text( 43 | "Join Our Newsletter", 44 | style: TextStyle( 45 | color: Color.fromRGBO(47, 141, 70, 1), 46 | fontSize: 25.0, 47 | fontWeight: FontWeight.bold, 48 | ), 49 | textAlign: TextAlign.center, 50 | ), 51 | SizedBox( 52 | height: 12.0, 53 | ), 54 | Text( 55 | "Be one of the first to be notified when\nwe have an update...", 56 | style: TextStyle( 57 | color: Color.fromRGBO(47, 141, 70, 1), 58 | fontSize: 18.0, 59 | ), 60 | textAlign: TextAlign.center, 61 | ), 62 | SizedBox(height: 12), 63 | Form( 64 | key: _formKey, 65 | child: Column( 66 | // crossAxisAlignment: CrossAxisAlignment.start, 67 | children: [ 68 | TextFormField( 69 | decoration: const InputDecoration( 70 | hintText: 'Enter your email', 71 | ), 72 | controller: _emailController, 73 | validator: (String value) { 74 | String pattern = 75 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; 76 | RegExp regExp = new RegExp(pattern); 77 | if (value.length == 0) { 78 | return "Email is Required"; 79 | } else if (!regExp.hasMatch(value)) { 80 | return "Invalid Email"; 81 | } else { 82 | return null; 83 | } 84 | }), 85 | Padding( 86 | padding: const EdgeInsets.all(15), 87 | child: Center( 88 | child: RaisedButton( 89 | color: Color.fromRGBO(47, 141, 70, 1), 90 | onPressed: () async { 91 | if (_formKey.currentState.validate()) { 92 | try { 93 | await FirebaseStorageService 94 | .subscribeToNewsletter( 95 | _emailController.text?.trim()); 96 | _emailController.clear(); 97 | Fluttertoast.showToast( 98 | msg: "Subscribed successfully"); 99 | } catch (e) { 100 | Fluttertoast.showToast( 101 | msg: 102 | "An error occurred. Please try again later"); 103 | } 104 | } 105 | }, 106 | child: Text( 107 | 'Subscribe', 108 | style: TextStyle( 109 | color: Colors.white, 110 | fontSize: 18, 111 | ), 112 | ), 113 | ), 114 | ), 115 | ), 116 | ], 117 | ), 118 | ), 119 | SizedBox( 120 | height: 12, 121 | ), 122 | ], 123 | ), 124 | ), 125 | ), 126 | ), 127 | ), 128 | ); 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /lib/models/individual_member.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | import 'package:cached_network_image/cached_network_image.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 6 | import 'package:url_launcher/url_launcher.dart'; 7 | 8 | import '../utils/tools.dart'; 9 | import 'members.dart'; 10 | 11 | class IndividualMember extends StatelessWidget { 12 | final Member member; 13 | 14 | const IndividualMember({Key key, this.member}) : super(key: key); 15 | @override 16 | Widget build(BuildContext context) { 17 | return Card( 18 | elevation: 0.0, 19 | child: Padding( 20 | padding: const EdgeInsets.all(12.0), 21 | child: Row( 22 | mainAxisSize: MainAxisSize.min, 23 | children: [ 24 | ConstrainedBox( 25 | constraints: BoxConstraints.expand( 26 | height: MediaQuery.of(context).size.height * 0.2, 27 | width: MediaQuery.of(context).size.width * 0.3, 28 | ), 29 | child: 30 | (member.speakerImage == "" || member.speakerImage == null) 31 | ? FittedBox( 32 | fit: BoxFit.contain, 33 | child: Icon( 34 | Icons.account_circle, 35 | color: Colors.green, 36 | ), 37 | ) 38 | : CachedNetworkImage( 39 | imageUrl: member.speakerImage ?? "", 40 | imageBuilder: (context, imageProvider) => Container( 41 | decoration: BoxDecoration( 42 | image: DecorationImage( 43 | image: imageProvider, 44 | fit: BoxFit.cover, 45 | ), 46 | ), 47 | ), 48 | progressIndicatorBuilder: 49 | (context, url, downloadProgress) => 50 | CircularProgressIndicator( 51 | value: downloadProgress.progress), 52 | errorWidget: (context, url, error) { 53 | print(error.toString()); 54 | return FittedBox( 55 | fit: BoxFit.contain, 56 | child: Icon( 57 | Icons.error, 58 | color: Colors.red, 59 | ), 60 | ); 61 | })), 62 | SizedBox( 63 | width: 20, 64 | ), 65 | Expanded( 66 | child: Column( 67 | crossAxisAlignment: CrossAxisAlignment.start, 68 | mainAxisAlignment: MainAxisAlignment.start, 69 | mainAxisSize: MainAxisSize.min, 70 | children: [ 71 | Column( 72 | crossAxisAlignment: CrossAxisAlignment.start, 73 | mainAxisSize: MainAxisSize.min, 74 | children: [ 75 | Text( 76 | member.speakerName, 77 | style: Theme.of(context).textTheme.headline6, 78 | ), 79 | SizedBox( 80 | height: 5, 81 | ), 82 | AnimatedContainer( 83 | duration: Duration(seconds: 1), 84 | width: MediaQuery.of(context).size.width * 0.2, 85 | height: 5, 86 | color: Tools.multiColors[Random().nextInt(4)], 87 | ), 88 | ], 89 | ), 90 | SizedBox( 91 | height: 10, 92 | ), 93 | Text(member.speakerDesc, 94 | style: Theme.of(context).textTheme.headline6), 95 | SizedBox( 96 | height: 10, 97 | ), 98 | Text( 99 | member.speakerSession, 100 | style: Theme.of(context).textTheme.caption, 101 | ), 102 | socialActions(context, member), 103 | ], 104 | ), 105 | ) 106 | ], 107 | ), 108 | ), 109 | ); 110 | } 111 | } 112 | 113 | Widget socialActions(context, Member developers) => FittedBox( 114 | child: Row( 115 | // mainAxisAlignment: MainAxisAlignment.spaceBetween, 116 | children: [ 117 | if (developers.fbUrl != null) 118 | IconButton( 119 | icon: Icon( 120 | FontAwesomeIcons.facebookF, 121 | size: 15, 122 | ), 123 | onPressed: () { 124 | launch(developers.fbUrl); 125 | }, 126 | ), 127 | if (developers.instagramUrl != null) 128 | IconButton( 129 | icon: Icon( 130 | FontAwesomeIcons.instagram, 131 | size: 15, 132 | ), 133 | onPressed: () { 134 | launch(developers.instagramUrl); 135 | }, 136 | ), 137 | if (developers.twitterUrl != null) 138 | IconButton( 139 | icon: Icon( 140 | FontAwesomeIcons.twitter, 141 | size: 15, 142 | ), 143 | onPressed: () { 144 | launch(developers.twitterUrl); 145 | }, 146 | ), 147 | if (developers.githubUrl != null) 148 | IconButton( 149 | icon: Icon( 150 | FontAwesomeIcons.github, 151 | size: 15, 152 | ), 153 | onPressed: () { 154 | launch(developers.githubUrl); 155 | }, 156 | ), 157 | if (developers.linkedinUrl != null) 158 | IconButton( 159 | icon: Icon( 160 | FontAwesomeIcons.linkedin, 161 | size: 15, 162 | ), 163 | onPressed: () { 164 | launch(developers.linkedinUrl); 165 | }, 166 | ) 167 | ], 168 | ), 169 | ); 170 | -------------------------------------------------------------------------------- /lib/widgets/CustomAppDrawer.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:fluttertoast/fluttertoast.dart'; 4 | import 'package:share/share.dart'; 5 | 6 | import '../screens/EventRegistration.dart'; 7 | import '../screens/contact_us_screen.dart'; 8 | import '../screens/homepage.dart'; 9 | import '../screens/LoginScreen.dart'; 10 | import '../screens/about_screen.dart'; 11 | import '../screens/members.dart'; 12 | import '../screens/upcoming_events_screen.dart'; 13 | import '../services/firebase_auth_service.dart'; 14 | 15 | class CustomAppDrawer extends StatefulWidget { 16 | @override 17 | _CustomAppDrawerState createState() => _CustomAppDrawerState(); 18 | } 19 | 20 | class _CustomAppDrawerState extends State { 21 | String email,name,googlename,firestorename; 22 | @override 23 | void initState() { 24 | getEmail(); 25 | super.initState(); 26 | } 27 | getEmail()async{ 28 | email = FirebaseAuth.instance.currentUser.email; 29 | } 30 | 31 | @override 32 | Widget build(BuildContext context) { 33 | return Drawer( 34 | child: Container( 35 | child: ListView(children: [ 36 | DrawerHeader( 37 | margin: EdgeInsets.symmetric(vertical: 0, horizontal: 2.5), 38 | decoration: BoxDecoration( 39 | image: DecorationImage( 40 | image: AssetImage("assets/images/logo.jpeg"), 41 | fit: BoxFit.cover)), 42 | child: null, 43 | ), 44 | ListTile( 45 | leading: Icon(Icons.person,color: Color.fromRGBO(47, 141, 70, 1),), 46 | title: Text(email), 47 | ), 48 | InkWell( 49 | onTap: () { 50 | Navigator.pushNamed(context, HomePage.routeName); 51 | }, 52 | child: ListTile( 53 | title: Text( 54 | "Home", 55 | ), 56 | // style: TextStyle(color: Colors.white), 57 | leading: Icon( 58 | Icons.home, 59 | color: Color.fromRGBO(47, 141, 70, 1), 60 | ), 61 | ), 62 | ), 63 | Divider( 64 | color: Color.fromRGBO(47, 141, 70, 1), 65 | ), 66 | InkWell( 67 | onTap: () { 68 | Navigator.pushNamed(context, About.routeName); 69 | }, 70 | child: ListTile( 71 | title: Text( 72 | "About Us", 73 | ), 74 | leading: Icon( 75 | Icons.info, 76 | color: Color.fromRGBO(47, 141, 70, 1), 77 | ), 78 | ), 79 | ), 80 | Divider( 81 | color: Color.fromRGBO(47, 141, 70, 1), 82 | ), 83 | InkWell( 84 | onTap: () { 85 | Navigator.pushNamed(context, Members.routeName); 86 | }, 87 | child: ListTile( 88 | title: Text( 89 | "Team", 90 | ), 91 | leading: Icon( 92 | Icons.group, 93 | color: Color.fromRGBO(47, 141, 70, 1), 94 | ), 95 | ), 96 | ), 97 | Divider( 98 | color: Color.fromRGBO(47, 141, 70, 1), 99 | ), 100 | InkWell( 101 | onTap: () { 102 | Navigator.pushNamed(context, UpcomingEventsScreen.routeName); 103 | }, 104 | child: ListTile( 105 | title: Text( 106 | "Events", 107 | ), 108 | leading: Icon( 109 | Icons.event, 110 | color: Color.fromRGBO(47, 141, 70, 1), 111 | ), 112 | ), 113 | ), 114 | Divider( 115 | color: Color.fromRGBO(47, 141, 70, 1), 116 | ), 117 | InkWell( 118 | onTap: () { 119 | Navigator.pushNamed(context, EventRegistration.routeName); 120 | }, 121 | child: ListTile( 122 | title: Text( 123 | "Register", 124 | ), 125 | leading: Icon( 126 | Icons.app_registration, 127 | color: Color.fromRGBO(47, 141, 70, 1), 128 | ), 129 | ), 130 | ), 131 | Divider( 132 | color: Color.fromRGBO(47, 141, 70, 1), 133 | ), 134 | InkWell( 135 | onTap: () { 136 | Navigator.pushNamed(context, ContactUs.routeName); 137 | }, 138 | child: ListTile( 139 | title: Text( 140 | "Contact Us", 141 | ), 142 | leading: Icon( 143 | Icons.contact_page, 144 | color: Color.fromRGBO(47, 141, 70, 1), 145 | ), 146 | ), 147 | ), 148 | Divider( 149 | color: Color.fromRGBO(47, 141, 70, 1), 150 | ), 151 | InkWell( 152 | onTap: () { 153 | Share.share('Find *Our GFG* app here, \n\n' 154 | 'Step 1: Visit https://github.com/GameofSource-GFG/Android-Development \n' 155 | 'Step 2: Click on ```Actions``` \n' 156 | 'Step 3: In the workflows listed, click on the latest workflow \n' 157 | 'Step 4: Download the ```release-apk``` present under the heading *Artifacts*'); 158 | }, 159 | child: ListTile( 160 | title: Text( 161 | "Share", 162 | ), 163 | leading: Icon( 164 | Icons.share, 165 | color: Color.fromRGBO(47, 141, 70, 1), 166 | ), 167 | ), 168 | ), 169 | Divider( 170 | color: Color.fromRGBO(47, 141, 70, 1), 171 | ), 172 | InkWell( 173 | onTap: () async { 174 | await FirebaseAuthService.logoutUser(); 175 | Navigator.pushNamedAndRemoveUntil( 176 | context, 177 | LoginScreen.routeName, 178 | (route) => false, 179 | ); 180 | Fluttertoast.showToast(msg: "Logged out successfully"); 181 | }, 182 | child: ListTile( 183 | title: Text( 184 | "Logout", 185 | ), 186 | leading: Icon( 187 | Icons.logout, 188 | color: Color.fromRGBO(47, 141, 70, 1), 189 | ), 190 | ), 191 | ), 192 | ]), 193 | ), 194 | ); 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Guidelines 4 | 5 | - Issues will be assigned on a first come, first serve basis. You just have to comment on the issue, asking to be assigned, and it will be done if found fit. 6 | - Preferably, you cannot work on any issue that is not assigned to you. 7 | - In case you want to submit an improvement to an existing feature or section, we prefer that you notify us in suggested medium of contact, describing in details your improvement. This will help others to analyze your contribution. 8 | - All PRs must be made from a Branch. Create a separate branch for every Issue you are working upon and once found fit, make a PR. 9 | - If you have no idea what are [issues](https://docs.github.com/en/free-pro-team@latest/github/managing-your-work-on-github/about-issues) or [PR](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-requests)s, please do refer to the links. 10 | 11 | **Make sure your code works before submitting it :D** 12 | 13 |
14 | 15 | 16 |

Set it up locally

17 |
18 | 19 | ### Fork it 20 | 21 | You can get your own fork/copy of this project by using the Fork button. 22 | 23 | ![Fork Button](https://help.github.com/assets/images/help/repository/fork_button.jpg) 24 | 25 | ### Clone it 26 | 27 | You need to clone (download) it to local machine using 28 | 29 | ```sh 30 | $ git clone https://github.com//Android-Development.git 31 | ``` 32 | 33 | Once you have cloned the repository, move to that folder first using `cd` command. 34 | 35 | ```sh 36 | $ cd Android-Development 37 | ``` 38 | 39 | Move to this folder for all other commands. 40 | 41 | ### Set it up 42 | 43 | Run the following commands to see that _your local copy_ has a reference to _your forked remote repository_ in Github :octocat: 44 | 45 | ```sh 46 | $ git remote -v 47 | origin https://github.com//Android-Development.git (fetch) 48 | origin https://github.com//Android-Development.git (push) 49 | ``` 50 | 51 | Now, lets add a reference to the original [Android-Development](https://github.com/GameofSource-GFG/Android-Development) repository using 52 | 53 | ```sh 54 | $ git remote add upstream https://github.com/GameofSource-GFG/Android-Development.git 55 | ``` 56 | 57 | > This adds a new remote named **_upstream_**. 58 | 59 | Verify the changes using 60 | 61 | ```sh 62 | $ git remote -v 63 | origin https://github.com//Android-Development.git (fetch) 64 | origin https://github.com//Android-Development.git (push) 65 | upstream https://github.com/GameofSource-GFG/Android-Development.git (fetch) 66 | upstream https://github.com/GameofSource-GFG/Android-Development.git (push) 67 | ``` 68 | 69 | ### Sync it 70 | 71 | **Always keep your local copy of repository updated with the original repository.** 72 | 73 | Before making any changes and/or in an appropriate interval, run the following commands _carefully_ to update your local repository. 74 | 75 | ```sh 76 | # Fetch all remote repositories and delete any deleted remote branches 77 | $ git fetch --all --prune 78 | 79 | # Switch to `main` branch 80 | $ git checkout main 81 | 82 | # Reset local `main` branch to match `upstream` repository's `main` branch 83 | $ git reset --hard upstream/main 84 | 85 | # Push changes to your forked `Android-Development` repo 86 | $ git push origin 87 | ``` 88 | 89 | ### You're Ready to Go 90 | 91 | Once you have completed these steps, you are ready to start contributing by checking our Issues and creating [pull requests](https://github.com/GameofSource-GFG/Android-Development/pulls). 92 | 93 |
94 | 95 | --- 96 | 97 |
98 | 99 |

Installation

100 |
101 | 102 | Make sure you have following installed on your machine: 103 | 104 | - [Git](https://git-scm.com/downloads) 105 | - [Flutter SDK](https://flutter.dev/docs/get-started/install) 106 | - [Android Studio](https://developer.android.com/studio) or [VSCode](https://code.visualstudio.com/download) 107 | 108 | To setup Flutter in Android Studio check [here](https://flutter.dev/docs/development/tools/android-studio) 109 | 110 | To setup Flutter in VSCode check [here](https://flutter.dev/docs/development/tools/vs-code) 111 | 112 | Install all dependencies using: 113 | 114 | ```sh 115 | $ flutter pub get 116 | ``` 117 | 118 | Run the app using: 119 | 120 | ```sh 121 | $ flutter run 122 | ``` 123 | 124 | 130 | 131 |
132 | 133 | --- 134 | 135 | ### Create a new branch 136 | 137 | Whenever you are going to make contribution. Please create seperate branch using the command and keep your `main` branch clean and most stable version of your project (i.e. synced with remote branch). 138 | 139 | ```sh 140 | # It will create a new branch with name / and switch to that branch 141 | $ git checkout -b / 142 | #Example 143 | #$ git checkout -b monatheoctocat/1 144 | ``` 145 | 146 | Create a seperate branch for contibution and try to use same name of branch as of your contributing feature associated with your assigned issue. 147 | 148 | To switch to desired branch 149 | 150 | ```sh 151 | # To switch from one branch to other 152 | $ git checkout 153 | ``` 154 | 155 | To add the changes to the branch. Use 156 | 157 | ```sh 158 | # To add all files to branch / 159 | $ git add . 160 | ``` 161 | 162 | Type in a message relevant for the code reveiwer using 163 | 164 | ```sh 165 | # This message get associated with all files you have changed 166 | $ git commit -m 'relevant message' 167 | ``` 168 | 169 | Now, Push your awesome work to your remote repository using 170 | 171 | ```sh 172 | # To push your work to your remote repository 173 | $ git push -u origin 174 | #Example 175 | #$ git push -u origin / 176 | ``` 177 | 178 | Finally, go to your repository in browser and click on `compare and pull requests`. 179 | 180 |

NOTE:

181 | 182 | **_Make sure you make Pull Request from your branch to the `development` branch of our project_** 183 | 184 | ![IMAGE](https://pixan198.github.io/images/compare-pr.PNG) 185 | 186 | Then add a title and description to your pull request that explains your precious effort. 187 | Don't forget to mention the issue number you are working on. 188 | 189 | ### Thank you for your contribution. 190 | -------------------------------------------------------------------------------- /lib/screens/sign_up.dart: -------------------------------------------------------------------------------- 1 | //sign up page along with google sign in button 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:modal_progress_hud/modal_progress_hud.dart'; 5 | 6 | import 'homepage.dart'; 7 | 8 | String emailIdErrorMessage = ""; 9 | String passwordErrorMessage = ""; 10 | 11 | class SignUp extends StatefulWidget { 12 | static final String routeName = "/sign_up"; 13 | @override 14 | _SignUpState createState() => _SignUpState(); 15 | } 16 | 17 | class _SignUpState extends State { 18 | FirebaseAuth firebaseAuth = FirebaseAuth.instance; 19 | //DatabaseReference dbRef = FirebaseDatabase.instance.reference().child("Users"); 20 | TextEditingController nameController = TextEditingController(); 21 | 22 | //google sign-in 23 | // ignore: unused_field 24 | 25 | final email = TextEditingController(); 26 | final password = TextEditingController(); 27 | bool validityEmail = true; 28 | bool validityPassword = true; 29 | 30 | bool _isLoading = false; 31 | //email sign-up method 32 | void registerToFb() { 33 | setState(() { 34 | _isLoading = true; 35 | }); 36 | firebaseAuth 37 | .createUserWithEmailAndPassword( 38 | email: email.text, password: password.text) 39 | .then((result) { 40 | Navigator.pushNamed(context, HomePage.routeName); 41 | 42 | setState(() { 43 | _isLoading = false; 44 | }); 45 | }).catchError( 46 | (err) { 47 | setState(() { 48 | _isLoading = false; 49 | }); 50 | showDialog( 51 | context: context, 52 | builder: (BuildContext context) { 53 | return AlertDialog( 54 | title: Text("Error"), 55 | content: Text(err.message), 56 | actions: [ 57 | FlatButton( 58 | child: Text("Ok"), 59 | onPressed: () { 60 | Navigator.of(context).pop(); 61 | }, 62 | ) 63 | ], 64 | ); 65 | }, 66 | ); 67 | }, 68 | ); 69 | } 70 | 71 | @override 72 | void dispose() { 73 | // Cleaning up controllers. 74 | nameController.dispose(); 75 | email.dispose(); 76 | password.dispose(); 77 | super.dispose(); 78 | } 79 | 80 | @override 81 | Widget build(BuildContext context) { 82 | return ModalProgressHUD( 83 | inAsyncCall: _isLoading, 84 | child: Scaffold( 85 | backgroundColor: Colors.white, 86 | body: SafeArea( 87 | child: Padding( 88 | padding: EdgeInsets.all(36.0), 89 | child: ListView(children: [ 90 | // SizedBox(height: 80), 91 | Column( 92 | children: [ 93 | Image( 94 | image: NetworkImage( 95 | 'https://media.geeksforgeeks.org/wp-content/cdn-uploads/20190710102234/download3.png'), 96 | ), 97 | SizedBox(height: 16), 98 | Text( 99 | 'Geeks For Geeks', 100 | style: TextStyle( 101 | fontSize: 20, 102 | ), 103 | ), 104 | ], 105 | ), 106 | SizedBox(height: 60), 107 | Padding( 108 | padding: const EdgeInsets.only(left: 10, right: 10), 109 | child: TextField( 110 | textInputAction: TextInputAction.next, 111 | onSubmitted: (v) { 112 | FocusScope.of(context).requestFocus(); 113 | }, 114 | decoration: InputDecoration( 115 | enabledBorder: UnderlineInputBorder( 116 | borderSide: BorderSide(color: Colors.brown), 117 | ), 118 | hintText: '\tName', 119 | icon: Icon( 120 | Icons.person_add, 121 | color: Colors.brown, 122 | ), 123 | ), 124 | ), 125 | ), 126 | SizedBox( 127 | height: 13, 128 | ), 129 | Padding( 130 | padding: const EdgeInsets.only(left: 10, right: 10), 131 | child: TextField( 132 | controller: email, 133 | keyboardType: TextInputType.emailAddress, 134 | textInputAction: TextInputAction.next, 135 | onSubmitted: (v) { 136 | FocusScope.of(context).requestFocus(); 137 | }, 138 | decoration: InputDecoration( 139 | enabledBorder: UnderlineInputBorder( 140 | borderSide: BorderSide(color: Colors.brown), 141 | ), 142 | hintText: '\tEmail', 143 | icon: Icon( 144 | Icons.email, 145 | color: Colors.brown, 146 | ), 147 | errorText: validityEmail ? null : emailIdErrorMessage, 148 | ), 149 | ), 150 | ), 151 | SizedBox(height: 14), 152 | Padding( 153 | padding: const EdgeInsets.only(left: 10, right: 10), 154 | child: TextField( 155 | controller: password, 156 | textInputAction: TextInputAction.done, 157 | 158 | decoration: InputDecoration( 159 | hoverColor: Colors.brown, 160 | enabledBorder: UnderlineInputBorder( 161 | borderSide: BorderSide(color: Colors.brown), 162 | ), 163 | hintText: 'Password', 164 | icon: Icon(Icons.lock, color: Colors.brown), 165 | errorText: validityPassword ? null : passwordErrorMessage, 166 | ), 167 | obscureText: 168 | true, //replaces password with bullets as we enter it 169 | ), 170 | ), 171 | 172 | SizedBox( 173 | height: 10, 174 | ), 175 | Padding( 176 | padding: EdgeInsets.fromLTRB(10, 30, 10, 10), 177 | child: Column( 178 | children: [ 179 | Text('Continue for a seamless experience!'), 180 | SizedBox( 181 | height: 10.0, 182 | ), 183 | RaisedButton( 184 | padding: EdgeInsets.only(left: 40, right: 40), 185 | shape: StadiumBorder(), 186 | color: Color(0xFF2F8D46), 187 | onPressed: () { 188 | setState( 189 | () { 190 | validityEmail = isValidEmail(email.text); 191 | validityPassword = isValidPassword(password.text); 192 | registerToFb(); 193 | }, 194 | ); 195 | }, 196 | child: Text('SIGN UP', 197 | style: TextStyle(color: Colors.white)), 198 | ), 199 | SizedBox( 200 | height: 10.0, 201 | ), 202 | ], 203 | ), 204 | ), 205 | ]), 206 | ), 207 | ), 208 | ), 209 | ); 210 | } 211 | } 212 | 213 | bool isValidEmail(String email) { 214 | //Function that VALIDATES ENTERED EMAIL ID 215 | 216 | String p = 217 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; 218 | RegExp regExp = new RegExp(p); 219 | if (email.isEmpty) { 220 | //assigning error message to String variable emailIdErrorMessage 221 | emailIdErrorMessage = "Please enter a Email-id"; 222 | return false; 223 | } else if (!(regExp.hasMatch(email))) { 224 | //assigning error message to String variable emailIdErrorMessage 225 | emailIdErrorMessage = "Please enter a valid Email Address"; 226 | return false; 227 | } else 228 | return true; 229 | } 230 | 231 | bool isValidPassword(String password) { 232 | //Function that VALIDATES ENTERED PASSWORD 233 | 234 | String pattern = 235 | r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$'; 236 | RegExp regExp = new RegExp(pattern); 237 | if (password.isEmpty) { 238 | //assigning error message to String variable passwordErrorMessage 239 | passwordErrorMessage = "Please enter Password"; 240 | return false; 241 | } else if (password.length < 8) { 242 | //assigning error message to String variable passwordErrorMessage 243 | passwordErrorMessage = "Password must contain at least 8 characters"; 244 | return false; 245 | } else if (!(regExp.hasMatch(password))) { 246 | //assigning error message to String variable passwordErrorMessage 247 | passwordErrorMessage = 248 | "Password must contain \n at least 1 upper case alphabet,\nat least one number \nand at least one special character \nalong with lowercase alphabets"; 249 | return false; 250 | } else 251 | return true; 252 | } 253 | -------------------------------------------------------------------------------- /lib/screens/LoginScreen.dart: -------------------------------------------------------------------------------- 1 | //User Login screen for the app 2 | import 'package:flutter/material.dart'; 3 | import 'package:firebase_auth/firebase_auth.dart'; 4 | import 'package:fluttertoast/fluttertoast.dart'; 5 | import 'package:google_sign_in/google_sign_in.dart'; 6 | import 'package:modal_progress_hud/modal_progress_hud.dart'; 7 | 8 | import 'homepage.dart'; 9 | import '../services/firebase_auth_service.dart'; 10 | import 'sign_up.dart'; 11 | 12 | class LoginScreen extends StatefulWidget { 13 | static final String routeName = "/login"; 14 | 15 | @override 16 | _LoginScreenState createState() => _LoginScreenState(); 17 | } 18 | 19 | String emailIdErrorMessage = ""; 20 | String passwordErrorMessage = ""; 21 | //string variables that store error messages 22 | //for incorrectly entered email and password respectively. 23 | //They are initialized to "" but their values are changed by 24 | //functions bool isValidEmail(String) and bool is isValidPassword(String) 25 | //if entered Data is invalid. 26 | //The functions bool isValidEmail(String) and bool isValidPassword(String) 27 | //validate the email and password entered by user. 28 | 29 | class _LoginScreenState extends State { 30 | //textControllers for textFields of email and password 31 | final email = TextEditingController(); 32 | final password = TextEditingController(); 33 | 34 | //boolean variables that indicate whether or not entered data is valid 35 | bool validityEmail = true; 36 | bool validityPassword = true; 37 | //They store values returned by functions bool isValidEmail(String) and bool is isValidPassword(String) 38 | //They are initialized to true but their values change depending on data entered.On pressing the LogIn button 39 | //the functions bool isValidEmail(String) and bool isValidPassword(String) 40 | //are called which validate entered data and return true if data is valid and false if data is invalid. 41 | // ignore: unused_field 42 | bool _isLoggedIn = false; 43 | 44 | GoogleSignIn _googleSignIn = GoogleSignIn(scopes: ['email']); 45 | 46 | _login() async { 47 | try { 48 | await _googleSignIn.signIn().then((value) { 49 | setState(() { 50 | _isLoggedIn = true; 51 | }); 52 | Navigator.pushNamed(context, HomePage.routeName); 53 | }); 54 | } catch (err) { 55 | print(err); 56 | } 57 | } 58 | 59 | // ignore: unused_element 60 | _logout() { 61 | _googleSignIn.signOut(); 62 | setState( 63 | () { 64 | _isLoggedIn = false; 65 | }, 66 | ); 67 | } 68 | 69 | @override 70 | void dispose() { 71 | // Cleaning up controllers. 72 | email.dispose(); 73 | password.dispose(); 74 | super.dispose(); 75 | } 76 | 77 | bool _isLoading = false; 78 | 79 | @override 80 | Widget build(BuildContext context) { 81 | return ModalProgressHUD( 82 | inAsyncCall: _isLoading, 83 | child: Scaffold( 84 | backgroundColor: Colors.white, 85 | body: SingleChildScrollView( 86 | child: Column( 87 | children: [ 88 | Padding( 89 | //the GRAPHIC DESIGN included in the page 90 | padding: const EdgeInsets.all(8.0), 91 | child: Container( 92 | margin: EdgeInsets.only(top: 50.0), 93 | height: MediaQuery.of(context).size.height * 0.32, 94 | decoration: BoxDecoration( 95 | image: DecorationImage( 96 | //graphic design used for the screen 97 | image: AssetImage('assets/images/login-design.png'), 98 | fit: BoxFit.fitHeight)), 99 | ), 100 | ), 101 | //blank space 102 | SizedBox(height: 10.0), 103 | Padding( 104 | //textField to enter EMAIL ADDRESS 105 | padding: const EdgeInsets.all(16.0), 106 | child: TextField( 107 | controller: email, 108 | keyboardType: TextInputType.emailAddress, 109 | textInputAction: TextInputAction.next, 110 | onSubmitted: (v) { 111 | FocusScope.of(context).requestFocus(); 112 | }, 113 | decoration: InputDecoration( 114 | filled: true, 115 | fillColor: Color(0xFF2F8D46).withOpacity(0.2), 116 | hintText: 'Email', 117 | hintStyle: 118 | TextStyle(color: Colors.black.withOpacity(0.6)), 119 | prefixIcon: Icon(Icons.person, color: Color(0xFF2F8D46)), 120 | enabledBorder: OutlineInputBorder( 121 | borderSide: BorderSide( 122 | color: Color(0xFF2F8D46).withOpacity(0.2)), 123 | borderRadius: BorderRadius.circular(20.0), 124 | ), 125 | focusedBorder: OutlineInputBorder( 126 | borderSide: BorderSide( 127 | color: Color(0xFF2F8D46).withOpacity(0.2)), 128 | borderRadius: BorderRadius.circular(20.0), 129 | ), 130 | errorText: validityEmail ? null : emailIdErrorMessage, 131 | //here string stored in emailIdErrorMessage is displayed if boolean variable validityEmail is false 132 | 133 | errorBorder: OutlineInputBorder( 134 | borderSide: BorderSide( 135 | color: Colors.deepOrange, 136 | ), 137 | borderRadius: BorderRadius.circular(20.0), 138 | ), 139 | focusedErrorBorder: OutlineInputBorder( 140 | borderSide: BorderSide( 141 | color: Colors.deepOrange, 142 | ), 143 | borderRadius: BorderRadius.circular(20.0), 144 | )), 145 | ), 146 | ), 147 | Padding( 148 | //TextField to enter PASSWORD 149 | padding: const EdgeInsets.all(16.0), 150 | child: TextField( 151 | controller: password, 152 | textInputAction: TextInputAction.done, 153 | decoration: InputDecoration( 154 | filled: true, 155 | fillColor: Color(0xFF2F8D46).withOpacity(0.2), 156 | hintText: 'Password', 157 | hintStyle: 158 | TextStyle(color: Colors.black.withOpacity(0.6)), 159 | errorText: validityPassword ? null : passwordErrorMessage, 160 | //here string stored in emailIdErrorMessage is displayed if boolean variable validityEmail is false 161 | 162 | errorBorder: OutlineInputBorder( 163 | borderSide: 164 | BorderSide(color: Colors.deepOrange, width: 1.0), 165 | borderRadius: BorderRadius.circular(20.0), 166 | ), 167 | focusedErrorBorder: OutlineInputBorder( 168 | borderSide: BorderSide( 169 | color: Colors.deepOrange, 170 | ), 171 | borderRadius: BorderRadius.circular(20.0), 172 | ), 173 | prefixIcon: Icon(Icons.lock, color: Color(0xFF2F8D46)), 174 | enabledBorder: OutlineInputBorder( 175 | borderSide: BorderSide( 176 | color: Color(0xFF2F8D46).withOpacity(0.2)), 177 | borderRadius: BorderRadius.circular(20.0), 178 | ), 179 | focusedBorder: OutlineInputBorder( 180 | borderSide: BorderSide( 181 | color: Color(0xFF2F8D46).withOpacity(0.2)), 182 | borderRadius: BorderRadius.circular(20.0), 183 | )), 184 | obscureText: true, 185 | ), 186 | ), 187 | Padding( 188 | //LOGIN BUTTON 189 | //after pressing this button the emailId and Password entered by user 190 | //are validated by validating functions bool isValidEmail(String) and bool isValidPassword(String) 191 | //the value returned by function is stored in the boolean variables validityEmail and validityPassword 192 | // if the data is entered is valid functions return true. 193 | //if data entered is invalid: 194 | // 1.functions assign appropriate error messages to String variable passwordErrorMessage and String variable emailIdErrorMessage 195 | // 2. and then return false. 196 | 197 | padding: const EdgeInsets.all(16.0), 198 | child: MaterialButton( 199 | height: MediaQuery.of(context).size.height * 0.08, 200 | minWidth: MediaQuery.of(context).size.width, 201 | shape: RoundedRectangleBorder( 202 | borderRadius: new BorderRadius.circular(20)), 203 | onPressed: () async { 204 | setState(() { 205 | //storing value returned by validating functions into boolean variables 206 | validityEmail = isValidEmail(email.text); 207 | validityPassword = isValidPassword(password.text); 208 | }); 209 | if (validityEmail && validityPassword) { 210 | try { 211 | setState(() { 212 | _isLoading = true; 213 | }); 214 | await FirebaseAuthService.loginUser( 215 | email: email.text?.trim(), 216 | password: password.text, 217 | ); 218 | 219 | Navigator.pushReplacementNamed( 220 | context, 221 | HomePage.routeName, 222 | ); 223 | } on FirebaseAuthException catch (e) { 224 | Fluttertoast.showToast(msg: e.message); 225 | } catch (e) { 226 | Fluttertoast.showToast( 227 | msg: 228 | "An error occurred. Please try again later"); 229 | } finally { 230 | setState(() { 231 | _isLoading = false; 232 | }); 233 | } 234 | } 235 | }, 236 | child: Text( 237 | "LOGIN", 238 | style: TextStyle(fontSize: 17.0, color: Colors.white), 239 | ), 240 | //Color(0xFF0DD6BB) 241 | color: new Color(0xFF2F8D46))), 242 | SizedBox(height: 10.0), 243 | Column( 244 | //REGISTER NOW LINK 245 | mainAxisAlignment: MainAxisAlignment.center, 246 | children: [ 247 | Text( 248 | "Don't have a account yet?", 249 | style: TextStyle(), 250 | ), 251 | SizedBox(width: 5.0), 252 | InkWell( 253 | onTap: () { 254 | Navigator.pushNamed(context, SignUp.routeName); 255 | }, 256 | child: Text( 257 | 'Register Now', 258 | style: TextStyle( 259 | color: Color(0xFF2F8D46), 260 | fontWeight: FontWeight.bold, 261 | decoration: TextDecoration.underline), 262 | ), 263 | //Color(0xFF0DD6BB) 264 | ), 265 | SizedBox(height: 10.0), 266 | RaisedButton( 267 | padding: EdgeInsets.only(left: 40, right: 40), 268 | shape: StadiumBorder(), 269 | color: Color(0xFF2F8D46), 270 | onPressed: () { 271 | _login(); 272 | }, 273 | child: Text( 274 | 'Sign In With Google', 275 | style: TextStyle(color: Colors.white), 276 | ), 277 | ), 278 | ], 279 | ), 280 | ], 281 | ), 282 | ), 283 | ), 284 | ); 285 | } 286 | } 287 | 288 | bool isValidEmail(String email) { 289 | //Function that VALIDATES ENTERED EMAIL ID 290 | 291 | String p = 292 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; 293 | RegExp regExp = new RegExp(p); 294 | if (email.isEmpty) { 295 | //assigning error message to String variable emailIdErrorMessage 296 | emailIdErrorMessage = "Please enter a Email-id"; 297 | return false; 298 | } else if (!(regExp.hasMatch(email))) { 299 | //assigning error message to String variable emailIdErrorMessage 300 | emailIdErrorMessage = "Please enter a valid Email Address"; 301 | return false; 302 | } else 303 | return true; 304 | } 305 | 306 | bool isValidPassword(String password) { 307 | //Function that VALIDATES ENTERED PASSWORD 308 | 309 | String pattern = 310 | r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$'; 311 | RegExp regExp = new RegExp(pattern); 312 | if (password.isEmpty) { 313 | //assigning error message to String variable passwordErrorMessage 314 | passwordErrorMessage = "Please enter Password"; 315 | return false; 316 | } else if (password.length < 8) { 317 | //assigning error message to String variable passwordErrorMessage 318 | passwordErrorMessage = "Password must contain at least 8 characters"; 319 | return false; 320 | } else if (!(regExp.hasMatch(password))) { 321 | //assigning error message to String variable passwordErrorMessage 322 | passwordErrorMessage = 323 | "Password must contain \n at least 1 upper case alphabet,\nat least one number \nand at least one special character \nalong with lowercase alphabets"; 324 | return false; 325 | } else 326 | return true; 327 | } 328 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | animated_text_kit: 5 | dependency: "direct main" 6 | description: 7 | name: animated_text_kit 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.5.1" 11 | archive: 12 | dependency: transitive 13 | description: 14 | name: archive 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.0.13" 18 | args: 19 | dependency: transitive 20 | description: 21 | name: args 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.6.0" 25 | async: 26 | dependency: transitive 27 | description: 28 | name: async 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.5.0-nullsafety.1" 32 | boolean_selector: 33 | dependency: transitive 34 | description: 35 | name: boolean_selector 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.1.0-nullsafety.1" 39 | cached_network_image: 40 | dependency: "direct main" 41 | description: 42 | name: cached_network_image 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "2.3.3" 46 | characters: 47 | dependency: transitive 48 | description: 49 | name: characters 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.1.0-nullsafety.3" 53 | charcode: 54 | dependency: transitive 55 | description: 56 | name: charcode 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.2.0-nullsafety.1" 60 | clock: 61 | dependency: transitive 62 | description: 63 | name: clock 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.1.0-nullsafety.1" 67 | cloud_firestore: 68 | dependency: "direct main" 69 | description: 70 | name: cloud_firestore 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "0.14.1+3" 74 | cloud_firestore_platform_interface: 75 | dependency: transitive 76 | description: 77 | name: cloud_firestore_platform_interface 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "2.1.2" 81 | cloud_firestore_web: 82 | dependency: transitive 83 | description: 84 | name: cloud_firestore_web 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "0.2.0+4" 88 | collection: 89 | dependency: transitive 90 | description: 91 | name: collection 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "1.15.0-nullsafety.3" 95 | color: 96 | dependency: transitive 97 | description: 98 | name: color 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "2.1.1" 102 | convert: 103 | dependency: transitive 104 | description: 105 | name: convert 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "2.1.1" 109 | crypto: 110 | dependency: transitive 111 | description: 112 | name: crypto 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "2.1.5" 116 | cupertino_icons: 117 | dependency: "direct main" 118 | description: 119 | name: cupertino_icons 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "1.0.0" 123 | fake_async: 124 | dependency: transitive 125 | description: 126 | name: fake_async 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "1.2.0-nullsafety.1" 130 | ffi: 131 | dependency: transitive 132 | description: 133 | name: ffi 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "0.1.3" 137 | file: 138 | dependency: transitive 139 | description: 140 | name: file 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "5.2.1" 144 | firebase: 145 | dependency: transitive 146 | description: 147 | name: firebase 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "7.3.2" 151 | firebase_auth: 152 | dependency: "direct main" 153 | description: 154 | name: firebase_auth 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "0.18.1+2" 158 | firebase_auth_platform_interface: 159 | dependency: transitive 160 | description: 161 | name: firebase_auth_platform_interface 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "2.1.1" 165 | firebase_auth_web: 166 | dependency: transitive 167 | description: 168 | name: firebase_auth_web 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "0.3.1+1" 172 | firebase_core: 173 | dependency: "direct main" 174 | description: 175 | name: firebase_core 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "0.5.0+1" 179 | firebase_core_platform_interface: 180 | dependency: transitive 181 | description: 182 | name: firebase_core_platform_interface 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "2.0.0" 186 | firebase_core_web: 187 | dependency: transitive 188 | description: 189 | name: firebase_core_web 190 | url: "https://pub.dartlang.org" 191 | source: hosted 192 | version: "0.2.0" 193 | firebase_database: 194 | dependency: "direct main" 195 | description: 196 | name: firebase_database 197 | url: "https://pub.dartlang.org" 198 | source: hosted 199 | version: "4.1.1" 200 | flutter: 201 | dependency: "direct main" 202 | description: flutter 203 | source: sdk 204 | version: "0.0.0" 205 | flutter_blurhash: 206 | dependency: transitive 207 | description: 208 | name: flutter_blurhash 209 | url: "https://pub.dartlang.org" 210 | source: hosted 211 | version: "0.5.0" 212 | flutter_cache_manager: 213 | dependency: transitive 214 | description: 215 | name: flutter_cache_manager 216 | url: "https://pub.dartlang.org" 217 | source: hosted 218 | version: "2.0.0" 219 | flutter_native_splash: 220 | dependency: "direct dev" 221 | description: 222 | name: flutter_native_splash 223 | url: "https://pub.dartlang.org" 224 | source: hosted 225 | version: "0.1.9" 226 | flutter_test: 227 | dependency: "direct dev" 228 | description: flutter 229 | source: sdk 230 | version: "0.0.0" 231 | flutter_web_plugins: 232 | dependency: transitive 233 | description: flutter 234 | source: sdk 235 | version: "0.0.0" 236 | fluttertoast: 237 | dependency: "direct main" 238 | description: 239 | name: fluttertoast 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "7.1.1" 243 | font_awesome_flutter: 244 | dependency: "direct main" 245 | description: 246 | name: font_awesome_flutter 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "8.10.0" 250 | google_fonts: 251 | dependency: "direct dev" 252 | description: 253 | name: google_fonts 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "1.1.1" 257 | google_sign_in: 258 | dependency: "direct main" 259 | description: 260 | name: google_sign_in 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "4.5.5" 264 | google_sign_in_platform_interface: 265 | dependency: transitive 266 | description: 267 | name: google_sign_in_platform_interface 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "1.1.2" 271 | google_sign_in_web: 272 | dependency: transitive 273 | description: 274 | name: google_sign_in_web 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "0.9.2" 278 | http: 279 | dependency: transitive 280 | description: 281 | name: http 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "0.12.2" 285 | http_parser: 286 | dependency: transitive 287 | description: 288 | name: http_parser 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "3.1.4" 292 | image: 293 | dependency: transitive 294 | description: 295 | name: image 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "2.1.18" 299 | intl: 300 | dependency: "direct main" 301 | description: 302 | name: intl 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "0.16.1" 306 | js: 307 | dependency: transitive 308 | description: 309 | name: js 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "0.6.2" 313 | matcher: 314 | dependency: transitive 315 | description: 316 | name: matcher 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "0.12.10-nullsafety.1" 320 | meta: 321 | dependency: transitive 322 | description: 323 | name: meta 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "1.3.0-nullsafety.3" 327 | mime: 328 | dependency: transitive 329 | description: 330 | name: mime 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "0.9.7" 334 | modal_progress_hud: 335 | dependency: "direct main" 336 | description: 337 | name: modal_progress_hud 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "0.1.3" 341 | octo_image: 342 | dependency: transitive 343 | description: 344 | name: octo_image 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "0.3.0" 348 | onesignal_flutter: 349 | dependency: "direct main" 350 | description: 351 | name: onesignal_flutter 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "2.6.1" 355 | path: 356 | dependency: transitive 357 | description: 358 | name: path 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "1.8.0-nullsafety.1" 362 | path_provider: 363 | dependency: transitive 364 | description: 365 | name: path_provider 366 | url: "https://pub.dartlang.org" 367 | source: hosted 368 | version: "1.6.22" 369 | path_provider_linux: 370 | dependency: transitive 371 | description: 372 | name: path_provider_linux 373 | url: "https://pub.dartlang.org" 374 | source: hosted 375 | version: "0.0.1+2" 376 | path_provider_macos: 377 | dependency: transitive 378 | description: 379 | name: path_provider_macos 380 | url: "https://pub.dartlang.org" 381 | source: hosted 382 | version: "0.0.4+4" 383 | path_provider_platform_interface: 384 | dependency: transitive 385 | description: 386 | name: path_provider_platform_interface 387 | url: "https://pub.dartlang.org" 388 | source: hosted 389 | version: "1.0.3" 390 | path_provider_windows: 391 | dependency: transitive 392 | description: 393 | name: path_provider_windows 394 | url: "https://pub.dartlang.org" 395 | source: hosted 396 | version: "0.0.4+1" 397 | pedantic: 398 | dependency: transitive 399 | description: 400 | name: pedantic 401 | url: "https://pub.dartlang.org" 402 | source: hosted 403 | version: "1.9.2" 404 | petitparser: 405 | dependency: transitive 406 | description: 407 | name: petitparser 408 | url: "https://pub.dartlang.org" 409 | source: hosted 410 | version: "3.1.0" 411 | platform: 412 | dependency: transitive 413 | description: 414 | name: platform 415 | url: "https://pub.dartlang.org" 416 | source: hosted 417 | version: "2.2.1" 418 | plugin_platform_interface: 419 | dependency: transitive 420 | description: 421 | name: plugin_platform_interface 422 | url: "https://pub.dartlang.org" 423 | source: hosted 424 | version: "1.0.3" 425 | process: 426 | dependency: transitive 427 | description: 428 | name: process 429 | url: "https://pub.dartlang.org" 430 | source: hosted 431 | version: "3.0.13" 432 | quiver: 433 | dependency: transitive 434 | description: 435 | name: quiver 436 | url: "https://pub.dartlang.org" 437 | source: hosted 438 | version: "2.1.4+1" 439 | rxdart: 440 | dependency: transitive 441 | description: 442 | name: rxdart 443 | url: "https://pub.dartlang.org" 444 | source: hosted 445 | version: "0.24.1" 446 | share: 447 | dependency: "direct main" 448 | description: 449 | name: share 450 | url: "https://pub.dartlang.org" 451 | source: hosted 452 | version: "0.6.5+4" 453 | shimmer: 454 | dependency: "direct main" 455 | description: 456 | name: shimmer 457 | url: "https://pub.dartlang.org" 458 | source: hosted 459 | version: "1.1.2" 460 | sky_engine: 461 | dependency: transitive 462 | description: flutter 463 | source: sdk 464 | version: "0.0.99" 465 | source_span: 466 | dependency: transitive 467 | description: 468 | name: source_span 469 | url: "https://pub.dartlang.org" 470 | source: hosted 471 | version: "1.8.0-nullsafety.2" 472 | sqflite: 473 | dependency: transitive 474 | description: 475 | name: sqflite 476 | url: "https://pub.dartlang.org" 477 | source: hosted 478 | version: "1.3.1+2" 479 | sqflite_common: 480 | dependency: transitive 481 | description: 482 | name: sqflite_common 483 | url: "https://pub.dartlang.org" 484 | source: hosted 485 | version: "1.0.2+1" 486 | stack_trace: 487 | dependency: transitive 488 | description: 489 | name: stack_trace 490 | url: "https://pub.dartlang.org" 491 | source: hosted 492 | version: "1.10.0-nullsafety.1" 493 | stream_channel: 494 | dependency: transitive 495 | description: 496 | name: stream_channel 497 | url: "https://pub.dartlang.org" 498 | source: hosted 499 | version: "2.1.0-nullsafety.1" 500 | string_scanner: 501 | dependency: transitive 502 | description: 503 | name: string_scanner 504 | url: "https://pub.dartlang.org" 505 | source: hosted 506 | version: "1.1.0-nullsafety.1" 507 | synchronized: 508 | dependency: transitive 509 | description: 510 | name: synchronized 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "2.2.0+2" 514 | term_glyph: 515 | dependency: transitive 516 | description: 517 | name: term_glyph 518 | url: "https://pub.dartlang.org" 519 | source: hosted 520 | version: "1.2.0-nullsafety.1" 521 | test_api: 522 | dependency: transitive 523 | description: 524 | name: test_api 525 | url: "https://pub.dartlang.org" 526 | source: hosted 527 | version: "0.2.19-nullsafety.2" 528 | timeago: 529 | dependency: "direct main" 530 | description: 531 | name: timeago 532 | url: "https://pub.dartlang.org" 533 | source: hosted 534 | version: "2.0.28" 535 | typed_data: 536 | dependency: transitive 537 | description: 538 | name: typed_data 539 | url: "https://pub.dartlang.org" 540 | source: hosted 541 | version: "1.3.0-nullsafety.3" 542 | url_launcher: 543 | dependency: "direct main" 544 | description: 545 | name: url_launcher 546 | url: "https://pub.dartlang.org" 547 | source: hosted 548 | version: "5.7.8" 549 | url_launcher_linux: 550 | dependency: transitive 551 | description: 552 | name: url_launcher_linux 553 | url: "https://pub.dartlang.org" 554 | source: hosted 555 | version: "0.0.1+3" 556 | url_launcher_macos: 557 | dependency: transitive 558 | description: 559 | name: url_launcher_macos 560 | url: "https://pub.dartlang.org" 561 | source: hosted 562 | version: "0.0.1+8" 563 | url_launcher_platform_interface: 564 | dependency: transitive 565 | description: 566 | name: url_launcher_platform_interface 567 | url: "https://pub.dartlang.org" 568 | source: hosted 569 | version: "1.0.9" 570 | url_launcher_web: 571 | dependency: transitive 572 | description: 573 | name: url_launcher_web 574 | url: "https://pub.dartlang.org" 575 | source: hosted 576 | version: "0.1.5" 577 | url_launcher_windows: 578 | dependency: transitive 579 | description: 580 | name: url_launcher_windows 581 | url: "https://pub.dartlang.org" 582 | source: hosted 583 | version: "0.0.1+1" 584 | uuid: 585 | dependency: transitive 586 | description: 587 | name: uuid 588 | url: "https://pub.dartlang.org" 589 | source: hosted 590 | version: "2.2.2" 591 | vector_math: 592 | dependency: transitive 593 | description: 594 | name: vector_math 595 | url: "https://pub.dartlang.org" 596 | source: hosted 597 | version: "2.1.0-nullsafety.3" 598 | webview_flutter: 599 | dependency: "direct main" 600 | description: 601 | name: webview_flutter 602 | url: "https://pub.dartlang.org" 603 | source: hosted 604 | version: "1.0.5" 605 | win32: 606 | dependency: transitive 607 | description: 608 | name: win32 609 | url: "https://pub.dartlang.org" 610 | source: hosted 611 | version: "1.7.3" 612 | xdg_directories: 613 | dependency: transitive 614 | description: 615 | name: xdg_directories 616 | url: "https://pub.dartlang.org" 617 | source: hosted 618 | version: "0.1.2" 619 | xml: 620 | dependency: transitive 621 | description: 622 | name: xml 623 | url: "https://pub.dartlang.org" 624 | source: hosted 625 | version: "4.5.1" 626 | yaml: 627 | dependency: transitive 628 | description: 629 | name: yaml 630 | url: "https://pub.dartlang.org" 631 | source: hosted 632 | version: "2.2.1" 633 | sdks: 634 | dart: ">=2.10.0 <2.11.0" 635 | flutter: ">=1.22.0 <2.0.0" 636 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | FRAMEWORK_SEARCH_PATHS = ( 293 | "$(inherited)", 294 | "$(PROJECT_DIR)/Flutter", 295 | ); 296 | INFOPLIST_FILE = Runner/Info.plist; 297 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 298 | LIBRARY_SEARCH_PATHS = ( 299 | "$(inherited)", 300 | "$(PROJECT_DIR)/Flutter", 301 | ); 302 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg; 303 | PRODUCT_NAME = "$(TARGET_NAME)"; 304 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 305 | SWIFT_VERSION = 5.0; 306 | VERSIONING_SYSTEM = "apple-generic"; 307 | }; 308 | name = Profile; 309 | }; 310 | 97C147031CF9000F007C117D /* Debug */ = { 311 | isa = XCBuildConfiguration; 312 | buildSettings = { 313 | ALWAYS_SEARCH_USER_PATHS = NO; 314 | CLANG_ANALYZER_NONNULL = YES; 315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 316 | CLANG_CXX_LIBRARY = "libc++"; 317 | CLANG_ENABLE_MODULES = YES; 318 | CLANG_ENABLE_OBJC_ARC = YES; 319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 320 | CLANG_WARN_BOOL_CONVERSION = YES; 321 | CLANG_WARN_COMMA = YES; 322 | CLANG_WARN_CONSTANT_CONVERSION = YES; 323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 325 | CLANG_WARN_EMPTY_BODY = YES; 326 | CLANG_WARN_ENUM_CONVERSION = YES; 327 | CLANG_WARN_INFINITE_RECURSION = YES; 328 | CLANG_WARN_INT_CONVERSION = YES; 329 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 330 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 334 | CLANG_WARN_STRICT_PROTOTYPES = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CLANG_WARN_UNREACHABLE_CODE = YES; 337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 339 | COPY_PHASE_STRIP = NO; 340 | DEBUG_INFORMATION_FORMAT = dwarf; 341 | ENABLE_STRICT_OBJC_MSGSEND = YES; 342 | ENABLE_TESTABILITY = YES; 343 | GCC_C_LANGUAGE_STANDARD = gnu99; 344 | GCC_DYNAMIC_NO_PIC = NO; 345 | GCC_NO_COMMON_BLOCKS = YES; 346 | GCC_OPTIMIZATION_LEVEL = 0; 347 | GCC_PREPROCESSOR_DEFINITIONS = ( 348 | "DEBUG=1", 349 | "$(inherited)", 350 | ); 351 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 352 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 353 | GCC_WARN_UNDECLARED_SELECTOR = YES; 354 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 355 | GCC_WARN_UNUSED_FUNCTION = YES; 356 | GCC_WARN_UNUSED_VARIABLE = YES; 357 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 358 | MTL_ENABLE_DEBUG_INFO = YES; 359 | ONLY_ACTIVE_ARCH = YES; 360 | SDKROOT = iphoneos; 361 | TARGETED_DEVICE_FAMILY = "1,2"; 362 | }; 363 | name = Debug; 364 | }; 365 | 97C147041CF9000F007C117D /* Release */ = { 366 | isa = XCBuildConfiguration; 367 | buildSettings = { 368 | ALWAYS_SEARCH_USER_PATHS = NO; 369 | CLANG_ANALYZER_NONNULL = YES; 370 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 371 | CLANG_CXX_LIBRARY = "libc++"; 372 | CLANG_ENABLE_MODULES = YES; 373 | CLANG_ENABLE_OBJC_ARC = YES; 374 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 375 | CLANG_WARN_BOOL_CONVERSION = YES; 376 | CLANG_WARN_COMMA = YES; 377 | CLANG_WARN_CONSTANT_CONVERSION = YES; 378 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 379 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 380 | CLANG_WARN_EMPTY_BODY = YES; 381 | CLANG_WARN_ENUM_CONVERSION = YES; 382 | CLANG_WARN_INFINITE_RECURSION = YES; 383 | CLANG_WARN_INT_CONVERSION = YES; 384 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 385 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 386 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 389 | CLANG_WARN_STRICT_PROTOTYPES = YES; 390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 391 | CLANG_WARN_UNREACHABLE_CODE = YES; 392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 394 | COPY_PHASE_STRIP = NO; 395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 396 | ENABLE_NS_ASSERTIONS = NO; 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | GCC_C_LANGUAGE_STANDARD = gnu99; 399 | GCC_NO_COMMON_BLOCKS = YES; 400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 402 | GCC_WARN_UNDECLARED_SELECTOR = YES; 403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 404 | GCC_WARN_UNUSED_FUNCTION = YES; 405 | GCC_WARN_UNUSED_VARIABLE = YES; 406 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 407 | MTL_ENABLE_DEBUG_INFO = NO; 408 | SDKROOT = iphoneos; 409 | SUPPORTED_PLATFORMS = iphoneos; 410 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 411 | TARGETED_DEVICE_FAMILY = "1,2"; 412 | VALIDATE_PRODUCT = YES; 413 | }; 414 | name = Release; 415 | }; 416 | 97C147061CF9000F007C117D /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 419 | buildSettings = { 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | CLANG_ENABLE_MODULES = YES; 422 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 423 | ENABLE_BITCODE = NO; 424 | FRAMEWORK_SEARCH_PATHS = ( 425 | "$(inherited)", 426 | "$(PROJECT_DIR)/Flutter", 427 | ); 428 | INFOPLIST_FILE = Runner/Info.plist; 429 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 430 | LIBRARY_SEARCH_PATHS = ( 431 | "$(inherited)", 432 | "$(PROJECT_DIR)/Flutter", 433 | ); 434 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 438 | SWIFT_VERSION = 5.0; 439 | VERSIONING_SYSTEM = "apple-generic"; 440 | }; 441 | name = Debug; 442 | }; 443 | 97C147071CF9000F007C117D /* Release */ = { 444 | isa = XCBuildConfiguration; 445 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 446 | buildSettings = { 447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 448 | CLANG_ENABLE_MODULES = YES; 449 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 450 | ENABLE_BITCODE = NO; 451 | FRAMEWORK_SEARCH_PATHS = ( 452 | "$(inherited)", 453 | "$(PROJECT_DIR)/Flutter", 454 | ); 455 | INFOPLIST_FILE = Runner/Info.plist; 456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 457 | LIBRARY_SEARCH_PATHS = ( 458 | "$(inherited)", 459 | "$(PROJECT_DIR)/Flutter", 460 | ); 461 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg; 462 | PRODUCT_NAME = "$(TARGET_NAME)"; 463 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 464 | SWIFT_VERSION = 5.0; 465 | VERSIONING_SYSTEM = "apple-generic"; 466 | }; 467 | name = Release; 468 | }; 469 | /* End XCBuildConfiguration section */ 470 | 471 | /* Begin XCConfigurationList section */ 472 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 473 | isa = XCConfigurationList; 474 | buildConfigurations = ( 475 | 97C147031CF9000F007C117D /* Debug */, 476 | 97C147041CF9000F007C117D /* Release */, 477 | 249021D3217E4FDB00AE95B9 /* Profile */, 478 | ); 479 | defaultConfigurationIsVisible = 0; 480 | defaultConfigurationName = Release; 481 | }; 482 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 483 | isa = XCConfigurationList; 484 | buildConfigurations = ( 485 | 97C147061CF9000F007C117D /* Debug */, 486 | 97C147071CF9000F007C117D /* Release */, 487 | 249021D4217E4FDB00AE95B9 /* Profile */, 488 | ); 489 | defaultConfigurationIsVisible = 0; 490 | defaultConfigurationName = Release; 491 | }; 492 | /* End XCConfigurationList section */ 493 | }; 494 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 495 | } 496 | --------------------------------------------------------------------------------