├── lib ├── Models │ ├── Expense.dart │ └── User.dart ├── providers │ ├── ExpenseProvider.dart │ └── UserProvider.dart ├── json │ ├── create_budget_json.dart │ ├── day_month.dart │ ├── budget_json.dart │ └── daily_json.dart ├── theme │ ├── colors.dart │ └── Style.dart ├── widget │ ├── snackbar.dart │ ├── chart.dart │ ├── Buttons.dart │ └── inputbox.dart ├── pages │ ├── Dashboard.dart │ ├── Splash.dart │ ├── Onboarding.dart │ ├── create_budge_page.dart │ ├── Signin.dart │ ├── daily_page.dart │ ├── budget_page.dart │ ├── stats_page.dart │ ├── ForgotPass.dart │ └── Profile.dart └── main.dart ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist └── .gitignore ├── assets ├── logo.jpg ├── logo.png ├── logos.jpg ├── logos.png ├── logot.png └── images │ ├── auto.png │ ├── bank.png │ ├── cash.png │ ├── gift.png │ ├── charity.png │ └── eating.png ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ └── Icon-512.png ├── manifest.json └── index.html ├── Screenshots ├── 1.png ├── trackex (1).png ├── trackex (2).png ├── trackex (3).png ├── trackex (4).png ├── trackex (5).png ├── trackex (6).png ├── trackex (7).png ├── trackex (8).png └── trackex (9).png ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── launcher_icon.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── launcher_icon.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── launcher_icon.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── launcher_icon.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── launcher_icon.png │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── tech │ │ │ │ │ └── hyperone │ │ │ │ │ └── trackex │ │ │ │ │ └── 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 ├── local.properties ├── .vscode └── launch.json ├── .gitignore ├── LICENSE ├── test └── widget_test.dart ├── README.md ├── pubspec.yaml └── pubspec.lock /lib/Models/Expense.dart: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/providers/ExpenseProvider.dart: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /assets/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/logo.jpg -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/logo.png -------------------------------------------------------------------------------- /assets/logos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/logos.jpg -------------------------------------------------------------------------------- /assets/logos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/logos.png -------------------------------------------------------------------------------- /assets/logot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/logot.png -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/web/favicon.png -------------------------------------------------------------------------------- /Screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/1.png -------------------------------------------------------------------------------- /assets/images/auto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/auto.png -------------------------------------------------------------------------------- /assets/images/bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/bank.png -------------------------------------------------------------------------------- /assets/images/cash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/cash.png -------------------------------------------------------------------------------- /assets/images/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/gift.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /assets/images/charity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/charity.png -------------------------------------------------------------------------------- /assets/images/eating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/assets/images/eating.png -------------------------------------------------------------------------------- /Screenshots/trackex (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (1).png -------------------------------------------------------------------------------- /Screenshots/trackex (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (2).png -------------------------------------------------------------------------------- /Screenshots/trackex (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (3).png -------------------------------------------------------------------------------- /Screenshots/trackex (4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (4).png -------------------------------------------------------------------------------- /Screenshots/trackex (5).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (5).png -------------------------------------------------------------------------------- /Screenshots/trackex (6).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (6).png -------------------------------------------------------------------------------- /Screenshots/trackex (7).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (7).png -------------------------------------------------------------------------------- /Screenshots/trackex (8).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (8).png -------------------------------------------------------------------------------- /Screenshots/trackex (9).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/Screenshots/trackex (9).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/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/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/hyperonetech/Trackex/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/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-hdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-mdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyperonetech/Trackex/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/tech/hyperone/trackex/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package tech.hyperone.trackex 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/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: 4d7946a68d26794349189cf21b3f68cc6fe61dcb 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Mon Mar 29 17:53:25 IST 2021 8 | sdk.dir=C\:\\Users\\jemis\\AppData\\Local\\Android\\Sdk 9 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /lib/json/create_budget_json.dart: -------------------------------------------------------------------------------- 1 | const List categories = [ 2 | {"name": "Auto", "icon": "assets/images/auto.png"}, 3 | {"name": "Bank", "icon": "assets/images/bank.png"}, 4 | {"name": "Cash", "icon": "assets/images/cash.png"}, 5 | {"name": "Charity", "icon": "assets/images/charity.png"}, 6 | {"name": "Eating", "icon": "assets/images/eating.png"}, 7 | {"name": "Gift", "icon": "assets/images/gift.png"} 8 | ]; 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "trackex", 9 | "request": "launch", 10 | "type": "dart" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/theme/colors.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | const Color primary = Color(0xFF2C3137); 4 | const Color secondary = Color(0xFF2C3137); 5 | const Color black = Color(0xFF000000); 6 | const Color white = Color(0xFFFFFFFF); 7 | const Color grey = Color(0xFFF6F6F6); 8 | const Color red = Color(0xFFec5766); 9 | const Color green = Color(0xFF43aa8b); 10 | const Color blue = Color(0xFF28c2ff); 11 | const Color errorColor = red; 12 | 13 | const Color succses = green; 14 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/theme/Style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trackex/theme/colors.dart'; 3 | 4 | double mainMargin = 18; 5 | double subMargin = 14; 6 | 7 | double buttonRadius = 8; 8 | double mainMarginHalf = 9; 9 | 10 | class AppTitle extends StatelessWidget { 11 | String title; 12 | AppTitle({this.title}); 13 | @override 14 | Widget build(BuildContext context) { 15 | return Text( 16 | title, 17 | style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: black), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/json/day_month.dart: -------------------------------------------------------------------------------- 1 | List days = [ 2 | {"label": "Sun", "day": "28"}, 3 | {"label": "Mon", "day": "29"}, 4 | {"label": "Tue", "day": "30"}, 5 | {"label": "Wed", "day": "1"}, 6 | {"label": "Thu", "day": "2"}, 7 | {"label": "Fri", "day": "3"}, 8 | {"label": "Sat", "day": "4"}, 9 | ]; 10 | List months = [ 11 | {"label": "2018", "day": "Jan"}, 12 | {"label": "2018", "day": "Feb"}, 13 | {"label": "2018", "day": "Mar"}, 14 | {"label": "2018", "day": "Apr"}, 15 | {"label": "2018", "day": "May"}, 16 | {"label": "2018", "day": "Jun"}, 17 | ]; 18 | -------------------------------------------------------------------------------- /lib/json/budget_json.dart: -------------------------------------------------------------------------------- 1 | import 'package:trackex/theme/colors.dart'; 2 | 3 | const List budget_json = [ 4 | { 5 | "name": "Gift", 6 | "price": "\$2250.00", 7 | "label_percentage": "45%", 8 | "percentage": 0.45, 9 | "color": green 10 | }, 11 | { 12 | "name": "Automobile", 13 | "price": "\$3000.00", 14 | "label_percentage": "70%", 15 | "percentage": 0.7, 16 | "color": red 17 | }, 18 | { 19 | "name": "Bank", 20 | "price": "\$4000.00", 21 | "label_percentage": "90%", 22 | "percentage": 0.9, 23 | "color": blue 24 | } 25 | ]; 26 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trackex", 3 | "short_name": "trackex", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter application.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/json/daily_json.dart: -------------------------------------------------------------------------------- 1 | const List daily = [ 2 | { 3 | "icon": "assets/images/bank.png", 4 | "name": "Bank", 5 | "date": "Fri 10AM", 6 | "price": "\$340.00" 7 | }, 8 | { 9 | "icon": "assets/images/auto.png", 10 | "name": "Automobile", 11 | "date": "Mon 8AM", 12 | "price": "\$70.00" 13 | }, 14 | { 15 | "icon": "assets/images/gift.png", 16 | "name": "Gift", 17 | "date": "Sat 6PM", 18 | "price": "\$110.00" 19 | }, 20 | { 21 | "icon": "assets/images/eating.png", 22 | "name": "Eating", 23 | "date": "Sun 5PM", 24 | "price": "\$60.00" 25 | }, 26 | { 27 | "icon": "assets/images/charity.png", 28 | "name": "Charity", 29 | "date": "Wed 12PM", 30 | "price": "\$1200.00" 31 | } 32 | ]; 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:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.3.5' 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 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 hyperonetech 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 | 11 | import 'package:trackex/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/providers/UserProvider.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:cloud_firestore/cloud_firestore.dart'; 4 | import 'package:firebase_auth/firebase_auth.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:trackex/Models/User.dart'; 8 | 9 | class UserProvider with ChangeNotifier { 10 | AppUser user; 11 | 12 | DocumentSnapshot mydata; 13 | 14 | UserProvider() { 15 | fetchLogedUser(); 16 | } 17 | 18 | Future fetchLogedUser() async { 19 | print("fetching userdata from server"); 20 | bool code = false; 21 | if (FirebaseAuth.instance.currentUser != null) { 22 | await FirebaseFirestore.instance 23 | .collection("users") 24 | .doc(FirebaseAuth.instance.currentUser.uid) 25 | .get() 26 | .then((DocumentSnapshot snapshot) { 27 | var data = snapshot.data(); 28 | mydata = snapshot; 29 | user = AppUser.fromJson(data); 30 | code = true; 31 | notifyListeners(); 32 | }); 33 | notifyListeners(); 34 | } 35 | return code; 36 | } 37 | 38 | void destroyUser() { 39 | user = null; 40 | notifyListeners(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "335957415067", 4 | "firebase_url": "https://space-quiz-c0816.firebaseio.com", 5 | "project_id": "space-quiz-c0816", 6 | "storage_bucket": "space-quiz-c0816.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:335957415067:android:06f60acc08359c6ad6623e", 12 | "android_client_info": { 13 | "package_name": "tech.hyperone.trackex" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "335957415067-63jr6f4s9n66bvs0381m18u42h6t49kd.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIzaSyDIVWLKM4qlvuHXVVEvJlD4QPGOJ6RHXZQ" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [ 30 | { 31 | "client_id": "335957415067-63jr6f4s9n66bvs0381m18u42h6t49kd.apps.googleusercontent.com", 32 | "client_type": 3 33 | } 34 | ] 35 | } 36 | } 37 | } 38 | ], 39 | "configuration_version": "1" 40 | } -------------------------------------------------------------------------------- /lib/Models/User.dart: -------------------------------------------------------------------------------- 1 | // To parse this JSON data, do 2 | // 3 | // final appUser = appUserFromJson(jsonString); 4 | 5 | import 'dart:convert'; 6 | 7 | import 'package:cloud_firestore/cloud_firestore.dart'; 8 | 9 | AppUser appUserFromJson(String str) => AppUser.fromJson(json.decode(str)); 10 | 11 | String appUserToJson(AppUser data) => json.encode(data.toJson()); 12 | 13 | class AppUser { 14 | AppUser({ 15 | this.name, 16 | this.birthdate, 17 | this.bio, 18 | this.profilePicture, 19 | this.isplus, 20 | this.email, 21 | }); 22 | 23 | String name; 24 | Timestamp birthdate; 25 | String bio; 26 | String profilePicture; 27 | bool isplus; 28 | String email; 29 | 30 | factory AppUser.fromJson(Map json) => AppUser( 31 | name: json["name"], 32 | birthdate: json["birthdate"], 33 | bio: json["bio"], 34 | profilePicture: json["profilePicture"], 35 | isplus: json["isplus"], 36 | email: json["email"], 37 | ); 38 | 39 | Map toJson() => { 40 | "name": name, 41 | "birthdate": birthdate, 42 | "bio": bio, 43 | "profilePicture": profilePicture, 44 | "isplus": isplus, 45 | "email": email, 46 | }; 47 | } 48 | -------------------------------------------------------------------------------- /lib/widget/snackbar.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | import 'package:trackex/theme/colors.dart'; 4 | 5 | class CustomSnackBar { 6 | GlobalKey scaffoldKey; 7 | bool haserror = false; 8 | String title, actionTile; 9 | Function onPressed; 10 | bool isfloating; 11 | 12 | CustomSnackBar( 13 | {this.scaffoldKey, 14 | this.title, 15 | this.haserror, 16 | this.actionTile, 17 | this.isfloating, 18 | this.onPressed}); 19 | 20 | void show() { 21 | scaffoldKey.currentState.showSnackBar(SnackBar( 22 | content: Text( 23 | title, 24 | style: TextStyle(fontSize: 16), 25 | ), 26 | backgroundColor: haserror ? errorColor : succses, 27 | behavior: isfloating ? SnackBarBehavior.floating : SnackBarBehavior.fixed, 28 | margin: isfloating ? EdgeInsets.all(20) : null, 29 | duration: Duration(seconds: 2), 30 | action: actionTile != "" 31 | ? SnackBarAction( 32 | label: actionTile, 33 | onPressed: onPressed == null 34 | ? () { 35 | scaffoldKey.currentState.hideCurrentSnackBar(); 36 | } 37 | : onPressed, 38 | textColor: white, 39 | ) 40 | : null, 41 | )); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | trackex 30 | 31 | 32 | 33 | 36 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | trackex 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 | 30 | 31 | NSPhotoLibraryUsageDescription 32 | Photo libary access 33 | 34 | 35 | 36 | NSCameraUsageDescription 37 | Camera access 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | UIViewControllerBasedStatusBarAppearance 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | apply plugin: 'com.google.gms.google-services' 28 | 29 | android { 30 | compileSdkVersion 30 31 | 32 | sourceSets { 33 | main.java.srcDirs += 'src/main/kotlin' 34 | } 35 | 36 | defaultConfig { 37 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 38 | applicationId "tech.hyperone.trackex" 39 | minSdkVersion 19 40 | targetSdkVersion 30 41 | versionCode flutterVersionCode.toInteger() 42 | versionName flutterVersionName 43 | multiDexEnabled true 44 | } 45 | 46 | buildTypes { 47 | release { 48 | // TODO: Add your own signing config for the release build. 49 | // Signing with the debug keys for now, so `flutter run --release` works. 50 | signingConfig signingConfigs.debug 51 | } 52 | } 53 | } 54 | 55 | flutter { 56 | source '../..' 57 | } 58 | 59 | dependencies { 60 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 61 | implementation platform('com.google.firebase:firebase-bom:27.0.0') 62 | } 63 | -------------------------------------------------------------------------------- /lib/widget/chart.dart: -------------------------------------------------------------------------------- 1 | import 'package:fl_chart/fl_chart.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:trackex/theme/colors.dart'; 4 | 5 | List gradientColors = [primary]; 6 | 7 | LineChartData mainData() { 8 | return LineChartData( 9 | gridData: FlGridData( 10 | show: true, 11 | drawHorizontalLine: true, 12 | getDrawingHorizontalLine: (value) { 13 | return FlLine( 14 | color: const Color(0xff37434d), 15 | strokeWidth: 0.1, 16 | ); 17 | }), 18 | titlesData: FlTitlesData( 19 | show: true, 20 | bottomTitles: SideTitles( 21 | showTitles: true, 22 | reservedSize: 22, 23 | getTextStyles: (value) => 24 | const TextStyle(color: Color(0xff68737d), fontSize: 12), 25 | getTitles: (value) { 26 | switch (value.toInt()) { 27 | case 2: 28 | return '1'; 29 | case 5: 30 | return '11'; 31 | case 8: 32 | return '21'; 33 | } 34 | return ''; 35 | }, 36 | margin: 8, 37 | ), 38 | leftTitles: SideTitles( 39 | showTitles: true, 40 | getTextStyles: (value) => const TextStyle( 41 | color: Color(0xff67727d), 42 | fontSize: 12, 43 | ), 44 | getTitles: (value) { 45 | switch (value.toInt()) { 46 | case 1: 47 | return '10k'; 48 | case 3: 49 | return '50k'; 50 | case 5: 51 | return '100k'; 52 | } 53 | return ''; 54 | }, 55 | reservedSize: 28, 56 | margin: 12, 57 | ), 58 | ), 59 | borderData: FlBorderData( 60 | show: false, 61 | ), 62 | minX: 0, 63 | maxX: 11, 64 | minY: 0, 65 | maxY: 6, 66 | lineBarsData: [ 67 | LineChartBarData( 68 | spots: [ 69 | FlSpot(0, 3), 70 | FlSpot(2.6, 2), 71 | FlSpot(4.9, 5), 72 | FlSpot(6.8, 3.1), 73 | FlSpot(8, 4), 74 | FlSpot(9.5, 3), 75 | FlSpot(11, 4), 76 | ], 77 | isCurved: true, 78 | colors: gradientColors, 79 | barWidth: 3, 80 | isStrokeCapRound: true, 81 | dotData: FlDotData( 82 | show: false, 83 | ), 84 | ), 85 | ], 86 | ); 87 | } 88 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/pages/Dashboard.dart: -------------------------------------------------------------------------------- 1 | import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_icons/flutter_icons.dart'; 4 | import 'package:trackex/pages/budget_page.dart'; 5 | import 'package:trackex/pages/create_budge_page.dart'; 6 | import 'package:trackex/pages/daily_page.dart'; 7 | import 'package:trackex/pages/Profile.dart'; 8 | import 'package:trackex/pages/stats_page.dart'; 9 | import 'package:trackex/theme/colors.dart'; 10 | 11 | import '../theme/colors.dart'; 12 | 13 | class Dashboard extends StatefulWidget { 14 | @override 15 | _DashboardState createState() => _DashboardState(); 16 | } 17 | 18 | class _DashboardState extends State { 19 | int pageIndex = 0; 20 | List pages = [ 21 | DailyPage(), 22 | StatsPage(), 23 | BudgetPage(), 24 | ProfilePage(), 25 | CreatBudgetPage() 26 | ]; 27 | 28 | @override 29 | void initState() { 30 | // TODO: implement initState 31 | super.initState(); 32 | } 33 | 34 | @override 35 | void dispose() { 36 | super.dispose(); 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | return Scaffold( 42 | body: getBody(), 43 | bottomNavigationBar: getFooter(), 44 | floatingActionButton: FloatingActionButton( 45 | onPressed: () { 46 | selectedTab(4); 47 | }, 48 | child: Icon( 49 | Icons.add, 50 | size: 25, 51 | ), 52 | backgroundColor: primary 53 | //params 54 | ), 55 | floatingActionButtonLocation: 56 | FloatingActionButtonLocation.centerDocked); 57 | } 58 | 59 | Widget getBody() { 60 | return IndexedStack( 61 | index: pageIndex, 62 | children: pages, 63 | ); 64 | } 65 | 66 | Widget getFooter() { 67 | List iconItems = [ 68 | Ionicons.md_calendar, 69 | Ionicons.ios_stats, 70 | Ionicons.md_wallet, 71 | Ionicons.ios_person, 72 | ]; 73 | 74 | return AnimatedBottomNavigationBar( 75 | activeColor: primary, 76 | splashColor: secondary, 77 | inactiveColor: Colors.black.withOpacity(0.5), 78 | icons: iconItems, 79 | activeIndex: pageIndex, 80 | gapLocation: GapLocation.center, 81 | notchSmoothness: NotchSmoothness.softEdge, 82 | leftCornerRadius: 10, 83 | iconSize: 25, 84 | rightCornerRadius: 10, 85 | onTap: (index) { 86 | selectedTab(index); 87 | }, 88 | //other params 89 | ); 90 | } 91 | 92 | selectedTab(index) { 93 | setState(() { 94 | pageIndex = index; 95 | }); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 9 | 16 | 20 | 24 | 29 | 33 | 34 | 35 | 36 | 37 | 38 | 42 | 43 | 45 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Trackex 2 | ## _Personal expense manager in flutter with firebase_ 3 | 4 | 5 | 6 | 7 | 8 | Trackex is a personal expense manager built in a flutter with firebase as database, 9 | It user firebase email pass auth for authentication and firestore as storage 10 | 11 | - Clone it and unlock magic of flutter and firestore 12 | 13 | ## Features 14 | 15 | - Easy interface 16 | - Daily transaction list 17 | - Monthaly transaction 18 | - Analytics 19 | 20 | ## UI 21 | 22 | 23 | 24 | 25 | 26 | ## Tech 27 | Trackex uses a number of open source projects to work properly: 28 | 29 | - [Flutter](https://flutter.dev/) - Ui and Backend! 30 | - [Firebase](https://firebase.flutter.dev/docs/overview/) - As database! 31 | 32 | ## Installation 33 | 34 | Trackex requires [Flutter](https://flutter.dev/) v2.0+ to run. 35 | 36 | follow this step for quick setup. 37 | 38 | ```sh 39 | git clone https://github.com/hyperonetech/Trackex.git 40 | cd Trackex 41 | flutter doctor 42 | flutter pub get 43 | flutter run 44 | ``` 45 | 46 | For production environments... 47 | 48 | ```sh 49 | git clone https://github.com/flutter/flutter.git 50 | set path="path to flutter/bin" 51 | ``` 52 | 53 | ## Plugins 54 | 55 | Trackex is currently extended with the following plugins. 56 | Instructions on how to use them in your own application are linked below. 57 | 58 | | Plugin | 59 | | ------| 60 | cupertino_icons: ^1.0.2| 61 | flutter_icons: ^1.1.0| 62 | page_transition: ^1.1.7+6| 63 | animated_bottom_navigation_bar: ^0.2.1|| 64 | fl_chart: ^0.12.2| 65 | percent_indicator: "^2.1.7+2"|| 66 | firebase_auth: ^1.0.3| 67 | cloud_firestore: ^1.0.4| 68 | provider: ^5.0.0| 69 | firebase_core: ^1.0.3 | 70 | date_time_picker: ^2.0.0| 71 | shared_preferences: ^2.0.5| 72 | firebase_storage: ^8.0.3| 73 | image_picker: ^0.7.4| 74 | image_cropper: ^1.4.0 | 75 | cached_network_image: ^2.5.0| 76 | 77 | 78 | ## Want to contribute? Great! 79 | Follow and Contact us @ 80 | Linkedin | 81 | | ------ | 82 | | [Whatsapp](https://wa.me/14582047711) 83 | | [Linkedin](https://www.linkedin.com/company/hyperone-technology/) 84 | | [Instagram](https://www.instagram.com/hyperonetech/) 85 | | [Twitter](https://twitter.com/hyperonetech) 86 | 87 | 88 | ## Credit goes to 89 | 90 | 91 | 92 | Linkedin | Github 93 | | ------ | ------ | 94 | | [Jemis Goti](https://www.linkedin.com/in/jemis-goti/) | [View](https://github.com/jemisgoti) | 95 | | [SopheaMen Van](https://www.linkedin.com/in/sopheamen-van-949639119/?originalSubdomain=kh) |[View](https://github.com/sopheamen007) | 96 | 97 | 98 | ## License 99 | 100 | MIT 101 | 102 | **Free Software, Hell Yeah!** 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_core/firebase_core.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:provider/provider.dart'; 5 | import 'package:trackex/pages/Splash.dart'; 6 | import 'package:trackex/providers/UserProvider.dart'; 7 | import 'package:trackex/theme/colors.dart'; 8 | 9 | void main() async { 10 | WidgetsFlutterBinding.ensureInitialized(); 11 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 12 | statusBarColor: Colors.transparent, 13 | statusBarIconBrightness: Brightness.dark, 14 | // systemNavigationBarColor: Colors.transparent 15 | )); 16 | 17 | await Firebase.initializeApp(); 18 | runApp(MyApp()); 19 | } 20 | 21 | class MyApp extends StatelessWidget { 22 | // This widget is the root of your application. 23 | @override 24 | Widget build(BuildContext context) { 25 | return MultiProvider( 26 | providers: [ 27 | ChangeNotifierProvider( 28 | create: (context) => UserProvider(), 29 | ), 30 | ], 31 | child: MaterialApp( 32 | title: 'Trackex', 33 | debugShowCheckedModeBanner: false, 34 | theme: ThemeData( 35 | // This is the theme of your application. 36 | // 37 | // Try running your application with "flutter run". You'll see the 38 | // application has a blue toolbar. Then, without quitting the app, try 39 | // changing the primarySwatch below to Colors.green and then invoke 40 | // "hot reload" (press "r" in the console where you ran "flutter run", 41 | // or simply save your changes to "hot reload" in a Flutter IDE). 42 | // Notice that the counter didn't reset back to zero; the application 43 | // is not restarted. 44 | primarySwatch: MaterialColor(0xFF2C3137, { 45 | 50: Color(0xFF2C3137), 46 | 100: Color(0xFF2C3137), 47 | 200: Color(0xFF2C3137), 48 | 300: Color(0xFF2C3137), 49 | 400: Color(0xFF2C3137), 50 | 500: Color(0xFF2C3137), 51 | 600: Color(0xFF2C3137), 52 | 700: Color(0xFF2C3137), 53 | 800: Color(0xFF2C3137), 54 | 900: Color(0xFF2C3137) 55 | }), 56 | appBarTheme: AppBarTheme( 57 | brightness: Brightness.light, 58 | backgroundColor: white, 59 | elevation: 0), 60 | 61 | // This makes the visual density adapt to the platform that you run 62 | // the app on. For desktop platforms, the controls will be smaller and 63 | // closer together (more dense) than on mobile platforms. 64 | visualDensity: VisualDensity.adaptivePlatformDensity, 65 | backgroundColor: white), 66 | home: SplashScreen(), 67 | ), 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/pages/Splash.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:trackex/pages/Dashboard.dart'; 5 | import 'package:trackex/pages/Onboarding.dart'; 6 | import 'package:trackex/pages/Signin.dart'; 7 | import 'package:trackex/theme/colors.dart'; 8 | 9 | 10 | class SplashScreen extends StatefulWidget { 11 | @override 12 | _SplashScreenState createState() => _SplashScreenState(); 13 | } 14 | 15 | class _SplashScreenState extends State 16 | with SingleTickerProviderStateMixin { 17 | AnimationController controller; 18 | Animation heartbeatAnimation; 19 | @override 20 | void initState() { 21 | super.initState(); 22 | 23 | controller = 24 | AnimationController(vsync: this, duration: Duration(milliseconds: 1000)) 25 | ..repeat(reverse: true); 26 | heartbeatAnimation = 27 | Tween(begin: 110.0, end: 220.0).animate(controller); 28 | controller.forward().whenComplete(() { 29 | controller.reverse(); 30 | }); 31 | Future.delayed(Duration(seconds: 2)).then((value) { 32 | if(FirebaseAuth.instance.currentUser!=null) 33 | { 34 | 35 | Navigator.of(context).pushAndRemoveUntil( 36 | MaterialPageRoute(builder: (context) => Dashboard()), 37 | (route) => false); 38 | 39 | }else{ 40 | 41 | Navigator.of(context).pushAndRemoveUntil( 42 | MaterialPageRoute(builder: (context) => Onboarding()), 43 | (route) => false); 44 | } 45 | }); 46 | } 47 | 48 | @override 49 | void dispose() { 50 | // TODO: implement dispose 51 | controller.dispose(); 52 | super.dispose(); 53 | } 54 | 55 | @override 56 | Widget build(BuildContext context) { 57 | return AnimatedBuilder( 58 | animation: heartbeatAnimation, 59 | builder: (context, widget) { 60 | return Scaffold( 61 | backgroundColor: white, 62 | // appBar: AppBar( 63 | // backgroundColor: transperentColor, 64 | // elevation: 0, 65 | // brightness: Brightness.dark), 66 | // extendBodyBehindAppBar: true, 67 | // 68 | body: Stack(children: [ 69 | Column( 70 | mainAxisAlignment: MainAxisAlignment.center, 71 | crossAxisAlignment: CrossAxisAlignment.center, 72 | children: [ 73 | Row(), 74 | Image( 75 | image: AssetImage("assets/logot.png"), 76 | width: heartbeatAnimation.value, 77 | height: heartbeatAnimation.value, 78 | ), 79 | ], 80 | ), 81 | // Align( 82 | // alignment: Alignment.center, 83 | // child: Padding( 84 | // padding: const EdgeInsets.only(top: 200.0), 85 | // child: Text( 86 | // "BreathSense", 87 | // style: TextStyle( 88 | // color: white, 89 | // fontSize: 36.0, 90 | // fontWeight: FontWeight.w300), 91 | // ), 92 | // ), 93 | // ) 94 | ]), 95 | ); 96 | }, 97 | ); 98 | } 99 | 100 | 101 | } 102 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: trackex 2 | description: A new Flutter application. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | 28 | # The following adds the Cupertino Icons font to your application. 29 | # Use with the CupertinoIcons class for iOS style icons. 30 | cupertino_icons: ^1.0.2 31 | flutter_icons: ^1.1.0 32 | page_transition: ^1.1.7+6 33 | animated_bottom_navigation_bar: ^0.2.1 34 | fl_chart: ^0.12.2 35 | percent_indicator: "^2.1.7+2" 36 | firebase_auth: ^1.0.3 37 | cloud_firestore: ^1.0.4 38 | provider: ^5.0.0 39 | firebase_core: ^1.0.3 40 | date_time_picker: ^2.0.0 41 | shared_preferences: ^2.0.5 42 | firebase_storage: ^8.0.3 43 | image_picker: ^0.7.4 44 | image_cropper: ^1.4.0 45 | # cached_network_image: ^3.0.0 46 | cached_network_image: ^2.5.0 47 | dev_dependencies: 48 | flutter_test: 49 | sdk: flutter 50 | # flutter_launcher_icons: "^0.8.0" 51 | 52 | 53 | # For information on the generic Dart part of this file, see the 54 | # following page: https://dart.dev/tools/pub/pubspec 55 | 56 | # The following section is specific to Flutter. 57 | flutter_icons: 58 | android: "launcher_icon" 59 | ios: true 60 | image_path: "assets/logot.png" 61 | 62 | flutter: 63 | 64 | # The following line ensures that the Material Icons font is 65 | # included with your application, so that you can use the icons in 66 | # the material Icons class. 67 | uses-material-design: true 68 | 69 | # To add assets to your application, add an assets section, like this: 70 | # assets: 71 | # - images/a_dot_burr.jpeg 72 | # - images/a_dot_ham.jpeg 73 | assets: 74 | - assets/ 75 | - assets/images/ 76 | # An image asset can refer to one or more resolution-specific "variants", see 77 | # https://flutter.dev/assets-and-images/#resolution-aware. 78 | 79 | # For details regarding adding assets from package dependencies, see 80 | # https://flutter.dev/assets-and-images/#from-packages 81 | 82 | # To add custom fonts to your application, add a fonts section here, 83 | # in this "flutter" section. Each entry in this list should have a 84 | # "family" key with the font family name, and a "fonts" key with a 85 | # list giving the asset and other descriptors for the font. For 86 | # example: 87 | # fonts: 88 | # - family: Schyler 89 | # fonts: 90 | # - asset: fonts/Schyler-Regular.ttf 91 | # - asset: fonts/Schyler-Italic.ttf 92 | # style: italic 93 | # - family: Trajan Pro 94 | # fonts: 95 | # - asset: fonts/TrajanPro.ttf 96 | # - asset: fonts/TrajanPro_Bold.ttf 97 | # weight: 700 98 | # 99 | # For details regarding fonts from package dependencies, 100 | # see https://flutter.dev/custom-fonts/#from-packages 101 | -------------------------------------------------------------------------------- /lib/widget/Buttons.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PrimaryButton extends StatefulWidget { 4 | String title; 5 | Function onPressed; 6 | bool isloading; 7 | double width; 8 | Color foregroundColor, backgroundColor; 9 | double fontsize; 10 | double height; 11 | double borderRadius; 12 | 13 | PrimaryButton( 14 | {this.title, 15 | this.width, 16 | this.onPressed, 17 | this.foregroundColor, 18 | this.backgroundColor, 19 | this.fontsize, 20 | this.height, 21 | this.borderRadius, 22 | this.isloading}); 23 | @override 24 | _PrimaryButtonState createState() => _PrimaryButtonState(); 25 | } 26 | 27 | class _PrimaryButtonState extends State { 28 | @override 29 | Widget build(BuildContext context) { 30 | return InkWell( 31 | onTap: widget.isloading ? null : widget.onPressed, 32 | child: Container( 33 | decoration: BoxDecoration( 34 | color: widget.backgroundColor, 35 | borderRadius: BorderRadius.circular(widget.borderRadius == null 36 | ? widget.height / 2 37 | : widget.borderRadius)), 38 | height: widget.height == null ? 50 : widget.height, 39 | width: widget.width != null 40 | ? widget.width 41 | : MediaQuery.of(context).size.width, 42 | child: Center( 43 | child: widget.isloading 44 | ? Center( 45 | child: Container( 46 | width: 40, 47 | height: 40, 48 | child: CircularProgressIndicator( 49 | valueColor: new AlwaysStoppedAnimation( 50 | widget.foregroundColor), 51 | backgroundColor: widget.backgroundColor, 52 | ), 53 | )) 54 | : Text( 55 | widget.title, 56 | style: TextStyle( 57 | color: widget.foregroundColor, 58 | fontSize: widget.fontsize == null ? 24 : widget.fontsize, 59 | fontWeight: FontWeight.w700), 60 | ), 61 | ), 62 | ), 63 | ); 64 | } 65 | } 66 | 67 | // class BorderedButton extends StatefulWidget { 68 | // String title; 69 | // Function onPressed; 70 | // bool isloading; 71 | // double width; 72 | // double fontsize; 73 | // Color foregroundColor, backgroundColor; 74 | // double height; 75 | 76 | // BorderedButton( 77 | // {this.title, 78 | // this.width, 79 | // this.onPressed, 80 | // this.foregroundColor, 81 | // this.backgroundColor, 82 | // this.fontsize, 83 | // this.height, 84 | // this.isloading}); 85 | // @override 86 | // _BorderedButtonState createState() => _BorderedButtonState(); 87 | // } 88 | 89 | // class _BorderedButtonState extends State { 90 | // @override 91 | // Widget build(BuildContext context) { 92 | // return InkWell( 93 | // onTap: widget.isloading ? null : widget.onPressed, 94 | // child: Container( 95 | // decoration: BoxDecoration( 96 | // color: widget.backgroundColor, 97 | // border: Border.all(width: 2, color: widget.foregroundColor), 98 | // borderRadius: BorderRadius.circular(buttonRadius)), 99 | // height: widget.height == null ? 60 : widget.height, 100 | // width: widget.width != null 101 | // ? widget.width 102 | // : MediaQuery.of(context).size.width, 103 | // child: Center( 104 | // child: widget.isloading 105 | // ? Center( 106 | // child: Container( 107 | // width: 40, 108 | // height: 40, 109 | // child: CircularProgressIndicator( 110 | // valueColor: new AlwaysStoppedAnimation( 111 | // widget.foregroundColor), 112 | // backgroundColor: widget.backgroundColor, 113 | // ), 114 | // )) 115 | // : Text( 116 | // widget.title, 117 | // style: TextStyle( 118 | // color: widget.foregroundColor, 119 | // fontSize: widget.fontsize == null 120 | // ? buttonTextSize 121 | // : widget.fontsize, 122 | // fontWeight: FontWeight.w700), 123 | // ), 124 | // ), 125 | // ), 126 | // ); 127 | // } 128 | // } 129 | -------------------------------------------------------------------------------- /lib/pages/Onboarding.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import 'package:trackex/pages/Signin.dart'; 5 | import 'package:trackex/pages/Signup.dart'; 6 | import 'package:trackex/theme/Style.dart'; 7 | import 'package:trackex/theme/colors.dart'; 8 | import 'package:trackex/widget/Buttons.dart'; 9 | 10 | class Onboarding extends StatefulWidget { 11 | @override 12 | _OnboardingState createState() => _OnboardingState(); 13 | } 14 | 15 | class _OnboardingState extends State { 16 | @override 17 | Widget build(BuildContext context) { 18 | return Scaffold( 19 | backgroundColor: white, 20 | body: Container( 21 | width: MediaQuery.of(context).size.width, 22 | decoration: BoxDecoration(color: white), 23 | child: Column( 24 | crossAxisAlignment: CrossAxisAlignment.start, 25 | children: [ 26 | Expanded( 27 | child: Container( 28 | padding: EdgeInsets.symmetric(horizontal: mainMargin), 29 | decoration: BoxDecoration( 30 | color: white, 31 | // image: DecorationImage( 32 | // image: AssetImage("assets/onb2.png"), 33 | // fit: BoxFit.fitWidth), 34 | ), 35 | child: Center( 36 | child: Column( 37 | mainAxisAlignment: MainAxisAlignment.center, 38 | children: [ 39 | Padding( 40 | padding: EdgeInsets.symmetric(horizontal: subMargin), 41 | child: Image( 42 | image: AssetImage("assets/logot.png"), 43 | width: 100, 44 | ), 45 | ), 46 | SizedBox( 47 | height: 6 * subMargin, 48 | ), 49 | PrimaryButton( 50 | isloading: false, 51 | onPressed: () { 52 | Navigator.push( 53 | context, 54 | MaterialPageRoute( 55 | builder: (context) => SignIn())); 56 | }, 57 | title: "Login", 58 | height: 55, 59 | backgroundColor: primary, 60 | foregroundColor: white, 61 | ), 62 | // SizedBox( 63 | // height: 8 * subMargin, 64 | // ), 65 | ], 66 | ), 67 | ), 68 | ), 69 | ), 70 | Container( 71 | padding: EdgeInsets.symmetric( 72 | horizontal: mainMargin, vertical: 2 * subMargin), 73 | decoration: BoxDecoration(color: white), 74 | child: Column( 75 | crossAxisAlignment: CrossAxisAlignment.start, 76 | children: [ 77 | // Text( 78 | // "Fitness.", 79 | // style: TextStyle( 80 | // color: black, 81 | // fontWeight: FontWeight.bold, 82 | // fontSize: 40), 83 | // ), 84 | // Text( 85 | // "With Friends", 86 | // style: TextStyle( 87 | // color: primaryDark, 88 | // fontWeight: FontWeight.w400, 89 | // fontSize: 40, 90 | // ), 91 | // ), 92 | // SizedBox( 93 | // height: 2 * subMargin, 94 | // ), 95 | // PrimaryButton( 96 | // isloading: false, 97 | // onPressed: () { 98 | // Navigator.push(context, 99 | // MaterialPageRoute(builder: (context) => SignIn())); 100 | // }, 101 | // title: "Login", 102 | // backgroundColor: primary, 103 | // foregroundColor: white, 104 | // ), 105 | // SizedBox( 106 | // height: 8 * subMargin, 107 | // ), 108 | Center( 109 | child: InkWell( 110 | onTap: () { 111 | Navigator.push( 112 | context, 113 | MaterialPageRoute( 114 | builder: (context) => Signup())); 115 | }, 116 | child: Text( 117 | "New here? Create New Account", 118 | style: TextStyle( 119 | fontSize: mainMargin - 2, 120 | fontWeight: FontWeight.w400), 121 | ), 122 | ), 123 | ), 124 | ], 125 | ), 126 | ) 127 | ], 128 | ), 129 | )); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /lib/widget/inputbox.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:trackex/theme/colors.dart'; 5 | import 'package:trackex/theme/Style.dart'; 6 | 7 | class inputBox extends StatefulWidget { 8 | TextEditingController controller; 9 | String labelText, errorText; 10 | Function onchanged; 11 | List inuptformat; 12 | bool obscureText, error; 13 | bool ispassword = false; 14 | bool istextarea = false; 15 | bool readonly = false; 16 | int minLine; 17 | inputBox( 18 | {this.controller, 19 | this.labelText, 20 | this.error, 21 | this.errorText, 22 | this.inuptformat, 23 | this.obscureText, 24 | this.ispassword, 25 | this.istextarea, 26 | this.readonly, 27 | this.minLine, 28 | this.onchanged}); 29 | 30 | @override 31 | _inputBoxState createState() => _inputBoxState(); 32 | } 33 | 34 | class _inputBoxState extends State { 35 | bool error, obscureText, hidepass = false; 36 | 37 | @override 38 | void initState() { 39 | // TODO: implement initState 40 | if (widget.obscureText) { 41 | setState(() { 42 | hidepass = true; 43 | }); 44 | } 45 | super.initState(); 46 | } 47 | 48 | @override 49 | Widget build(BuildContext context) { 50 | // TODO: implement build 51 | return TextField( 52 | controller: widget.controller, 53 | cursorColor: primary, 54 | obscureText: hidepass, 55 | onChanged: widget.onchanged, 56 | inputFormatters: widget.inuptformat, 57 | maxLines: widget.istextarea ? null : 1, 58 | textAlignVertical: TextAlignVertical.top, 59 | readOnly: widget.readonly, 60 | textAlign: TextAlign.left, 61 | style: TextStyle( 62 | fontSize: 18, 63 | fontWeight: FontWeight.w400, 64 | color: black, 65 | ), 66 | decoration: InputDecoration( 67 | focusColor: black, 68 | fillColor: grey, 69 | errorText: widget.error ? widget.errorText : null, 70 | 71 | contentPadding: EdgeInsets.all(subMargin + 4), 72 | labelText: widget.labelText, 73 | labelStyle: TextStyle(color: black, fontSize: subMargin + 2), 74 | focusedBorder: OutlineInputBorder( 75 | borderRadius: BorderRadius.circular(buttonRadius), 76 | borderSide: BorderSide(width: 2, color: primary), 77 | ), 78 | disabledBorder: OutlineInputBorder( 79 | borderRadius: BorderRadius.circular(buttonRadius), 80 | borderSide: BorderSide(width: 1, color: grey), 81 | ), 82 | enabledBorder: OutlineInputBorder( 83 | borderRadius: BorderRadius.circular(buttonRadius), 84 | borderSide: BorderSide(width: 1, color: black), 85 | ), 86 | border: OutlineInputBorder( 87 | borderRadius: BorderRadius.circular(buttonRadius), 88 | borderSide: BorderSide( 89 | width: 1, 90 | )), 91 | errorBorder: OutlineInputBorder( 92 | borderRadius: BorderRadius.circular(buttonRadius), 93 | borderSide: BorderSide(width: 1.5, color: errorColor)), 94 | focusedErrorBorder: OutlineInputBorder( 95 | borderRadius: BorderRadius.circular(buttonRadius), 96 | borderSide: BorderSide(width: 2, color: errorColor)), 97 | // isDense: true, 98 | errorStyle: TextStyle(color: errorColor, height: 0), 99 | alignLabelWithHint: true, 100 | 101 | suffixIcon: widget.ispassword 102 | ? IconButton( 103 | onPressed: () { 104 | if (widget.ispassword) { 105 | setState(() { 106 | if (hidepass == true) { 107 | hidepass = false; 108 | } else { 109 | hidepass = true; 110 | } 111 | }); 112 | } 113 | }, 114 | splashColor: Colors.transparent, 115 | icon: Icon( 116 | hidepass ? CupertinoIcons.eye_slash : CupertinoIcons.eye, 117 | color: widget.ispassword ? black.withOpacity(0.6) : white, 118 | ), 119 | ) 120 | : null, 121 | ), 122 | ); 123 | } 124 | } 125 | 126 | SnackBar redsnackBar(String text) { 127 | return SnackBar( 128 | content: Text(text), 129 | backgroundColor: errorColor, 130 | behavior: SnackBarBehavior.floating, 131 | margin: EdgeInsets.all(20), 132 | duration: Duration(seconds: 1), 133 | ); 134 | } 135 | 136 | SnackBar greensnackBar(String text) { 137 | return SnackBar( 138 | content: Text(text), 139 | backgroundColor: succses, 140 | behavior: SnackBarBehavior.floating, 141 | margin: EdgeInsets.all(20), 142 | duration: Duration(seconds: 1), 143 | ); 144 | } 145 | 146 | Center greenProgressBar() { 147 | return Center( 148 | child: Container( 149 | width: 60, 150 | height: 60, 151 | child: CircularProgressIndicator( 152 | valueColor: new AlwaysStoppedAnimation(primary), 153 | backgroundColor: grey, 154 | ), 155 | )); 156 | } 157 | 158 | Center progressBar() { 159 | return Center( 160 | child: Container( 161 | width: 60, 162 | height: 60, 163 | child: CircularProgressIndicator( 164 | valueColor: new AlwaysStoppedAnimation(primary), 165 | backgroundColor: grey, 166 | ), 167 | )); 168 | } 169 | -------------------------------------------------------------------------------- /lib/pages/create_budge_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_icons/flutter_icons.dart'; 3 | import 'package:trackex/json/create_budget_json.dart'; 4 | import 'package:trackex/theme/colors.dart'; 5 | 6 | class CreatBudgetPage extends StatefulWidget { 7 | @override 8 | _CreatBudgetPageState createState() => _CreatBudgetPageState(); 9 | } 10 | 11 | class _CreatBudgetPageState extends State { 12 | int activeCategory = 0; 13 | TextEditingController _budgetName = 14 | TextEditingController(text: "Grocery Budget"); 15 | TextEditingController _budgetPrice = TextEditingController(text: "\$1500.00"); 16 | @override 17 | Widget build(BuildContext context) { 18 | return Scaffold( 19 | backgroundColor: grey.withOpacity(0.05), 20 | body: getBody(), 21 | ); 22 | } 23 | 24 | Widget getBody() { 25 | var size = MediaQuery.of(context).size; 26 | return SingleChildScrollView( 27 | child: Column( 28 | crossAxisAlignment: CrossAxisAlignment.start, 29 | children: [ 30 | Container( 31 | decoration: BoxDecoration(color: white, boxShadow: [ 32 | BoxShadow( 33 | color: grey.withOpacity(0.01), 34 | spreadRadius: 10, 35 | blurRadius: 3, 36 | // changes position of shadow 37 | ), 38 | ]), 39 | child: Padding( 40 | padding: const EdgeInsets.only( 41 | top: 60, right: 20, left: 20, bottom: 25), 42 | child: Column( 43 | children: [ 44 | Row( 45 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 46 | children: [ 47 | Text( 48 | "Create budget", 49 | style: TextStyle( 50 | fontSize: 20, 51 | fontWeight: FontWeight.bold, 52 | color: black), 53 | ), 54 | Row( 55 | children: [Icon(AntDesign.search1)], 56 | ) 57 | ], 58 | ), 59 | ], 60 | ), 61 | ), 62 | ), 63 | Padding( 64 | padding: const EdgeInsets.only(left: 20, right: 20, top: 30), 65 | child: Text( 66 | "Choose category", 67 | style: TextStyle( 68 | fontSize: 16, 69 | fontWeight: FontWeight.bold, 70 | color: black.withOpacity(0.5)), 71 | ), 72 | ), 73 | SizedBox( 74 | height: 20, 75 | ), 76 | SingleChildScrollView( 77 | scrollDirection: Axis.horizontal, 78 | child: Row( 79 | children: List.generate(categories.length, (index) { 80 | return GestureDetector( 81 | onTap: () { 82 | setState(() { 83 | activeCategory = index; 84 | }); 85 | }, 86 | child: Padding( 87 | padding: const EdgeInsets.only( 88 | left: 10, 89 | ), 90 | child: Container( 91 | margin: EdgeInsets.only( 92 | left: 10, 93 | ), 94 | width: 150, 95 | height: 170, 96 | decoration: BoxDecoration( 97 | color: white, 98 | border: Border.all( 99 | width: 2, 100 | color: activeCategory == index 101 | ? primary 102 | : Colors.transparent), 103 | borderRadius: BorderRadius.circular(12), 104 | boxShadow: [ 105 | BoxShadow( 106 | color: grey.withOpacity(0.01), 107 | spreadRadius: 10, 108 | blurRadius: 3, 109 | // changes position of shadow 110 | ), 111 | ]), 112 | child: Padding( 113 | padding: const EdgeInsets.only( 114 | left: 25, right: 25, top: 20, bottom: 20), 115 | child: Column( 116 | crossAxisAlignment: CrossAxisAlignment.start, 117 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 118 | children: [ 119 | Container( 120 | width: 40, 121 | height: 40, 122 | decoration: BoxDecoration( 123 | shape: BoxShape.circle, 124 | color: grey.withOpacity(0.15)), 125 | child: Center( 126 | child: Image.asset( 127 | categories[index]['icon'], 128 | width: 30, 129 | height: 30, 130 | fit: BoxFit.contain, 131 | ), 132 | )), 133 | Text( 134 | categories[index]['name'], 135 | style: TextStyle( 136 | fontWeight: FontWeight.bold, 137 | fontSize: 20, 138 | ), 139 | ) 140 | ], 141 | ), 142 | ), 143 | ), 144 | ), 145 | ); 146 | })), 147 | ), 148 | SizedBox( 149 | height: 50, 150 | ), 151 | Padding( 152 | padding: const EdgeInsets.only(left: 20, right: 20), 153 | child: Column( 154 | crossAxisAlignment: CrossAxisAlignment.start, 155 | children: [ 156 | Text( 157 | "budget name", 158 | style: TextStyle( 159 | fontWeight: FontWeight.w500, 160 | fontSize: 13, 161 | color: Color(0xff67727d)), 162 | ), 163 | TextField( 164 | controller: _budgetName, 165 | cursorColor: black, 166 | style: TextStyle( 167 | fontSize: 17, fontWeight: FontWeight.bold, color: black), 168 | decoration: InputDecoration( 169 | hintText: "Enter Budget Name", border: InputBorder.none), 170 | ), 171 | SizedBox( 172 | height: 20, 173 | ), 174 | Row( 175 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 176 | children: [ 177 | Container( 178 | width: (size.width - 140), 179 | child: Column( 180 | crossAxisAlignment: CrossAxisAlignment.start, 181 | children: [ 182 | Text( 183 | "Enter budget", 184 | style: TextStyle( 185 | fontWeight: FontWeight.w500, 186 | fontSize: 13, 187 | color: Color(0xff67727d)), 188 | ), 189 | TextField( 190 | controller: _budgetPrice, 191 | cursorColor: black, 192 | style: TextStyle( 193 | fontSize: 17, 194 | fontWeight: FontWeight.bold, 195 | color: black), 196 | decoration: InputDecoration( 197 | hintText: "Enter Budget", 198 | border: InputBorder.none), 199 | ), 200 | ], 201 | ), 202 | ), 203 | SizedBox( 204 | width: 20, 205 | ), 206 | Container( 207 | width: 50, 208 | height: 50, 209 | decoration: BoxDecoration( 210 | color: primary, 211 | borderRadius: BorderRadius.circular(15)), 212 | child: Icon( 213 | Icons.arrow_forward, 214 | color: white, 215 | ), 216 | ), 217 | ], 218 | ) 219 | ], 220 | ), 221 | ) 222 | ], 223 | ), 224 | ); 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /lib/pages/Signin.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/gestures.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:provider/provider.dart'; 5 | import 'package:trackex/pages/Dashboard.dart'; 6 | import 'package:trackex/pages/ForgotPass.dart'; 7 | import 'package:trackex/providers/UserProvider.dart'; 8 | import 'package:trackex/theme/colors.dart'; 9 | 10 | import 'package:trackex/theme/Style.dart'; 11 | 12 | import 'package:trackex/widget/inputbox.dart'; 13 | 14 | import 'package:trackex/widget/Buttons.dart'; 15 | 16 | import 'package:trackex/widget/snackbar.dart'; 17 | 18 | class SignIn extends StatefulWidget { 19 | @override 20 | _SignInState createState() => _SignInState(); 21 | } 22 | 23 | class _SignInState extends State { 24 | TextEditingController email, pass; 25 | bool email_error = false, pass_error = false; 26 | bool isloading = false; 27 | final scaffoldKey = GlobalKey(); 28 | 29 | FirebaseAuth auth = FirebaseAuth.instance; 30 | @override 31 | void initState() { 32 | email = TextEditingController(); 33 | pass = TextEditingController(); 34 | super.initState(); 35 | } 36 | 37 | void sigin(BuildContext context) async { 38 | try { 39 | UserCredential userCredential = await FirebaseAuth.instance 40 | .signInWithEmailAndPassword(email: email.text, password: pass.text); 41 | print("login"); 42 | print(userCredential); 43 | print("user instance"); 44 | print(userCredential.user); 45 | 46 | Provider.of(context, listen: false) 47 | .fetchLogedUser() 48 | .then((value) { 49 | Navigator.of(context).pushAndRemoveUntil( 50 | MaterialPageRoute(builder: (context) => Dashboard()), 51 | (route) => false); 52 | }); 53 | } on FirebaseAuthException catch (e) { 54 | if (e.code == 'user-not-found') { 55 | setState(() { 56 | email_error = true; 57 | isloading = false; 58 | CustomSnackBar( 59 | actionTile: "close", 60 | haserror: true, 61 | scaffoldKey: scaffoldKey, 62 | isfloating: false, 63 | onPressed: () {}, 64 | title: "No user found for this email!") 65 | .show(); 66 | }); 67 | print('No user found for that email.'); 68 | } else if (e.code == 'wrong-password') { 69 | isloading = false; 70 | pass_error = true; 71 | setState(() { 72 | CustomSnackBar( 73 | actionTile: "close", 74 | haserror: true, 75 | scaffoldKey: scaffoldKey, 76 | isfloating: false, 77 | onPressed: () {}, 78 | title: "Wrong password provided for this user!") 79 | .show(); 80 | }); 81 | print('Wrong password provided for that user.'); 82 | } else { 83 | isloading = false; 84 | pass_error = true; 85 | print(e.code); 86 | setState(() { 87 | CustomSnackBar( 88 | actionTile: "close", 89 | haserror: true, 90 | scaffoldKey: scaffoldKey, 91 | isfloating: false, 92 | onPressed: () {}, 93 | title: e.code) 94 | .show(); 95 | }); 96 | } 97 | } 98 | } 99 | 100 | @override 101 | Widget build(BuildContext context) { 102 | return Scaffold( 103 | backgroundColor: white, 104 | key: scaffoldKey, 105 | appBar: AppBar( 106 | brightness: Brightness.light, 107 | backgroundColor: white, 108 | elevation: 0, 109 | leading: IconButton( 110 | onPressed: () { 111 | Navigator.of(context).pop(); 112 | }, 113 | icon: Icon( 114 | Icons.arrow_back_ios, 115 | color: black, 116 | size: mainMargin + 6, 117 | ), 118 | ), 119 | ), 120 | body: Container( 121 | padding: EdgeInsets.all(mainMargin), 122 | child: SingleChildScrollView( 123 | child: Column( 124 | crossAxisAlignment: CrossAxisAlignment.start, 125 | children: [ 126 | Text( 127 | "Login", 128 | style: TextStyle( 129 | color: primary, fontWeight: FontWeight.bold, fontSize: 40), 130 | ), 131 | SizedBox( 132 | height: mainMargin, 133 | ), 134 | Text( 135 | "Enter your email address and password\nto get access your account", 136 | style: TextStyle( 137 | color: primary, 138 | fontWeight: FontWeight.w400, 139 | fontSize: subMargin + 4), 140 | ), 141 | SizedBox( 142 | height: 2 * mainMargin, 143 | ), 144 | inputBox( 145 | controller: email, 146 | error: email_error, 147 | errorText: "", 148 | inuptformat: [], 149 | labelText: "Email Address", 150 | obscureText: false, 151 | ispassword: false, 152 | istextarea: false, 153 | readonly: false, 154 | onchanged: (value) { 155 | setState(() { 156 | email_error = false; 157 | }); 158 | }, 159 | ), 160 | SizedBox( 161 | height: mainMargin, 162 | ), 163 | inputBox( 164 | controller: pass, 165 | error: pass_error, 166 | errorText: "", 167 | inuptformat: [], 168 | labelText: "Password", 169 | readonly: false, 170 | obscureText: true, 171 | ispassword: true, 172 | istextarea: false, 173 | onchanged: (value) { 174 | setState(() { 175 | pass_error = false; 176 | }); 177 | }, 178 | ), 179 | SizedBox( 180 | height: mainMargin, 181 | ), 182 | PrimaryButton( 183 | isloading: isloading, 184 | onPressed: () { 185 | if (email.text == '') { 186 | print("email null"); 187 | setState(() { 188 | CustomSnackBar( 189 | actionTile: "close", 190 | haserror: true, 191 | isfloating: false, 192 | scaffoldKey: scaffoldKey, 193 | onPressed: () {}, 194 | title: "Please enter your email!") 195 | .show(); 196 | email_error = true; 197 | }); 198 | } else if (!RegExp( 199 | r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+") 200 | .hasMatch(email.text)) { 201 | print("not email"); 202 | setState(() { 203 | CustomSnackBar( 204 | actionTile: "close", 205 | haserror: true, 206 | isfloating: false, 207 | scaffoldKey: scaffoldKey, 208 | onPressed: () {}, 209 | title: "Please enter valid email!") 210 | .show(); 211 | email_error = true; 212 | }); 213 | } else if (pass.text == '') { 214 | setState(() { 215 | CustomSnackBar( 216 | actionTile: "close", 217 | haserror: true, 218 | isfloating: false, 219 | scaffoldKey: scaffoldKey, 220 | onPressed: () {}, 221 | title: "Please enter your password!") 222 | .show(); 223 | 224 | pass_error = true; 225 | }); 226 | } else { 227 | setState(() { 228 | isloading = true; 229 | }); 230 | 231 | print("calling signin"); 232 | sigin(context); 233 | } 234 | }, 235 | title: "Login", 236 | backgroundColor: primary, 237 | foregroundColor: white, 238 | height: 55, 239 | ), 240 | SizedBox( 241 | height: mainMargin, 242 | ), 243 | Center( 244 | child: InkWell( 245 | onTap: () { 246 | Navigator.push(context, 247 | MaterialPageRoute(builder: (context) => ForgotPass())); 248 | }, 249 | child: Text( 250 | "Forgot Password?", 251 | style: TextStyle( 252 | fontSize: mainMargin - 2, fontWeight: FontWeight.w400), 253 | ), 254 | ), 255 | ) 256 | ], 257 | ), 258 | ), 259 | ), 260 | ); 261 | } 262 | } 263 | -------------------------------------------------------------------------------- /lib/pages/daily_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_icons/flutter_icons.dart'; 3 | import 'package:trackex/json/daily_json.dart'; 4 | import 'package:trackex/json/day_month.dart'; 5 | import 'package:trackex/theme/colors.dart'; 6 | 7 | class DailyPage extends StatefulWidget { 8 | @override 9 | _DailyPageState createState() => _DailyPageState(); 10 | } 11 | 12 | class _DailyPageState extends State { 13 | int activeDay = 3; 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | backgroundColor: grey.withOpacity(0.05), 18 | body: getBody(), 19 | ); 20 | } 21 | 22 | Widget getBody() { 23 | var size = MediaQuery.of(context).size; 24 | return SingleChildScrollView( 25 | child: Column( 26 | children: [ 27 | Container( 28 | decoration: BoxDecoration(color: white, boxShadow: [ 29 | BoxShadow( 30 | color: grey.withOpacity(0.01), 31 | spreadRadius: 10, 32 | blurRadius: 3, 33 | // changes position of shadow 34 | ), 35 | ]), 36 | child: Padding( 37 | padding: const EdgeInsets.only( 38 | top: 60, right: 20, left: 20, bottom: 25), 39 | child: Column( 40 | children: [ 41 | Row( 42 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 43 | children: [ 44 | Text( 45 | "Daily Transaction", 46 | style: TextStyle( 47 | fontSize: 20, 48 | fontWeight: FontWeight.bold, 49 | color: black), 50 | ), 51 | Icon(AntDesign.search1) 52 | ], 53 | ), 54 | SizedBox( 55 | height: 25, 56 | ), 57 | Row( 58 | crossAxisAlignment: CrossAxisAlignment.start, 59 | children: List.generate(days.length, (index) { 60 | return GestureDetector( 61 | onTap: () { 62 | setState(() { 63 | activeDay = index; 64 | }); 65 | }, 66 | child: Container( 67 | width: (MediaQuery.of(context).size.width - 40) / 7, 68 | child: Column( 69 | children: [ 70 | Text( 71 | days[index]['label'], 72 | style: TextStyle(fontSize: 10), 73 | ), 74 | SizedBox( 75 | height: 10, 76 | ), 77 | Container( 78 | width: 30, 79 | height: 30, 80 | decoration: BoxDecoration( 81 | color: activeDay == index 82 | ? primary 83 | : Colors.transparent, 84 | shape: BoxShape.circle, 85 | border: Border.all( 86 | color: activeDay == index 87 | ? primary 88 | : black.withOpacity(0.1))), 89 | child: Center( 90 | child: Text( 91 | days[index]['day'], 92 | style: TextStyle( 93 | fontSize: 10, 94 | fontWeight: FontWeight.w600, 95 | color: activeDay == index 96 | ? white 97 | : black), 98 | ), 99 | ), 100 | ) 101 | ], 102 | ), 103 | ), 104 | ); 105 | })) 106 | ], 107 | ), 108 | ), 109 | ), 110 | SizedBox( 111 | height: 30, 112 | ), 113 | Padding( 114 | padding: const EdgeInsets.only(left: 20, right: 20), 115 | child: Column( 116 | children: List.generate(daily.length, (index) { 117 | return Column( 118 | children: [ 119 | Row( 120 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 121 | children: [ 122 | Container( 123 | width: (size.width - 40) * 0.7, 124 | child: Row( 125 | children: [ 126 | Container( 127 | width: 50, 128 | height: 50, 129 | decoration: BoxDecoration( 130 | shape: BoxShape.circle, 131 | color: grey.withOpacity(0.1), 132 | ), 133 | child: Center( 134 | child: Image.asset( 135 | daily[index]['icon'], 136 | width: 30, 137 | height: 30, 138 | ), 139 | ), 140 | ), 141 | SizedBox(width: 15), 142 | Container( 143 | width: (size.width - 90) * 0.5, 144 | child: Column( 145 | mainAxisAlignment: MainAxisAlignment.center, 146 | crossAxisAlignment: CrossAxisAlignment.start, 147 | children: [ 148 | Text( 149 | daily[index]['name'], 150 | style: TextStyle( 151 | fontSize: 15, 152 | color: black, 153 | fontWeight: FontWeight.w500), 154 | overflow: TextOverflow.ellipsis, 155 | ), 156 | SizedBox(height: 5), 157 | Text( 158 | daily[index]['date'], 159 | style: TextStyle( 160 | fontSize: 12, 161 | color: black.withOpacity(0.5), 162 | fontWeight: FontWeight.w400), 163 | overflow: TextOverflow.ellipsis, 164 | ), 165 | ], 166 | ), 167 | ) 168 | ], 169 | ), 170 | ), 171 | Container( 172 | width: (size.width - 40) * 0.3, 173 | child: Row( 174 | mainAxisAlignment: MainAxisAlignment.end, 175 | children: [ 176 | Text( 177 | daily[index]['price'], 178 | style: TextStyle( 179 | fontWeight: FontWeight.w600, 180 | fontSize: 15, 181 | color: Colors.green), 182 | ), 183 | ], 184 | ), 185 | ) 186 | ], 187 | ), 188 | Padding( 189 | padding: const EdgeInsets.only(left: 65, top: 8), 190 | child: Divider( 191 | thickness: 0.8, 192 | ), 193 | ) 194 | ], 195 | ); 196 | })), 197 | ), 198 | SizedBox( 199 | height: 15, 200 | ), 201 | Padding( 202 | padding: const EdgeInsets.only(left: 20, right: 20), 203 | child: Row( 204 | children: [ 205 | Spacer(), 206 | Padding( 207 | padding: const EdgeInsets.only(right: 80), 208 | child: Text( 209 | "Total", 210 | style: TextStyle( 211 | fontSize: 16, 212 | color: black.withOpacity(0.4), 213 | fontWeight: FontWeight.w600), 214 | overflow: TextOverflow.ellipsis, 215 | ), 216 | ), 217 | Spacer(), 218 | Padding( 219 | padding: const EdgeInsets.only(top: 5), 220 | child: Text( 221 | "\$1780.00", 222 | style: TextStyle( 223 | fontSize: 20, 224 | color: black, 225 | fontWeight: FontWeight.bold), 226 | overflow: TextOverflow.ellipsis, 227 | ), 228 | ), 229 | ], 230 | ), 231 | ) 232 | ], 233 | ), 234 | ); 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /lib/pages/budget_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_icons/flutter_icons.dart'; 3 | import 'package:trackex/json/budget_json.dart'; 4 | import 'package:trackex/json/day_month.dart'; 5 | import 'package:trackex/theme/colors.dart'; 6 | 7 | class BudgetPage extends StatefulWidget { 8 | @override 9 | _BudgetPageState createState() => _BudgetPageState(); 10 | } 11 | 12 | class _BudgetPageState extends State { 13 | int activeDay = 3; 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | backgroundColor: grey.withOpacity(0.05), 18 | body: getBody(), 19 | ); 20 | } 21 | 22 | Widget getBody() { 23 | var size = MediaQuery.of(context).size; 24 | 25 | return SingleChildScrollView( 26 | child: Column( 27 | children: [ 28 | Container( 29 | decoration: BoxDecoration(color: white, boxShadow: [ 30 | BoxShadow( 31 | color: grey.withOpacity(0.01), 32 | spreadRadius: 10, 33 | blurRadius: 3, 34 | // changes position of shadow 35 | ), 36 | ]), 37 | child: Padding( 38 | padding: const EdgeInsets.only( 39 | top: 60, right: 20, left: 20, bottom: 25), 40 | child: Column( 41 | children: [ 42 | Row( 43 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 44 | children: [ 45 | Text( 46 | "Budget", 47 | style: TextStyle( 48 | fontSize: 20, 49 | fontWeight: FontWeight.bold, 50 | color: black), 51 | ), 52 | Row( 53 | children: [ 54 | Icon( 55 | Icons.add, 56 | size: 25, 57 | ), 58 | SizedBox( 59 | width: 20, 60 | ), 61 | Icon(AntDesign.search1) 62 | ], 63 | ) 64 | ], 65 | ), 66 | SizedBox( 67 | height: 25, 68 | ), 69 | Row( 70 | crossAxisAlignment: CrossAxisAlignment.start, 71 | children: List.generate(months.length, (index) { 72 | return GestureDetector( 73 | onTap: () { 74 | setState(() { 75 | activeDay = index; 76 | }); 77 | }, 78 | child: Container( 79 | width: (MediaQuery.of(context).size.width - 40) / 6, 80 | child: Column( 81 | children: [ 82 | Text( 83 | months[index]['label'], 84 | style: TextStyle(fontSize: 10), 85 | ), 86 | SizedBox( 87 | height: 10, 88 | ), 89 | Container( 90 | decoration: BoxDecoration( 91 | color: activeDay == index 92 | ? primary 93 | : black.withOpacity(0.02), 94 | borderRadius: BorderRadius.circular(5), 95 | border: Border.all( 96 | color: activeDay == index 97 | ? primary 98 | : black.withOpacity(0.1))), 99 | child: Padding( 100 | padding: const EdgeInsets.only( 101 | left: 12, right: 12, top: 7, bottom: 7), 102 | child: Text( 103 | months[index]['day'], 104 | style: TextStyle( 105 | fontSize: 10, 106 | fontWeight: FontWeight.w600, 107 | color: activeDay == index 108 | ? white 109 | : black), 110 | ), 111 | ), 112 | ) 113 | ], 114 | ), 115 | ), 116 | ); 117 | })) 118 | ], 119 | ), 120 | ), 121 | ), 122 | SizedBox( 123 | height: 20, 124 | ), 125 | Padding( 126 | padding: const EdgeInsets.only(left: 20, right: 20), 127 | child: Column( 128 | children: List.generate(budget_json.length, (index) { 129 | return Padding( 130 | padding: const EdgeInsets.only(bottom: 20), 131 | child: Container( 132 | width: double.infinity, 133 | decoration: BoxDecoration( 134 | color: white, 135 | borderRadius: BorderRadius.circular(12), 136 | boxShadow: [ 137 | BoxShadow( 138 | color: grey.withOpacity(0.01), 139 | spreadRadius: 10, 140 | blurRadius: 3, 141 | // changes position of shadow 142 | ), 143 | ]), 144 | child: Padding( 145 | padding: EdgeInsets.only( 146 | left: 25, right: 25, bottom: 25, top: 25), 147 | child: Column( 148 | crossAxisAlignment: CrossAxisAlignment.start, 149 | children: [ 150 | Text( 151 | budget_json[index]['name'], 152 | style: TextStyle( 153 | fontWeight: FontWeight.w500, 154 | fontSize: 13, 155 | color: Color(0xff67727d).withOpacity(0.6)), 156 | ), 157 | SizedBox( 158 | height: 10, 159 | ), 160 | Row( 161 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 162 | children: [ 163 | Row( 164 | children: [ 165 | Text( 166 | budget_json[index]['price'], 167 | style: TextStyle( 168 | fontWeight: FontWeight.bold, 169 | fontSize: 20, 170 | ), 171 | ), 172 | SizedBox( 173 | width: 8, 174 | ), 175 | Padding( 176 | padding: const EdgeInsets.only(top: 3), 177 | child: Text( 178 | budget_json[index]['label_percentage'], 179 | style: TextStyle( 180 | fontWeight: FontWeight.w500, 181 | fontSize: 13, 182 | color: 183 | Color(0xff67727d).withOpacity(0.6)), 184 | ), 185 | ), 186 | ], 187 | ), 188 | Padding( 189 | padding: const EdgeInsets.only(top: 3), 190 | child: Text( 191 | "\$5000.00", 192 | style: TextStyle( 193 | fontWeight: FontWeight.w500, 194 | fontSize: 13, 195 | color: Color(0xff67727d).withOpacity(0.6)), 196 | ), 197 | ), 198 | ], 199 | ), 200 | SizedBox( 201 | height: 15, 202 | ), 203 | Stack( 204 | children: [ 205 | Container( 206 | width: (size.width - 40), 207 | height: 4, 208 | decoration: BoxDecoration( 209 | borderRadius: BorderRadius.circular(5), 210 | color: Color(0xff67727d).withOpacity(0.1)), 211 | ), 212 | Container( 213 | width: (size.width - 40) * 214 | budget_json[index]['percentage'], 215 | height: 4, 216 | decoration: BoxDecoration( 217 | borderRadius: BorderRadius.circular(5), 218 | color: budget_json[index]['color']), 219 | ), 220 | ], 221 | ) 222 | ], 223 | ), 224 | ), 225 | ), 226 | ); 227 | })), 228 | ) 229 | ], 230 | ), 231 | ); 232 | } 233 | } 234 | -------------------------------------------------------------------------------- /lib/pages/stats_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:fl_chart/fl_chart.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_icons/flutter_icons.dart'; 4 | import 'package:trackex/json/day_month.dart'; 5 | import 'package:trackex/theme/colors.dart'; 6 | import 'package:trackex/widget/chart.dart'; 7 | 8 | class StatsPage extends StatefulWidget { 9 | @override 10 | _StatsPageState createState() => _StatsPageState(); 11 | } 12 | 13 | class _StatsPageState extends State { 14 | int activeDay = 3; 15 | 16 | bool showAvg = false; 17 | @override 18 | Widget build(BuildContext context) { 19 | return Scaffold( 20 | backgroundColor: grey.withOpacity(0.05), 21 | body: getBody(), 22 | ); 23 | } 24 | 25 | Widget getBody() { 26 | var size = MediaQuery.of(context).size; 27 | 28 | List expenses = [ 29 | { 30 | "icon": Icons.arrow_back, 31 | "color": blue, 32 | "label": "Income", 33 | "cost": "\$6593.75" 34 | }, 35 | { 36 | "icon": Icons.arrow_forward, 37 | "color": red, 38 | "label": "Expense", 39 | "cost": "\$2645.50" 40 | } 41 | ]; 42 | return SingleChildScrollView( 43 | child: Column( 44 | children: [ 45 | Container( 46 | decoration: BoxDecoration(color: white, boxShadow: [ 47 | BoxShadow( 48 | color: grey.withOpacity(0.01), 49 | spreadRadius: 10, 50 | blurRadius: 3, 51 | // changes position of shadow 52 | ), 53 | ]), 54 | child: Padding( 55 | padding: const EdgeInsets.only( 56 | top: 60, right: 20, left: 20, bottom: 25), 57 | child: Column( 58 | children: [ 59 | Row( 60 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 61 | children: [ 62 | Text( 63 | "Stats", 64 | style: TextStyle( 65 | fontSize: 20, 66 | fontWeight: FontWeight.bold, 67 | color: black), 68 | ), 69 | Icon(AntDesign.search1) 70 | ], 71 | ), 72 | SizedBox( 73 | height: 25, 74 | ), 75 | Row( 76 | crossAxisAlignment: CrossAxisAlignment.start, 77 | children: List.generate(months.length, (index) { 78 | return GestureDetector( 79 | onTap: () { 80 | setState(() { 81 | activeDay = index; 82 | }); 83 | }, 84 | child: Container( 85 | width: (MediaQuery.of(context).size.width - 40) / 6, 86 | child: Column( 87 | children: [ 88 | Text( 89 | months[index]['label'], 90 | style: TextStyle(fontSize: 10), 91 | ), 92 | SizedBox( 93 | height: 10, 94 | ), 95 | Container( 96 | decoration: BoxDecoration( 97 | color: activeDay == index 98 | ? primary 99 | : black.withOpacity(0.02), 100 | borderRadius: BorderRadius.circular(5), 101 | border: Border.all( 102 | color: activeDay == index 103 | ? primary 104 | : black.withOpacity(0.1))), 105 | child: Padding( 106 | padding: const EdgeInsets.only( 107 | left: 12, right: 12, top: 7, bottom: 7), 108 | child: Text( 109 | months[index]['day'], 110 | style: TextStyle( 111 | fontSize: 10, 112 | fontWeight: FontWeight.w600, 113 | color: activeDay == index 114 | ? white 115 | : black), 116 | ), 117 | ), 118 | ) 119 | ], 120 | ), 121 | ), 122 | ); 123 | })) 124 | ], 125 | ), 126 | ), 127 | ), 128 | SizedBox( 129 | height: 20, 130 | ), 131 | Padding( 132 | padding: const EdgeInsets.only(left: 20, right: 20), 133 | child: Container( 134 | width: double.infinity, 135 | height: 250, 136 | decoration: BoxDecoration( 137 | color: white, 138 | borderRadius: BorderRadius.circular(12), 139 | boxShadow: [ 140 | BoxShadow( 141 | color: grey.withOpacity(0.01), 142 | spreadRadius: 10, 143 | blurRadius: 3, 144 | // changes position of shadow 145 | ), 146 | ]), 147 | child: Padding( 148 | padding: EdgeInsets.all(10), 149 | child: Stack( 150 | children: [ 151 | Padding( 152 | padding: const EdgeInsets.only( 153 | top: 10, 154 | ), 155 | child: Column( 156 | crossAxisAlignment: CrossAxisAlignment.start, 157 | children: [ 158 | Text( 159 | "Net balance", 160 | style: TextStyle( 161 | fontWeight: FontWeight.w500, 162 | fontSize: 13, 163 | color: Color(0xff67727d)), 164 | ), 165 | SizedBox( 166 | height: 10, 167 | ), 168 | Text( 169 | "\$2446.90", 170 | style: TextStyle( 171 | fontWeight: FontWeight.bold, 172 | fontSize: 25, 173 | ), 174 | ) 175 | ], 176 | ), 177 | ), 178 | Positioned( 179 | bottom: 0, 180 | child: Container( 181 | width: (size.width - 20), 182 | height: 150, 183 | child: LineChart( 184 | mainData(), 185 | ), 186 | ), 187 | ) 188 | ], 189 | ), 190 | ), 191 | ), 192 | ), 193 | SizedBox( 194 | height: 20, 195 | ), 196 | Wrap( 197 | spacing: 20, 198 | children: List.generate(expenses.length, (index) { 199 | return Container( 200 | width: (size.width - 60) / 2, 201 | height: 170, 202 | decoration: BoxDecoration( 203 | color: white, 204 | borderRadius: BorderRadius.circular(12), 205 | boxShadow: [ 206 | BoxShadow( 207 | color: grey.withOpacity(0.01), 208 | spreadRadius: 10, 209 | blurRadius: 3, 210 | // changes position of shadow 211 | ), 212 | ]), 213 | child: Padding( 214 | padding: const EdgeInsets.only( 215 | left: 25, right: 25, top: 20, bottom: 20), 216 | child: Column( 217 | crossAxisAlignment: CrossAxisAlignment.start, 218 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 219 | children: [ 220 | Container( 221 | width: 40, 222 | height: 40, 223 | decoration: BoxDecoration( 224 | shape: BoxShape.circle, 225 | color: expenses[index]['color']), 226 | child: Center( 227 | child: Icon( 228 | expenses[index]['icon'], 229 | color: white, 230 | )), 231 | ), 232 | Column( 233 | crossAxisAlignment: CrossAxisAlignment.start, 234 | children: [ 235 | Text( 236 | expenses[index]['label'], 237 | style: TextStyle( 238 | fontWeight: FontWeight.w500, 239 | fontSize: 13, 240 | color: Color(0xff67727d)), 241 | ), 242 | SizedBox( 243 | height: 8, 244 | ), 245 | Text( 246 | expenses[index]['cost'], 247 | style: TextStyle( 248 | fontWeight: FontWeight.bold, 249 | fontSize: 20, 250 | ), 251 | ) 252 | ], 253 | ) 254 | ], 255 | ), 256 | ), 257 | ); 258 | })) 259 | ], 260 | ), 261 | ); 262 | } 263 | } 264 | -------------------------------------------------------------------------------- /lib/pages/ForgotPass.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:firebase_auth/firebase_auth.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:provider/provider.dart'; 6 | import 'package:shared_preferences/shared_preferences.dart'; 7 | import 'package:trackex/theme/Style.dart'; 8 | import 'package:trackex/theme/colors.dart'; 9 | import 'package:trackex/widget/Buttons.dart'; 10 | import 'package:trackex/widget/inputbox.dart'; 11 | import 'package:trackex/widget/snackbar.dart'; 12 | 13 | class ForgotPass extends StatefulWidget { 14 | @override 15 | _ForgotPassState createState() => _ForgotPassState(); 16 | } 17 | 18 | class _ForgotPassState extends State { 19 | TextEditingController email, pass; 20 | bool email_error = false, pass_error = false; 21 | bool isloading = false; 22 | final scaffoldKey = GlobalKey(); 23 | var wait= 2400; 24 | int w=0; 25 | bool readonly=false; 26 | bool sendagain=false; 27 | FirebaseAuth auth = FirebaseAuth.instance; 28 | @override 29 | void initState() { 30 | email = TextEditingController(); 31 | pass = TextEditingController(); 32 | timereset(); 33 | super.initState(); 34 | } 35 | void timereset() async 36 | { 37 | 38 | try{ 39 | final prefs = await SharedPreferences.getInstance(); 40 | int timestamp = prefs.getInt('myTimestampKey'); 41 | DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp); 42 | DateTime before = DateTime.fromMillisecondsSinceEpoch(timestamp); 43 | DateTime now = DateTime.now(); 44 | Duration timeDifference = now.difference(before); 45 | print(timeDifference.inSeconds); 46 | 47 | setState(() { 48 | 49 | w=timeDifference.inSeconds; 50 | }); 51 | if(w>120) 52 | { 53 | setState(() { 54 | 55 | readonly=false; 56 | }); 57 | }else{ 58 | setState(() { 59 | readonly=true; 60 | }); 61 | } 62 | 63 | }catch(e) 64 | { 65 | 66 | 67 | } 68 | 69 | 70 | } 71 | 72 | void ForgotPass(BuildContext context) async { 73 | try { 74 | // UserCredential userCredential = await FirebaseAuth.instance 75 | // .signInWithEmailAndPassword(email: email.text, password: pass.text); 76 | // print("login"); 77 | 78 | await FirebaseAuth.instance.sendPasswordResetEmail(email: email.text); 79 | 80 | CustomSnackBar( 81 | actionTile: "close", 82 | haserror: false, 83 | scaffoldKey: scaffoldKey, 84 | isfloating: false, 85 | onPressed: () {}, 86 | title: "Reset password link sended successfully.") 87 | .show(); 88 | 89 | int timestamp = DateTime.now().millisecondsSinceEpoch; 90 | 91 | final prefs = await SharedPreferences.getInstance(); 92 | prefs.setInt('myTimestampKey', timestamp); 93 | setState(() { 94 | readonly=true; 95 | sendagain=true; 96 | w=0; 97 | isloading=false; 98 | }); 99 | 100 | // Provider.of(context, listen: false).fetchLogedUser(); 101 | 102 | // Provider.of(context, listen: false) 103 | // .getActivitiesFromFirebase(); 104 | 105 | // Navigator.of(context).pushAndRemoveUntil( 106 | // MaterialPageRoute(builder: (context) => DashBoard()), 107 | // (route) => false); 108 | } on FirebaseAuthException catch (e) { 109 | if (e.code == 'invalid-email') { 110 | setState(() { 111 | email_error = true; 112 | isloading = false; 113 | CustomSnackBar( 114 | actionTile: "close", 115 | haserror: true, 116 | scaffoldKey: scaffoldKey, 117 | isfloating: false, 118 | onPressed: () {}, 119 | title: "No user found for this email!") 120 | .show(); 121 | }); 122 | print('No user found for that email.'); 123 | } else if (e.code == 'wrong-password') { 124 | isloading = false; 125 | pass_error = true; 126 | setState(() { 127 | CustomSnackBar( 128 | actionTile: "close", 129 | haserror: true, 130 | scaffoldKey: scaffoldKey, 131 | isfloating: false, 132 | onPressed: () {}, 133 | title: "Wrong password provided for this user!") 134 | .show(); 135 | }); 136 | print('Wrong password provided for that user.'); 137 | } else { 138 | isloading = false; 139 | pass_error = true; 140 | setState(() { 141 | CustomSnackBar( 142 | actionTile: "close", 143 | haserror: true, 144 | scaffoldKey: scaffoldKey, 145 | isfloating: false, 146 | onPressed: () {}, 147 | title: e.message) 148 | .show(); 149 | }); 150 | } 151 | } 152 | } 153 | 154 | @override 155 | Widget build(BuildContext context) { 156 | return Scaffold( 157 | backgroundColor: white, 158 | key: scaffoldKey, 159 | appBar: AppBar( 160 | brightness: Brightness.light, 161 | backgroundColor: white, 162 | elevation: 0, 163 | leading: IconButton( 164 | onPressed: () { 165 | Navigator.of(context).pop(); 166 | }, 167 | icon: Icon( 168 | Icons.arrow_back_ios, 169 | color: black, 170 | size: mainMargin + 6, 171 | ), 172 | ), 173 | ), 174 | body: Container( 175 | padding: EdgeInsets.all(mainMargin), 176 | child: SingleChildScrollView( 177 | child: Column( 178 | crossAxisAlignment: CrossAxisAlignment.start, 179 | children: [ 180 | Text( 181 | "Forogot \nPassword?", 182 | style: TextStyle( 183 | color: primary, 184 | fontWeight: FontWeight.bold, 185 | fontSize: 36), 186 | ), 187 | SizedBox( 188 | height: mainMargin, 189 | ), 190 | Text( 191 | "Enter your email address to get reset password link.", 192 | style: TextStyle( 193 | color: primary, 194 | fontWeight: FontWeight.w400, 195 | fontSize: subMargin + 4), 196 | ), 197 | SizedBox( 198 | height: 1 * mainMargin, 199 | ), 200 | IgnorePointer( 201 | ignoring: readonly, 202 | child: inputBox( 203 | controller: email, 204 | error: email_error, 205 | errorText: "", 206 | inuptformat: [], 207 | labelText: "Email Adress", 208 | obscureText: false, 209 | ispassword: false, 210 | istextarea: false, 211 | readonly: readonly, 212 | onchanged: (value) { 213 | setState(() { 214 | email_error = false; 215 | }); 216 | }, 217 | ), 218 | ), 219 | readonly? SizedBox( 220 | height: mainMargin, 221 | ):SizedBox.shrink(), 222 | readonly? TweenAnimationBuilder( 223 | duration: Duration(seconds: 120-w), 224 | tween: Tween(begin: Duration(seconds: 120-w), end: Duration.zero), 225 | onEnd: () { 226 | print('Timer ended'); 227 | setState(() { 228 | readonly=false; 229 | sendagain=true; 230 | }); 231 | }, 232 | builder: (BuildContext context, Duration value, Widget child) { 233 | final minutes = value.inMinutes; 234 | final seconds = value.inSeconds % 60; 235 | return (minutes==0 && seconds==0)?Text("You can resend now ", style: TextStyle( 236 | color: primary, 237 | fontWeight: FontWeight.w400, 238 | fontSize: subMargin + 4)):Padding( 239 | padding: const EdgeInsets.symmetric(vertical: 5), 240 | child: Text('Please wait for '+value.inSeconds.toString()+' seconds to resend password reset link', 241 | textAlign: TextAlign.start, 242 | style: TextStyle( 243 | color: primary, 244 | fontWeight: FontWeight.w400, 245 | fontSize: subMargin + 4),)); 246 | }):SizedBox.shrink(), 247 | 248 | SizedBox( 249 | height: mainMargin, 250 | ), 251 | IgnorePointer( 252 | ignoring: readonly, 253 | child: PrimaryButton( 254 | isloading: isloading, 255 | onPressed: () { 256 | if (email.text == '') { 257 | print("email null"); 258 | setState(() { 259 | CustomSnackBar( 260 | actionTile: "close", 261 | haserror: true, 262 | isfloating: false, 263 | scaffoldKey: scaffoldKey, 264 | onPressed: () {}, 265 | title: "Please enter your email!") 266 | .show(); 267 | email_error = true; 268 | }); 269 | } else if (!RegExp( 270 | r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+") 271 | .hasMatch(email.text)) { 272 | print("not email"); 273 | setState(() { 274 | CustomSnackBar( 275 | actionTile: "close", 276 | haserror: true, 277 | isfloating: false, 278 | scaffoldKey: scaffoldKey, 279 | onPressed: () {}, 280 | title: "Please enter valid email!") 281 | .show(); 282 | email_error = true; 283 | }); 284 | } else { 285 | setState(() { 286 | isloading = true; 287 | }); 288 | 289 | print("calling signin"); 290 | ForgotPass(context); 291 | } 292 | }, 293 | title:readonly?"Wait": "Send Link", 294 | backgroundColor: primary, 295 | foregroundColor: white, 296 | height: 55, 297 | fontsize: 24, 298 | ), 299 | ), 300 | ], 301 | ), 302 | ), 303 | ), 304 | ); 305 | } 306 | } 307 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | animated_bottom_navigation_bar: 5 | dependency: "direct main" 6 | description: 7 | name: animated_bottom_navigation_bar 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "0.2.1" 11 | archive: 12 | dependency: transitive 13 | description: 14 | name: archive 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "3.1.2" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.5.0" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.0" 32 | cached_network_image: 33 | dependency: "direct main" 34 | description: 35 | name: cached_network_image 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.5.1" 39 | characters: 40 | dependency: transitive 41 | description: 42 | name: characters 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.1.0" 46 | charcode: 47 | dependency: transitive 48 | description: 49 | name: charcode 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.2.0" 53 | clock: 54 | dependency: transitive 55 | description: 56 | name: clock 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.1.0" 60 | cloud_firestore: 61 | dependency: "direct main" 62 | description: 63 | name: cloud_firestore 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.0.4" 67 | cloud_firestore_platform_interface: 68 | dependency: transitive 69 | description: 70 | name: cloud_firestore_platform_interface 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "4.0.1" 74 | cloud_firestore_web: 75 | dependency: transitive 76 | description: 77 | name: cloud_firestore_web 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.0.4" 81 | collection: 82 | dependency: transitive 83 | description: 84 | name: collection 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "1.15.0" 88 | crypto: 89 | dependency: transitive 90 | description: 91 | name: crypto 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "3.0.1" 95 | cupertino_icons: 96 | dependency: "direct main" 97 | description: 98 | name: cupertino_icons 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "1.0.2" 102 | date_time_picker: 103 | dependency: "direct main" 104 | description: 105 | name: date_time_picker 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "2.0.0" 109 | equatable: 110 | dependency: transitive 111 | description: 112 | name: equatable 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "1.2.6" 116 | fake_async: 117 | dependency: transitive 118 | description: 119 | name: fake_async 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "1.2.0" 123 | ffi: 124 | dependency: transitive 125 | description: 126 | name: ffi 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "1.0.0" 130 | file: 131 | dependency: transitive 132 | description: 133 | name: file 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "6.1.0" 137 | firebase_auth: 138 | dependency: "direct main" 139 | description: 140 | name: firebase_auth 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "1.0.3" 144 | firebase_auth_platform_interface: 145 | dependency: transitive 146 | description: 147 | name: firebase_auth_platform_interface 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "4.0.2" 151 | firebase_auth_web: 152 | dependency: transitive 153 | description: 154 | name: firebase_auth_web 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "1.0.5" 158 | firebase_core: 159 | dependency: "direct main" 160 | description: 161 | name: firebase_core 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "1.0.3" 165 | firebase_core_platform_interface: 166 | dependency: transitive 167 | description: 168 | name: firebase_core_platform_interface 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "4.0.0" 172 | firebase_core_web: 173 | dependency: transitive 174 | description: 175 | name: firebase_core_web 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "1.0.2" 179 | firebase_storage: 180 | dependency: "direct main" 181 | description: 182 | name: firebase_storage 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "8.0.3" 186 | firebase_storage_platform_interface: 187 | dependency: transitive 188 | description: 189 | name: firebase_storage_platform_interface 190 | url: "https://pub.dartlang.org" 191 | source: hosted 192 | version: "2.0.1" 193 | firebase_storage_web: 194 | dependency: transitive 195 | description: 196 | name: firebase_storage_web 197 | url: "https://pub.dartlang.org" 198 | source: hosted 199 | version: "1.0.3" 200 | fl_chart: 201 | dependency: "direct main" 202 | description: 203 | name: fl_chart 204 | url: "https://pub.dartlang.org" 205 | source: hosted 206 | version: "0.12.3" 207 | flutter: 208 | dependency: "direct main" 209 | description: flutter 210 | source: sdk 211 | version: "0.0.0" 212 | flutter_blurhash: 213 | dependency: transitive 214 | description: 215 | name: flutter_blurhash 216 | url: "https://pub.dartlang.org" 217 | source: hosted 218 | version: "0.5.0" 219 | flutter_cache_manager: 220 | dependency: transitive 221 | description: 222 | name: flutter_cache_manager 223 | url: "https://pub.dartlang.org" 224 | source: hosted 225 | version: "2.1.2" 226 | flutter_icons: 227 | dependency: "direct main" 228 | description: 229 | name: flutter_icons 230 | url: "https://pub.dartlang.org" 231 | source: hosted 232 | version: "1.1.0" 233 | flutter_plugin_android_lifecycle: 234 | dependency: transitive 235 | description: 236 | name: flutter_plugin_android_lifecycle 237 | url: "https://pub.dartlang.org" 238 | source: hosted 239 | version: "2.0.1" 240 | flutter_test: 241 | dependency: "direct dev" 242 | description: flutter 243 | source: sdk 244 | version: "0.0.0" 245 | flutter_web_plugins: 246 | dependency: transitive 247 | description: flutter 248 | source: sdk 249 | version: "0.0.0" 250 | http: 251 | dependency: transitive 252 | description: 253 | name: http 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "0.13.1" 257 | http_parser: 258 | dependency: transitive 259 | description: 260 | name: http_parser 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "4.0.0" 264 | image: 265 | dependency: transitive 266 | description: 267 | name: image 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "3.0.2" 271 | image_cropper: 272 | dependency: "direct main" 273 | description: 274 | name: image_cropper 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "1.4.0" 278 | image_picker: 279 | dependency: "direct main" 280 | description: 281 | name: image_picker 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "0.7.4" 285 | image_picker_for_web: 286 | dependency: transitive 287 | description: 288 | name: image_picker_for_web 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "2.0.0" 292 | image_picker_platform_interface: 293 | dependency: transitive 294 | description: 295 | name: image_picker_platform_interface 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "2.0.1" 299 | intl: 300 | dependency: transitive 301 | description: 302 | name: intl 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "0.17.0" 306 | js: 307 | dependency: transitive 308 | description: 309 | name: js 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "0.6.3" 313 | matcher: 314 | dependency: transitive 315 | description: 316 | name: matcher 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "0.12.10" 320 | meta: 321 | dependency: transitive 322 | description: 323 | name: meta 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "1.3.0" 327 | nested: 328 | dependency: transitive 329 | description: 330 | name: nested 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "1.0.0" 334 | octo_image: 335 | dependency: transitive 336 | description: 337 | name: octo_image 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "0.3.0" 341 | page_transition: 342 | dependency: "direct main" 343 | description: 344 | name: page_transition 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "1.1.7+6" 348 | path: 349 | dependency: transitive 350 | description: 351 | name: path 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "1.8.0" 355 | path_drawing: 356 | dependency: transitive 357 | description: 358 | name: path_drawing 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "0.4.1+1" 362 | path_parsing: 363 | dependency: transitive 364 | description: 365 | name: path_parsing 366 | url: "https://pub.dartlang.org" 367 | source: hosted 368 | version: "0.1.4" 369 | path_provider: 370 | dependency: transitive 371 | description: 372 | name: path_provider 373 | url: "https://pub.dartlang.org" 374 | source: hosted 375 | version: "2.0.1" 376 | path_provider_linux: 377 | dependency: transitive 378 | description: 379 | name: path_provider_linux 380 | url: "https://pub.dartlang.org" 381 | source: hosted 382 | version: "2.0.0" 383 | path_provider_macos: 384 | dependency: transitive 385 | description: 386 | name: path_provider_macos 387 | url: "https://pub.dartlang.org" 388 | source: hosted 389 | version: "2.0.0" 390 | path_provider_platform_interface: 391 | dependency: transitive 392 | description: 393 | name: path_provider_platform_interface 394 | url: "https://pub.dartlang.org" 395 | source: hosted 396 | version: "2.0.1" 397 | path_provider_windows: 398 | dependency: transitive 399 | description: 400 | name: path_provider_windows 401 | url: "https://pub.dartlang.org" 402 | source: hosted 403 | version: "2.0.0" 404 | pedantic: 405 | dependency: transitive 406 | description: 407 | name: pedantic 408 | url: "https://pub.dartlang.org" 409 | source: hosted 410 | version: "1.11.0" 411 | percent_indicator: 412 | dependency: "direct main" 413 | description: 414 | name: percent_indicator 415 | url: "https://pub.dartlang.org" 416 | source: hosted 417 | version: "2.1.9+1" 418 | petitparser: 419 | dependency: transitive 420 | description: 421 | name: petitparser 422 | url: "https://pub.dartlang.org" 423 | source: hosted 424 | version: "4.1.0" 425 | platform: 426 | dependency: transitive 427 | description: 428 | name: platform 429 | url: "https://pub.dartlang.org" 430 | source: hosted 431 | version: "3.0.0" 432 | plugin_platform_interface: 433 | dependency: transitive 434 | description: 435 | name: plugin_platform_interface 436 | url: "https://pub.dartlang.org" 437 | source: hosted 438 | version: "2.0.0" 439 | process: 440 | dependency: transitive 441 | description: 442 | name: process 443 | url: "https://pub.dartlang.org" 444 | source: hosted 445 | version: "4.2.1" 446 | provider: 447 | dependency: "direct main" 448 | description: 449 | name: provider 450 | url: "https://pub.dartlang.org" 451 | source: hosted 452 | version: "5.0.0" 453 | rxdart: 454 | dependency: transitive 455 | description: 456 | name: rxdart 457 | url: "https://pub.dartlang.org" 458 | source: hosted 459 | version: "0.25.0" 460 | shared_preferences: 461 | dependency: "direct main" 462 | description: 463 | name: shared_preferences 464 | url: "https://pub.dartlang.org" 465 | source: hosted 466 | version: "2.0.5" 467 | shared_preferences_linux: 468 | dependency: transitive 469 | description: 470 | name: shared_preferences_linux 471 | url: "https://pub.dartlang.org" 472 | source: hosted 473 | version: "2.0.0" 474 | shared_preferences_macos: 475 | dependency: transitive 476 | description: 477 | name: shared_preferences_macos 478 | url: "https://pub.dartlang.org" 479 | source: hosted 480 | version: "2.0.0" 481 | shared_preferences_platform_interface: 482 | dependency: transitive 483 | description: 484 | name: shared_preferences_platform_interface 485 | url: "https://pub.dartlang.org" 486 | source: hosted 487 | version: "2.0.0" 488 | shared_preferences_web: 489 | dependency: transitive 490 | description: 491 | name: shared_preferences_web 492 | url: "https://pub.dartlang.org" 493 | source: hosted 494 | version: "2.0.0" 495 | shared_preferences_windows: 496 | dependency: transitive 497 | description: 498 | name: shared_preferences_windows 499 | url: "https://pub.dartlang.org" 500 | source: hosted 501 | version: "2.0.0" 502 | sky_engine: 503 | dependency: transitive 504 | description: flutter 505 | source: sdk 506 | version: "0.0.99" 507 | source_span: 508 | dependency: transitive 509 | description: 510 | name: source_span 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "1.8.0" 514 | sqflite: 515 | dependency: transitive 516 | description: 517 | name: sqflite 518 | url: "https://pub.dartlang.org" 519 | source: hosted 520 | version: "2.0.0+3" 521 | sqflite_common: 522 | dependency: transitive 523 | description: 524 | name: sqflite_common 525 | url: "https://pub.dartlang.org" 526 | source: hosted 527 | version: "2.0.0+2" 528 | stack_trace: 529 | dependency: transitive 530 | description: 531 | name: stack_trace 532 | url: "https://pub.dartlang.org" 533 | source: hosted 534 | version: "1.10.0" 535 | stream_channel: 536 | dependency: transitive 537 | description: 538 | name: stream_channel 539 | url: "https://pub.dartlang.org" 540 | source: hosted 541 | version: "2.1.0" 542 | string_scanner: 543 | dependency: transitive 544 | description: 545 | name: string_scanner 546 | url: "https://pub.dartlang.org" 547 | source: hosted 548 | version: "1.1.0" 549 | synchronized: 550 | dependency: transitive 551 | description: 552 | name: synchronized 553 | url: "https://pub.dartlang.org" 554 | source: hosted 555 | version: "3.0.0" 556 | term_glyph: 557 | dependency: transitive 558 | description: 559 | name: term_glyph 560 | url: "https://pub.dartlang.org" 561 | source: hosted 562 | version: "1.2.0" 563 | test_api: 564 | dependency: transitive 565 | description: 566 | name: test_api 567 | url: "https://pub.dartlang.org" 568 | source: hosted 569 | version: "0.2.19" 570 | typed_data: 571 | dependency: transitive 572 | description: 573 | name: typed_data 574 | url: "https://pub.dartlang.org" 575 | source: hosted 576 | version: "1.3.0" 577 | uuid: 578 | dependency: transitive 579 | description: 580 | name: uuid 581 | url: "https://pub.dartlang.org" 582 | source: hosted 583 | version: "3.0.4" 584 | vector_math: 585 | dependency: transitive 586 | description: 587 | name: vector_math 588 | url: "https://pub.dartlang.org" 589 | source: hosted 590 | version: "2.1.0" 591 | win32: 592 | dependency: transitive 593 | description: 594 | name: win32 595 | url: "https://pub.dartlang.org" 596 | source: hosted 597 | version: "2.0.5" 598 | xdg_directories: 599 | dependency: transitive 600 | description: 601 | name: xdg_directories 602 | url: "https://pub.dartlang.org" 603 | source: hosted 604 | version: "0.2.0" 605 | xml: 606 | dependency: transitive 607 | description: 608 | name: xml 609 | url: "https://pub.dartlang.org" 610 | source: hosted 611 | version: "5.1.0" 612 | sdks: 613 | dart: ">=2.12.0 <3.0.0" 614 | flutter: ">=1.24.0-10" 615 | -------------------------------------------------------------------------------- /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 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 294 | PRODUCT_BUNDLE_IDENTIFIER = tech.hyperone.trackex; 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 297 | SWIFT_VERSION = 5.0; 298 | VERSIONING_SYSTEM = "apple-generic"; 299 | }; 300 | name = Profile; 301 | }; 302 | 97C147031CF9000F007C117D /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = dwarf; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_DYNAMIC_NO_PIC = NO; 337 | GCC_NO_COMMON_BLOCKS = YES; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 350 | MTL_ENABLE_DEBUG_INFO = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | TARGETED_DEVICE_FAMILY = "1,2"; 354 | }; 355 | name = Debug; 356 | }; 357 | 97C147041CF9000F007C117D /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu99; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 394 | GCC_WARN_UNDECLARED_SELECTOR = YES; 395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 396 | GCC_WARN_UNUSED_FUNCTION = YES; 397 | GCC_WARN_UNUSED_VARIABLE = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 399 | MTL_ENABLE_DEBUG_INFO = NO; 400 | SDKROOT = iphoneos; 401 | SUPPORTED_PLATFORMS = iphoneos; 402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Release; 407 | }; 408 | 97C147061CF9000F007C117D /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CLANG_ENABLE_MODULES = YES; 414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 415 | ENABLE_BITCODE = NO; 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | PRODUCT_BUNDLE_IDENTIFIER = tech.hyperone.trackex; 419 | PRODUCT_NAME = "$(TARGET_NAME)"; 420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | SWIFT_VERSION = 5.0; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | }; 425 | name = Debug; 426 | }; 427 | 97C147071CF9000F007C117D /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | INFOPLIST_FILE = Runner/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = tech.hyperone.trackex; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 440 | SWIFT_VERSION = 5.0; 441 | VERSIONING_SYSTEM = "apple-generic"; 442 | }; 443 | name = Release; 444 | }; 445 | /* End XCBuildConfiguration section */ 446 | 447 | /* Begin XCConfigurationList section */ 448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | 97C147031CF9000F007C117D /* Debug */, 452 | 97C147041CF9000F007C117D /* Release */, 453 | 249021D3217E4FDB00AE95B9 /* Profile */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147061CF9000F007C117D /* Debug */, 462 | 97C147071CF9000F007C117D /* Release */, 463 | 249021D4217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | /* End XCConfigurationList section */ 469 | }; 470 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 471 | } -------------------------------------------------------------------------------- /lib/pages/Profile.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:cloud_firestore/cloud_firestore.dart'; 3 | import 'package:firebase_auth/firebase_auth.dart'; 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_icons/flutter_icons.dart'; 7 | import 'package:percent_indicator/circular_percent_indicator.dart'; 8 | import 'package:provider/provider.dart'; 9 | import 'package:trackex/Models/User.dart'; 10 | import 'package:trackex/pages/Onboarding.dart'; 11 | import 'package:trackex/providers/UserProvider.dart'; 12 | import 'package:trackex/theme/colors.dart'; 13 | import 'package:trackex/theme/Style.dart'; 14 | 15 | class ProfilePage extends StatefulWidget { 16 | @override 17 | _ProfilePageState createState() => _ProfilePageState(); 18 | } 19 | 20 | class _ProfilePageState extends State { 21 | TextEditingController _email = 22 | TextEditingController(text: "abbie_wilson@gmail.com"); 23 | TextEditingController dateOfBirth = TextEditingController(text: "04-19-1992"); 24 | TextEditingController bio = TextEditingController(text: " "); 25 | AppUser user; 26 | @override 27 | Widget build(BuildContext context) { 28 | var size = MediaQuery.of(context).size; 29 | return Consumer(builder: (context, UserProvider, child) { 30 | user = UserProvider.user; 31 | if (user != null) { 32 | print(user.profilePicture); 33 | _email.text = user.email; 34 | bio.text = user.bio; 35 | 36 | dateOfBirth.text = DateTime.fromMillisecondsSinceEpoch( 37 | user.birthdate.millisecondsSinceEpoch) 38 | .toString() 39 | .substring(0, 10); 40 | } 41 | return user == null 42 | ? CircularProgressIndicator.adaptive() 43 | : Scaffold( 44 | backgroundColor: grey, 45 | appBar: AppBar( 46 | title: AppTitle(title: "Profile"), 47 | actions: [ 48 | Padding( 49 | padding: EdgeInsets.only(right: mainMargin), 50 | child: IconButton( 51 | icon: Icon( 52 | FontAwesome.power_off, 53 | color: primary, 54 | ), 55 | onPressed: () { 56 | FirebaseAuth.instance.signOut().then((value) { 57 | Navigator.pushAndRemoveUntil( 58 | context, 59 | MaterialPageRoute( 60 | builder: (context) => Onboarding()), 61 | (route) => false); 62 | }); 63 | }, 64 | ), 65 | ) 66 | ], 67 | ), 68 | body: SingleChildScrollView( 69 | child: Column( 70 | crossAxisAlignment: CrossAxisAlignment.start, 71 | children: [ 72 | Container( 73 | decoration: BoxDecoration( 74 | color: white, 75 | boxShadow: [ 76 | BoxShadow( 77 | color: grey.withOpacity(0.01), 78 | spreadRadius: 10, 79 | blurRadius: 3, 80 | // changes position of shadow 81 | ), 82 | ], 83 | borderRadius: BorderRadius.only( 84 | bottomLeft: Radius.circular(2 * subMargin), 85 | bottomRight: Radius.circular(2 * subMargin))), 86 | child: Padding( 87 | padding: EdgeInsets.only( 88 | top: 20, right: 20, left: 20, bottom: 25), 89 | child: Column( 90 | children: [ 91 | Row( 92 | children: [ 93 | Container( 94 | width: (size.width - 40) * 0.4, 95 | child: Container( 96 | child: Stack( 97 | children: [ 98 | RotatedBox( 99 | quarterTurns: -2, 100 | child: CircularPercentIndicator( 101 | circularStrokeCap: 102 | CircularStrokeCap.round, 103 | backgroundColor: 104 | grey.withOpacity(0.3), 105 | radius: 110.0, 106 | lineWidth: 6.0, 107 | percent: 0.53, 108 | progressColor: primary), 109 | ), 110 | Positioned( 111 | top: 12.5, 112 | left:12.5, 113 | 114 | child: Center( 115 | child: Container( 116 | width: 85, 117 | height: 85, 118 | decoration: BoxDecoration( 119 | shape: BoxShape.circle, 120 | // image: DecorationImage( 121 | // image: CachedNetworkImageProvider( 122 | // user.profilePicture), 123 | // fit: BoxFit.cover) 124 | // 125 | ), 126 | child: ClipRRect( 127 | borderRadius: BorderRadius.circular(42.5), 128 | child: CachedNetworkImage( 129 | imageUrl: user.profilePicture, 130 | fit: BoxFit.fitWidth, 131 | placeholder: (context, url) => 132 | CircularProgressIndicator( 133 | valueColor: 134 | new AlwaysStoppedAnimation< 135 | Color>(primary), 136 | backgroundColor: grey, 137 | ), 138 | errorWidget: 139 | (context, url, error) => 140 | Container( 141 | width: 85, 142 | height: 85, 143 | color: primary, 144 | child: Icon( 145 | CupertinoIcons 146 | .person_solid, 147 | color: primary, 148 | size: 50, 149 | )), 150 | ), 151 | ), 152 | ), 153 | ), 154 | ) 155 | ], 156 | ), 157 | ), 158 | ), 159 | Container( 160 | width: (size.width - 40) * 0.6, 161 | child: Column( 162 | crossAxisAlignment: 163 | CrossAxisAlignment.start, 164 | children: [ 165 | Text( 166 | user.name, 167 | style: TextStyle( 168 | fontSize: 20, 169 | fontWeight: FontWeight.bold, 170 | color: black), 171 | ), 172 | SizedBox( 173 | height: 10, 174 | ), 175 | Text( 176 | "Credit score: 73.50", 177 | style: TextStyle( 178 | fontSize: 14, 179 | fontWeight: FontWeight.w500, 180 | color: black.withOpacity(0.4)), 181 | ), 182 | ], 183 | ), 184 | ) 185 | ], 186 | ), 187 | SizedBox( 188 | height: 25, 189 | ), 190 | Container( 191 | width: double.infinity, 192 | decoration: BoxDecoration( 193 | color: primary, 194 | borderRadius: 195 | BorderRadius.circular(subMargin), 196 | boxShadow: [ 197 | BoxShadow( 198 | color: primary.withOpacity(0.01), 199 | spreadRadius: 10, 200 | blurRadius: 3, 201 | // changes position of shadow 202 | ), 203 | ]), 204 | child: Padding( 205 | padding: const EdgeInsets.only( 206 | left: 20, right: 20, top: 25, bottom: 25), 207 | child: Row( 208 | mainAxisAlignment: 209 | MainAxisAlignment.spaceBetween, 210 | children: [ 211 | Column( 212 | crossAxisAlignment: 213 | CrossAxisAlignment.start, 214 | children: [ 215 | Text( 216 | "United Bank Asia", 217 | style: TextStyle( 218 | fontWeight: FontWeight.w500, 219 | fontSize: 12, 220 | color: white), 221 | ), 222 | SizedBox( 223 | height: 10, 224 | ), 225 | Text( 226 | "\$2446.90", 227 | style: TextStyle( 228 | fontWeight: FontWeight.bold, 229 | fontSize: 20, 230 | color: white), 231 | ), 232 | ], 233 | ), 234 | Container( 235 | decoration: BoxDecoration( 236 | borderRadius: 237 | BorderRadius.circular(10), 238 | border: Border.all(color: white)), 239 | child: Padding( 240 | padding: const EdgeInsets.all(13.0), 241 | child: Text( 242 | "Update", 243 | style: TextStyle(color: white), 244 | ), 245 | ), 246 | ) 247 | ], 248 | ), 249 | ), 250 | ) 251 | ], 252 | ), 253 | ), 254 | ), 255 | SizedBox( 256 | height: mainMargin, 257 | ), 258 | Container( 259 | padding: const EdgeInsets.only(left: 20, right: 20), 260 | child: Column( 261 | crossAxisAlignment: CrossAxisAlignment.start, 262 | children: [ 263 | Container( 264 | width: double.infinity, 265 | decoration: BoxDecoration( 266 | color: white, 267 | borderRadius: BorderRadius.circular(subMargin), 268 | boxShadow: [ 269 | BoxShadow( 270 | color: primary.withOpacity(0.01), 271 | spreadRadius: 10, 272 | blurRadius: 3, 273 | // changes position of shadow 274 | ), 275 | ]), 276 | child: Padding( 277 | padding: const EdgeInsets.only( 278 | left: 20, right: 20, top: 25, bottom: 25), 279 | child: Row( 280 | mainAxisAlignment: 281 | MainAxisAlignment.spaceBetween, 282 | children: [ 283 | Column( 284 | crossAxisAlignment: 285 | CrossAxisAlignment.start, 286 | children: [ 287 | Text( 288 | "Email", 289 | style: TextStyle( 290 | fontWeight: FontWeight.w500, 291 | fontSize: 12, 292 | color: primary), 293 | ), 294 | SizedBox( 295 | height: 5, 296 | ), 297 | Container( 298 | height: 30, 299 | width: size.width - 80, 300 | child: TextField( 301 | controller: _email, 302 | cursorColor: black, 303 | style: TextStyle( 304 | fontSize: 17, 305 | fontWeight: FontWeight.bold, 306 | color: black), 307 | decoration: InputDecoration( 308 | hintText: "Email", 309 | contentPadding: EdgeInsets.zero, 310 | border: InputBorder.none), 311 | ), 312 | ), 313 | ], 314 | ), 315 | ], 316 | ), 317 | ), 318 | ), 319 | SizedBox( 320 | height: 20, 321 | ), 322 | Container( 323 | width: double.infinity, 324 | decoration: BoxDecoration( 325 | color: white, 326 | borderRadius: BorderRadius.circular(subMargin), 327 | boxShadow: [ 328 | BoxShadow( 329 | color: primary.withOpacity(0.01), 330 | spreadRadius: 10, 331 | blurRadius: 3, 332 | // changes position of shadow 333 | ), 334 | ]), 335 | child: Padding( 336 | padding: const EdgeInsets.only( 337 | left: 20, right: 20, top: 25, bottom: 25), 338 | child: Row( 339 | mainAxisAlignment: 340 | MainAxisAlignment.spaceBetween, 341 | children: [ 342 | Column( 343 | crossAxisAlignment: 344 | CrossAxisAlignment.start, 345 | children: [ 346 | Text( 347 | "Date of birth", 348 | style: TextStyle( 349 | fontWeight: FontWeight.w500, 350 | fontSize: 12, 351 | color: primary), 352 | ), 353 | SizedBox( 354 | height: 5, 355 | ), 356 | Container( 357 | height: 30, 358 | width: size.width - 80, 359 | child: TextField( 360 | controller: dateOfBirth, 361 | cursorColor: black, 362 | style: TextStyle( 363 | fontSize: 17, 364 | fontWeight: FontWeight.bold, 365 | color: black), 366 | decoration: InputDecoration( 367 | hintText: "Date of birth", 368 | contentPadding: EdgeInsets.zero, 369 | border: InputBorder.none), 370 | ), 371 | ), 372 | ], 373 | ), 374 | ], 375 | ), 376 | ), 377 | ), 378 | SizedBox( 379 | height: 20, 380 | ), 381 | Container( 382 | width: double.infinity, 383 | decoration: BoxDecoration( 384 | color: white, 385 | borderRadius: BorderRadius.circular(subMargin), 386 | boxShadow: [ 387 | BoxShadow( 388 | color: primary.withOpacity(0.01), 389 | spreadRadius: 10, 390 | blurRadius: 3, 391 | // changes position of shadow 392 | ), 393 | ]), 394 | child: Padding( 395 | padding: const EdgeInsets.only( 396 | left: 20, right: 20, top: 25, bottom: 25), 397 | child: Row( 398 | mainAxisAlignment: 399 | MainAxisAlignment.spaceBetween, 400 | children: [ 401 | Column( 402 | crossAxisAlignment: 403 | CrossAxisAlignment.start, 404 | children: [ 405 | Text( 406 | "bio", 407 | style: TextStyle( 408 | fontWeight: FontWeight.w500, 409 | fontSize: 12, 410 | color: primary), 411 | ), 412 | SizedBox( 413 | height: 5, 414 | ), 415 | Container( 416 | height: 30, 417 | width: size.width - 80, 418 | child: TextField( 419 | controller: bio, 420 | cursorColor: black, 421 | style: TextStyle( 422 | fontSize: 17, 423 | fontWeight: FontWeight.bold, 424 | color: black), 425 | decoration: InputDecoration( 426 | hintText: "bio", 427 | contentPadding: EdgeInsets.zero, 428 | border: InputBorder.none), 429 | ), 430 | ), 431 | ], 432 | ), 433 | ], 434 | ), 435 | ), 436 | ), 437 | ], 438 | ), 439 | ) 440 | ], 441 | ), 442 | )); 443 | }); 444 | } 445 | } 446 | --------------------------------------------------------------------------------