import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } Future _handleLogin() async { final email = _emailController.text.trim(); final password = _passwordController.text; if (email.isEmpty || password.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Email dan password harus diisi')), ); return; } if (!email.contains('@') || !email.contains('.')) { ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('Email tidak valid'))); return; } final authProvider = context.read(); final success = await authProvider.login(email, password); if (success) { if (!mounted) return; if (!mounted) return; Navigator.pushReplacementNamed(context, '/home'); } else { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(authProvider.errorMessage ?? 'Login gagal')), ); } } @override Widget build(BuildContext context) { return Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.orange.shade100, Colors.amber.shade100, Colors.greenAccent.shade100, ], ), ), child: SafeArea( child: LayoutBuilder( builder: (context, constraints) { return SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints(minHeight: constraints.maxHeight), child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ const SizedBox(height: 20), // Back Button Align( alignment: Alignment.centerLeft, child: GestureDetector( onTap: () => Navigator.pop(context), child: Icon( Icons.arrow_back_ios, color: Colors.grey.shade700, size: 28, ), ), ), const SizedBox(height: 40), // Greeting Text( 'Welcome Back!', style: TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Colors.orange.shade700, ), ), const SizedBox(height: 12), Text( 'Masuk ke akun Anda', style: TextStyle( fontSize: 16, color: Colors.grey.shade700), ), const SizedBox(height: 60), // Login Form Card Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ), ], ), padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Email Field Text( 'Email', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: InputDecoration( hintText: 'Masukkan email Anda', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.email_outlined, color: Colors.orange.shade600, ), ), ), const SizedBox(height: 20), // Password Field Text( 'Password', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( hintText: 'Masukkan password Anda', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.lock_outlined, color: Colors.orange.shade600, ), suffixIcon: GestureDetector( onTap: () { setState(() { _obscurePassword = !_obscurePassword; }); }, child: Icon( _obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, color: Colors.orange.shade600, ), ), ), ), const SizedBox(height: 30), // Login Button Consumer( builder: (context, authProvider, _) { return SizedBox( width: double.infinity, height: 56, child: ElevatedButton( onPressed: authProvider.isLoading ? null : _handleLogin, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFF4D03F), disabledBackgroundColor: Colors.grey.shade300, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), ), child: authProvider.isLoading ? const SizedBox( width: 24, height: 24, child: CircularProgressIndicator( strokeWidth: 2, ), ) : Text( 'Masuk', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey.shade800, ), ), ), ); }, ), ], ), ), const SizedBox(height: 24), // Sign Up Link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Belum punya akun? ', style: TextStyle( fontSize: 14, color: Colors.grey.shade700, ), ), GestureDetector( onTap: () => Navigator.pushNamed(context, '/signup'), child: Text( 'Daftar di sini', style: TextStyle( fontSize: 14, color: Colors.orange.shade600, fontWeight: FontWeight.bold, ), ), ), ], ), ], ), ), ), ); }, ), ), ), ); } }