Files
android-lchat/app/src/main/java/com/mattintech/lchat/viewmodel/ChatViewModel.kt

89 lines
2.7 KiB
Kotlin
Raw Normal View History

2025-07-03 20:21:11 -04:00
package com.mattintech.lchat.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.mattintech.lchat.data.Message
import com.mattintech.lchat.repository.ChatRepository
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import java.util.UUID
sealed class ChatState {
object Connected : ChatState()
object Disconnected : ChatState()
data class Error(val message: String) : ChatState()
}
class ChatViewModel(
private val chatRepository: ChatRepository
) : ViewModel() {
private val _state = MutableLiveData<ChatState>(ChatState.Connected)
val state: LiveData<ChatState> = _state
val messages: StateFlow<List<Message>> = chatRepository.messages
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = emptyList()
)
val connectionState = chatRepository.connectionState
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = ChatRepository.ConnectionState.Disconnected
)
val connectedUsers = chatRepository.connectedUsers
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = emptyList()
)
private var currentUserId: String = ""
private var currentUserName: String = ""
private var currentRoomName: String = ""
private var isHost: Boolean = false
fun initialize(roomName: String, userName: String, isHost: Boolean) {
this.currentRoomName = roomName
this.currentUserName = userName
this.isHost = isHost
this.currentUserId = UUID.randomUUID().toString()
// Setup message callback if needed for additional processing
chatRepository.setMessageCallback { userId, userName, content ->
// Can add additional message processing here if needed
}
}
fun sendMessage(content: String) {
if (content.isBlank()) return
viewModelScope.launch {
chatRepository.sendMessage(currentUserId, currentUserName, content)
}
}
fun getRoomInfo(): Triple<String, String, Boolean> {
return Triple(currentRoomName, currentUserName, isHost)
}
fun disconnect() {
viewModelScope.launch {
chatRepository.stop()
_state.value = ChatState.Disconnected
}
}
override fun onCleared() {
super.onCleared()
disconnect()
}
}