Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:provider/provider.dart';
3 : import '../../services/auth_service.dart';
4 : import '../../models/user_model.dart';
5 :
6 : class ProfileScreen extends StatefulWidget {
7 24 : const ProfileScreen({super.key});
8 :
9 0 : @override
10 0 : State<ProfileScreen> createState() => _ProfileScreenState();
11 : }
12 :
13 : class _ProfileScreenState extends State<ProfileScreen> {
14 : final _formKey = GlobalKey<FormState>();
15 : final _nameController = TextEditingController();
16 : bool _isEditing = false;
17 :
18 0 : @override
19 : void initState() {
20 0 : super.initState();
21 0 : WidgetsBinding.instance.addPostFrameCallback((_) {
22 0 : final user = Provider.of<AuthService>(context, listen: false).currentUser;
23 : if (user != null) {
24 0 : _nameController.text = user.name;
25 : }
26 : });
27 : }
28 :
29 0 : @override
30 : void dispose() {
31 0 : _nameController.dispose();
32 0 : super.dispose();
33 : }
34 :
35 0 : @override
36 : Widget build(BuildContext context) {
37 0 : return Scaffold(
38 0 : appBar: AppBar(
39 : title: const Text('내 프로필'),
40 0 : actions: [
41 0 : IconButton(
42 0 : icon: Icon(_isEditing ? Icons.save : Icons.edit),
43 0 : onPressed: () {
44 0 : setState(() {
45 0 : _isEditing = !_isEditing;
46 : });
47 0 : if (!_isEditing) {
48 : // 저장 로직 구현 (추후 개발)
49 0 : if (_formKey.currentState!.validate()) {
50 0 : ScaffoldMessenger.of(context).showSnackBar(
51 : const SnackBar(content: Text('프로필이 업데이트되었습니다')),
52 : );
53 : }
54 : }
55 : },
56 : ),
57 : ],
58 : ),
59 0 : body: Consumer<AuthService>(
60 0 : builder: (context, authService, child) {
61 0 : final User? user = authService.currentUser;
62 :
63 : if (user == null) {
64 : return const Center(child: Text('사용자 정보를 불러올 수 없습니다'));
65 : }
66 :
67 0 : return SingleChildScrollView(
68 : padding: const EdgeInsets.all(16.0),
69 0 : child: Form(
70 0 : key: _formKey,
71 0 : child: Column(
72 : crossAxisAlignment: CrossAxisAlignment.center,
73 0 : children: [
74 : // 프로필 이미지
75 0 : CircleAvatar(
76 : radius: 50,
77 0 : backgroundImage: user.profileImage != null
78 0 : ? NetworkImage(user.profileImage!)
79 : : null,
80 0 : child: user.profileImage == null
81 0 : ? Text(
82 0 : user.name.isNotEmpty ? user.name[0].toUpperCase() : '?',
83 : style: const TextStyle(fontSize: 40),
84 : )
85 : : null,
86 : ),
87 : const SizedBox(height: 16),
88 :
89 : // 이름 필드
90 0 : TextFormField(
91 0 : controller: _nameController,
92 0 : enabled: _isEditing,
93 : decoration: const InputDecoration(
94 : labelText: '이름',
95 : border: OutlineInputBorder(),
96 : ),
97 0 : validator: (value) {
98 0 : if (value == null || value.isEmpty) {
99 : return '이름을 입력해주세요';
100 : }
101 : return null;
102 : },
103 : ),
104 : const SizedBox(height: 16),
105 :
106 : // 이메일 (수정 불가)
107 0 : TextFormField(
108 0 : initialValue: user.email,
109 : enabled: false,
110 : decoration: const InputDecoration(
111 : labelText: '이메일',
112 : border: OutlineInputBorder(),
113 : ),
114 : ),
115 : const SizedBox(height: 16),
116 :
117 : // 역할 표시
118 0 : TextFormField(
119 0 : initialValue: _getRoleDisplayName(user.role),
120 : enabled: false,
121 : decoration: const InputDecoration(
122 : labelText: '역할',
123 : border: OutlineInputBorder(),
124 : ),
125 : ),
126 : const SizedBox(height: 16),
127 :
128 : // 클럽 역할 표시 (클럽이 있는 경우)
129 0 : if (user.clubRole != null)
130 0 : TextFormField(
131 0 : initialValue: _getRoleDisplayName(user.clubRole!),
132 : enabled: false,
133 : decoration: const InputDecoration(
134 : labelText: '클럽 내 역할',
135 : border: OutlineInputBorder(),
136 : ),
137 : ),
138 0 : const SizedBox(height: 32),
139 :
140 : // 로그아웃 버튼
141 0 : ElevatedButton(
142 0 : onPressed: () async {
143 0 : await authService.logout();
144 0 : if (context.mounted) {
145 0 : Navigator.of(context).pushReplacementNamed('/login');
146 : }
147 : },
148 0 : style: ElevatedButton.styleFrom(
149 : backgroundColor: Colors.red,
150 : foregroundColor: Colors.white,
151 : padding: const EdgeInsets.symmetric(
152 : horizontal: 32,
153 : vertical: 12,
154 : ),
155 : ),
156 : child: const Text('로그아웃'),
157 : ),
158 : ],
159 : ),
160 : ),
161 : );
162 : },
163 : ),
164 : );
165 : }
166 :
167 : // 역할 표시 이름 변환
168 0 : String _getRoleDisplayName(String role) {
169 : switch (role) {
170 0 : case 'admin':
171 : return '관리자';
172 0 : case 'superadmin':
173 : return '최고 관리자';
174 0 : case 'user':
175 : return '일반 사용자';
176 0 : case 'owner':
177 : return '클럽 소유자';
178 0 : case 'manager':
179 : return '클럽 매니저';
180 0 : case 'member':
181 : return '클럽 회원';
182 : default:
183 : return role;
184 : }
185 : }
186 : }
|