Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:provider/provider.dart';
3 : import '../../services/auth_service.dart';
4 :
5 : class ForgotPasswordScreen extends StatefulWidget {
6 24 : const ForgotPasswordScreen({super.key});
7 :
8 0 : @override
9 0 : State<ForgotPasswordScreen> createState() => _ForgotPasswordScreenState();
10 : }
11 :
12 : class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> {
13 : final _formKey = GlobalKey<FormState>();
14 : final _emailController = TextEditingController();
15 : bool _isSubmitting = false;
16 : bool _emailSent = false;
17 :
18 0 : @override
19 : void dispose() {
20 0 : _emailController.dispose();
21 0 : super.dispose();
22 : }
23 :
24 : // 비밀번호 재설정 이메일 전송 함수
25 0 : Future<void> _resetPassword() async {
26 0 : if (_formKey.currentState!.validate()) {
27 0 : setState(() {
28 0 : _isSubmitting = true;
29 : });
30 :
31 0 : final authService = Provider.of<AuthService>(context, listen: false);
32 0 : final success = await authService.sendPasswordResetEmail(
33 0 : _emailController.text.trim(),
34 : );
35 :
36 0 : setState(() {
37 0 : _isSubmitting = false;
38 0 : _emailSent = success;
39 : });
40 :
41 0 : if (success && mounted) {
42 0 : ScaffoldMessenger.of(context).showSnackBar(
43 : const SnackBar(
44 : content: Text('비밀번호 재설정 이메일이 전송되었습니다. 이메일을 확인해주세요.'),
45 : backgroundColor: Colors.green,
46 : ),
47 : );
48 0 : } else if (mounted) {
49 0 : ScaffoldMessenger.of(context).showSnackBar(
50 : const SnackBar(
51 : content: Text('비밀번호 재설정 이메일 전송에 실패했습니다. 이메일 주소를 확인해주세요.'),
52 : backgroundColor: Colors.red,
53 : ),
54 : );
55 : }
56 : }
57 : }
58 :
59 0 : @override
60 : Widget build(BuildContext context) {
61 0 : return Scaffold(
62 0 : appBar: AppBar(
63 : title: const Text('비밀번호 찾기'),
64 : ),
65 0 : body: SafeArea(
66 0 : child: Center(
67 0 : child: SingleChildScrollView(
68 : padding: const EdgeInsets.all(24.0),
69 0 : child: Form(
70 0 : key: _formKey,
71 0 : child: Column(
72 : mainAxisAlignment: MainAxisAlignment.center,
73 : crossAxisAlignment: CrossAxisAlignment.stretch,
74 0 : children: [
75 : const Icon(
76 : Icons.lock_reset,
77 : size: 80,
78 : color: Colors.blue,
79 : ),
80 : const SizedBox(height: 24),
81 :
82 : const Text(
83 : '비밀번호를 잊으셨나요?',
84 : textAlign: TextAlign.center,
85 : style: TextStyle(
86 : fontSize: 24,
87 : fontWeight: FontWeight.bold,
88 : ),
89 : ),
90 : const SizedBox(height: 16),
91 :
92 : const Text(
93 : '가입하신 이메일 주소를 입력하시면 비밀번호 재설정 링크를 보내드립니다.',
94 : textAlign: TextAlign.center,
95 : style: TextStyle(
96 : fontSize: 16,
97 : color: Colors.grey,
98 : ),
99 : ),
100 : const SizedBox(height: 32),
101 :
102 : // 이메일 입력 필드
103 0 : TextFormField(
104 0 : controller: _emailController,
105 : keyboardType: TextInputType.emailAddress,
106 : decoration: const InputDecoration(
107 : labelText: '이메일',
108 : prefixIcon: Icon(Icons.email),
109 : border: OutlineInputBorder(),
110 : ),
111 0 : validator: (value) {
112 0 : if (value == null || value.isEmpty) {
113 : return '이메일을 입력해주세요';
114 : }
115 0 : if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) {
116 : return '유효한 이메일 주소를 입력해주세요';
117 : }
118 : return null;
119 : },
120 : ),
121 : const SizedBox(height: 24),
122 :
123 : // 비밀번호 재설정 이메일 전송 버튼
124 0 : ElevatedButton(
125 0 : onPressed: _isSubmitting ? null : _resetPassword,
126 0 : style: ElevatedButton.styleFrom(
127 : padding: const EdgeInsets.symmetric(vertical: 16),
128 : backgroundColor: Colors.blue,
129 : foregroundColor: Colors.white,
130 : ),
131 0 : child: _isSubmitting
132 : ? const SizedBox(
133 : width: 20,
134 : height: 20,
135 : child: CircularProgressIndicator(
136 : strokeWidth: 2,
137 : color: Colors.white,
138 : ),
139 : )
140 : : const Text(
141 : '비밀번호 재설정 이메일 전송',
142 : style: TextStyle(fontSize: 16),
143 : ),
144 : ),
145 : const SizedBox(height: 16),
146 :
147 : // 로그인 화면으로 돌아가기
148 0 : Row(
149 : mainAxisAlignment: MainAxisAlignment.center,
150 0 : children: [
151 : const Text('비밀번호가 기억나셨나요?'),
152 0 : TextButton(
153 0 : onPressed: () {
154 0 : Navigator.pop(context); // 로그인 화면으로 돌아가기
155 : },
156 : child: const Text('로그인'),
157 : ),
158 : ],
159 : ),
160 : ],
161 : ),
162 : ),
163 : ),
164 : ),
165 : ),
166 : );
167 : }
168 : }
|