import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../services/auth_service.dart'; class RegisterScreen extends StatefulWidget { const RegisterScreen({super.key}); @override State createState() => _RegisterScreenState(); } class _RegisterScreenState extends State { final _formKey = GlobalKey(); final _nameController = TextEditingController(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _isPasswordVisible = false; bool _isConfirmPasswordVisible = false; @override void dispose() { _nameController.dispose(); _emailController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } // 회원가입 처리 함수 Future _register() async { if (_formKey.currentState!.validate()) { final authService = Provider.of(context, listen: false); final success = await authService.register( _nameController.text.trim(), _emailController.text.trim(), _passwordController.text, ); if (success && mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('회원가입이 완료되었습니다. 로그인해주세요.'), backgroundColor: Colors.green, ), ); Navigator.pop(context); // 로그인 화면으로 돌아가기 } else if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('회원가입에 실패했습니다. 다시 시도해주세요.'), backgroundColor: Colors.red, ), ); } } } @override Widget build(BuildContext context) { final authService = Provider.of(context); return Scaffold( appBar: AppBar( title: const Text('회원가입'), ), 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: [ // 이름 입력 필드 TextFormField( controller: _nameController, 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: _emailController, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: '이메일', prefixIcon: Icon(Icons.email), border: OutlineInputBorder(), ), validator: (value) { if (value == null || value.isEmpty) { return '이메일을 입력해주세요'; } if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) { 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 '비밀번호를 입력해주세요'; } if (value.length < 6) { return '비밀번호는 6자 이상이어야 합니다'; } return null; }, ), const SizedBox(height: 16), // 비밀번호 확인 입력 필드 TextFormField( controller: _confirmPasswordController, obscureText: !_isConfirmPasswordVisible, decoration: InputDecoration( labelText: '비밀번호 확인', prefixIcon: const Icon(Icons.lock_outline), border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( _isConfirmPasswordVisible ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _isConfirmPasswordVisible = !_isConfirmPasswordVisible; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '비밀번호를 다시 입력해주세요'; } if (value != _passwordController.text) { return '비밀번호가 일치하지 않습니다'; } return null; }, ), const SizedBox(height: 24), // 회원가입 버튼 ElevatedButton( onPressed: authService.isLoading ? null : _register, 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.pop(context); // 로그인 화면으로 돌아가기 }, child: const Text('로그인'), ), ], ), ], ), ), ), ), ), ); } }