diff --git a/frontend/ongi/lib/screens/health/family_step_tracker_screen.dart b/frontend/ongi/lib/screens/health/family_step_tracker_screen.dart index 6e9db08..a70ca86 100644 --- a/frontend/ongi/lib/screens/health/family_step_tracker_screen.dart +++ b/frontend/ongi/lib/screens/health/family_step_tracker_screen.dart @@ -3,6 +3,8 @@ import '../../core/app_colors.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:ongi/widgets/date_carousel.dart'; import 'package:ongi/services/step_service.dart'; +import 'package:ongi/services/family_service.dart'; +import 'package:ongi/utils/prefs_manager.dart'; class FamilyStepTrackerScreen extends StatefulWidget { const FamilyStepTrackerScreen({super.key}); @@ -54,22 +56,29 @@ class _FamilyStepTrackerScreenState extends State { }); try { final String dateStr = _formatDate(date); - final Map? result = await _stepService.getSteps( - date: dateStr, - ); + + // 가족 구성원 정보와 걸음 수 정보를 동시에 가져오기 + final List futures = [ + _stepService.getSteps(date: dateStr), + FamilyService.getFamilyMembers(), + ]; + + final results = await Future.wait(futures); + final Map? stepResult = results[0] as Map?; + final List> familyMembers = results[1] as List>; int parsedTotal = 0; final List<_MemberStep> parsedMembers = []; - if (result != null) { - if (result['totalSteps'] is int) { - parsedTotal = result['totalSteps'] as int; - } else if (result['steps'] is int) { - parsedTotal = result['steps'] as int; - } else if (result['total'] is int) { - parsedTotal = result['total'] as int; + if (stepResult != null) { + if (stepResult['totalSteps'] is int) { + parsedTotal = stepResult['totalSteps'] as int; + } else if (stepResult['steps'] is int) { + parsedTotal = stepResult['steps'] as int; + } else if (stepResult['total'] is int) { + parsedTotal = stepResult['total'] as int; } - final dynamic members = result['memberSteps']; + final dynamic members = stepResult['memberSteps']; if (members is List) { for (final dynamic item in members) { if (item is Map) { @@ -78,12 +87,16 @@ class _FamilyStepTrackerScreenState extends State { final int steps = (item['steps'] is int) ? item['steps'] as int : int.tryParse(item['steps']?.toString() ?? '0') ?? 0; + + // 실제 가족 구성원의 프로필 이미지 가져오기 + final profileImagePath = await PrefsManager.getProfileImagePathByUserId(userId, familyMembers); + parsedMembers.add( _MemberStep( userId: userId, userName: userName.isEmpty ? '이름없음' : userName, steps: steps, - imageAsset: 'assets/images/users/elderly_woman.png', + imageAsset: profileImagePath, ), ); } diff --git a/frontend/ongi/lib/screens/home/home_ourfamily_text.dart b/frontend/ongi/lib/screens/home/home_ourfamily_text.dart index 6567e66..7e2380d 100644 --- a/frontend/ongi/lib/screens/home/home_ourfamily_text.dart +++ b/frontend/ongi/lib/screens/home/home_ourfamily_text.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:ongi/utils/prefs_manager.dart'; class HomeOngiText extends StatelessWidget { final String username; @@ -24,10 +25,19 @@ class HomeOngiText extends StatelessWidget { children: [ Row( children: [ - Image.asset( - 'assets/images/users/elderly_woman.png', - width: iconSize, - height: iconSize, + FutureBuilder>( + future: PrefsManager.getUserInfo(), + builder: (context, snapshot) { + final userInfo = snapshot.data ?? {}; + final profileImageId = userInfo['profileImageId'] ?? 0; + final profileImagePath = PrefsManager.getProfileImagePath(profileImageId); + + return Image.asset( + profileImagePath, + width: iconSize, + height: iconSize, + ); + }, ), const SizedBox(width: 8), Text( diff --git a/frontend/ongi/lib/screens/mypage/mypage_myinfo.dart b/frontend/ongi/lib/screens/mypage/mypage_myinfo.dart index b5be9c0..b0fe453 100644 --- a/frontend/ongi/lib/screens/mypage/mypage_myinfo.dart +++ b/frontend/ongi/lib/screens/mypage/mypage_myinfo.dart @@ -5,9 +5,14 @@ import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; -class Myinfo extends StatelessWidget { - const Myinfo({Key? key}) : super(key: key); +class Myinfo extends StatefulWidget { + const Myinfo({super.key}); + @override + State createState() => _MyinfoState(); +} + +class _MyinfoState extends State { Future> fetchFamilyInfo() async { final token = await PrefsManager.getAccessToken(); if (token == null) throw Exception('로그인 필요'); @@ -57,14 +62,13 @@ class Myinfo extends StatelessWidget { // 기존 PrefsManager.getUserInfo()에서 불러오던 나머지 정보는 그대로 사용 // (예: name, profileImage, isParent 등) // 아래는 예시로 name 등은 PrefsManager에서 계속 불러오도록 유지 - return FutureBuilder>( + return FutureBuilder>( future: PrefsManager.getUserInfo(), builder: (context, userSnapshot) { final userInfo = userSnapshot.data ?? {}; final name = userInfo['name'] ?? '사용자'; - final profileImage = - userInfo['profileImage'] ?? - 'assets/images/users/elderly_woman.png'; + final profileImageId = userInfo['profileImageId'] ?? 0; + final profileImagePath = PrefsManager.getProfileImagePath(profileImageId); final isParent = userInfo['isParent'] == 'true'; final roleText = isParent ? '부모' : '자녀'; return Padding( @@ -78,7 +82,7 @@ class Myinfo extends StatelessWidget { // 프로필 이미지 ClipOval( child: Image.asset( - profileImage, + profileImagePath, width: screenWidth * 0.3, // 112/375 height: screenWidth * 0.4, fit: BoxFit.contain, diff --git a/frontend/ongi/lib/screens/photo/detail_record_screen.dart b/frontend/ongi/lib/screens/photo/detail_record_screen.dart index 94e53dc..f553d42 100644 --- a/frontend/ongi/lib/screens/photo/detail_record_screen.dart +++ b/frontend/ongi/lib/screens/photo/detail_record_screen.dart @@ -304,11 +304,18 @@ class _DetailRecordScreenState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CircleAvatar( - radius: 22, - backgroundImage: AssetImage( - 'assets/images/users/elderly_woman.png', - ), + FutureBuilder>( + future: PrefsManager.getUserInfo(), + builder: (context, snapshot) { + final userInfo = snapshot.data ?? {}; + final profileImageId = userInfo['profileImageId'] ?? 0; + final profileImagePath = PrefsManager.getProfileImagePath(profileImageId); + + return CircleAvatar( + radius: 22, + backgroundImage: AssetImage(profileImagePath), + ); + }, ), const SizedBox(width: 10), Expanded( diff --git a/frontend/ongi/lib/screens/photo/photo_date_screen.dart b/frontend/ongi/lib/screens/photo/photo_date_screen.dart index b304238..09c163a 100644 --- a/frontend/ongi/lib/screens/photo/photo_date_screen.dart +++ b/frontend/ongi/lib/screens/photo/photo_date_screen.dart @@ -4,6 +4,8 @@ import 'package:ongi/core/app_light_background.dart'; import 'package:ongi/core/app_colors.dart'; import 'package:ongi/models/maum_log.dart'; import 'package:ongi/services/maum_log_service.dart'; +import 'package:ongi/services/family_service.dart'; +import 'package:ongi/utils/prefs_manager.dart'; import 'dart:ui'; // Added for ImageFilter class PhotoDateScreen extends StatefulWidget { @@ -18,6 +20,7 @@ class PhotoDateScreen extends StatefulWidget { class _PhotoDateScreenState extends State { int _currentPage = 0; MaumLogResponse? _maumLogResponse; + List> _familyMembers = []; bool _isLoading = true; String? _error; @@ -42,10 +45,19 @@ class _PhotoDateScreenState extends State { _error = null; }); - final response = await MaumLogService.getMaumLog(widget.date); + // 마음 기록과 가족 구성원 정보를 동시에 로드 + final futures = [ + MaumLogService.getMaumLog(widget.date), + FamilyService.getFamilyMembers(), + ]; + + final results = await Future.wait(futures); + final response = results[0] as MaumLogResponse; + final familyMembers = results[1] as List>; setState(() { _maumLogResponse = response; + _familyMembers = familyMembers; _isLoading = false; if (response.maumLogDtos.isNotEmpty) { _currentPage = 0; @@ -122,9 +134,7 @@ class _PhotoDateScreenState extends State { Widget _buildContent(double cardWidth, double cardHeight) { if (_isLoading) { return const Center( - child: CircularProgressIndicator( - color: AppColors.ongiOrange, - ), + child: CircularProgressIndicator(color: AppColors.ongiOrange), ); } @@ -212,50 +222,47 @@ class _PhotoDateScreenState extends State { borderRadius: BorderRadius.circular(32), child: isActive ? Image.network( - maumLog.frontPresignedUrl, - width: cardWidth, - height: cardHeight, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Container( - width: cardWidth, - height: cardHeight, - color: Colors.grey[300], - child: const Icon( - Icons.broken_image, - color: Colors.grey, - size: 48, - ), - ); - }, - ) + maumLog.frontPresignedUrl, + width: cardWidth, + height: cardHeight, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Container( + width: cardWidth, + height: cardHeight, + color: Colors.grey[300], + child: const Icon( + Icons.broken_image, + color: Colors.grey, + size: 48, + ), + ); + }, + ) : ImageFiltered( - imageFilter: ImageFilter.blur( - sigmaX: 8, - sigmaY: 8, - ), - child: Opacity( - opacity: 0.7, - child: Image.network( - maumLog.frontPresignedUrl, - width: cardWidth, - height: cardHeight, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Container( - width: cardWidth, - height: cardHeight, - color: Colors.grey[300], - child: const Icon( - Icons.broken_image, - color: Colors.grey, - size: 48, + imageFilter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: Opacity( + opacity: 0.7, + child: Image.network( + maumLog.frontPresignedUrl, + width: cardWidth, + height: cardHeight, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Container( + width: cardWidth, + height: cardHeight, + color: Colors.grey[300], + child: const Icon( + Icons.broken_image, + color: Colors.grey, + size: 48, + ), + ); + }, ), - ); - }, - ), - ), - ), + ), + ), ), // 좌상단 서브(프로필) 사진 Positioned( @@ -265,10 +272,7 @@ class _PhotoDateScreenState extends State { width: 88, height: 100, decoration: BoxDecoration( - border: Border.all( - color: AppColors.ongiOrange, - width: 3, - ), + border: Border.all(color: AppColors.ongiOrange, width: 3), borderRadius: BorderRadius.circular(15), ), child: ClipRRect( @@ -296,12 +300,7 @@ class _PhotoDateScreenState extends State { right: 0, bottom: 0, child: Container( - padding: const EdgeInsets.fromLTRB( - 20, - 16, - 20, - 24, - ), + padding: const EdgeInsets.fromLTRB(20, 16, 20, 24), decoration: BoxDecoration( borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(32), @@ -311,8 +310,8 @@ class _PhotoDateScreenState extends State { begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ - Colors.black.withOpacity(0.0), - Colors.black.withOpacity(0.4), + Colors.black.withValues(alpha: 0.0), + Colors.black.withValues(alpha: 0.4), ], ), ), @@ -322,7 +321,18 @@ class _PhotoDateScreenState extends State { children: [ Row( children: [ - Image.asset("assets/images/users/elderly_woman.png", width: 30), + FutureBuilder( + future: PrefsManager.getProfileImagePathByUserName( + maumLog.uploader, + _familyMembers, + ), + builder: (context, snapshot) { + final profileImagePath = + snapshot.data ?? + PrefsManager.getProfileImagePath(0); + return Image.asset(profileImagePath, width: 30); + }, + ), const SizedBox(width: 8), Expanded( child: Text( @@ -353,7 +363,9 @@ class _PhotoDateScreenState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - SvgPicture.asset('assets/images/location_icon.svg'), + SvgPicture.asset( + 'assets/images/location_icon.svg', + ), const SizedBox(width: 4), Text( maumLog.location, @@ -395,8 +407,11 @@ class _PhotoDateScreenState extends State { List rows = []; for (int i = 0; i < emotions.length; i += 4) { - final rowEmotions = emotions.sublist(i, i + 4 > emotions.length ? emotions.length : i + 4); - + final rowEmotions = emotions.sublist( + i, + i + 4 > emotions.length ? emotions.length : i + 4, + ); + rows.add( Row( mainAxisAlignment: MainAxisAlignment.center, @@ -408,16 +423,14 @@ class _PhotoDateScreenState extends State { ], ), ); - + // 마지막 행이 아니면 세로 간격 추가 if (i + 4 < emotions.length) { rows.add(const SizedBox(height: 2)); } } - return Column( - children: rows, - ); + return Column(children: rows); } Widget _buildPageIndicators() { @@ -471,4 +484,4 @@ class _PhotoDateScreenState extends State { ), ); } -} \ No newline at end of file +} diff --git a/frontend/ongi/lib/screens/signup/mode_screen.dart b/frontend/ongi/lib/screens/signup/mode_screen.dart index c3cfb27..2498f4c 100644 --- a/frontend/ongi/lib/screens/signup/mode_screen.dart +++ b/frontend/ongi/lib/screens/signup/mode_screen.dart @@ -32,6 +32,7 @@ class ModeScreen extends StatelessWidget { final email = prefs.getString('signup_email') ?? ''; final password = prefs.getString('signup_password') ?? ''; final name = prefs.getString('signup_username') ?? ''; + final profileImageId = prefs.getInt('signup_profileImageId') ?? 0; final isParent = mode == 'parent'; if (email.isEmpty || password.isEmpty || name.isEmpty) { @@ -58,11 +59,12 @@ class ModeScreen extends StatelessWidget { password: password, name: name, isParent: isParent, + profileImageId: profileImageId, ); final loginService = LoginService(); await loginService.login(email: email, password: password); - + // isParent 정보 저장 await PrefsManager.saveIsParent(isParent); @@ -112,7 +114,7 @@ class ModeScreen extends StatelessWidget { decoration: BoxDecoration( color: index != 4 ? AppColors.ongiOrange - : AppColors.ongiOrange.withOpacity(0.4), + : AppColors.ongiOrange.withValues(alpha: 0.4), borderRadius: BorderRadius.circular(4), ), ), diff --git a/frontend/ongi/lib/screens/signup/profilepic_screen.dart b/frontend/ongi/lib/screens/signup/profilepic_screen.dart index 4bb375d..3740d9d 100644 --- a/frontend/ongi/lib/screens/signup/profilepic_screen.dart +++ b/frontend/ongi/lib/screens/signup/profilepic_screen.dart @@ -15,14 +15,16 @@ class ProfilepicScreen extends StatefulWidget { class _ProfilepicScreenState extends State { String? _selectedAsset; + int? _selectedIndex; - Widget _buildSelectableIcon(String assetPath, {double size = 90}) { + Widget _buildSelectableIcon(String assetPath, int index, {double size = 90}) { final bool isSelected = _selectedAsset == assetPath; return GestureDetector( onTap: () { setState(() { _selectedAsset = assetPath; + _selectedIndex = index; }); }, child: Center( @@ -87,7 +89,7 @@ class _ProfilepicScreenState extends State { decoration: BoxDecoration( color: index == 0 || index == 1 || index == 2 ? AppColors.ongiOrange - : AppColors.ongiOrange.withOpacity(0.4), + : AppColors.ongiOrange.withValues(alpha: 0.4), borderRadius: BorderRadius.circular(4), ), ), @@ -131,38 +133,47 @@ class _ProfilepicScreenState extends State { children: [ _buildSelectableIcon( 'assets/images/users/mom_icon.png', + 0, size: 107, ), _buildSelectableIcon( 'assets/images/users/dad_icon.png', + 1, size: 110, ), _buildSelectableIcon( 'assets/images/users/daughter_icon.png', + 2, size: 103, ), _buildSelectableIcon( 'assets/images/users/son_icon.png', + 3, size: 98, ), _buildSelectableIcon( 'assets/images/users/black_woman_icon.png', + 4, size: 90, ), _buildSelectableIcon( 'assets/images/users/black_man_icon.png', + 5, size: 91, ), _buildSelectableIcon( 'assets/images/users/baby_icon.png', + 6, size: 96, ), _buildSelectableIcon( 'assets/images/users/dog_icon.png', + 7, size: 98, ), _buildSelectableIcon( 'assets/images/users/robot_icon.png', + 8, size: 98, ), ], @@ -182,8 +193,30 @@ class _ProfilepicScreenState extends State { ), ), onPressed: () async { + if (_selectedIndex == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text( + '프로필 아이콘을 선택해주세요.', + style: TextStyle(color: AppColors.ongiOrange), + ), + backgroundColor: Colors.white, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + duration: const Duration(seconds: 2), + ), + ); + return; + } + final prefs = await SharedPreferences.getInstance(); await prefs.setString('signup_username', widget.username); + await prefs.setInt( + 'signup_profileImageId', + _selectedIndex!, + ); Navigator.push( context, MaterialPageRoute( diff --git a/frontend/ongi/lib/services/login_service.dart b/frontend/ongi/lib/services/login_service.dart index f799195..cdf3458 100644 --- a/frontend/ongi/lib/services/login_service.dart +++ b/frontend/ongi/lib/services/login_service.dart @@ -31,6 +31,11 @@ class LoginService { await PrefsManager.saveIsParent(responseJson["userInfo"]["isParent"]); } + // profileImageId 정보도 저장 + if (responseJson["userInfo"]["profileImageId"] != null) { + await PrefsManager.saveProfileImageId(responseJson["userInfo"]["profileImageId"]); + } + // 로그인 성공 후 FCM 토큰 업로드 try { await FCMService.initializeAndUploadFCMToken(); diff --git a/frontend/ongi/lib/services/signup_service.dart b/frontend/ongi/lib/services/signup_service.dart index ca0aeda..ad6835b 100644 --- a/frontend/ongi/lib/services/signup_service.dart +++ b/frontend/ongi/lib/services/signup_service.dart @@ -2,25 +2,26 @@ import 'dart:convert'; import 'package:http/http.dart' as http; class SignupService { - static const String baseUrl = 'https://ongi-1049536928483.asia-northeast3.run.app'; + static const String baseUrl = + 'https://ongi-1049536928483.asia-northeast3.run.app'; Future> register({ required String email, required String password, required String name, required bool isParent, + required int profileImageId, }) async { try { final response = await http.post( Uri.parse('$baseUrl/auth/register'), - headers: { - 'Content-Type': 'application/json', - }, + headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'email': email, 'password': password, 'name': name, 'isParent': isParent, + 'profileImageId': profileImageId, }), ); @@ -33,4 +34,4 @@ class SignupService { throw Exception('회원가입 중 오류가 발생했습니다: $e'); } } -} \ No newline at end of file +} diff --git a/frontend/ongi/lib/utils/prefs_manager.dart b/frontend/ongi/lib/utils/prefs_manager.dart index 206862f..d0fad49 100644 --- a/frontend/ongi/lib/utils/prefs_manager.dart +++ b/frontend/ongi/lib/utils/prefs_manager.dart @@ -6,7 +6,7 @@ class PrefsManager { static const _userFamilyCodeKey = 'userFamilyCode'; static const _userFamilyNameKey = 'userFamilyName'; static const _isParent = 'isParent'; - static const _userProfileImageKey = 'userProfileImage'; + static const _profileImageIdKey = 'profileImageId'; static const _uuidKey = 'uuid'; static SharedPreferences? _instance; @@ -56,6 +56,16 @@ class PrefsManager { return prefs.getString(_uuidKey); } + static Future saveProfileImageId(int profileImageId) async { + final prefs = await _prefs; + await prefs.setInt(_profileImageIdKey, profileImageId); + } + + static Future getProfileImageId() async { + final prefs = await _prefs; + return prefs.getInt(_profileImageIdKey); + } + static Future logout() async { final prefs = await _prefs; await prefs.remove(_accessTokenKey); @@ -63,18 +73,18 @@ class PrefsManager { await prefs.remove(_uuidKey); await prefs.remove(_userFamilyCodeKey); await prefs.remove(_userFamilyNameKey); - await prefs.remove(_userProfileImageKey); + await prefs.remove(_profileImageIdKey); await prefs.remove(_isParent); } - static Future> getUserInfo() async { + static Future> getUserInfo() async { final prefs = await _prefs; return { 'name': prefs.getString(_userNameKey), 'uuid': prefs.getString(_uuidKey), 'familycode': prefs.getString(_userFamilyCodeKey), 'familyname': prefs.getString(_userFamilyNameKey), - 'profileImage': prefs.getString(_userProfileImageKey), + 'profileImageId': prefs.getInt(_profileImageIdKey), 'isParent': prefs.getBool(_isParent) == true ? 'true' : 'false', }; } @@ -94,4 +104,87 @@ class PrefsManager { final prefs = await _prefs; return prefs.getBool(_isParent) ?? false; } + + // 프로필 이미지 인덱스를 실제 이미지 경로로 변환하는 함수 + static String getProfileImagePath(int index) { + final imagePaths = [ + 'assets/images/users/mom_icon.png', // 0 + 'assets/images/users/dad_icon.png', // 1 + 'assets/images/users/daughter_icon.png', // 2 + 'assets/images/users/son_icon.png', // 3 + 'assets/images/users/black_woman_icon.png', // 4 + 'assets/images/users/black_man_icon.png', // 5 + 'assets/images/users/baby_icon.png', // 6 + 'assets/images/users/dog_icon.png', // 7 + 'assets/images/users/robot_icon.png', // 8 + ]; + + if (index >= 0 && index < imagePaths.length) { + return imagePaths[index]; + } + // 기본값으로 첫 번째 이미지 반환 + return imagePaths[0]; + } + + // userId를 기반으로 프로필 이미지 경로를 가져오는 함수 + static Future getProfileImagePathByUserId(String userId, List> familyMembers) async { + try { + // familyMembers에서 userId와 일치하는 구성원 찾기 + final member = familyMembers.firstWhere( + (member) => member['userId']?.toString() == userId, + orElse: () => {}, + ); + + // profileImageId가 있으면 해당 이미지 경로 반환 + if (member.isNotEmpty && member['profileImageId'] != null) { + final profileImageId = member['profileImageId'] as int; + return getProfileImagePath(profileImageId); + } + + // 현재 사용자인지 확인해서 현재 사용자 프로필 이미지 반환 + final currentUserInfo = await getUserInfo(); + final currentUserUuid = currentUserInfo['uuid']; + if (userId == currentUserUuid) { + final profileImageId = currentUserInfo['profileImageId'] ?? 0; + return getProfileImagePath(profileImageId); + } + + // 기본 이미지 반환 + return getProfileImagePath(0); + } catch (e) { + // 에러 발생 시 기본 이미지 반환 + return getProfileImagePath(0); + } + } + + // userName을 기반으로 프로필 이미지 경로를 가져오는 함수 + static Future getProfileImagePathByUserName(String userName, List> familyMembers) async { + try { + // familyMembers에서 userName과 일치하는 구성원 찾기 + final member = familyMembers.firstWhere( + (member) => member['name']?.toString() == userName, + orElse: () => {}, + ); + + // profileImageId가 있으면 해당 이미지 경로 반환 + if (member.isNotEmpty && member['profileImageId'] != null) { + final profileImageId = member['profileImageId'] as int; + return getProfileImagePath(profileImageId); + } + + // 현재 사용자인지 확인해서 현재 사용자 프로필 이미지 반환 + final currentUserInfo = await getUserInfo(); + final currentUserName = currentUserInfo['name']; + if (userName == currentUserName) { + final profileImageId = currentUserInfo['profileImageId'] ?? 0; + return getProfileImagePath(profileImageId); + } + + // 기본 이미지 반환 + return getProfileImagePath(0); + } catch (e) { + // 에러 발생 시 기본 이미지 반환 + return getProfileImagePath(0); + } + } }