Fix tab switching in CatheterizeSheet + camera launch timing
CatheterizeSheet: - Replace OutlinedButton with filled Button for tab selection - Selected tab: filled color, unselected: 10% opacity background - Tabs now reliably switch between 수기/음성/카메라 - Camera tab directly calls onCameraRequested + onDismiss PiezoMonitoringView: - Fix camera launch: use pendingCamera + LaunchedEffect to ensure ModalBottomSheet fully closes before camera opens - Prevents state race condition between sheet dismiss and camera show Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+38
-21
@@ -124,27 +124,44 @@ fun CatheterizeSheet(
|
|||||||
|
|
||||||
// 3 탭 버튼
|
// 3 탭 버튼
|
||||||
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
listOf(
|
// 수기
|
||||||
Triple("수기", Icons.Default.Edit, Color(0xFFFF9800)),
|
Button(
|
||||||
Triple("음성", Icons.Default.SettingsVoice, Color(0xFF007AFF)),
|
onClick = { selectedTab = 0 },
|
||||||
Triple("카메라", Icons.Default.CameraAlt, Color(0xFF4CAF50))
|
modifier = Modifier.weight(1f).height(64.dp),
|
||||||
).forEachIndexed { idx, (label, icon, color) ->
|
shape = RoundedCornerShape(12.dp),
|
||||||
val isSelected = selectedTab == idx
|
colors = ButtonDefaults.buttonColors(
|
||||||
OutlinedButton(
|
containerColor = if (selectedTab == 0) Color(0xFFFF9800) else Color(0xFFFF9800).copy(alpha = 0.1f)
|
||||||
onClick = {
|
)
|
||||||
selectedTab = idx
|
) {
|
||||||
if (idx == 2) { onCameraRequested(); onDismiss() }
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
},
|
Icon(Icons.Default.Edit, null, Modifier.size(20.dp), tint = if (selectedTab == 0) Color.White else Color(0xFFFF9800))
|
||||||
modifier = Modifier.weight(1f).height(64.dp),
|
Text("수기", fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = if (selectedTab == 0) Color.White else Color(0xFFFF9800))
|
||||||
shape = RoundedCornerShape(12.dp),
|
}
|
||||||
colors = ButtonDefaults.outlinedButtonColors(
|
}
|
||||||
containerColor = if (isSelected) color.copy(alpha = 0.1f) else Color.Transparent
|
// 음성
|
||||||
)
|
Button(
|
||||||
) {
|
onClick = { selectedTab = 1 },
|
||||||
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
modifier = Modifier.weight(1f).height(64.dp),
|
||||||
Icon(icon, null, tint = color, modifier = Modifier.size(20.dp))
|
shape = RoundedCornerShape(12.dp),
|
||||||
Text(label, fontSize = 11.sp, color = color, fontWeight = FontWeight.SemiBold)
|
colors = ButtonDefaults.buttonColors(
|
||||||
}
|
containerColor = if (selectedTab == 1) Color(0xFF007AFF) else Color(0xFF007AFF).copy(alpha = 0.1f)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Icon(Icons.Default.SettingsVoice, null, Modifier.size(20.dp), tint = if (selectedTab == 1) Color.White else Color(0xFF007AFF))
|
||||||
|
Text("음성", fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = if (selectedTab == 1) Color.White else Color(0xFF007AFF))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 카메라
|
||||||
|
Button(
|
||||||
|
onClick = { onCameraRequested(); onDismiss() },
|
||||||
|
modifier = Modifier.weight(1f).height(64.dp),
|
||||||
|
shape = RoundedCornerShape(12.dp),
|
||||||
|
colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF4CAF50).copy(alpha = 0.1f))
|
||||||
|
) {
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Icon(Icons.Default.CameraAlt, null, Modifier.size(20.dp), tint = Color(0xFF4CAF50))
|
||||||
|
Text("카메라", fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = Color(0xFF4CAF50))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-1
@@ -132,13 +132,22 @@ fun PiezoMonitoringView(appState: AppState) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 카메라 요청 대기 상태
|
||||||
|
var pendingCamera by remember { mutableStateOf(false) }
|
||||||
|
LaunchedEffect(pendingCamera) {
|
||||||
|
if (pendingCamera) {
|
||||||
|
pendingCamera = false
|
||||||
|
showUrineCamera = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 배뇨 기록 시트 (수기/음성/카메라)
|
// 배뇨 기록 시트 (수기/음성/카메라)
|
||||||
if (showCatheterizeSheet) {
|
if (showCatheterizeSheet) {
|
||||||
CatheterizeSheet(
|
CatheterizeSheet(
|
||||||
onDismiss = { showCatheterizeSheet = false },
|
onDismiss = { showCatheterizeSheet = false },
|
||||||
onCameraRequested = {
|
onCameraRequested = {
|
||||||
showCatheterizeSheet = false
|
showCatheterizeSheet = false
|
||||||
showUrineCamera = true
|
pendingCamera = true
|
||||||
},
|
},
|
||||||
onCatheterized = {
|
onCatheterized = {
|
||||||
appState.resetLevel()
|
appState.resetLevel()
|
||||||
|
|||||||
Reference in New Issue
Block a user