diff --git a/core/model/src/main/kotlin/com/bff/wespot/model/user/response/User.kt b/core/model/src/main/kotlin/com/bff/wespot/model/user/response/User.kt index b8ce838de..0051e68ac 100644 --- a/core/model/src/main/kotlin/com/bff/wespot/model/user/response/User.kt +++ b/core/model/src/main/kotlin/com/bff/wespot/model/user/response/User.kt @@ -12,6 +12,11 @@ data class User( fun toSchoolInfo() = "$schoolName ${grade}학년 ${classNumber}반" + fun toShortSchoolName(): String = + schoolName.replace("중학교", "중").replace("고등학교", "고") + + fun toUserInfoWithoutSchoolName() = "${grade}학년 ${classNumber}반 $name" + fun toDescription(): String { val schoolName = schoolName.replace("중학교", "중").replace("고등학교", "고") return "$schoolName ${grade}학년 ${classNumber}반 $name" diff --git a/designsystem/src/main/kotlin/com/bff/wespot/designsystem/component/list/WSMessageItem.kt b/designsystem/src/main/kotlin/com/bff/wespot/designsystem/component/list/WSMessageItem.kt index 938828e6a..81b4cc8a7 100644 --- a/designsystem/src/main/kotlin/com/bff/wespot/designsystem/component/list/WSMessageItem.kt +++ b/designsystem/src/main/kotlin/com/bff/wespot/designsystem/component/list/WSMessageItem.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.bff.wespot.designsystem.R import com.bff.wespot.designsystem.theme.Gray100 @@ -40,6 +41,7 @@ import com.bff.wespot.designsystem.util.OrientationPreviews fun WSMessageItem( date: String, wsMessageItemType: WSMessageItemType, + schoolName: String? = null, userInfo: String? = null, itemClick: () -> Unit, optionButtonClick: () -> Unit, @@ -61,6 +63,7 @@ fun WSMessageItem( userInfo = userInfo, date = date, wsMessageItemType = wsMessageItemType, + schoolName = schoolName, ) } } @@ -88,6 +91,7 @@ private fun WSLetterItemOptionButton( @Composable private fun WSLetterItemContent( + schoolName: String?, userInfo: String?, date: String, wsMessageItemType: WSMessageItemType, @@ -121,9 +125,13 @@ private fun WSLetterItemContent( Column(modifier = Modifier.padding(top = 2.dp)) { Text( - text = wsMessageItemType.letterStatusText(), + text = schoolName?.let { + wsMessageItemType.letterStatusText() + " $schoolName" + } ?: wsMessageItemType.letterStatusText(), color = Gray100, style = StaticTypeScale.Default.body9, + maxLines = 1, + overflow = TextOverflow.Ellipsis, ) userInfo?.let { @@ -131,6 +139,8 @@ private fun WSLetterItemContent( text = userInfo, color = Gray100, style = StaticTypeScale.Default.body9, + maxLines = 1, + overflow = TextOverflow.Ellipsis, ) } } @@ -158,7 +168,6 @@ private fun WSLetterItemContent( } sealed interface WSMessageItemType { - // TODO 송신/차단/신고된 메세지는 다른 이모지 사용 @Composable fun optionIcon(): ImageVector diff --git a/designsystem/src/main/res/drawable/closed_letter.png b/designsystem/src/main/res/drawable/closed_letter.png index c22b194f6..a0fe04bcf 100644 Binary files a/designsystem/src/main/res/drawable/closed_letter.png and b/designsystem/src/main/res/drawable/closed_letter.png differ diff --git a/designsystem/src/main/res/drawable/opened_letter.png b/designsystem/src/main/res/drawable/opened_letter.png index 9ce7d6fd6..5b36c4980 100644 Binary files a/designsystem/src/main/res/drawable/opened_letter.png and b/designsystem/src/main/res/drawable/opened_letter.png differ diff --git a/feature/message/src/main/kotlin/com/bff/wespot/message/screen/MessageStorageScreen.kt b/feature/message/src/main/kotlin/com/bff/wespot/message/screen/MessageStorageScreen.kt index cce7f855e..776022f71 100644 --- a/feature/message/src/main/kotlin/com/bff/wespot/message/screen/MessageStorageScreen.kt +++ b/feature/message/src/main/kotlin/com/bff/wespot/message/screen/MessageStorageScreen.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import androidx.compose.ui.zIndex import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems @@ -220,10 +221,11 @@ fun MessageStorageScreen( item?.let { WSMessageItem( userInfo = if (item.isBlocked.not() && item.isReported.not()) { - item.receiver.toDescription() + item.receiver.toUserInfoWithoutSchoolName() } else { null }, + schoolName = item.receiver.toShortSchoolName(), date = item.receivedAt?.toStringWithDotSeparator() ?: "", wsMessageItemType = when { item.isBlocked -> WSMessageItemType.BlockedMessage @@ -386,11 +388,17 @@ private fun MessageContentDialog( closeButtonClick: () -> Unit, ) { Dialog(onDismissRequest = { }) { - Box( - modifier = Modifier - .width(296.dp) - .heightIn(min = 376.dp, max = 424.dp), - ) { + Box(modifier = Modifier.width(296.dp)) { + Image( + modifier = Modifier + .align(Alignment.TopEnd) + .padding(top = 8.dp, end = 8.dp) + .clickable { closeButtonClick() } + .zIndex(1f), + painter = painterResource(id = R.drawable.close), + contentDescription = stringResource(id = R.string.close), + ) + Column( modifier = Modifier .clip(WeSpotThemeManager.shapes.extraLarge) @@ -400,32 +408,20 @@ private fun MessageContentDialog( color = Primary400, shape = WeSpotThemeManager.shapes.extraLarge, ) - .fillMaxSize() - .padding(horizontal = 24.dp, vertical = 20.dp), - verticalArrangement = Arrangement.spacedBy(20.dp), + .padding(start = 24.dp, end = 24.dp, bottom = 24.dp), + verticalArrangement = Arrangement.SpaceBetween, ) { - MessageDialogText("To.\n" + message.receiver) + Column { + MessageDialogText("To.\n" + message.receiver) - MessageDialogText(message.content, Modifier.weight(1f)) + MessageDialogText(message.content, isMessageContent = true) + } MessageDialogText( text = "From.\n" + message.sender, textAlign = TextAlign.End, ) } - - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp, end = 8.dp), - contentAlignment = Alignment.CenterEnd, - ) { - Image( - modifier = Modifier.clickable { closeButtonClick() }, - painter = painterResource(id = R.drawable.close), - contentDescription = stringResource(id = R.string.close), - ) - } } } } @@ -433,11 +429,16 @@ private fun MessageContentDialog( @Composable private fun MessageDialogText( text: String, - modifier: Modifier = Modifier, textAlign: TextAlign = TextAlign.Start, + isMessageContent: Boolean = false, ) { Text( - modifier = modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .padding(top = 20.dp) + .let { + if (isMessageContent) it.heightIn(min = 192.dp, max = 240.dp) else it + }, text = text, style = StaticTypeScale.Default.body4, color = WeSpotThemeManager.colors.txtTitleColor, diff --git a/feature/message/src/main/kotlin/com/bff/wespot/message/viewmodel/SendViewModel.kt b/feature/message/src/main/kotlin/com/bff/wespot/message/viewmodel/SendViewModel.kt index 32adc0f81..d8522ab92 100644 --- a/feature/message/src/main/kotlin/com/bff/wespot/message/viewmodel/SendViewModel.kt +++ b/feature/message/src/main/kotlin/com/bff/wespot/message/viewmodel/SendViewModel.kt @@ -154,12 +154,14 @@ class SendViewModel @Inject constructor( selectedUser = message.receiver, messageInput = message.content, isRandomName = message.isAnonymous, - sender = message.senderName, ) } - // 예약된 메세지 보낸이가 익명인 경우, 새로 프로필을 불러온다. + // 예약된 메세지 보낸이가 익명인 경우, 새로 프로필을 불러와 상태에 대입한다. if (message.isAnonymous) { + reduce { state.copy(randomName = message.senderName) } getProfile() + } else { + reduce { state.copy(sender = message.senderName) } } messageInput.value = message.content