Skip to content

Commit

Permalink
Merge pull request #352 from apeun-gidaechi/feature/351-fix-chat-deta…
Browse files Browse the repository at this point in the history
…il-date-issue

Fix/Chat Detail Issue
  • Loading branch information
8954sood authored Nov 5, 2024
2 parents 7f5d16d + 2c950d8 commit e89604e
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@ import com.seugi.network.meal.response.MealResponse
import com.seugi.network.message.response.MessageRoomEventResponse
import com.seugi.network.notification.response.NotificationResponse
import com.seugi.network.timetable.response.TimetableResponse
import java.time.LocalDate
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.datetime.toKotlinLocalDate

internal fun MessageRoomEventResponse.toEventModel(userId: Long): MessageRoomEvent = when (this) {
is MessageRoomEventResponse.MessageParent.Message -> toModel(userId)
Expand All @@ -35,7 +33,6 @@ internal fun MessageRoomEventResponse.MessageParent.Message.toModel(userId: Long
val botData = message.toResponse<MessageBotRawKeywordInData<List<MealResponse>>>()
val response = botData.data
.toModels()
.filter { it.mealDate == LocalDate.now().toKotlinLocalDate() }
.toImmutableList()

val breakfast = response.firstOrNull { it.mealType == MealType.BREAKFAST }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ sealed class MessageRoomEvent(
val messageStatus: String,
val uuid: String?,
val emoticon: String?,
val eventList: ImmutableList<Int>?,
val eventList: ImmutableList<Long>?,
val emojiList: ImmutableList<MessageEmojiModel>,
val mention: ImmutableList<Int>,
val mention: ImmutableList<Long>,
val mentionAll: Boolean,
override val timestamp: LocalDateTime,
) : MessageParent(timestamp, type, userId)
Expand All @@ -44,9 +44,9 @@ sealed class MessageRoomEvent(
val messageStatus: String,
val uuid: String?,
val emoticon: String?,
val eventList: ImmutableList<Int>?,
val eventList: ImmutableList<Long>?,
val emojiList: ImmutableList<MessageEmojiModel>,
val mention: ImmutableList<Int>,
val mention: ImmutableList<Long>,
val mentionAll: Boolean,
override val timestamp: LocalDateTime,
) : MessageParent(timestamp, type, userId)
Expand All @@ -60,9 +60,9 @@ sealed class MessageRoomEvent(
@Transient override val userId: Long,
@Transient open val messageStatus: String,
@Transient open val emoticon: String?,
@Transient open val eventList: ImmutableList<Int>?,
@Transient open val eventList: ImmutableList<Long>?,
@Transient open val emojiList: ImmutableList<MessageEmojiModel>,
@Transient open val mention: ImmutableList<Int>,
@Transient open val mention: ImmutableList<Long>,
@Transient open val mentionAll: Boolean,
@Transient override val timestamp: LocalDateTime,
) : MessageParent(timestamp, type, userId) {
Expand All @@ -72,13 +72,13 @@ sealed class MessageRoomEvent(
val visibleMessage: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -90,13 +90,13 @@ sealed class MessageRoomEvent(
val visibleMessage: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -108,13 +108,13 @@ sealed class MessageRoomEvent(
val visibleMessage: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -126,13 +126,13 @@ sealed class MessageRoomEvent(
val visibleMessage: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -144,13 +144,13 @@ sealed class MessageRoomEvent(
val visibleMessage: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -161,13 +161,13 @@ sealed class MessageRoomEvent(
val message: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand All @@ -178,13 +178,13 @@ sealed class MessageRoomEvent(
val message: String,
override val messageStatus: String,
override val emoticon: String?,
override val eventList: ImmutableList<Int>?,
override val eventList: ImmutableList<Long>?,
override val id: String,
override val emojiList: ImmutableList<MessageEmojiModel>,
override val chatRoomId: String,
override val timestamp: LocalDateTime,
override val userId: Long,
override val mention: ImmutableList<Int>,
override val mention: ImmutableList<Long>,
override val mentionAll: Boolean,
override val isFirst: Boolean,
override val isLast: Boolean,
Expand Down Expand Up @@ -215,15 +215,15 @@ sealed class MessageRoomEvent(
override val userId: Long,
override val timestamp: LocalDateTime,
val roomId: String,
val eventList: ImmutableList<Int>,
val eventList: ImmutableList<Long>,
) : MessageParent(timestamp, type, userId)

data class Left(
override val type: MessageType,
override val userId: Long,
override val timestamp: LocalDateTime,
val roomId: String,
val eventList: ImmutableList<Int>,
val eventList: ImmutableList<Long>,
) : MessageParent(timestamp, type, userId)

data class Date(
Expand Down Expand Up @@ -260,21 +260,21 @@ sealed class MessageRoomEvent(
override val type: MessageType,
override val userId: Long,
val messageId: String,
val emojiId: Int,
val emojiId: Long,
) : MessageRoomEvent(type, userId)

data class RemoveEmoji(
override val type: MessageType,
override val userId: Long,
val messageId: String,
val emojiId: Int,
val emojiId: Long,
) : MessageRoomEvent(type, userId)

data class TransperAdmin(
override val type: MessageType,
override val userId: Long,
val roomId: String,
val eventList: ImmutableList<Int>,
val eventList: ImmutableList<Long>,
) : MessageRoomEvent(type, userId)
}

Expand All @@ -287,9 +287,9 @@ fun MessageRoomEvent.MessageParent.BOT.copy(
userId: Long = this.userId,
messageStatus: String = this.messageStatus,
emoticon: String? = this.emoticon,
eventList: ImmutableList<Int>? = this.eventList,
eventList: ImmutableList<Long>? = this.eventList,
emojiList: ImmutableList<MessageEmojiModel> = this.emojiList,
mention: ImmutableList<Int> = this.mention,
mention: ImmutableList<Long> = this.mention,
mentionAll: Boolean = this.mentionAll,
timestamp: LocalDateTime = this.timestamp,
): MessageRoomEvent.MessageParent.BOT = when (this) {
Expand Down Expand Up @@ -480,7 +480,7 @@ fun MessageRoomEvent.MessageParent.BOT.DrawLots.getVisibleMessage(members: List<
val results = regex.findAll(this.message)

val numbers = results.mapNotNull { result ->
result.groupValues[1].toIntOrNull()
result.groupValues[1].toLongOrNull()
}.toList()

val visibleMessage = "사람을 ${numbers.size}명 뽑았어요\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import com.seugi.designsystem.component.GradientPrimary
import com.seugi.designsystem.component.SeugiAvatar
import com.seugi.designsystem.component.modifier.DropShadowType
import com.seugi.designsystem.component.modifier.dropShadow
import com.seugi.designsystem.component.modifier.`if`
import com.seugi.designsystem.theme.SeugiTheme

val CHAT_SHAPE = 8.dp
Expand Down Expand Up @@ -661,6 +662,9 @@ private fun SeugiChatItemFile(modifier: Modifier = Modifier, onClick: () -> Unit
val screenWidth = LocalConfiguration.current.screenWidthDp.dp * 0.8f
Row(
modifier = modifier
.`if`(!isMe) {
padding(start = 32.dp)
}
.padding(horizontal = 8.dp)
.widthIn(
min = min(screenWidth, 128.dp),
Expand Down Expand Up @@ -887,7 +891,11 @@ fun SeugiChatItemImage(modifier: Modifier = Modifier, isMe: Boolean, onClick: ()
val screenWidth = configuration.screenWidthDp.dp * 0.8f
val screenHeight = (configuration.screenHeightDp.dp - topBarHeight - bottomTextFieldHeight) * 0.8f
Row(
modifier = Modifier.fillMaxWidth(),
modifier = Modifier
.fillMaxWidth()
.`if`(!isMe) {
padding(start = 32.dp)
},
horizontalArrangement = if (isMe) Arrangement.End else Arrangement.Start,
verticalAlignment = Alignment.Bottom,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ internal fun ChatDetailScreen(
}

LifecycleStartEffect(key1 = Unit) {
viewModel.collectStompLifecycle(userId)
viewModel.collectStompLifecycle(chatRoomId, userId)
viewModel.channelReconnect(userId, chatRoomId)
onStopOrDispose {
viewModel.subscribeCancel()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ class ChatDetailViewModel @Inject constructor(
}
}

fun collectStompLifecycle(userId: Long) {
fun collectStompLifecycle(chatRoomId: String, userId: Long) {
viewModelScope.launch {
val job = viewModelScope.async {
messageRepository.collectStompLifecycle().collect {
Expand All @@ -297,10 +297,27 @@ class ChatDetailViewModel @Inject constructor(
tokenRepository.newToken().collect {
when (it) {
is Result.Success -> {
// TODO 페이징 처리
// messageRepository.getMessage(state.value.roomInfo?.id ?: "665d9ec15e65717b19a62701", 0, PAGE_SIZE).collect {
// it.collectMessage()
// }
messageRepository.getMessage(
chatRoomId = chatRoomId,
userId = userId,
timestamp = LocalDateTime.now().toKotlinLocalDateTime(),
).collect {
when (it) {
is Result.Success -> {
_state.update { uiState ->
uiState.copy(
isInit = true,
isLastPage = it.data.messages.size != 30,
)
}
it.data.messages.collectMessage()
}
Result.Loading -> {}
is Result.Error -> {
it.throwable.printStackTrace()
}
}
}
channelReconnect(userId)
}
else -> {}
Expand Down Expand Up @@ -592,23 +609,20 @@ class ChatDetailViewModel @Inject constructor(

val remoteFirstItem = data.first()
val lastItem = message.lastOrNull()
if (lastItem is MessageParent.Date) {
// 날짜가 같다면 삭제
if (remoteFirstItem.timestamp.isDifferentDay(lastItem.timestamp).not()) {
message.removeLast()
}

// 날짜가 같다면 삭제
if (lastItem is MessageParent.Date && remoteFirstItem.timestamp.isDifferentDay(lastItem.timestamp).not()) {
message.removeLast()
}

// 최상단에 있는 채팅 isFirst 놔둬야 할지 비교
if (lastItem is MessageParent.Other && lastItem.isFirst) {
if (remoteFirstItem.userId == lastItem.userId) {
message.removeLast()
message.add(
lastItem.copy(
isFirst = false,
),
)
}
if (lastItem is MessageParent.Other && lastItem.isFirst && remoteFirstItem.userId == lastItem.userId) {
message.removeLast()
message.add(
lastItem.copy(
isFirst = false,
),
)
}

data.forEachIndexed { index, messageParent ->
Expand All @@ -623,21 +637,13 @@ class ChatDetailViewModel @Inject constructor(

if (formerItem != null && messageParent.timestamp.isDifferentDay(formerItem.timestamp)) {
isFirst = true
message.add(
element = MessageParent.Date(
type = MessageType.MESSAGE,
timestamp = LocalDateTime.of(messageParent.timestamp.year, messageParent.timestamp.monthValue, messageParent.timestamp.dayOfMonth, 0, 0),
userId = 0,
text = "",
),
)
}

if (formerItem is MessageParent.Enter || formerItem is MessageParent.Left) {
isFirst = true
}

var newData = when (messageParent) {
val newData = when (messageParent) {
is MessageParent.Me -> messageParent.copy(
isLast = isLast,
)
Expand Down Expand Up @@ -669,7 +675,19 @@ class ChatDetailViewModel @Inject constructor(
}
else -> messageParent
}

message.add(newData)

if (formerItem != null && messageParent.timestamp.isDifferentDay(formerItem.timestamp)) {
message.add(
element = MessageParent.Date(
type = MessageType.MESSAGE,
timestamp = LocalDateTime.of(messageParent.timestamp.year, messageParent.timestamp.monthValue, messageParent.timestamp.dayOfMonth, 0, 0),
userId = 0,
text = "",
),
)
}
}

_state.update {
Expand Down
Loading

0 comments on commit e89604e

Please sign in to comment.