Files
carwash_vendor_app-frontend/lib/screens/login_screen.dart

199 lines
7.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:glowwheels/provider/shop_provider.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import '../screens/main_screen.dart';
class LoginScreen extends StatefulWidget {
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
final _formKey = GlobalKey<FormState>();
bool _isLoading = false;
bool _obscurePassword = true;
void _handleLogin(BuildContext context) async {
if (!_formKey.currentState!.validate()) return;
final shopProvider = Provider.of<ShopProvider>(context, listen: false);
setState(() => _isLoading = true);
final success = await shopProvider.login(
_emailController.text.trim(),
_passwordController.text.trim(),
);
setState(() => _isLoading = false);
if (success) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => MainScreen()),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Login failed. Check credentials.')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: SingleChildScrollView(
child: Column(
children: [
// Top Banner
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color.fromRGBO(80, 166, 242, 0.66),
Color.fromRGBO(168, 134, 255, 0.66),
Color.fromRGBO(86, 88, 255, 0.38),
Color.fromRGBO(214, 246, 255, 0.66),
],
),
borderRadius: BorderRadius.only(
bottomRight: Radius.elliptical(300, 110),
),
),
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
SizedBox(height: 30),
Image.asset('assets/images/signinlogo.png', height: 250),
SizedBox(height: 20),
Align(
alignment: Alignment.centerLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Welcome back!",
style: GoogleFonts.istokWeb(
fontSize: 18,
color: Color.fromRGBO(25, 25, 112, 0.87),
fontWeight: FontWeight.w700,
)),
Container(
width: 200,
child: Text("Please sign in to continue",
style: GoogleFonts.radioCanada(
fontSize: 24,
fontWeight: FontWeight.w700,
height: 0.9,
color: Color.fromRGBO(25, 25, 112, 0.87),
)),
),
],
),
),
],
),
),
),
// Login Form
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20),
Text('Enter Email Id', style: GoogleFonts.radioCanada(fontSize: 16)),
SizedBox(height: 5),
TextFormField(
controller: _emailController,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) {
return 'Enter a valid email';
}
return null;
},
decoration: InputDecoration(
hintText: 'abcd@gmail.com',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15.0),
),
),
),
SizedBox(height: 20),
Text('Enter Password', style: GoogleFonts.radioCanada(fontSize: 16)),
SizedBox(height: 5),
TextFormField(
controller: _passwordController,
obscureText: _obscurePassword,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your password';
}
return null;
},
decoration: InputDecoration(
hintText: 'Enter your password',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15.0),
),
suffixIcon: IconButton(
icon: Icon(
_obscurePassword ? Icons.visibility_off : Icons.visibility,
),
onPressed: () {
setState(() {
_obscurePassword = !_obscurePassword;
});
},
),
),
),
SizedBox(height: 30),
// Login Button
SizedBox(
width: double.infinity,
height: 50,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFF1F1762),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25),
),
),
onPressed: _isLoading ? null : () => _handleLogin(context),
child: _isLoading
? CircularProgressIndicator(color: Colors.white)
: Text(
'Login',
style: GoogleFonts.inter(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.w700,
),
),
),
)
],
),
),
),
],
),
),
);
}
}