Files
2025-08-01 16:45:26 +09:00

187 lines
6.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../services/auth_service.dart';
import '../../models/user_model.dart';
class ProfileScreen extends StatefulWidget {
const ProfileScreen({super.key});
@override
State<ProfileScreen> createState() => _ProfileScreenState();
}
class _ProfileScreenState extends State<ProfileScreen> {
final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController();
bool _isEditing = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final user = Provider.of<AuthService>(context, listen: false).currentUser;
if (user != null) {
_nameController.text = user.name;
}
});
}
@override
void dispose() {
_nameController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('내 프로필'),
actions: [
IconButton(
icon: Icon(_isEditing ? Icons.save : Icons.edit),
onPressed: () {
setState(() {
_isEditing = !_isEditing;
});
if (!_isEditing) {
// 저장 로직 구현 (추후 개발)
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('프로필이 업데이트되었습니다')),
);
}
}
},
),
],
),
body: Consumer<AuthService>(
builder: (context, authService, child) {
final User? user = authService.currentUser;
if (user == null) {
return const Center(child: Text('사용자 정보를 불러올 수 없습니다'));
}
return SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// 프로필 이미지
CircleAvatar(
radius: 50,
backgroundImage: user.profileImage != null
? NetworkImage(user.profileImage!)
: null,
child: user.profileImage == null
? Text(
user.name.isNotEmpty ? user.name[0].toUpperCase() : '?',
style: const TextStyle(fontSize: 40),
)
: null,
),
const SizedBox(height: 16),
// 이름 필드
TextFormField(
controller: _nameController,
enabled: _isEditing,
decoration: const InputDecoration(
labelText: '이름',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return '이름을 입력해주세요';
}
return null;
},
),
const SizedBox(height: 16),
// 이메일 (수정 불가)
TextFormField(
initialValue: user.email,
enabled: false,
decoration: const InputDecoration(
labelText: '이메일',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 16),
// 역할 표시
TextFormField(
initialValue: _getRoleDisplayName(user.role),
enabled: false,
decoration: const InputDecoration(
labelText: '역할',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 16),
// 클럽 역할 표시 (클럽이 있는 경우)
if (user.clubRole != null)
TextFormField(
initialValue: _getRoleDisplayName(user.clubRole!),
enabled: false,
decoration: const InputDecoration(
labelText: '클럽 내 역할',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 32),
// 로그아웃 버튼
ElevatedButton(
onPressed: () async {
await authService.logout();
if (context.mounted) {
Navigator.of(context).pushReplacementNamed('/login');
}
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(
horizontal: 32,
vertical: 12,
),
),
child: const Text('로그아웃'),
),
],
),
),
);
},
),
);
}
// 역할 표시 이름 변환
String _getRoleDisplayName(String role) {
switch (role) {
case 'admin':
return '관리자';
case 'superadmin':
return '최고 관리자';
case 'user':
return '일반 사용자';
case 'owner':
return '클럽 소유자';
case 'manager':
return '클럽 매니저';
case 'member':
return '클럽 회원';
default:
return role;
}
}
}