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 'pw_finding_page.dart'; import 'signup_page.dart'; class IdFindingPage extends StatefulWidget { const IdFindingPage({Key? key}) : super(key: key); @override _IdFindingPageState createState() => _IdFindingPageState(); } class _IdFindingPageState extends State { final TextEditingController nicknameController = TextEditingController(); final TextEditingController emailController = TextEditingController(); String nicknameErrorMessage = ''; String emailErrorMessage = ''; String foundIdMessage = ''; String authId = ''; Future _findId(String nickname, String email) async { // 로딩 인디케이터 표시 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/id'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode({ 'nickname': nickname, 'user_email': email, }), ).timeout(const Duration(seconds: 10)); // 10초 타임아웃 설정 String responseBody = utf8.decode(response.bodyBytes); Navigator.of(context).pop(); // 로딩 인디케이터 닫기 if (response.statusCode == 200) { final Map jsonResponse = jsonDecode(responseBody); print('ID 찾기 성공: $jsonResponse'); // 초기화 setState(() { nicknameErrorMessage = ''; emailErrorMessage = ''; foundIdMessage = ''; // ID 메시지 초기화 }); if (jsonResponse['response_info']['msg_title'] == '닉네임 확인') { setState(() { nicknameErrorMessage = '닉네임을 다시 확인해주세요'; // 닉네임 오류 메시지 설정 }); } else if (jsonResponse['response_info']['msg_title'] == '이메일 확인') { setState(() { emailErrorMessage = '이메일을 다시 확인해주세요'; // 이메일 오류 메시지 설정 }); } else if (jsonResponse['result'] == 'OK') { // ID 찾기 성공 시 처리 setState(() { foundIdMessage = '당신의 ID는 ${jsonResponse['data']['user_id']} 입니다'; // ID 메시지 설정 authId = jsonResponse['data']['auth']; // auth_id 값 저장 }); } else { _showErrorDialog(jsonResponse['response_info']['msg_title'], jsonResponse['response_info']['msg_content'], 'STAY'); } } else { // 요청이 실패했을 때 모달 창 띄우기 _showErrorDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } catch (e) { Navigator.of(context).pop(); // 로딩 인디케이터 닫기 _showErrorDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } Future _findAllId() async { // ID 전체 찾기 요청 처리 print('ID 전체 찾기 요청 $authId'); // 요청 시 출력 // 로딩 인디케이터 표시 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/id/full'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode({ 'auth': authId, // authId 값 포함 }), ).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('ID 전체 찾기 성공: $jsonResponse'); if (jsonResponse['result'] == 'OK') { // 성공 시 모달 창 띄우기 _showSuccessDialog('이메일로 전체 ID를 발송했습니다.'); } else { // 실패 시 모달 창 띄우기 _showErrorDialog(jsonResponse['response_info']['msg_title'], jsonResponse['response_info']['msg_content'], 'STAY'); } } else { // 요청이 실패했을 때 모달 창 띄우기 _showErrorDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } catch (e) { Navigator.of(context).pop(); // 로딩 인디케이터 닫기 _showErrorDialog('오류', '요청이 실패했습니다. 관리자에게 문의해주세요.', 'STAY'); } } void _showErrorDialog(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(); // 로그인 페이지로 이동 } }, ), ), ], ); }, ); } void _showSuccessDialog(String message) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: const Text('성공'), content: Text(message), actions: [ TextButton( child: const Text('확인'), onPressed: () { Navigator.of(context).pop(); // 모달 닫기 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: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ if (foundIdMessage.isEmpty) ...[ const Text( 'ID 찾기', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black, ), ), const SizedBox(height: 32), TextField( controller: nicknameController, decoration: InputDecoration( labelText: '닉네임', labelStyle: const TextStyle(color: Colors.black), border: OutlineInputBorder(), focusedBorder: OutlineInputBorder( borderSide: const BorderSide(color: Colors.black, width: 2.0), ), ), ), if (nicknameErrorMessage.isNotEmpty) // 닉네임 오류 메시지 표시 Padding( padding: const EdgeInsets.only(top: 8.0), child: Text( nicknameErrorMessage, 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: () { _findId(nicknameController.text, emailController.text); }, style: ElevatedButton.styleFrom( backgroundColor: Colors.black, foregroundColor: Colors.white, ), child: const Text('ID 찾기'), ), ] else ...[ // ID 찾기 성공 시 메시지 표시 Text( foundIdMessage, style: const TextStyle(fontSize: 20, color: Colors.black), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { _findAllId(); // ID 전체 찾기 버튼 클릭 시 처리 }, style: ElevatedButton.styleFrom( backgroundColor: Colors.black, foregroundColor: Colors.white, ), child: const Text('ID 전체 찾기'), ), ], 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 PwFindingPage()), ); }, child: const Text('PW 찾기', style: TextStyle(color: Colors.black)), ), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => const SignUpPage()), ); }, child: const Text('회원가입', style: TextStyle(color: Colors.black)), ), ], ), ), ), ); } }