Commit 30a7d9c2 authored by Budi Prasetyo's avatar Budi Prasetyo

register with firebase

parent 523fc0a2
...@@ -6,15 +6,18 @@ import 'package:medapp_eksad/model/user_model.dart'; ...@@ -6,15 +6,18 @@ import 'package:medapp_eksad/model/user_model.dart';
var cmd = 'https://dmsdev-api.eksad.com/gateway/medapp/v1/cmd'; var cmd = 'https://dmsdev-api.eksad.com/gateway/medapp/v1/cmd';
var qry = 'https://dmsdev-api.eksad.com/gateway/medapp/v1/qry'; var qry = 'https://dmsdev-api.eksad.com/gateway/medapp/v1/qry';
Future<bool> signUp(nama, email, nohp, username, password)async{ Future<bool> signUp(namars,nors,alamatrs,namapic,nopic,email, password)async{
final response = await http.post( final response = await http.post(
Uri.parse('$cmd/user/signup'), Uri.parse('$cmd/user/signup'),
body: jsonEncode({ body: jsonEncode({
"namaUser": nama, "namaRs": namars,
"emailUser": email, "noRs": nors,
"noHp": nohp, "alamatRs": alamatrs,
"username": username, "namaPic": namapic,
"password": password}), "noPic": nopic,
"emailPic": email,
"password": password
}),
headers: { headers: {
'Content-type' : 'application/json; charset=UTF-8', 'Content-type' : 'application/json; charset=UTF-8',
} }
......
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:medapp_eksad/firebase/showOtpDialog.dart';
import 'package:medapp_eksad/firebase/showSnackbar.dart';
class FirebaseAuthMethods {
final FirebaseAuth _auth;
FirebaseAuthMethods(this._auth);
// FOR EVERY FUNCTION HERE
// POP THE ROUTE USING: Navigator.of(context).pushNamedAndRemoveUntil('/', (Route<dynamic> route) => false);
// GET USER DATA
// using null check operator since this method should be called only
// when the user is logged in
User get user => _auth.currentUser!;
// STATE PERSISTENCE STREAM
Stream<User?> get authState => FirebaseAuth.instance.authStateChanges();
// OTHER WAYS (depends on use case):
// Stream get authState => FirebaseAuth.instance.userChanges();
// Stream get authState => FirebaseAuth.instance.idTokenChanges();
// KNOW MORE ABOUT THEM HERE: https://firebase.flutter.dev/docs/auth/start#auth-state
// EMAIL SIGN UP
Future<void> signUpWithEmail({
required String nameRS,
required String phoneRS,
required String addressRS,
required String namePIC,
required String phonePIC,
required String addressPIC,
required String email,
required String password,
required BuildContext context,
}) async {
try {
await _auth.createUserWithEmailAndPassword(
// nameRS: nameRS,
// phoneRS: phoneRS,
// addressRS: addressRS,
// namePIC: namePIC,
// phonePIC: phonePIC,
// addressPIC: addressPIC,
email: email,
password: password,
);
await sendEmailVerification(context);
} on FirebaseAuthException catch (e) {
// if you want to display your own custom error message
if (e.code == 'weak-password') {
print('The password provided is too weak.');
} else if (e.code == 'email-already-in-use') {
print('The account already exists for that email.');
}
showSnackBar(
context, e.message!); // Displaying the usual firebase error message
}
}
// EMAIL LOGIN
Future<void> loginWithEmail({
// required String nameRS,
// required String phoneRS,
// required String addressRS,
// required String namePIC,
// required String phonePIC,
// required String addressPIC,
required String email,
required String password,
required BuildContext context,
}) async {
try {
await _auth.signInWithEmailAndPassword(
// nameRS: nameRS,
// phoneRS: phoneRS,
// addressRS: addressRS,
// namePIC: namePIC,
// phonePIC: phonePIC,
// addressPIC: addressPIC,
email: email,
password: password,
);
if (!user.emailVerified) {
await sendEmailVerification(context);
// restrict access to certain things using provider
// transition to another page instead of home screen
}
} on FirebaseAuthException catch (e) {
showSnackBar(context, e.message!); // Displaying the error message
}
}
// EMAIL VERIFICATION
Future<void> sendEmailVerification(BuildContext context) async {
try {
_auth.currentUser!.sendEmailVerification();
showSnackBar(context, 'Email verification sent!');
} on FirebaseAuthException catch (e) {
showSnackBar(context, e.message!); // Display error message
}
}
// GOOGLE SIGN IN
// Future<void> signInWithGoogle(BuildContext context) async {
// try {
// if (kIsWeb) {
// GoogleAuthProvider googleProvider = GoogleAuthProvider();
//
// googleProvider
// .addScope('https://www.googleapis.com/auth/contacts.readonly');
//
// await _auth.signInWithPopup(googleProvider);
// } else {
// final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
//
// final GoogleSignInAuthentication? googleAuth =
// await googleUser?.authentication;
//
// if (googleAuth?.accessToken != null && googleAuth?.idToken != null) {
// // Create a new credential
// final credential = GoogleAuthProvider.credential(
// accessToken: googleAuth?.accessToken,
// idToken: googleAuth?.idToken,
// );
// UserCredential userCredential =
// await _auth.signInWithCredential(credential);
//
// // if you want to do specific task like storing information in firestore
// // only for new users using google sign in (since there are no two options
// // for google sign in and google sign up, only one as of now),
// // do the following:
//
// // if (userCredential.user != null) {
// // if (userCredential.additionalUserInfo!.isNewUser) {}
// // }
// }
// }
// } on FirebaseAuthException catch (e) {
// showSnackBar(context, e.message!); // Displaying the error message
// }
// }
// ANONYMOUS SIGN IN
Future<void> signInAnonymously(BuildContext context) async {
try {
await _auth.signInAnonymously();
} on FirebaseAuthException catch (e) {
showSnackBar(context, e.message!); // Displaying the error message
}
}
// FACEBOOK SIGN IN
// Future<void> signInWithFacebook(BuildContext context) async {
// try {
// final LoginResult loginResult = await FacebookAuth.instance.login();
//
// final OAuthCredential facebookAuthCredential =
// FacebookAuthProvider.credential(loginResult.accessToken!.token);
//
// await _auth.signInWithCredential(facebookAuthCredential);
// } on FirebaseAuthException catch (e) {
// showSnackBar(context, e.message!); // Displaying the error message
// }
// }
// PHONE SIGN IN
Future<void> phoneSignIn(
BuildContext context,
String phoneNumber,
) async {
TextEditingController codeController = TextEditingController();
if (kIsWeb) {
// !!! Works only on web !!!
ConfirmationResult result =
await _auth.signInWithPhoneNumber(phoneNumber);
// Diplay Dialog Box To accept OTP
showOTPDialog(
codeController: codeController,
context: context,
onPressed: () async {
PhoneAuthCredential credential = PhoneAuthProvider.credential(
verificationId: result.verificationId,
smsCode: codeController.text.trim(),
);
await _auth.signInWithCredential(credential);
Navigator.of(context).pop(); // Remove the dialog box
},
);
} else {
// FOR ANDROID, IOS
await _auth.verifyPhoneNumber(
phoneNumber: phoneNumber,
// Automatic handling of the SMS code
verificationCompleted: (PhoneAuthCredential credential) async {
// !!! works only on android !!!
await _auth.signInWithCredential(credential);
},
// Displays a message when verification fails
verificationFailed: (e) {
showSnackBar(context, e.message!);
},
// Displays a dialog box when OTP is sent
codeSent: ((String verificationId, int? resendToken) async {
showOTPDialog(
codeController: codeController,
context: context,
onPressed: () async {
PhoneAuthCredential credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: codeController.text.trim(),
);
// !!! Works only on Android, iOS !!!
await _auth.signInWithCredential(credential);
Navigator.of(context).pop(); // Remove the dialog box
},
);
}),
codeAutoRetrievalTimeout: (String verificationId) {
// Auto-resolution timed out...
},
);
}
}
// SIGN OUT
Future<void> signOut(BuildContext context) async {
try {
await _auth.signOut();
} on FirebaseAuthException catch (e) {
showSnackBar(context, e.message!); // Displaying the error message
}
}
// DELETE ACCOUNT
Future<void> deleteAccount(BuildContext context) async {
try {
await _auth.currentUser!.delete();
} on FirebaseAuthException catch (e) {
showSnackBar(context, e.message!); // Displaying the error message
// if an error of requires-recent-login is thrown, make sure to log
// in user again and then delete account.
}
}
}
import 'package:flutter/material.dart';
void showOTPDialog({
required BuildContext context,
required TextEditingController codeController,
required VoidCallback onPressed,
}) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: const Text("Enter OTP"),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
TextField(
controller: codeController,
),
],
),
actions: <Widget>[
TextButton(
child: const Text("Done"),
onPressed: onPressed,
)
],
),
);
}
import 'package:flutter/material.dart';
void showSnackBar(BuildContext context, String text) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(text),
),
);
}
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:medapp_eksad/auth/forget_password.dart'; import 'package:medapp_eksad/auth/forget_password.dart';
import 'package:medapp_eksad/dashboard/admin/main_dashboard_admin.dart'; import 'package:medapp_eksad/dashboard/admin/main_dashboard_admin.dart';
import 'package:medapp_eksad/firebase/firebase_auth_methods.dart';
import 'package:medapp_eksad/firebase_options.dart';
import 'package:medapp_eksad/homepage.dart'; import 'package:medapp_eksad/homepage.dart';
import 'package:medapp_eksad/login.dart'; import 'package:medapp_eksad/login.dart';
import 'package:medapp_eksad/register.dart'; import 'package:medapp_eksad/register.dart';
...@@ -8,8 +12,13 @@ import 'package:medapp_eksad/register_pic.dart'; ...@@ -8,8 +12,13 @@ import 'package:medapp_eksad/register_pic.dart';
import 'package:medapp_eksad/screen/contact_us/contact_us.dart'; import 'package:medapp_eksad/screen/contact_us/contact_us.dart';
import 'package:medapp_eksad/screen/solution.dart'; import 'package:medapp_eksad/screen/solution.dart';
import 'package:medapp_eksad/screen_user/demo_user.dart'; import 'package:medapp_eksad/screen_user/demo_user.dart';
import 'package:provider/provider.dart';
void main() { void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const MyApp()); runApp(const MyApp());
} }
...@@ -18,7 +27,17 @@ class MyApp extends StatelessWidget { ...@@ -18,7 +27,17 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MultiProvider(
providers: [
Provider<FirebaseAuthMethods>(
create: (_) => FirebaseAuthMethods(FirebaseAuth.instance),
),
StreamProvider(
create: (context) => context.read<FirebaseAuthMethods>().authState,
initialData: null,
),
],
child: MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: "MedApp by Eksad", title: "MedApp by Eksad",
initialRoute: '/', initialRoute: '/',
...@@ -28,12 +47,14 @@ class MyApp extends StatelessWidget { ...@@ -28,12 +47,14 @@ class MyApp extends StatelessWidget {
'/solutions': (context) => const Solutions(), '/solutions': (context) => const Solutions(),
'/contact': (context) => const ContactUs(), '/contact': (context) => const ContactUs(),
'/login': (context) => const SignIn(), '/login': (context) => const SignIn(),
'/register': (context) => const RegisterPic(), //'/register': (context) => const RegisterPic(),
'/register': (context) => const Register(),
'/dashboard': (context) => const DashboardAdmin(), '/dashboard': (context) => const DashboardAdmin(),
'/reset_password': (context) => const ForgotPassword(), '/reset_password': (context) => const ForgotPassword(),
'/demo': (context) => const DemoUser(), '/demo': (context) => const DemoUser(),
//'/register_pic': (context) => const RegisterPic(), //'/register_pic': (context) => const RegisterPic(),
}, },
),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:medapp_eksad/api/user_api.dart'; import 'package:medapp_eksad/api/user_api.dart';
import 'package:medapp_eksad/firebase/firebase_auth_methods.dart';
import 'package:provider/provider.dart';
class Register extends StatefulWidget { class Register extends StatefulWidget {
//static String routeName = '/register';
const Register({Key? key}) : super(key: key); const Register({Key? key}) : super(key: key);
@override @override
...@@ -9,16 +13,39 @@ class Register extends StatefulWidget { ...@@ -9,16 +13,39 @@ class Register extends StatefulWidget {
} }
class _RegisterState extends State<Register> { class _RegisterState extends State<Register> {
bool _isObscure = true; bool _isObscure = true;
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
final nameController = TextEditingController(); final nameRSController = TextEditingController();
final emailController = TextEditingController(); final phoneRSController = TextEditingController();
final phoneController = TextEditingController(); final addressRSController = TextEditingController();
final usernameController = TextEditingController(); final namePICController = TextEditingController();
final pwController = TextEditingController(); final phonePICController = TextEditingController();
final addressPICController = TextEditingController();
final emailPICController = TextEditingController();
final passwordController = TextEditingController();
void signUpUser() async {
context.read<FirebaseAuthMethods>().signUpWithEmail(
nameRS: nameRSController.text,
phoneRS: phoneRSController.text,
addressRS: addressRSController.text,
namePIC: namePICController.text,
phonePIC: phonePICController.text,
addressPIC: addressPICController.text,
email: emailPICController.text,
password: passwordController.text,
context: context,
);
signUp( nameRSController.value.text,
phoneRSController.value.text,
addressRSController.value.text,
namePICController.value.text,
phonePICController.value.text,
emailPICController.value.text,
passwordController.value.text);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -31,17 +58,15 @@ class _RegisterState extends State<Register> { ...@@ -31,17 +58,15 @@ class _RegisterState extends State<Register> {
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/images/bg-medapp.png"), image: AssetImage("assets/images/bg-medapp.png"),
fit: BoxFit.fill, fit: BoxFit.fill,
) )),
),
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: screenize.width * 0.13, left: screenize.width * 0.13,
top: screenize.height * 0.05, top: screenize.height * 0.05,
bottom: screenize.height * 0.05 bottom: screenize.height * 0.05),
),
child: Stack( child: Stack(
children: [ children: [
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: screenize.height*0.15), padding: EdgeInsets.symmetric(vertical: screenize.height * 0.15),
// child: Container( // child: Container(
// decoration: BoxDecoration( // decoration: BoxDecoration(
// color: const Color.fromARGB(255, 10, 116, 255), // color: const Color.fromARGB(255, 10, 116, 255),
...@@ -62,7 +87,7 @@ class _RegisterState extends State<Register> { ...@@ -62,7 +87,7 @@ class _RegisterState extends State<Register> {
left: screenize.width * 0.35, left: screenize.width * 0.35,
), ),
child: Container( child: Container(
width: screenize.width * 0.30, width: screenize.width * 0.50,
height: screenize.height * 1, height: screenize.height * 1,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
...@@ -74,23 +99,24 @@ class _RegisterState extends State<Register> { ...@@ -74,23 +99,24 @@ class _RegisterState extends State<Register> {
), ),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: const Color.fromARGB(255, 10, 116, 255).withAlpha(60), color:
const Color.fromARGB(255, 10, 116, 255).withAlpha(60),
blurRadius: 15.0, blurRadius: 15.0,
spreadRadius: 20.0, spreadRadius: 20.0,
offset: const Offset( offset: const Offset(
0.0, 0.0,
3.0, 3.0,
), ),
),], ),
],
), ),
child: Form( child: Form(
key: _formKey, key: _formKey,
child: Container( child: Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: screenize.width * 0.045, left: screenize.width * 0.045,
top: screenize.height * 0.01 top: screenize.height * 0.01),
), width: screenize.width * 0.50,
width: screenize.width * 0.36,
height: screenize.height * 1, height: screenize.height * 1,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
...@@ -98,13 +124,21 @@ class _RegisterState extends State<Register> { ...@@ -98,13 +124,21 @@ class _RegisterState extends State<Register> {
children: [ children: [
const Spacer(), const Spacer(),
Container( Container(
padding: EdgeInsets.only( padding:
left: screenize.width * 0.05 EdgeInsets.only(left: screenize.width * 0.15),
),
height: screenize.width * 0.03, height: screenize.width * 0.03,
child: Image.asset("assets/logo/medapp-logo.png"), // child: Image.asset("assets/logo/medapp-logo.png"),
),
const SizedBox(
height: 20,
), ),
const SizedBox(height: 20,), Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============nama rs=============
Row( Row(
children: [ children: [
Icon( Icon(
...@@ -115,91 +149,222 @@ class _RegisterState extends State<Register> { ...@@ -115,91 +149,222 @@ class _RegisterState extends State<Register> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
const Text("Nama", const Text(
style: TextStyle( "Nama Rumah Sakit",
fontSize: 13 style: TextStyle(fontSize: 13),
),
), ),
], ],
), ),
const SizedBox(height: 5,), const SizedBox(
height: 5,
),
Row( Row(
children: [ children: [
SizedBox( SizedBox(
height: 60, height: 60,
width: screenize.width * 0.2, width: screenize.width * 0.2,
child: TextFormField( child: TextFormField(
controller: nameController, controller: nameRSController,
textAlign: TextAlign.start, textAlign: TextAlign.start,
decoration: InputDecoration( decoration: InputDecoration(
labelText: "Nama Lengkap", labelText: "Nama Rumah Sakit",
labelStyle: TextStyle( labelStyle: TextStyle(fontSize: 13),
fontSize: 13
),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0), borderRadius:
BorderRadius.circular(5.0),
)),
validator: (value) {
if (value == null || value.isEmpty) {
return "Nama Rumah Sakit tidak boleh kosong";
}
return null;
},
),
) )
],
),
// ===============akhir nama rs=============
],
),
const SizedBox(
width: 30,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============telepon rs==========
Row(
children: [
Icon(
Icons.phone_android,
color: Colors.grey[500],
size: screenize.width * 0.01,
),
const SizedBox(
width: 10,
),
const Text(
"No Telepon Rumah Sakit",
style: TextStyle(fontSize: 13),
),
],
),
const SizedBox(
height: 5,
), ),
validator: (value){ Row(
if (value == null || value.isEmpty){ children: [
return "Nama tidak boleh kosong"; SizedBox(
height: 60,
width: screenize.width * 0.2,
child: TextFormField(
controller: phoneRSController,
textAlign: TextAlign.start,
validator: (value) {
if (value == null || value.isEmpty) {
return "Nomor Telepon Rumah Sakit tidak boleh kosong";
} }
return null; return null;
}, },
decoration: InputDecoration(
labelText:
"Nomor Telepon Rumah Sakit",
labelStyle: TextStyle(fontSize: 13),
hintStyle: const TextStyle(),
border: OutlineInputBorder(
borderRadius:
BorderRadius.circular(5.0),
)),
), ),
) )
], ],
), ),
// ===============akhir telepon rs==========
const SizedBox(height: 5 ,), ],
),
],
),
Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============alamat rs==========
Row( Row(
children: [ children: [
Icon( Icon(
Icons.email_outlined, Icons.add_home_work_sharp,
color: Colors.grey[500], color: Colors.grey[500],
size: screenize.width * 0.01, size: screenize.width * 0.01,
), ),
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
const Text("Email", const Text(
style: TextStyle( "Alamat Rumah Sakit",
fontSize: 13 style: TextStyle(fontSize: 13),
),
), ),
], ],
), ),
const SizedBox(height: 5,), const SizedBox(
height: 5,
),
Row( Row(
children: [ children: [
SizedBox( SizedBox(
height: 60, height: 60,
width: screenize.width * 0.2, width: screenize.width * 0.2,
child: TextFormField( child: TextFormField(
controller: emailController, controller: addressRSController,
textAlign: TextAlign.start, textAlign: TextAlign.start,
validator: (value){ validator: (value) {
if (value == null || value.isEmpty){ if (value == null || value.isEmpty) {
return "Email tidak boleh kosong"; return "Nomor Alamat Rumah Sakit tidak boleh kosong";
} }
return null; return null;
}, },
decoration: InputDecoration( decoration: InputDecoration(
labelText: "Email Valid", labelText:
labelStyle: TextStyle( "Nomor Alamat Rumah Sakit",
fontSize:13 labelStyle: TextStyle(fontSize: 13),
),
hintStyle: const TextStyle(), hintStyle: const TextStyle(),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0), borderRadius:
BorderRadius.circular(5.0),
)),
),
) )
],
),
// ===============akhir alamat rs==========
],
), ),
const SizedBox(
width: 30,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============nama pic=============
Row(
children: [
Icon(
Icons.drive_file_rename_outline,
color: Colors.grey[500],
size: screenize.width * 0.01,
),
const SizedBox(
width: 10,
),
const Text(
"Nama PIC",
style: TextStyle(fontSize: 13),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
SizedBox(
height: 60,
width: screenize.width * 0.2,
child: TextFormField(
controller: namePICController,
textAlign: TextAlign.start,
decoration: InputDecoration(
labelText: "Nama PIC",
labelStyle: TextStyle(fontSize: 13),
border: OutlineInputBorder(
borderRadius:
BorderRadius.circular(5.0),
)),
validator: (value) {
if (value == null || value.isEmpty) {
return "Nama PIC tidak boleh kosong";
}
return null;
},
), ),
) )
], ],
), ),
// ===============akhir nama pic=============
const SizedBox(height: 5,), ],
),
],
),
Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============telepon pic==========
Row( Row(
children: [ children: [
Icon( Icon(
...@@ -210,91 +375,109 @@ class _RegisterState extends State<Register> { ...@@ -210,91 +375,109 @@ class _RegisterState extends State<Register> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
const Text("No Hp", const Text(
style: TextStyle( "No Telepon PIC",
fontSize: 13 style: TextStyle(fontSize: 13),
),
), ),
], ],
), ),
const SizedBox(height: 5,), const SizedBox(
height: 5,
),
Row( Row(
children: [ children: [
SizedBox( SizedBox(
height: 60, height: 60,
width: screenize.width * 0.2, width: screenize.width * 0.2,
child: TextFormField( child: TextFormField(
controller: phoneController, controller: phonePICController,
textAlign: TextAlign.start, textAlign: TextAlign.start,
validator: (value){ validator: (value) {
if (value == null || value.isEmpty){ if (value == null || value.isEmpty) {
return "Nomor handphone tidak boleh kosong"; return "Nomor Telepon PIC tidak boleh kosong";
} }
return null; return null;
}, },
decoration: InputDecoration( decoration: InputDecoration(
labelText: "Nomor Handphone", labelText: "Nomor Telepon PIC",
labelStyle: TextStyle( labelStyle: TextStyle(fontSize: 13),
fontSize: 13
),
hintStyle: const TextStyle(), hintStyle: const TextStyle(),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0), borderRadius:
) BorderRadius.circular(5.0),
), )),
), ),
) )
], ],
), ),
const SizedBox(height: 5,), // ===============akhir telepon pic==========
],
),
const SizedBox(
width: 30,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============email pic==========
Row( Row(
children: [ children: [
Icon( Icon(
Icons.account_circle_sharp, Icons.email_outlined,
color: Colors.grey[500], color: Colors.grey[500],
size: screenize.width * 0.01, size: screenize.width * 0.01,
), ),
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
const Text("Username", const Text(
style: TextStyle( "Email PIC",
fontSize: 13 style: TextStyle(fontSize: 13),
),
), ),
], ],
), ),
const SizedBox(height: 5,), const SizedBox(
height: 5,
),
Row( Row(
children: [ children: [
SizedBox( SizedBox(
height: 60, height: 60,
width: screenize.width * 0.2, width: screenize.width * 0.2,
child: TextFormField( child: TextFormField(
controller: usernameController, controller: emailPICController,
textAlign: TextAlign.start, textAlign: TextAlign.start,
validator: (value){ validator: (value) {
if (value == null || value.isEmpty){ if (value == null || value.isEmpty) {
return "Username tidak boleh kosong"; return "Email PIC tidak boleh kosong";
} }
return null; return null;
}, },
decoration: InputDecoration( decoration: InputDecoration(
labelText: "Username", labelText: "Email PIC",
labelStyle: TextStyle( labelStyle: TextStyle(fontSize: 13),
fontSize: 13
),
hintStyle: const TextStyle(), hintStyle: const TextStyle(),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0), borderRadius:
BorderRadius.circular(5.0),
)),
),
) )
],
), ),
// ===============akhir email pic==========
],
), ),
)
], ],
), ),
Row(
const SizedBox(height: 5,), children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// ===============password==========
Row( Row(
children: [ children: [
Icon( Icon(
...@@ -305,38 +488,36 @@ class _RegisterState extends State<Register> { ...@@ -305,38 +488,36 @@ class _RegisterState extends State<Register> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
const Text("Password", const Text(
style: TextStyle( "Password",
fontSize: 13 style: TextStyle(fontSize: 13),
),
), ),
], ],
), ),
const SizedBox(height: 5,), const SizedBox(
height: 5,
),
SizedBox( SizedBox(
height: 60, height: 60,
width: screenize.width * 0.2, width: screenize.width * 0.2,
child: TextFormField( child: TextFormField(
controller: pwController, controller: passwordController,
textAlign: TextAlign.start, textAlign: TextAlign.start,
validator: (value){ validator: (value) {
if (value == null || value.isEmpty){ if (value == null || value.isEmpty) {
return "Nama tidak boleh kosong"; return "Password tidak boleh kosong";
} }
return null; return null;
}, },
obscureText: _isObscure, obscureText: _isObscure,
decoration: InputDecoration( decoration: InputDecoration(
labelText: "Password", labelText: "Password",
labelStyle: TextStyle( labelStyle: TextStyle(fontSize: 13),
fontSize: 13
),
suffixIcon: IconButton( suffixIcon: IconButton(
icon: Icon(_isObscure icon: Icon(_isObscure
? Icons.visibility ? Icons.visibility
: Icons.visibility_off : Icons.visibility_off),
), onPressed: () {
onPressed: (){
setState(() { setState(() {
_isObscure = !_isObscure; _isObscure = !_isObscure;
}); });
...@@ -344,22 +525,83 @@ class _RegisterState extends State<Register> { ...@@ -344,22 +525,83 @@ class _RegisterState extends State<Register> {
), ),
hintStyle: const TextStyle(), hintStyle: const TextStyle(),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0) borderRadius:
BorderRadius.circular(5.0)),
),
),
), ),
// ===============akhir password==========
],
), ),
const SizedBox(
width: 30,
), ),
],
), ),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
// children: [
// // ===============password==========
// Row(
// children: [
// Icon(
// Icons.vpn_lock,
// color: Colors.grey[500],
// size: screenize.width * 0.01,
// ),
// const SizedBox(
// width: 10,
// ),
// const Text(
// "Latitude & Longitude PIC",
// style: TextStyle(fontSize: 13),
// ),
// ],
// ),
// const SizedBox(
// height: 5,
// ),
// Container(
// height: 50,
// width: screenize.width * 0.42,
// decoration: BoxDecoration(
// border: Border.all(color: Colors.grey),
// borderRadius: BorderRadius.circular(10),
// ),
// child: Row(
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text(''),
// Container(
// height: 51,
// child: ClipRRect(
// borderRadius:
// BorderRadius.circular(10),
// child: ElevatedButton(
// onPressed: () {},
// child: Text('Set'))),
// ),
// ],
// )),
// // ===============akhir password==========
// ],
// ),
const Spacer( const Spacer(
flex: 4, flex: 4,
), ),
Row( Container(
padding:
EdgeInsets.only(left: screenize.width * 0.10),
height: screenize.width * 0.03,
child: Row(
children: [ children: [
SizedBox( SizedBox(
height: 30, height: 30,
width: screenize.width * 0.09, width: screenize.width * 0.09,
child: ElevatedButton( child: ElevatedButton(
onPressed: (){ onPressed: () {
Navigator.pushNamed(context, '/login'); Navigator.pushNamed(context, '/login');
}, },
child: const Text("LOGIN"), child: const Text("LOGIN"),
...@@ -372,39 +614,14 @@ class _RegisterState extends State<Register> { ...@@ -372,39 +614,14 @@ class _RegisterState extends State<Register> {
height: 30, height: 30,
width: screenize.width * 0.09, width: screenize.width * 0.09,
child: ElevatedButton( child: ElevatedButton(
onPressed: () async { onPressed: signUpUser,
if (_formKey.currentState!.validate()){
final response = await signUp(
nameController.value.text,
emailController.value.text,
phoneController.value.text,
usernameController.value.text,
pwController.value.text);
ScaffoldMessenger.of(context).showSnackBar(
response == true
? const SnackBar(
content: Text("Registrasi berhasil ! cek email untuk validasi"),
backgroundColor: Colors.green,)
: const SnackBar(
content: Text("Registrasi gagal"),
backgroundColor: Colors.red,)
);
print(
nameController.value.text+ emailController.value.text+phoneController.value.text+usernameController.value.text+pwController.value.text
);
nameController.clear();
emailController.clear();
phoneController.clear();
usernameController.clear();
pwController.clear();
}
},
child: const Text("REGISTER"), child: const Text("REGISTER"),
), ),
) )
], ],
), ),
),
const Spacer( const Spacer(
flex: 4, flex: 4,
) )
...@@ -420,3 +637,4 @@ class _RegisterState extends State<Register> { ...@@ -420,3 +637,4 @@ class _RegisterState extends State<Register> {
); );
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment