diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 186a709ce..3ad918b98 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -34,7 +34,7 @@ struct ChatPreviewView: View { HStack(alignment: .top) { chatPreviewTitle() Spacer() - (cItem?.timestampText ?? formatTimestampText(chat.chatInfo.updatedAt)) + (cItem?.timestampText ?? formatTimestampText(chat.chatInfo.chatTs)) .font(.subheadline) .frame(minWidth: 60, alignment: .trailing) .foregroundColor(.secondary) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index ff61a51d3..198a777f8 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1367,6 +1367,17 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat { } } + public var chatTs: Date { + switch self { + case let .direct(contact): return contact.chatTs ?? contact.updatedAt + case let .group(groupInfo): return groupInfo.chatTs ?? groupInfo.updatedAt + case let .local(noteFolder): return noteFolder.chatTs + case let .contactRequest(contactRequest): return contactRequest.updatedAt + case let .contactConnection(contactConnection): return contactConnection.updatedAt + case .invalidJSON: return .now + } + } + public struct SampleData { public var direct: ChatInfo public var group: ChatInfo @@ -1425,6 +1436,7 @@ public struct Contact: Identifiable, Decodable, NamedChat { public var mergedPreferences: ContactUserPreferences var createdAt: Date var updatedAt: Date + var chatTs: Date? var contactGroupMemberId: Int64? var contactGrpInvSent: Bool @@ -1744,6 +1756,7 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat { public var chatSettings: ChatSettings var createdAt: Date var updatedAt: Date + var chatTs: Date? public var id: ChatId { get { "#\(groupId)" } } public var apiId: Int64 { get { groupId } } @@ -2049,6 +2062,7 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat { public var unread: Bool var createdAt: Date public var updatedAt: Date + var chatTs: Date public var id: ChatId { get { "*\(noteFolderId)" } } public var apiId: Int64 { get { noteFolderId } } @@ -2070,7 +2084,8 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat { favorite: false, unread: false, createdAt: .now, - updatedAt: .now + updatedAt: .now, + chatTs: .now ) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index d44c80e92..b68d098f9 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -969,6 +969,16 @@ sealed class ChatInfo: SomeChat, NamedChat { is Group -> groupInfo.chatSettings else -> null } + + val chatTs: Instant + get() = when(this) { + is Direct -> contact.chatTs ?: contact.updatedAt + is Group -> groupInfo.chatTs ?: groupInfo.updatedAt + is Local -> noteFolder.chatTs + is ContactRequest -> contactRequest.updatedAt + is ContactConnection -> contactConnection.updatedAt + is InvalidJSON -> updatedAt + } } @Serializable @@ -1009,6 +1019,7 @@ data class Contact( val mergedPreferences: ContactUserPreferences, override val createdAt: Instant, override val updatedAt: Instant, + val chatTs: Instant?, val contactGroupMemberId: Long? = null, val contactGrpInvSent: Boolean ): SomeChat, NamedChat { @@ -1077,6 +1088,7 @@ data class Contact( mergedPreferences = ContactUserPreferences.sampleData, createdAt = Clock.System.now(), updatedAt = Clock.System.now(), + chatTs = Clock.System.now(), contactGrpInvSent = false ) } @@ -1204,7 +1216,8 @@ data class GroupInfo ( val hostConnCustomUserProfileId: Long? = null, val chatSettings: ChatSettings, override val createdAt: Instant, - override val updatedAt: Instant + override val updatedAt: Instant, + val chatTs: Instant? ): SomeChat, NamedChat { override val chatType get() = ChatType.Group override val id get() = "#$groupId" @@ -1245,7 +1258,8 @@ data class GroupInfo ( hostConnCustomUserProfileId = null, chatSettings = ChatSettings(enableNtfs = MsgFilter.All, sendRcpts = null, favorite = false), createdAt = Clock.System.now(), - updatedAt = Clock.System.now() + updatedAt = Clock.System.now(), + chatTs = Clock.System.now() ) } } @@ -1507,7 +1521,8 @@ class NoteFolder( val favorite: Boolean, val unread: Boolean, override val createdAt: Instant, - override val updatedAt: Instant + override val updatedAt: Instant, + val chatTs: Instant ): SomeChat, NamedChat { override val chatType get() = ChatType.Local override val id get() = "*$noteFolderId" @@ -1530,7 +1545,8 @@ class NoteFolder( favorite = false, unread = false, createdAt = Clock.System.now(), - updatedAt = Clock.System.now() + updatedAt = Clock.System.now(), + chatTs = Clock.System.now() ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt index 08e95f391..e17ae6ea7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt @@ -286,7 +286,7 @@ fun ChatPreviewView( Box( contentAlignment = Alignment.TopEnd ) { - val ts = chat.chatItems.lastOrNull()?.timestampText ?: getTimestampText(chat.chatInfo.updatedAt) + val ts = chat.chatItems.lastOrNull()?.timestampText ?: getTimestampText(chat.chatInfo.chatTs) Text( ts, color = MaterialTheme.colors.secondary,