diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index 2b2ad6c860..e3ee2d55f1 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -314,8 +314,8 @@ open class ChatController(private val ctrl: ChatCtrl, val ntfManager: NtfManager throw Error("failed getting the list of chats: ${r.responseType} ${r.details}") } - suspend fun apiGetChat(type: ChatType, id: Long): Chat? { - val r = sendCmd(CC.ApiGetChat(type, id)) + suspend fun apiGetChat(type: ChatType, id: Long, pagination: ChatPagination = ChatPagination.Last(100)): Chat? { + val r = sendCmd(CC.ApiGetChat(type, id, pagination)) if (r is CR.ApiChat ) return r.chat Log.e(TAG, "apiGetChat bad response: ${r.responseType} ${r.details}") return null @@ -1104,7 +1104,7 @@ sealed class CC { class ApiImportArchive(val config: ArchiveConfig): CC() class ApiDeleteStorage: CC() class ApiGetChats: CC() - class ApiGetChat(val type: ChatType, val id: Long): CC() + class ApiGetChat(val type: ChatType, val id: Long, val pagination: ChatPagination): CC() class ApiSendMessage(val type: ChatType, val id: Long, val file: String?, val quotedItemId: Long?, val mc: MsgContent): CC() class ApiUpdateChatItem(val type: ChatType, val id: Long, val itemId: Long, val mc: MsgContent): CC() class ApiDeleteChatItem(val type: ChatType, val id: Long, val itemId: Long, val mode: CIDeleteMode): CC() @@ -1155,7 +1155,7 @@ sealed class CC { is ApiImportArchive -> "/_db import ${json.encodeToString(config)}" is ApiDeleteStorage -> "/_db delete" is ApiGetChats -> "/_get chats pcc=on" - is ApiGetChat -> "/_get chat ${chatRef(type, id)} count=100" + is ApiGetChat -> "/_get chat ${chatRef(type, id)} ${pagination.cmdString}" is ApiSendMessage -> "/_send ${chatRef(type, id)} json ${json.encodeToString(ComposedMessage(file, quotedItemId, mc))}" is ApiUpdateChatItem -> "/_update item ${chatRef(type, id)} $itemId ${mc.cmdString}" is ApiDeleteChatItem -> "/_delete item ${chatRef(type, id)} $itemId ${mode.deleteMode}" @@ -1255,6 +1255,18 @@ sealed class CC { } } +sealed class ChatPagination { + class Last(val count: Int): ChatPagination() + class After(val chatItemId: Long, val count: Int): ChatPagination() + class Before(val chatItemId: Long, val count: Int): ChatPagination() + + val cmdString: String get() = when (this) { + is Last -> "count=${this.count}" + is After -> "after=${this.chatItemId} count=${this.count}" + is Before -> "before=${this.chatItemId} count=${this.count}" + } +} + @Serializable class ComposedMessage(val filePath: String?, val quotedItemId: Long?, val msgContent: MsgContent) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 2e68bb148f..75320f91ca 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -185,8 +185,8 @@ func apiGetChats() throws -> [ChatData] { throw r } -func apiGetChat(type: ChatType, id: Int64) throws -> Chat { - let r = chatSendCmdSync(.apiGetChat(type: type, id: id)) +func apiGetChat(type: ChatType, id: Int64, pagination: ChatPagination = .last(count: 100)) throws -> Chat { + let r = chatSendCmdSync(.apiGetChat(type: type, id: id, pagination: pagination)) if case let .apiChat(chat) = r { return Chat.init(chat) } throw r } diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index b0c6f9c51b..77c2a476b1 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -24,7 +24,7 @@ public enum ChatCommand { case apiImportArchive(config: ArchiveConfig) case apiDeleteStorage case apiGetChats - case apiGetChat(type: ChatType, id: Int64) + case apiGetChat(type: ChatType, id: Int64, pagination: ChatPagination) case apiSendMessage(type: ChatType, id: Int64, file: String?, quotedItemId: Int64?, msg: MsgContent) case apiUpdateChatItem(type: ChatType, id: Int64, itemId: Int64, msg: MsgContent) case apiDeleteChatItem(type: ChatType, id: Int64, itemId: Int64, mode: CIDeleteMode) @@ -85,7 +85,7 @@ public enum ChatCommand { case let .apiImportArchive(cfg): return "/_db import \(encodeJSON(cfg))" case .apiDeleteStorage: return "/_db delete" case .apiGetChats: return "/_get chats pcc=on" - case let .apiGetChat(type, id): return "/_get chat \(ref(type, id)) count=100" + case let .apiGetChat(type, id, pagination): return "/_get chat \(ref(type, id)) \(pagination.cmdString)" case let .apiSendMessage(type, id, file, quotedItemId, mc): let msg = encodeJSON(ComposedMessage(filePath: file, quotedItemId: quotedItemId, msgContent: mc)) return "/_send \(ref(type, id)) json \(msg)" @@ -484,6 +484,20 @@ public enum ChatResponse: Decodable, Error { private var noDetails: String { get { "\(responseType): no details" } } } +public enum ChatPagination { + case last(count: Int) + case after(chatItemId: Int64, count: Int) + case before(chatItemId: Int64, count: Int) + + var cmdString: String { + switch self { + case let .last(count): return "count=\(count)" + case let .after(chatItemId, count): return "after=\(chatItemId) count=\(count)" + case let .before(chatItemId, count): return "before=\(chatItemId) count=\(count)" + } + } +} + struct ComposedMessage: Encodable { var filePath: String? var quotedItemId: Int64?