import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../services/auth_service.dart'; import 'register_screen.dart'; import 'forgot_password_screen.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); bool _isPasswordVisible = false; bool _rememberMe = false; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } // 로그인 처리 함수 Future _login() async { if (_formKey.currentState!.validate()) { final authService = Provider.of(context, listen: false); final success = await authService.login( _usernameController.text.trim(), _passwordController.text, ); if (success && mounted) { // 로그인 성공 시 홈 화면으로 이동 Navigator.of(context).pushNamedAndRemoveUntil('/', (route) => false); } else if (!success && mounted) { // 로그인 실패 시 스낵바 표시 ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('로그인에 실패했습니다. 아이디와 비밀번호를 확인해주세요.'), backgroundColor: Colors.red, ), ); } } } @override Widget build(BuildContext context) { final authService = Provider.of(context); return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // 로고 이미지 Column( children: [ Image.asset( 'assets/images/logo.png', width: 120, height: 120, ), const SizedBox(height: 16), const Text( '레인보우 - 볼링 클럽 매니저', textAlign: TextAlign.center, style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.blue, ), ), ], ), const SizedBox(height: 48), // 사용자명(아이디) 입력 필드 TextFormField( controller: _usernameController, decoration: const InputDecoration( labelText: '아이디', prefixIcon: Icon(Icons.person), border: OutlineInputBorder(), ), validator: (value) { if (value == null || value.isEmpty) { return '아이디를 입력해주세요'; } return null; }, ), const SizedBox(height: 16), // 비밀번호 입력 필드 TextFormField( controller: _passwordController, obscureText: !_isPasswordVisible, decoration: InputDecoration( labelText: '비밀번호', prefixIcon: const Icon(Icons.lock), border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( _isPasswordVisible ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _isPasswordVisible = !_isPasswordVisible; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '비밀번호를 입력해주세요'; } return null; }, ), const SizedBox(height: 8), // 로그인 상태 유지 체크박스 Row( children: [ Checkbox( value: _rememberMe, onChanged: (value) { setState(() { _rememberMe = value ?? false; }); }, ), const Text('로그인 상태 유지'), const Spacer(), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const ForgotPasswordScreen(), ), ); }, child: const Text('비밀번호 찾기'), ), ], ), const SizedBox(height: 24), // 로그인 버튼 ElevatedButton( onPressed: authService.isLoading ? null : _login, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), backgroundColor: Colors.blue, foregroundColor: Colors.white, ), child: authService.isLoading ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( '로그인', style: TextStyle(fontSize: 16), ), ), const SizedBox(height: 16), // 회원가입 링크 Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('계정이 없으신가요?'), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const RegisterScreen(), ), ); }, child: const Text('회원가입'), ), ], ), ], ), ), ), ), ), ); } }