import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:convert' show utf8; import 'login_page.dart'; // 로그인 페이지 임포트 추가 import 'signup_page.dart'; // 회원가입 페이지 임포트 추가 import 'id_finding_page.dart'; // ID 찾기 페이지 임포트 추가 class PwFindingPage extends StatefulWidget { const PwFindingPage({Key? key}) : super(key: key); @override _PwFindingPageState createState() => _PwFindingPageState(); } class _PwFindingPageState extends State { final TextEditingController idController = TextEditingController(); // ID 입력 컨트롤러 final TextEditingController emailController = TextEditingController(); // 이메일 입력 컨트롤러 String emailErrorMessage = ''; // 이메일 오류 메시지 String idErrorMessage = ''; // ID 오류 메시지 Future _findPassword(String id, String email) async { // PW 찾기 요청 처리 print('PW 찾기 요청: ID: $id, 이메일: $email'); // 요청 시 출력 // 로딩 인디케이터 표시 showDialog( context: context, barrierDismissible: false, // 바깥 클릭으로 닫지 않도록 설정 builder: (BuildContext context) { return const Center(child: CircularProgressIndicator()); }, ); try { final response = await http.post( Uri.parse('https://eldsoft.com:8097/user/find/password'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode({ 'user_id': id, 'user_email': email, }), ).timeout(const Duration(seconds: 10)); // 10초 타임아웃 설정 String responseBody = utf8.decode(response.bodyBytes); // UTF-8 디코딩 Navigator.of(context).pop(); // 로딩 인디케이터 닫기 if (response.statusCode == 200) { final Map jsonResponse = jsonDecode(responseBody); print('PW 찾기 성공: $jsonResponse'); // 추기화 setState(() { emailErrorMessage = ''; idErrorMessage = ''; }); if (jsonResponse['response_info']['msg_title'] == '아이디 확인') { setState(() { idErrorMessage = '아이디를 다시 확인해주세요'; // ID 오류 메시지 설정 }); } else if (jsonResponse['response_info']['msg_title'] == '이메일 확인') { setState(() { emailErrorMessage = '이메일을 다시 확인해주세요'; // 이메일 오류 메시지 설정 }); } else if (jsonResponse['result'] == 'OK') { // 성공 시 모달 창 띄우기 _showDialog('비밀번호 찾기 안내', '임시 비밀번호가 입력하신 이메일로 발송되었습니다.', 'LOGIN'); } else { // 실패 시 모달 창 띄우기 _showDialog(jsonResponse['response_info']['msg_title'], jsonResponse['response_info']['msg_content'], 'STAY'); } } else { // 요청이 실패했을 때 모달 창 띄우기 _showDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } catch (e) { Navigator.of(context).pop(); // 로딩 인디케이터 닫기 _showDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } void _showDialog(String title, String content, String action) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( backgroundColor: Colors.white, // 모달 배경색을 흰색으로 설정 title: Text(title, style: const TextStyle(color: Colors.black)), content: Text(content, style: const TextStyle(color: Colors.black)), actions: [ Center( child: TextButton( style: TextButton.styleFrom( backgroundColor: Colors.black, foregroundColor: Colors.white, // 텍스트 색상 ), child: const Text('확인'), onPressed: () { Navigator.of(context).pop(); // 모달 닫기 if (action == 'LOGIN') { Navigator.of(context).pop(); // 로그인 페이지로 이동 } }, ), ), ], ); }, ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( title: const Text('ALL SCORE', style: TextStyle(color: Colors.white)), backgroundColor: Colors.black, ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( 'PW 찾기', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black, ), ), const SizedBox(height: 32), TextField( controller: idController, // ID 입력 필드 decoration: InputDecoration( labelText: 'ID', labelStyle: const TextStyle(color: Colors.black), border: OutlineInputBorder(), focusedBorder: OutlineInputBorder( borderSide: const BorderSide(color: Colors.black, width: 2.0), ), ), ), if (idErrorMessage.isNotEmpty) // ID 오류 메시지 표시 Padding( padding: const EdgeInsets.only(top: 8.0), child: Text( idErrorMessage, style: const TextStyle(color: Colors.red), ), ), const SizedBox(height: 16), TextField( controller: emailController, // 이메일 입력 필드 decoration: InputDecoration( labelText: '이메일', labelStyle: const TextStyle(color: Colors.black), border: OutlineInputBorder(), focusedBorder: OutlineInputBorder( borderSide: const BorderSide(color: Colors.black, width: 2.0), ), ), ), if (emailErrorMessage.isNotEmpty) // 이메일 오류 메시지 표시 Padding( padding: const EdgeInsets.only(top: 8.0), child: Text( emailErrorMessage, style: const TextStyle(color: Colors.red), ), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { _findPassword(idController.text, emailController.text); // PW 찾기 요청 }, style: ElevatedButton.styleFrom( backgroundColor: Colors.black, foregroundColor: Colors.white, ), child: const Text('PW 찾기'), ), const SizedBox(height: 16), TextButton( onPressed: () { Navigator.pop(context); // 로그인 페이지로 이동 }, child: const Text('로그인', style: TextStyle(color: Colors.black)), ), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => const IdFindingPage()), ); }, child: const Text('ID 찾기', style: TextStyle(color: Colors.black)), ), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => const SignUpPage()), ); }, child: const Text('회원가입', style: TextStyle(color: Colors.black)), ), ], ), ), ); } }