Отправка гиф
This commit is contained in:
@@ -65,6 +65,14 @@ class ChatDetailViewModel @Inject constructor(
|
||||
|
||||
fun setChatId(chatId: String) {
|
||||
currentChatId = chatId
|
||||
|
||||
// Ensure SignalR is connected
|
||||
val token = tokenManager.getToken()
|
||||
if (token != null) {
|
||||
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
|
||||
signalrClient.connect(baseUrl, token)
|
||||
}
|
||||
|
||||
loadChatInfo(chatId)
|
||||
loadMessages(chatId)
|
||||
observeSignalREvents()
|
||||
@@ -155,9 +163,17 @@ class ChatDetailViewModel @Inject constructor(
|
||||
|
||||
fun sendMessage(text: String) {
|
||||
val chatId = currentChatId ?: return
|
||||
if (text.isBlank()) return
|
||||
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
repository.sendMessage(chatId, text)
|
||||
val sentMessage = repository.sendMessage(chatId, text)
|
||||
// Optimistic update if not already there
|
||||
_state.update { s ->
|
||||
if (s.messages.none { it.id == sentMessage.id }) {
|
||||
s.copy(messages = s.messages + sentMessage)
|
||||
} else s
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
_state.update { it.copy(error = e.localizedMessage) }
|
||||
}
|
||||
@@ -239,8 +255,21 @@ class ChatDetailViewModel @Inject constructor(
|
||||
val chatId = currentChatId ?: return
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
repository.sendMessage(chatId, url)
|
||||
val attachment = chats.data.remote.api.AttachmentRequest(
|
||||
type = "image",
|
||||
url = url,
|
||||
fileName = "gif.gif",
|
||||
fileSize = 0
|
||||
)
|
||||
val sentMessage = repository.sendMessage(chatId, null, "image", listOf(attachment))
|
||||
|
||||
// Optimistic update
|
||||
_state.update { s ->
|
||||
if (s.messages.none { it.id == sentMessage.id }) {
|
||||
s.copy(messages = s.messages + sentMessage)
|
||||
} else s
|
||||
}
|
||||
|
||||
// Add to recent
|
||||
val allGifs = _state.value.trendingGifs + _state.value.searchedGifs + _state.value.recentGifs
|
||||
val selectedGif = allGifs.find { gif ->
|
||||
|
||||
@@ -142,13 +142,29 @@ fun MessageBubble(
|
||||
}
|
||||
}
|
||||
|
||||
// Media Content
|
||||
if (message.media.isNotEmpty()) {
|
||||
// GIF Content (Klipy)
|
||||
if (message.mediaType == MediaType.GIF) {
|
||||
AsyncImage(
|
||||
model = message.content,
|
||||
imageLoader = core.utils.CoilUtils.getGifImageLoader(context),
|
||||
contentDescription = null,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.heightIn(max = 300.dp)
|
||||
.clip(RoundedCornerShape(8.dp))
|
||||
.clickable { /* Handle click */ },
|
||||
contentScale = ContentScale.Crop
|
||||
)
|
||||
Spacer(modifier = Modifier.height(4.dp))
|
||||
}
|
||||
|
||||
// Media Content (Attachments)
|
||||
if (message.media.isNotEmpty() && message.mediaType != MediaType.GIF) {
|
||||
val mediaCount = message.media.size
|
||||
if (mediaCount == 1) {
|
||||
val mediaItem = message.media[0]
|
||||
when {
|
||||
mediaItem.type.startsWith("image") || message.mediaType == MediaType.IMAGE || mediaItem.type.startsWith("image") -> {
|
||||
mediaItem.type.startsWith("image") || message.mediaType == MediaType.IMAGE -> {
|
||||
AsyncImage(
|
||||
model = mediaItem.url,
|
||||
imageLoader = core.utils.CoilUtils.getGifImageLoader(context),
|
||||
@@ -218,7 +234,7 @@ fun MessageBubble(
|
||||
}
|
||||
|
||||
// Text Content
|
||||
if (!message.content.isNullOrBlank() && !isVoiceMessage) {
|
||||
if (!message.content.isNullOrBlank() && !isVoiceMessage && message.mediaType != MediaType.GIF) {
|
||||
Text(
|
||||
text = message.content,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
|
||||
Reference in New Issue
Block a user