Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 25 additions & 12 deletions frontend/ongi/lib/screens/health/family_step_tracker_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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});
Expand Down Expand Up @@ -54,22 +56,29 @@ class _FamilyStepTrackerScreenState extends State<FamilyStepTrackerScreen> {
});
try {
final String dateStr = _formatDate(date);
final Map<String, dynamic>? result = await _stepService.getSteps(
date: dateStr,
);

// 가족 구성원 정보와 걸음 수 정보를 동시에 가져오기
final List<Future> futures = [
_stepService.getSteps(date: dateStr),
FamilyService.getFamilyMembers(),
];

final results = await Future.wait(futures);
final Map<String, dynamic>? stepResult = results[0] as Map<String, dynamic>?;
final List<Map<String, dynamic>> familyMembers = results[1] as List<Map<String, dynamic>>;

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<String, dynamic>) {
Expand All @@ -78,12 +87,16 @@ class _FamilyStepTrackerScreenState extends State<FamilyStepTrackerScreen> {
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,
),
);
}
Expand Down
18 changes: 14 additions & 4 deletions frontend/ongi/lib/screens/home/home_ourfamily_text.dart
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -24,10 +25,19 @@ class HomeOngiText extends StatelessWidget {
children: [
Row(
children: [
Image.asset(
'assets/images/users/elderly_woman.png',
width: iconSize,
height: iconSize,
FutureBuilder<Map<String, dynamic>>(
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(
Expand Down
18 changes: 11 additions & 7 deletions frontend/ongi/lib/screens/mypage/mypage_myinfo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<Myinfo> createState() => _MyinfoState();
}

class _MyinfoState extends State<Myinfo> {
Future<Map<String, String>> fetchFamilyInfo() async {
final token = await PrefsManager.getAccessToken();
if (token == null) throw Exception('로그인 필요');
Expand Down Expand Up @@ -57,14 +62,13 @@ class Myinfo extends StatelessWidget {
// 기존 PrefsManager.getUserInfo()에서 불러오던 나머지 정보는 그대로 사용
// (예: name, profileImage, isParent 등)
// 아래는 예시로 name 등은 PrefsManager에서 계속 불러오도록 유지
return FutureBuilder<Map<String, String?>>(
return FutureBuilder<Map<String, dynamic>>(
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(
Expand All @@ -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,
Expand Down
17 changes: 12 additions & 5 deletions frontend/ongi/lib/screens/photo/detail_record_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,18 @@ class _DetailRecordScreenState extends State<DetailRecordScreen> {
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CircleAvatar(
radius: 22,
backgroundImage: AssetImage(
'assets/images/users/elderly_woman.png',
),
FutureBuilder<Map<String, dynamic>>(
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(
Expand Down
Loading
Loading