import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import 'register_screen.dart'; import 'reset_password_screen.dart'; import 'dashboard.dart'; import 'app_language.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { TextEditingController emailController = TextEditingController(); TextEditingController passwordController = TextEditingController(); bool rememberMe = false; bool hidePassword = true; bool _isLoading = false; String apiUrl = "http://192.168.100.9/kopikaocare_api/login.php"; Future login() async { if (emailController.text.isEmpty || passwordController.text.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Email dan password harus diisi'), backgroundColor: Colors.orange, ), ); return; } setState(() => _isLoading = true); String lang = Localizations.localeOf(context).languageCode; var response = await http.post( Uri.parse(apiUrl), body: { "email": emailController.text, "password": passwordController.text }, ); var data = jsonDecode(response.body); if (data['status'] == "success") { final prefs = await SharedPreferences.getInstance(); await prefs.setString('name', data['name']); await prefs.setString('email', data['email']); await prefs.setString('image', data['image'] ?? ''); setState(() => _isLoading = false); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const DashboardScreen(), ), ); } else { setState(() => _isLoading = false); showDialog( context: context, builder: (context) { return AlertDialog( backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), title: const Text( 'Login Gagal', style: TextStyle(color: Colors.red), ), content: const Text('Email atau password salah'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('OK'), ), ], ); }, ); } } @override Widget build(BuildContext context) { String lang = Localizations.localeOf(context).languageCode; return Scaffold( backgroundColor: const Color(0xfff8f9fa), body: SafeArea( child: SingleChildScrollView( child: Column( children: [ // Header Gradient Container( width: double.infinity, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.red.shade700, Colors.red.shade500, Colors.red.shade300, ], ), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(40), bottomRight: Radius.circular(40), ), ), child: Column( children: [ const SizedBox(height: 50), // Logo Container Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( shape: BoxShape.circle, color: Colors.white.withOpacity(0.2), boxShadow: [ BoxShadow( blurRadius: 30, color: Colors.white.withOpacity(0.3), ), ], ), child: const Icon( Icons.coffee, size: 60, color: Colors.white, ), ), const SizedBox(height: 20), const Text( 'Welcome Back!', style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: Colors.white, letterSpacing: 1, ), ), const SizedBox(height: 10), Text( 'Sign in to your account', style: TextStyle( fontSize: 14, color: Colors.white.withOpacity(0.8), ), ), const SizedBox(height: 40), ], ), ), const SizedBox(height: 30), // Form Container Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: Column( children: [ // Email Field Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( blurRadius: 10, color: Colors.black.withOpacity(0.05), offset: const Offset(0, 5), ), ], ), child: TextField( controller: emailController, style: const TextStyle(fontSize: 16), decoration: InputDecoration( hintText: 'Email Address', prefixIcon: const Icon(Icons.email_outlined, color: Colors.red), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), ), const SizedBox(height: 20), // Password Field Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( blurRadius: 10, color: Colors.black.withOpacity(0.05), offset: const Offset(0, 5), ), ], ), child: TextField( controller: passwordController, obscureText: hidePassword, style: const TextStyle(fontSize: 16), decoration: InputDecoration( hintText: 'Password', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( hidePassword ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () { setState(() { hidePassword = !hidePassword; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), ), const SizedBox(height: 15), // Remember & Forgot Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Checkbox( value: rememberMe, activeColor: Colors.red, onChanged: (value) { setState(() { rememberMe = value!; }); }, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), ), const Text( 'Remember Me', style: TextStyle(color: Color(0xff666666)), ), ], ), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const ResetPasswordScreen(), ), ); }, child: const Text( 'Forgot Password?', style: TextStyle(color: Colors.red), ), ), ], ), const SizedBox(height: 30), // Login Button SizedBox( width: double.infinity, height: 55, child: ElevatedButton( onPressed: _isLoading ? null : login, style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Colors.white, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( 'Sign In', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1, ), ), ), ), const SizedBox(height: 20), // Divider Row( children: [ Expanded( child: Container( height: 1, color: Colors.grey.shade300, ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: Text( 'OR', style: TextStyle( color: Colors.grey.shade400, fontSize: 12, ), ), ), Expanded( child: Container( height: 1, color: Colors.grey.shade300, ), ), ], ), const SizedBox(height: 20), // Register Link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Don't have an account? ", style: TextStyle(color: Colors.grey.shade600), ), GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const RegisterScreen(), ), ); }, child: const Text( 'Sign Up', style: TextStyle( color: Colors.red, fontWeight: FontWeight.bold, ), ), ), ], ), ], ), ), const SizedBox(height: 30), ], ), ), ), ); } }