Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
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
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,19 @@ private fun HomeResponseDto.MedicationDto.toMedicines(): Medicines {
medicineName = type.orEmpty(),
todayTakenCount = taken,
todayRequiredCount = goal,
nextDoseTime = nextTime,
nextDoseTime = formatNextDoseTimeToKorean(nextTime),
doseStatusList = doseStatusList?.map { it.toHomeDoseStatus() } ?: emptyList(),
)
}

private fun formatNextDoseTimeToKorean(nextTime: String?): String? {
if (nextTime.isNullOrBlank()) return nextTime
return nextTime
.replace("MORNING", "아침약")
.replace("LUNCH", "점심약")
.replace("DINNER", "저녁약")
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
Comment thread
ProtossManse marked this conversation as resolved.
Outdated
}

// Dose DTO → Domain
private fun HomeResponseDto.DoseStatusDto.toHomeDoseStatus(): HomeDoseStatusList {
return HomeDoseStatusList(
Expand Down Expand Up @@ -182,9 +190,9 @@ object HomeMapper {

private fun getDefaultNextDose(firstTimeKey: Any?): String {
return when (firstTimeKey?.toString()?.uppercase()) {
"MORNING" -> "아침"
"LUNCH" -> "점심"
"DINNER" -> "저녁"
"MORNING" -> "아침약"
"LUNCH" -> "점심약"
"DINNER" -> "저녁약"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아침약, 점심약, 저녁약보다는 아침, 점심, 저녁으로 통일하는 게 나을 것 같습니다!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

피그마상 -약으로 표기되어있어서 피그마기준으로 맞춰두었습니다!

Copy link
Copy Markdown
Contributor Author

@librawish808 librawish808 Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 혹시 enum은 아침/점심/저녁으로 두고 ui표시할때만 약을 붙이라는 의미인가요?

Copy link
Copy Markdown
Contributor

@ProtossManse ProtossManse Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

피그마상 -약으로 표기되어있어서 피그마기준으로 맞춰두었습니다!

아 피그마에서 그렇게 돼있으면 아침약, 점심약, 저녁약으로 표기하는게 맞겠네요!
수정하신 코드대로 하면 될 것 같습니다~!

else -> "-"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ import kotlinx.serialization.Serializable
@Serializable
data class ElderIds(
val elderIds: Map<Long, String>,
val selectedElderId: Long = -1L,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.konkuk.medicarecall.data.repository
interface ElderIdRepository {
suspend fun updateElderIds(elderIdMap: Map<Long, String>)
suspend fun updateElderId(elderId: Long, name: String)
suspend fun updateSelectedElderId(elderId: Long)
suspend fun getSelectedElderId(): Long
suspend fun clearElderIds()
suspend fun getElderIds(): Map<Long, String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,23 @@ class ElderIdRepositoryImpl(
elderIdDataStore.updateData { it.copy(elderIds = it.elderIds.plus(elderId to name)) }
}

override suspend fun updateSelectedElderId(elderId: Long) {
elderIdDataStore.updateData { it.copy(selectedElderId = elderId) }
}

override suspend fun getSelectedElderId(): Long {
val preferences = elderIdDataStore.data.first()
return preferences.selectedElderId
}

override suspend fun getElderIds(): Map<Long, String> {
val preferences = elderIdDataStore.data.map { it.elderIds }
return preferences.first()
}

override suspend fun clearElderIds() {
elderIdDataStore.updateData {
ElderIds(elderIds = emptyMap())
ElderIds(elderIds = emptyMap(), selectedElderId = -1L)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.konkuk.medicarecall.ui.feature.home.navigation

import androidx.compose.runtime.Composable
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import com.konkuk.medicarecall.ui.feature.home.screen.HomeScreen
import com.konkuk.medicarecall.ui.feature.home.viewmodel.HomeViewModel
import com.konkuk.medicarecall.ui.navigation.MainTabRoute

fun NavController.navigateToHome(navOptions: NavOptions) {
Expand All @@ -18,9 +21,11 @@ fun NavGraphBuilder.homeNavGraph(
navigateToStateHealthDetailScreen: (Long) -> Unit,
navigateToStateMentalDetailScreen: (Long) -> Unit,
navigateToGlucoseDetailScreen: (Long) -> Unit,
getBackStackHomeViewModel: @Composable (NavBackStackEntry) -> HomeViewModel,
) {
composable<MainTabRoute.Home> { backStackEntry ->
HomeScreen(
viewModel = getBackStackHomeViewModel(backStackEntry),
navigateToMealDetailScreen = { elderId ->
navigateToMealDetailScreen(elderId)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ class HomeViewModel(
_selectedElderId.collect { elderId ->
if (elderId != -1L) {
savedStateHandle[KEY_SELECTED_ELDER_ID] = elderId
elderIdRepository.updateSelectedElderId(elderId)
fetchHomeSummaryForToday(elderId)
} else {
_homeUiState.value = HomeUiState.EMPTY.copy(isLoading = false)
Expand Down Expand Up @@ -120,8 +121,14 @@ class HomeViewModel(
_elderInfoList.value = elderIdMap.map {
ElderInfo(elderId = it.key, name = it.value)
}
val currentSelectedId = _selectedElderId.value
val sharedSelectedId = elderIdRepository.getSelectedElderId()
val restoredId = savedStateHandle.get<Long>(KEY_SELECTED_ELDER_ID) ?: -1L
if (restoredId != -1L && _elderInfoList.value.any { it.elderId == restoredId }) {
if (currentSelectedId != -1L && _elderInfoList.value.any { it.elderId == currentSelectedId }) {
_selectedElderId.value = currentSelectedId
} else if (sharedSelectedId != -1L && _elderInfoList.value.any { it.elderId == sharedSelectedId }) {
_selectedElderId.value = sharedSelectedId
} else if (restoredId != -1L && _elderInfoList.value.any { it.elderId == restoredId }) {
_selectedElderId.value = restoredId
} else if (_selectedElderId.value == -1L && _elderInfoList.value.isNotEmpty()) {
_selectedElderId.value = _elderInfoList.value.first().elderId
Expand Down Expand Up @@ -192,6 +199,7 @@ class HomeViewModel(
val id = elderIdByName[name] ?: return

if (_selectedElderId.value != id) {
savedStateHandle[KEY_SELECTED_ELDER_ID] = id
_selectedElderId.value = id
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Expand All @@ -40,6 +43,7 @@ fun StateHealthDetailScreen(
viewModel: HealthViewModel = koinViewModel(),
) {
val isLoading by viewModel.isLoading.collectAsStateWithLifecycle()
var isInitialLoading by remember(elderId) { mutableStateOf(true) }

// 재진입 시 오늘로 초기화
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
Expand All @@ -54,17 +58,11 @@ fun StateHealthDetailScreen(
viewModel.loadHealthDataForDate(elderId, selectedDate)
}

if (!isLoading)
StateHealthDetailScreenLayout(
modifier = Modifier,
onBack = onBack,
selectedDate = selectedDate,
health = health,
weekDates = selectedDate.getCurrentWeekDates(),
onDateSelected = { viewModel.selectDate(it) },
onMonthClick = { /* 모달 열기 */ },
)
else
LaunchedEffect(isLoading) {
if (!isLoading) isInitialLoading = false
}

if (isLoading && isInitialLoading) {
Box(
Modifier
.fillMaxSize()
Expand All @@ -75,6 +73,17 @@ fun StateHealthDetailScreen(
color = MediCareCallTheme.colors.main,
)
}
} else {
StateHealthDetailScreenLayout(
modifier = Modifier,
onBack = onBack,
selectedDate = selectedDate,
health = health,
weekDates = selectedDate.getCurrentWeekDates(),
onDateSelected = { viewModel.selectDate(it) },
onMonthClick = { /* 모달 열기 */ },
)
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,16 @@ class StatisticsViewModel(
private var lastFetchTime: Long = 0

init {
viewModelScope.launch {
_uiState.update { it.copy(eldersMap = eldersIdRepository.getElderIds()) }
}

viewModelScope.launch {
_uiState
.map { it.selectedElderId to it.currentWeek }
.distinctUntilChanged()
.collect { (id, week) ->
if (id != null) {
if (id != -1L) {
// [수정 2] 주차가 변경될 때마다 isLatestWeek와 isEarliestWeek를 다시 계산합니다.
// 이렇게 하면 API 호출 성공/실패와 관계없이 UI 상태가 정확해집니다.
val weekStart = week.first
Expand All @@ -58,7 +62,6 @@ class StatisticsViewModel(
getWeeklyStatistics(elderId = id, startDate = weekStart)
}
}
_uiState.update { it.copy(eldersMap = eldersIdRepository.getElderIds()) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ fun NavGraph(
// )
// }
homeNavGraph(
getBackStackHomeViewModel = { backStackEntry ->
backStackEntry.sharedViewModel<HomeViewModel, MainTabRoute.Home>(navController)
},
navigateToMealDetailScreen = navigator::navigateToMealDetailScreen,
navigateToMedicineDetailScreen = navigator::navigateToMedicineDetailScreen,
navigateToSleepDetailScreen = navigator::navigateToSleepDetailScreen,
Expand Down
Loading