104 lines
4.0 KiB
Kotlin
104 lines
4.0 KiB
Kotlin
|
|
// src/main/kotlin/ui/ActiveTradeRow.kt
|
||
|
|
package ui
|
||
|
|
|
||
|
|
import androidx.compose.foundation.background
|
||
|
|
import androidx.compose.foundation.clickable
|
||
|
|
import androidx.compose.foundation.layout.*
|
||
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||
|
|
import androidx.compose.material.*
|
||
|
|
import androidx.compose.runtime.Composable
|
||
|
|
import androidx.compose.ui.Alignment
|
||
|
|
import androidx.compose.ui.Modifier
|
||
|
|
import androidx.compose.ui.graphics.Color
|
||
|
|
import androidx.compose.ui.text.font.FontWeight
|
||
|
|
import androidx.compose.ui.unit.dp
|
||
|
|
import androidx.compose.ui.unit.sp
|
||
|
|
import model.ActiveTradeItem
|
||
|
|
import model.ActiveTradeType
|
||
|
|
|
||
|
|
@Composable
|
||
|
|
fun ActiveTradeRow(
|
||
|
|
item: ActiveTradeItem,
|
||
|
|
onCancelClick: (String) -> Unit = {}, // 미체결 취소용
|
||
|
|
onClick: () -> Unit
|
||
|
|
) {
|
||
|
|
val isMonitoring = item.type == ActiveTradeType.MONITORING
|
||
|
|
|
||
|
|
// 상태에 따른 배경색 설정 (미체결은 연노랑으로 강조)
|
||
|
|
val backgroundColor = if (isMonitoring) Color.White else Color(0xFFFFF9C4)
|
||
|
|
val badgeColor = if (isMonitoring) Color(0xFF0E62CF) else Color(0xFFE03E2D)
|
||
|
|
|
||
|
|
Card(
|
||
|
|
modifier = Modifier
|
||
|
|
.fillMaxWidth()
|
||
|
|
.padding(vertical = 4.dp, horizontal = 2.dp)
|
||
|
|
.clickable { onClick() },
|
||
|
|
elevation = 2.dp,
|
||
|
|
shape = RoundedCornerShape(4.dp),
|
||
|
|
backgroundColor = backgroundColor
|
||
|
|
) {
|
||
|
|
Row(
|
||
|
|
modifier = Modifier.padding(12.dp),
|
||
|
|
verticalAlignment = Alignment.CenterVertically,
|
||
|
|
horizontalArrangement = Arrangement.SpaceBetween
|
||
|
|
) {
|
||
|
|
Column(modifier = Modifier.weight(1f)) {
|
||
|
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||
|
|
// 상태 배지 (자동감시 / 미체결)
|
||
|
|
Surface(
|
||
|
|
color = badgeColor,
|
||
|
|
shape = RoundedCornerShape(4.dp)
|
||
|
|
) {
|
||
|
|
Text(
|
||
|
|
text = if (isMonitoring) "자동감시" else "미체결",
|
||
|
|
color = Color.White,
|
||
|
|
fontSize = 10.sp,
|
||
|
|
modifier = Modifier.padding(horizontal = 4.dp, vertical = 2.dp)
|
||
|
|
)
|
||
|
|
}
|
||
|
|
Spacer(modifier = Modifier.width(6.dp))
|
||
|
|
Text(
|
||
|
|
text = item.name,
|
||
|
|
fontWeight = FontWeight.Bold,
|
||
|
|
fontSize = 14.sp,
|
||
|
|
maxLines = 1
|
||
|
|
)
|
||
|
|
}
|
||
|
|
Text(
|
||
|
|
text = "${item.code} | ${if (isMonitoring) "목표가" else "주문가"}: ${String.format("%,.0f", item.price)}",
|
||
|
|
fontSize = 11.sp,
|
||
|
|
color = Color.Gray
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 우측 액션 영역
|
||
|
|
Column(horizontalAlignment = Alignment.End) {
|
||
|
|
if (!isMonitoring) {
|
||
|
|
// 미체결인 경우 취소 버튼 표시
|
||
|
|
Button(
|
||
|
|
onClick = { onCancelClick(item.id) },
|
||
|
|
contentPadding = PaddingValues(horizontal = 8.dp),
|
||
|
|
modifier = Modifier.height(28.dp),
|
||
|
|
colors = ButtonDefaults.buttonColors(backgroundColor = Color.LightGray)
|
||
|
|
) {
|
||
|
|
Text("취소", fontSize = 11.sp)
|
||
|
|
}
|
||
|
|
Text(
|
||
|
|
text = "${item.quantity}주",
|
||
|
|
fontSize = 12.sp,
|
||
|
|
fontWeight = FontWeight.Bold,
|
||
|
|
color = Color(0xFFE03E2D)
|
||
|
|
)
|
||
|
|
} else {
|
||
|
|
// 자동감시 중인 경우 상태 텍스트 표시
|
||
|
|
Text(
|
||
|
|
text = "감시중",
|
||
|
|
fontSize = 12.sp,
|
||
|
|
color = badgeColor,
|
||
|
|
fontWeight = FontWeight.Medium
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|