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
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ private fun formatTime(timeStr: String?): String {
Log.w("SleepRepository", "Failed to parse time: $timeStr", e)
""
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,3 @@ class SleepRepositoryImpl(
).handleResponse().toModel()
}
}

Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

package com.konkuk.medicarecall.domain.model

data class Sleep(
Expand All @@ -6,4 +7,4 @@ data class Sleep(
val totalSleepMinutes: Int? = null,
val bedTime: String? = null,
val wakeUpTime: String? = null,
)
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.konkuk.medicarecall.ui.feature.calendar
package com.konkuk.medicarecall.ui.common.component

import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ButtonDefaults
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.konkuk.medicarecall.ui.feature.calendar
package com.konkuk.medicarecall.ui.common.component

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
Expand Down Expand Up @@ -34,7 +34,7 @@ fun DateSelector(
val month = selectedDate.monthValue

Row(
modifier = Modifier
modifier = Modifier.Companion
.fillMaxWidth()
.clickable(
indication = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.konkuk.medicarecall.ui.feature.calendar
package com.konkuk.medicarecall.ui.common.component

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
Expand All @@ -20,13 +20,13 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.konkuk.medicarecall.ui.feature.calendar.viewmodel.CalendarUiState
import com.konkuk.medicarecall.ui.theme.MediCareCallTheme
import java.time.LocalDate

@Composable
fun WeeklyCalendar(
calendarUiState: CalendarUiState, // 현재 선택된 연/월/주차 날짜 상태
selectedDate: LocalDate,
weekDates: List<LocalDate>,
onDateSelected: (LocalDate) -> Unit, // 날짜 클릭 시 동작할 콜백
) {
val weekDays = listOf("일", "월", "화", "수", "목", "금", "토") // 요일 표시
Expand Down Expand Up @@ -58,9 +58,9 @@ fun WeeklyCalendar(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
) {
calendarUiState.weekDates.forEach { date ->
weekDates.forEach { date ->

val isSelected = date == calendarUiState.selectedDate
val isSelected = date == selectedDate

Box(
modifier = Modifier
Expand Down Expand Up @@ -89,12 +89,8 @@ fun PreviewWeeklyCalendar() {
val week = (0..6).map { baseDate.plusDays(it.toLong()) }

WeeklyCalendar(
calendarUiState = CalendarUiState(
currentYear = baseDate.year,
currentMonth = baseDate.monthValue,
weekDates = week,
selectedDate = baseDate.plusDays(2),
),
weekDates = week,
selectedDate = baseDate.plusDays(2),
onDateSelected = {},
)
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ import org.koin.androidx.compose.koinViewModel
@Composable
fun HomeScreen(
modifier: Modifier = Modifier,
homeViewModel: HomeViewModel = koinViewModel(),
viewModel: HomeViewModel = koinViewModel(),
navigateToMealDetailScreen: (Int) -> Unit,
navigateToMedicineDetailScreen: (Int) -> Unit,
navigateToSleepDetailScreen: (Int) -> Unit,
Expand All @@ -81,10 +81,10 @@ fun HomeScreen(
navigateToGlucoseDetailScreen: (Int) -> Unit,
mainBackStackEntry: NavBackStackEntry,
) {
val homeUiState by homeViewModel.homeUiState.collectAsStateWithLifecycle()
val elderInfoList by homeViewModel.elderInfoList.collectAsStateWithLifecycle()
val elderNameList by homeViewModel.elderNameList.collectAsStateWithLifecycle()
val selectedElderId by homeViewModel.selectedElderId.collectAsStateWithLifecycle()
val homeUiState by viewModel.homeUiState.collectAsStateWithLifecycle()
val elderInfoList by viewModel.elderInfoList.collectAsStateWithLifecycle()
val elderNameList by viewModel.elderNameList.collectAsStateWithLifecycle()
val selectedElderId by viewModel.selectedElderId.collectAsStateWithLifecycle()

var dropdownOpened by remember { mutableStateOf(false) }
var isRefreshing by remember { mutableStateOf(false) }
Expand All @@ -98,7 +98,7 @@ fun HomeScreen(

LaunchedEffect(updatedName) {
updatedName?.let {
homeViewModel.overrideName(it)
viewModel.overrideName(it)
mainBackStackEntry.savedStateHandle.remove<String>("ELDER_NAME_UPDATED") // 원샷 처리
}
}
Expand All @@ -113,7 +113,7 @@ fun HomeScreen(
onDropdownClick = { dropdownOpened = true },
onDropdownDismiss = { dropdownOpened = false },
onDropdownItemSelected = { selectedName ->
homeViewModel.selectElder(selectedName)
viewModel.selectElder(selectedName)
dropdownOpened = false
},
navigateToMealDetailScreen = { selectedElderId?.let(navigateToMealDetailScreen) },
Expand All @@ -131,14 +131,14 @@ fun HomeScreen(
scope.launch {
snackbarHostState.showSnackbar("케어콜이 곧 연결됩니다. 잠시만 기다려 주세요.")
delay(3000) // 케어콜 데이터 처리 기다리는 시간
homeViewModel.forceRefreshHomeData()
viewModel.forceRefreshHomeData()
}
},
onRefresh = {
homeViewModel.forceRefreshHomeData()
viewModel.forceRefreshHomeData()
},
immediateCall = {
homeViewModel.callImmediate(it)
viewModel.callImmediate(it)
},
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class HomeViewModel(
}

// 홈 화면 상태 (isLoading 포함)
private val _homeUiState = MutableStateFlow(HomeUiState.Companion.EMPTY)
private val _homeUiState = MutableStateFlow(HomeUiState.EMPTY)
val homeUiState: StateFlow<HomeUiState> = _homeUiState.asStateFlow()

// 어르신 전체 목록
Expand Down Expand Up @@ -90,7 +90,7 @@ class HomeViewModel(
savedStateHandle[KEY_SELECTED_ELDER_ID] = elderId
fetchHomeSummaryForToday(elderId)
} else {
_homeUiState.value = HomeUiState.Companion.EMPTY.copy(isLoading = false)
_homeUiState.value = HomeUiState.EMPTY.copy(isLoading = false)
}
}
}
Expand Down Expand Up @@ -198,7 +198,7 @@ class HomeViewModel(
_homeUiState.value = fallbackUiState.copy(isLoading = false)
} else {
Log.e(TAG, "getHomeSummary failed elderId=$elderId", e)
_homeUiState.value = HomeUiState.Companion.EMPTY.copy(isLoading = false)
_homeUiState.value = HomeUiState.EMPTY.copy(isLoading = false)
}
} finally {
_homeUiState.update { it.copy(isLoading = false) }
Expand Down Expand Up @@ -260,7 +260,7 @@ class HomeViewModel(
correctMedicationOrder.indexOf(medUiState.medicineName)
.let { if (it == -1) Int.MAX_VALUE else it }
}
return HomeUiState.Companion.EMPTY.copy(
return HomeUiState.EMPTY.copy(
elderName = elderName,
medicines = sortedFallbackMedicines,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ fun GlucoseDetailScreen(
modifier: Modifier = Modifier,
elderId: Int,
onBack: () -> Unit,
glucoseViewModel: GlucoseViewModel = koinViewModel(),
viewModel: GlucoseViewModel = koinViewModel(),
) {
val scrollState = rememberScrollState()
val uiState by glucoseViewModel.uiState.collectAsStateWithLifecycle()
val uiState by viewModel.uiState.collectAsStateWithLifecycle()

// 페이지 카운터
val counter = remember {
Expand All @@ -74,18 +74,18 @@ fun GlucoseDetailScreen(
val coroutineScope = rememberCoroutineScope()

// 데이터 새로고침 로직
val refreshData = remember(glucoseViewModel) {
val refreshData = remember(viewModel) {
{
counter[GlucoseTiming.BEFORE_MEAL] = 0
counter[GlucoseTiming.AFTER_MEAL] = 0

glucoseViewModel.getGlucoseData(
viewModel.getGlucoseData(
elderId = elderId,
counter = 0,
type = GlucoseTiming.BEFORE_MEAL,
isRefresh = true,
)
glucoseViewModel.getGlucoseData(
viewModel.getGlucoseData(
elderId = elderId,
counter = 0,
type = GlucoseTiming.AFTER_MEAL,
Expand Down Expand Up @@ -119,7 +119,7 @@ fun GlucoseDetailScreen(
val currentTiming = uiState.selectedTiming
val currentPage = counter.getValue(currentTiming)

glucoseViewModel.getGlucoseData(
viewModel.getGlucoseData(
elderId = elderId,
counter = currentPage + 1, // 다음 페이지 요청
type = currentTiming,
Expand All @@ -145,11 +145,11 @@ fun GlucoseDetailScreen(

// '공복'/'식후' 버튼
onTimingChange = { newTiming ->
glucoseViewModel.updateTiming(newTiming)
viewModel.updateTiming(newTiming)
coroutineScope.launch { scrollState.scrollTo(0) }
},
// 그래프 점
onPointClick = glucoseViewModel::onClickDots,
onPointClick = viewModel::onClickDots,
scrollState = scrollState,
onBack = onBack,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,9 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LifecycleEventEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.konkuk.medicarecall.ui.common.component.DateSelector
import com.konkuk.medicarecall.ui.common.component.TopAppBar
import com.konkuk.medicarecall.ui.feature.calendar.DateSelector
import com.konkuk.medicarecall.ui.feature.calendar.WeeklyCalendar
import com.konkuk.medicarecall.ui.feature.calendar.viewmodel.CalendarUiState
import com.konkuk.medicarecall.ui.feature.calendar.viewmodel.CalendarViewModel
import com.konkuk.medicarecall.ui.common.component.WeeklyCalendar
import com.konkuk.medicarecall.ui.feature.homedetail.meal.component.MealDetailCard
import com.konkuk.medicarecall.ui.feature.homedetail.meal.viewmodel.MealUiState
import com.konkuk.medicarecall.ui.feature.homedetail.meal.viewmodel.MealViewModel
Expand All @@ -38,28 +36,27 @@ import java.time.LocalDate
fun MealDetailScreen(
elderId: Int,
onBack: () -> Unit,
calendarViewModel: CalendarViewModel = koinViewModel(),
mealViewModel: MealViewModel = koinViewModel(),
viewModel: MealViewModel = koinViewModel(),
) {
// 재진입 시 오늘로 초기화
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
calendarViewModel.resetToToday()
viewModel.resetToToday()
}
// 날짜만 Observe
val selectedDate by calendarViewModel.selectedDate.collectAsStateWithLifecycle()
val meals by mealViewModel.meals.collectAsStateWithLifecycle()
val selectedDate by viewModel.selectedDate.collectAsStateWithLifecycle()
val meals by viewModel.meals.collectAsStateWithLifecycle()

// 날짜/어르신 변경 시마다 로드
LaunchedEffect(elderId, selectedDate) {
mealViewModel.loadMealsForDate(elderId, selectedDate)
viewModel.loadMealsForDate(elderId, selectedDate)
}

MealDetailScreenLayout(
onBack = onBack,
selectedDate = selectedDate,
meals = meals,
weekDates = calendarViewModel.getCurrentWeekDates(),
onDateSelected = calendarViewModel::selectDate,
weekDates = viewModel.getCurrentWeekDates(),
onDateSelected = viewModel::selectDate,
onMonthClick = { /* 모달 열기 */ },
)
}
Expand Down Expand Up @@ -105,12 +102,8 @@ fun MealDetailScreenLayout(
Spacer(Modifier.height(12.dp))

WeeklyCalendar(
calendarUiState = CalendarUiState(
currentYear = selectedDate.year,
currentMonth = selectedDate.monthValue,
weekDates = weekDates,
selectedDate = selectedDate,
),
weekDates = weekDates,
selectedDate = selectedDate,
onDateSelected = onDateSelected,
)

Expand All @@ -133,6 +126,9 @@ fun MealDetailScreenLayout(
@Preview(name = "식사 - 기록 있음", showBackground = true)
@Composable
fun PreviewMealDetailScreenRecorded() {
val selectedDate = LocalDate.of(2025, 5, 7)
val weekDates = (0..6).map { selectedDate.plusDays(it.toLong()) }

val dummyMeals = listOf(
MealUiState(
mealTime = "아침",
Expand All @@ -153,9 +149,6 @@ fun PreviewMealDetailScreenRecorded() {
isEaten = true,
),
)
val selectedDate = LocalDate.of(2025, 5, 7)
val weekDates =
(0..6).map { selectedDate.plusDays(it.toLong() - selectedDate.dayOfWeek.value % 7) }

MediCareCallTheme {
MealDetailScreenLayout(
Expand All @@ -172,6 +165,10 @@ fun PreviewMealDetailScreenRecorded() {
@Preview(name = "식사 - 미기록 화면", showBackground = true)
@Composable
fun PreviewMealDetailScreenUnrecorded() {
val selectedDate = LocalDate.of(2025, 5, 7)
val weekDates =
(0..6).map { selectedDate.plusDays(it.toLong() - selectedDate.dayOfWeek.value % 7) }

val dummyMeals = listOf(
MealUiState(
mealTime = "아침",
Expand All @@ -192,9 +189,6 @@ fun PreviewMealDetailScreenUnrecorded() {
isEaten = null,
),
)
val selectedDate = LocalDate.of(2025, 5, 7)
val weekDates =
(0..6).map { selectedDate.plusDays(it.toLong() - selectedDate.dayOfWeek.value % 7) }

MediCareCallTheme {
MealDetailScreenLayout(
Expand Down
Loading
Loading