Заготовка
This commit is contained in:
@@ -2,6 +2,8 @@ package chats.domain.model
|
||||
|
||||
import androidx.compose.runtime.Immutable
|
||||
|
||||
import chats.domain.model.MessageStatus
|
||||
|
||||
@Immutable
|
||||
data class Message(
|
||||
val id: String,
|
||||
@@ -19,7 +21,8 @@ data class Message(
|
||||
val isPinned: Boolean = false,
|
||||
val isForwarded: Boolean = false,
|
||||
val forwardedFromName: String? = null,
|
||||
val replyTo: Message? = null
|
||||
val replyTo: Message? = null,
|
||||
val status: MessageStatus = MessageStatus.SENT // Новое поле для офлайн-статуса
|
||||
)
|
||||
|
||||
@Immutable
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package chats.domain.model
|
||||
|
||||
/**
|
||||
* Статусы сообщения для отображения в UI и синхронизации
|
||||
*/
|
||||
enum class MessageStatus {
|
||||
/** Сообщение создано локально, ожидает отправки */
|
||||
PENDING,
|
||||
|
||||
/** Начата отправка на сервер */
|
||||
SENDING,
|
||||
|
||||
/** Сообщение успешно отправлено на сервер */
|
||||
SENT,
|
||||
|
||||
/** Сообщение доставлено получателю */
|
||||
DELIVERED,
|
||||
|
||||
/** Сообщение прочитано получателем */
|
||||
READ,
|
||||
|
||||
/** Ошибка отправки */
|
||||
FAILED,
|
||||
|
||||
/** Удалено локально */
|
||||
DELETED,
|
||||
|
||||
/** Неизвестный статус */
|
||||
UNKNOWN
|
||||
}
|
||||
@@ -3,10 +3,19 @@ package chats.domain.repository
|
||||
import chats.domain.model.Chat
|
||||
import chats.domain.model.Message
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface ChatRepository {
|
||||
// Чаты
|
||||
fun getChatsFlow(): Flow<List<Chat>>
|
||||
suspend fun getChats(): List<Chat>
|
||||
fun getMessagesFlow(chatId: String): kotlinx.coroutines.flow.Flow<List<Message>>
|
||||
suspend fun syncChats()
|
||||
|
||||
// Сообщения - Single Source of Truth через Flow
|
||||
fun getMessagesFlow(chatId: String): Flow<List<Message>>
|
||||
suspend fun getMessages(chatId: String, cursor: String? = null, pivot: Long? = null, limit: Int? = null): List<Message>
|
||||
|
||||
// Отправка сообщений с поддержкой офлайн
|
||||
suspend fun sendMessage(
|
||||
chatId: String,
|
||||
content: String?,
|
||||
@@ -15,15 +24,27 @@ interface ChatRepository {
|
||||
replyToId: String? = null,
|
||||
forwardedFromId: String? = null
|
||||
): Message
|
||||
|
||||
suspend fun retryFailedMessage(localId: String)
|
||||
suspend fun syncMessagesForChat(chatId: String)
|
||||
suspend fun schedulePeriodicSync()
|
||||
|
||||
// Реакции
|
||||
suspend fun addReaction(messageId: String, emoji: String)
|
||||
suspend fun sendTypingStatus(chatId: String)
|
||||
suspend fun markMessagesAsRead(chatId: String, lastMessageId: String, lastReadSequenceId: Int)
|
||||
|
||||
// Локальное хранение
|
||||
suspend fun saveMessage(message: Message)
|
||||
suspend fun deleteLocalMessage(messageId: String)
|
||||
|
||||
// Медиа
|
||||
suspend fun uploadMedia(file: java.io.File): String
|
||||
suspend fun getTrendingGifs(page: Int = 0): List<chats.data.remote.api.KlipyGifDto>
|
||||
suspend fun searchGifs(query: String, page: Int = 0): List<chats.data.remote.api.KlipyGifDto>
|
||||
suspend fun getGifCategories(): List<chats.data.remote.api.GifCategoryDto>
|
||||
|
||||
// Управление чатами
|
||||
suspend fun createPersonalChat(userId: String): Chat
|
||||
suspend fun deleteMessage(messageId: String, forEveryone: Boolean)
|
||||
suspend fun editMessage(messageId: String, content: String): Message
|
||||
|
||||
Reference in New Issue
Block a user