shas6395 #24

Merged
shas6395 merged 12 commits from shas6395 into master 2022-05-22 13:20:51 +02:00
14 changed files with 494 additions and 632 deletions
Showing only changes of commit 247b375f79 - Show all commits

View File

@ -1,292 +0,0 @@
// ignore_for_file: prefer_const_constructors
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_applicationdemo/BottomNavPage.dart';
import 'package:flutter_applicationdemo/GoogleSignInProvider.dart';
import 'package:flutter_applicationdemo/mysql.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter_applicationdemo/HomePage.dart';
import 'package:flutter_signin_button/flutter_signin_button.dart';
import 'package:provider/provider.dart';
import 'GoogleSignInProvider.dart';
import 'signInPage.dart';
import 'globals.dart';
import 'user.dart';
class CreateAccountPage extends StatefulWidget {
_CreateAccountPageState createState() => _CreateAccountPageState();
}
class _CreateAccountPageState extends State<CreateAccountPage> {
Color pinkBackgroundColor = const Color.fromARGB(255, 240, 229, 229);
Color textColor = const Color.fromARGB(255, 79, 98, 114);
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
TextEditingController userNameController = TextEditingController();
var db = mysql();
late user loggedInUser;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: pinkBackgroundColor,
body: SafeArea(
child: createLoginPageContent(),
),
);
}
// Builds all the components of the page
Column createLoginPageContent() {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
createBackButton(),
createTitleText(),
Text(
"Create Log in:",
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),
createUsernameField(),
createEmailField(),
createPasswordField(),
createCreateAccountButton(),
Text("or"),
createGoogleButton(),
Padding(
padding: EdgeInsets.only(top: 100),
child: createContinueWithoutLoggingInButton(),
),
],
);
}
SignInButton createGoogleButton() {
return SignInButton(Buttons.Google, onPressed: () async {
final provider =
Provider.of<GoogleSignInProvider>(context, listen: false);
await provider.logIn();
if (provider.user == null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
CreateAccountPage()), //Replace Container() with call to Map-page.
);
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
HomePage()), //Replace Container() with call to Map-page.
);
}
});
}
Text createTitleText() {
return Text(
'Sun Chasers',
style: TextStyle(
fontSize: 50,
color: textColor,
fontFamily: 'Sacramento',
shadows: const <Shadow>[
Shadow(
offset: Offset(2, 2),
blurRadius: 10.0,
color: Color.fromARGB(255, 0, 0, 0),
),
],
),
);
}
InputField createUsernameField() {
return InputField(
text: "Username:", isPassword: false, icon: Icon(Icons.person), controller: userNameController);
}
InputField createEmailField() {
return InputField(
text: "Email:", isPassword: false, icon: Icon(Icons.email), controller: emailController);
}
InputField createPasswordField() {
return InputField(
text: "Password:", isPassword: true, icon: Icon(Icons.lock), controller: passwordController);
}
Padding createBackButton() {
return Padding(
padding: EdgeInsets.only(bottom: 20, left: 10),
child: Align(
alignment: Alignment.topLeft,
child: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
icon: Icon(Icons.arrow_back),
iconSize: 40,
),
),
);
}
ElevatedButton createCreateAccountButton() {
return ElevatedButton(
onPressed: () async{
UserInput userInput = UserInput(isValid: false, errorMessage: "");
await verifyUserInput(emailController.text, userNameController.text, passwordController.text, userInput);
if(userInput.isValid){
await createUserInSQL(emailController.text, userNameController.text, passwordController.text);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
}else{
createUserError(userInput.errorMessage);
}
},
child: Text(
"Create Account",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
);
}
ElevatedButton createContinueWithoutLoggingInButton() {
return ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => BottomNavPage()),
);
},
child: Text(
"Continue without logging in",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
);
}
Future<void> createUserInSQL(String email, String username, String password) async{
await db.getConnection().then((conn) async{
String sql = "INSERT INTO maen0574.user (id, email, password, username) VALUES (null, '$email', '$password', '$username');";
await conn.query(sql);
sql = "Select id, email, username from maen0574.user where email = '$email'";
await conn.query(sql).then((results){
for(var row in results){
setState(() {
});
loggedInUser = new user(row[0], row[1], row[2]);
LOGGED_IN_USER.userID = loggedInUser.userID;
}
});
});
}
Future<void> verifyUserInput(String email, String username, String password, userInput) async {
userInput.isValid = false;
if(email.contains("'") || !email.contains("@") || email.length < 5){
userInput.errorMessage = "Incorrect email format";
return;
}else if(username.contains("'") || username.length < 6){
userInput.errorMessage = "Incorrect username. \nCharacters limited to a-z, A-Z, 0-9.";
return;
}else if(password.contains("'") || password.length < 6) {
userInput.errorMessage = "Incorrect password. \nPassword can't contain ' and needs to be atleast 6 characters long";
return;
}
await db.getConnection().then((conn) async{
String sql = "SELECT email from maen0574.user where email = '$email';";
var results = await conn.query(sql);
userInput.isValid = true;
for(var row in results){
userInput.isValid = false;
userInput.errorMessage = "email already registererd";
}
});
return;
}
void createUserError(String stringContext) {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text("Couldn't create user"),
content: Text(stringContext),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'OK'),
child: const Text('OK'),
),
],
),
);
}
}
class UserInput {
bool isValid;
String errorMessage;
UserInput({
required this.isValid,
required this.errorMessage
});
bool getIsValid(){
return isValid;
}
} // _LoginPageState
class InputField extends StatelessWidget {
final Icon icon;
final String text;
final bool isPassword;
final TextEditingController controller;
const InputField({
Key? key,
required this.text,
required this.isPassword,
required this.icon,
required this.controller
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 60),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
width: size.width * 0.7,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
child: TextField(
obscureText: isPassword,
controller: controller,
decoration: InputDecoration(
hintText: text,
icon: icon,
border: InputBorder.none,
),
),
);
}
}

View File

@ -1,9 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'BottomNavPage.dart'; import 'BottomNavPage.dart';
import 'package:flutter_applicationdemo/login/CreateAccountPage.dart';
import 'package:flutter_applicationdemo/CreateAccountPage.dart'; import 'package:flutter_applicationdemo/CreateAccountPage.dart';
import 'Venue.dart'; import 'Venue.dart';
import 'globals.dart'; import 'globals.dart';
import 'login/signInPage.dart';
import '../login/user.dart';
import 'mysql.dart'; import 'mysql.dart';
import 'signInPage.dart'; import 'signInPage.dart';
import 'user.dart'; import 'user.dart';
@ -189,6 +192,4 @@ class _HomePageState extends State<HomePage> {
), ),
); );
} }
} }

View File

@ -2,11 +2,11 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_applicationdemo/BottomNavPage.dart'; import 'package:flutter_applicationdemo/BottomNavPage.dart';
import 'package:flutter_applicationdemo/GoogleSignInProvider.dart'; import 'package:flutter_applicationdemo/login/GoogleSignInProvider.dart';
import 'package:google_sign_in/google_sign_in.dart'; import 'package:google_sign_in/google_sign_in.dart';
import 'package:settings_ui/settings_ui.dart'; import 'package:settings_ui/settings_ui.dart';
import 'ManageAccountPage.dart'; import 'ManageAccountPage.dart';
import 'GoogleSignInProvider.dart'; import 'login/GoogleSignInProvider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// Standard color of app // Standard color of app

View File

@ -1,162 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_applicationdemo/BottomNavPage.dart';
import 'package:flutter_applicationdemo/HomePage.dart';
class createUserPage extends StatefulWidget {
_createUserPageState createState() => _createUserPageState();
}
class _createUserPageState extends State<createUserPage> {
Color pinkBackgroundColor = const Color.fromARGB(255, 240, 229, 229);
Color textColor = const Color.fromARGB(255, 79, 98, 114);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
backgroundColor: pinkBackgroundColor,
body: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
createBackButton(),
createTitleText(),
Text(
"Create Log in:",
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),
createUsernameField(),
createEmailField(),
createPasswordField(),
createCreateAccountButton(),
Padding(
padding: EdgeInsets.only(top: 100),
child: createContinueWithoutLoggingInButton(),
),
],
),
),
);
}
Text createTitleText() {
return Text(
'Sun Chasers',
style: TextStyle(
fontSize: 50,
color: textColor,
fontFamily: 'Sacramento',
shadows: const <Shadow>[
Shadow(
offset: Offset(2, 2),
blurRadius: 10.0,
color: Color.fromARGB(255, 0, 0, 0),
),
],
),
);
}
InputField createUsernameField() {
return InputField(
text: "Username:", isPassword: false, icon: Icon(Icons.person));
}
InputField createEmailField() {
return InputField(
text: "Email:", isPassword: false, icon: Icon(Icons.email));
}
InputField createPasswordField() {
return InputField(
text: "Password:", isPassword: true, icon: Icon(Icons.lock));
}
Padding createBackButton() {
return Padding(
padding: EdgeInsets.only(bottom: 20, left: 10),
child: Align(
alignment: Alignment.topLeft,
child: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
icon: Icon(Icons.arrow_back),
iconSize: 40,
),
),
);
}
ElevatedButton createCreateAccountButton() {
return ElevatedButton(
onPressed: () {},
child: Text(
"Create Account",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
);
}
ElevatedButton createContinueWithoutLoggingInButton() {
return ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => BottomNavPage()),
);
},
child: Text(
"Continue without logging in",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
);
}
} // _LoginPageState
class InputField extends StatelessWidget {
final Icon icon;
final String text;
final bool isPassword;
const InputField({
Key? key,
required this.text,
required this.isPassword,
required this.icon,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 60),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
width: size.width * 0.7,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
child: TextField(
obscureText: isPassword,
decoration: InputDecoration(
hintText: text,
icon: icon,
border: InputBorder.none,
),
),
);
}
}

View File

@ -1,5 +1,6 @@
import 'Venue.dart'; import 'Venue.dart';
import 'user.dart'; import 'user.dart';
import '../login/user.dart';
import 'HomePage.dart'; import 'HomePage.dart';
import 'main.dart'; import 'main.dart';

View File

@ -0,0 +1,212 @@
// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';
import 'package:flutter_applicationdemo/BottomNavPage.dart';
import 'package:flutter_applicationdemo/mysql.dart';
import 'package:flutter_applicationdemo/HomePage.dart';
import '../globals.dart';
import '../reusables/InputField.dart';
import 'user.dart';
import '../reusables/returnButton.dart';
class CreateAccountPage extends StatefulWidget {
_CreateAccountPageState createState() => _CreateAccountPageState();
}
class _CreateAccountPageState extends State<CreateAccountPage> {
Color pinkBackgroundColor = const Color.fromARGB(255, 240, 229, 229);
Color textColor = const Color.fromARGB(255, 79, 98, 114);
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
TextEditingController userNameController = TextEditingController();
var db = mysql();
late user loggedInUser;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: pinkBackgroundColor,
leading: ReturnButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
),
),
backgroundColor: pinkBackgroundColor,
body: SafeArea(
child: createLoginPageContent(),
),
);
}
// Builds all the components of the page
Column createLoginPageContent() {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
createTitleText(),
Text(
"Create Log in:",
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),
createUsernameField(),
createEmailField(),
createPasswordField(),
Padding(
padding: const EdgeInsets.only(top: 20),
child: createCreateAccountButton(),
),
],
);
}
Text createTitleText() {
return Text(
'Sun Chasers',
style: TextStyle(
fontSize: 50,
color: textColor,
fontFamily: 'Sacramento',
shadows: const <Shadow>[
Shadow(
offset: Offset(2, 2),
blurRadius: 10.0,
color: Color.fromARGB(255, 0, 0, 0),
),
],
),
);
}
InputField createUsernameField() {
return InputField(
text: "Username:",
isPassword: false,
icon: Icon(Icons.person),
controller: userNameController);
}
InputField createEmailField() {
return InputField(
text: "Email:",
isPassword: false,
icon: Icon(Icons.email),
controller: emailController);
}
InputField createPasswordField() {
return InputField(
text: "Password:",
isPassword: true,
icon: Icon(Icons.lock),
controller: passwordController);
}
ElevatedButton createCreateAccountButton() {
return ElevatedButton(
onPressed: () async {
UserInput userInput = UserInput(isValid: false, errorMessage: "");
await verifyUserInput(emailController.text, userNameController.text,
passwordController.text, userInput);
if (userInput.isValid) {
await createUserInSQL(emailController.text, userNameController.text,
passwordController.text);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
} else {
createUserError(userInput.errorMessage);
}
},
child: Text(
"Create Account",
style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
);
}
Future<void> createUserInSQL(
String email, String username, String password) async {
await db.getConnection().then((conn) async {
String sql =
"INSERT INTO maen0574.user (id, email, password, username) VALUES (null, '$email', '$password', '$username');";
await conn.query(sql);
sql =
"Select id, email, username from maen0574.user where email = '$email'";
await conn.query(sql).then((results) {
for (var row in results) {
setState(() {});
loggedInUser = new user(row[0], row[1], row[2]);
LOGGED_IN_USER.userID = loggedInUser.userID;
}
});
});
}
Future<void> verifyUserInput(
String email, String username, String password, userInput) async {
userInput.isValid = false;
if (email.contains("'") || !email.contains("@") || email.length < 5) {
userInput.errorMessage = "Incorrect email format";
return;
} else if (username.contains("'") || username.length < 6) {
userInput.errorMessage =
"Incorrect username. \nCharacters limited to a-z, A-Z, 0-9.";
return;
} else if (password.contains("'") || password.length < 6) {
userInput.errorMessage =
"Incorrect password. \nPassword can't contain ' and needs to be atleast 6 characters long";
return;
}
await db.getConnection().then((conn) async {
String sql = "SELECT email from maen0574.user where email = '$email';";
var results = await conn.query(sql);
userInput.isValid = true;
for (var row in results) {
userInput.isValid = false;
userInput.errorMessage = "email already registererd";
}
});
return;
}
void createUserError(String stringContext) {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text("Couldn't create user"),
content: Text(stringContext),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'OK'),
child: const Text('OK'),
),
],
),
);
}
}
class UserInput {
bool isValid;
String errorMessage;
UserInput({required this.isValid, required this.errorMessage});
bool getIsValid() {
return isValid;
}
} // _LoginPageState

198
lib/login/signInPage.dart Normal file
View File

@ -0,0 +1,198 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../mysql.dart';
import '../HomePage.dart';
import '../main.dart';
import 'user.dart';
import 'package:flutter_applicationdemo/globals.dart';
import '../reusables/InputField.dart';
import '../reusables/returnButton.dart';
import 'package:flutter_signin_button/flutter_signin_button.dart';
import 'GoogleSignInProvider.dart';
import 'CreateAccountPage.dart';
import 'package:provider/provider.dart';
class SignInPage extends StatefulWidget {
@override
State<SignInPage> createState() => _SignInPageState();
}
class _SignInPageState extends State<SignInPage> {
Color pinkBackgroundColor = const Color.fromARGB(255, 240, 229, 229);
Color textColor = const Color.fromARGB(255, 79, 98, 114);
var db = mysql();
int loggedInID = 0;
late user loggedInUser;
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
Future<void> loginVerification(String email, String password) async {
await db.getConnection().then((conn) async {
String sql =
"select id, email, password from maen0574.user where email = '$email' and password = '$password'";
await conn.query(sql).then((results) {
for (var row in results) {
setState(() {});
loggedInUser = new user(row[0], row[1], row[2]);
loggedInID = loggedInUser.getID();
}
});
});
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
backgroundColor: pinkBackgroundColor,
leading: ReturnButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
),
),
//resizeToAvoidBottomPadding: false,
resizeToAvoidBottomInset: false,
backgroundColor: pinkBackgroundColor,
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
createTitleText(),
const Text(
'Sign in',
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),
createEmailField(),
createPasswordField(),
Padding(
padding: const EdgeInsets.only(top: 10.0),
child: createSignInButton(),
),
const Text("or"),
Padding(
padding: const EdgeInsets.only(top: 10.0),
child: createGoogleButton(),
),
],
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
void loginError() {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Login failed'),
content: const Text('Email or password incorrect'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'OK'),
child: const Text('OK'),
),
],
),
);
}
Text createTitleText() {
return Text(
'Sun Chasers',
style: TextStyle(
fontSize: 50,
color: textColor,
fontFamily: 'Sacramento',
shadows: const <Shadow>[
Shadow(
offset: Offset(2, 2),
blurRadius: 10.0,
color: Color.fromARGB(255, 0, 0, 0),
),
],
),
);
}
InputField createEmailField() {
return InputField(
text: "Email:",
isPassword: false,
icon: Icon(Icons.email),
controller: emailController);
}
InputField createPasswordField() {
return InputField(
text: "Password:",
isPassword: true,
icon: Icon(Icons.lock),
controller: passwordController);
}
ElevatedButton createSignInButton() {
return ElevatedButton(
onPressed: () async {
if (emailController.text.contains("'") ||
passwordController.text.contains("'")) {
loginError();
return;
}
await loginVerification(emailController.text, passwordController.text);
if (loggedInID != 0) {
LOGGED_IN_USER = loggedInUser;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
HomePage()), //Replace Container() with call to account-page.
);
} else {
loginError();
}
//print(loggedInUser.email + " " + loggedInUser.userID.toString());
},
child: const Text(
"Sign in",
style: TextStyle(
color: Colors.black, fontWeight: FontWeight.w400, fontSize: 15),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
fixedSize: MaterialStateProperty.all(Size.fromHeight(40.0)),
),
);
}
SignInButton createGoogleButton() {
return SignInButton(Buttons.Google, onPressed: () async {
final provider =
Provider.of<GoogleSignInProvider>(context, listen: false);
await provider.logIn();
if (provider.user == null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
CreateAccountPage()), //Replace Container() with call to Map-page.
);
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
HomePage()), //Replace Container() with call to Map-page.
);
}
});
}
}

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_applicationdemo/GoogleSignInProvider.dart'; import 'package:flutter_applicationdemo/GoogleSignInProvider.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter_applicationdemo/login/GoogleSignInProvider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'Map.dart'; import 'Map.dart';
@ -12,6 +13,7 @@ import 'HomePage.dart';
import 'Venue.dart'; import 'Venue.dart';
import 'mysql.dart'; import 'mysql.dart';
import 'user.dart'; import 'user.dart';
import 'login/user.dart';
import 'globals.dart'; import 'globals.dart';
void main() async { void main() async {

View File

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
// This class creates an input field for the login- and register-pages
class InputField extends StatelessWidget {
final Icon icon; // The icon
final String text; // The text to be displayed inside the input field
final bool isPassword; // Set to true if you want the input text to be hidden
final TextEditingController controller;
const InputField(
{Key? key,
required this.text,
required this.isPassword,
required this.icon,
required this.controller})
: super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 60),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
width: size.width * 0.7,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
child: TextField(
obscureText: isPassword,
controller: controller,
decoration: InputDecoration(
hintText: text,
icon: icon,
border: InputBorder.none,
),
),
);
}
}

View File

@ -0,0 +1,29 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_applicationdemo/HomePage.dart';
class ReturnButton extends StatelessWidget {
final onPressed;
ReturnButton({
required this.onPressed,
Key? key,})
: super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 10),
child: Align(
alignment: Alignment.topLeft,
child: IconButton(
onPressed: onPressed,
icon: const Icon(
Icons.arrow_back,
color: Colors.black,
),
iconSize: 40,
),
),
);
}
}

View File

@ -1,167 +0,0 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'mysql.dart';
import 'HomePage.dart';
import 'main.dart';
import 'user.dart';
import 'package:flutter_applicationdemo/globals.dart';
class SignInPage extends StatefulWidget{
@override
State<SignInPage> createState() => _SignInPageState();
}
class _SignInPageState extends State<SignInPage> {
Color pinkBackgroundColor = const Color.fromARGB(255, 240, 229, 229);
Color textColor = const Color.fromARGB(255, 79, 98, 114);
var db = mysql();
int loggedInID = 0;
late user loggedInUser;
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
Future<void> loginVerification(String email, String password) async{
await db.getConnection().then((conn) async {
String sql = "select id, username, email from maen0574.user where email = '$email' and password = '$password'";
await conn.query(sql).then((results){
for(var row in results){
setState(() {
});
loggedInUser = new user(row[0], row[1], row[2]);
loggedInID = loggedInUser.getID();
}
});
});
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
//resizeToAvoidBottomPadding: false,
resizeToAvoidBottomInset: false,
backgroundColor: pinkBackgroundColor,
body: SafeArea(
child: Column(
//mainAxisAlignment: MainAxisAlignment.center,
//crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
createBackButton(),
createTitleText(),
const Text(
'Login',
),
Padding(
padding: EdgeInsets.all(15),
child: TextField(
controller: emailController,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'email',
hintText: 'Enter your email',
),
),
),
Padding(
padding: EdgeInsets.all(15),
child: TextField(
controller: passwordController,
obscureText: true,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Password',
hintText: 'Enter Password',
),
),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
fixedSize: const Size(100, 50),
primary: const Color.fromARGB(204, 172, 123, 132),
elevation: 100,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(400.0),
),
),
onPressed: () async {
if(emailController.text.contains("'") || passwordController.text.contains("'")){
loginError();
return;
}
await loginVerification(emailController.text, passwordController.text);
if(loggedInID != 0){
LOGGED_IN_USER = loggedInUser;
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()), //Replace Container() with call to account-page.
);
}else{
loginError();
}
//print(loggedInUser.email + " " + loggedInUser.userID.toString());
},
child: Text('Sign In'),
),
],
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
void loginError() {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Login failed'),
content: const Text('Email or password incorrect'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'OK'),
child: const Text('OK'),
),
],
),
);
}
Padding createBackButton() {
return Padding(
padding: const EdgeInsets.only(bottom: 20, left: 10),
child: Align(
alignment: Alignment.topLeft,
child: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
icon: Icon(Icons.arrow_back),
iconSize: 40,
),
),
);
}
Text createTitleText() {
return Text(
'Sun Chasers',
style: TextStyle(
fontSize: 50,
color: textColor,
fontFamily: 'Sacramento',
shadows: const <Shadow>[
Shadow(
offset: Offset(2, 2),
blurRadius: 10.0,
color: Color.fromARGB(255, 0, 0, 0),
),
],
),
);
}
}

View File

@ -14,7 +14,7 @@ packages:
name: args name: args
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "2.3.1"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -91,7 +91,7 @@ packages:
name: ffi name: ffi
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.2.1"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -260,7 +260,7 @@ packages:
name: google_api_headers name: google_api_headers
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0+1" version: "1.3.0"
google_fonts: google_fonts:
dependency: "direct main" dependency: "direct main"
description: description:
@ -316,14 +316,14 @@ packages:
name: google_sign_in_platform_interface name: google_sign_in_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
google_sign_in_web: google_sign_in_web:
dependency: transitive dependency: transitive
description: description:
name: google_sign_in_web name: google_sign_in_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.10.1+1" version: "0.10.1+2"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -512,7 +512,7 @@ packages:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.4"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
@ -685,7 +685,7 @@ packages:
name: yaml name: yaml
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.1"
sdks: sdks:
dart: ">=2.16.2 <3.0.0" dart: ">=2.16.2 <3.0.0"
flutter: ">=2.10.0-0" flutter: ">=2.10.0-0"