Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
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 { mutableStateOf(true) }
Comment thread
librawish808 marked this conversation as resolved.
Outdated

// 재진입 시 오늘로 초기화
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