core, tests, ui: keep member order with role index, skip down-migration schema comparison, reload support list on return with older remote hosts

This commit is contained in:
Narasimha-sc
2026-09-30 15:38:14 +00:00
parent 1c0a4b47a3
commit cebc33cb8a
19 changed files with 127 additions and 141 deletions
+8 -16
View File
@@ -424,7 +424,6 @@ final class ChatModel: ObservableObject {
@Published var groupMembers: [GMember] = []
@Published var groupMembersIndexes: Dictionary<Int64, Int> = [:] // groupMemberId to index in groupMembers list
@Published var membersLoaded = false
var membersLoadedGroupId: Int64?
// Runtime-only relay hostnames for pre-join channel display, not persisted — lost on app restart.
// APIConnectPreparedGroup re-fetches fresh relays at connect time, so stale data doesn't affect join.
@Published var channelRelayHostnames: [Int64: [String]] = [:]
@@ -578,12 +577,9 @@ final class ChatModel: ObservableObject {
let groupMembers = await apiListMembers(groupInfo.groupId)
await MainActor.run {
if chatId == groupInfo.id {
if let groupMembers {
self.groupMembers = groupMembers.map { GMember.init($0) }
self.populateGroupMembersIndexes()
self.membersLoaded = true
self.membersLoadedGroupId = groupInfo.groupId
}
self.groupMembers = groupMembers.map { GMember.init($0) }
self.populateGroupMembersIndexes()
self.membersLoaded = true
updateView()
}
}
@@ -1331,15 +1327,11 @@ final class ChatModel: ObservableObject {
}
func upsertSupportChatMember(_ cInfo: ChatInfo) {
if case let .group(groupInfo, .memberSupport(member?)?) = cInfo, chatId == groupInfo.id {
var m = member
var supportChatAdded = false
if let current = getGroupMember(member.groupMemberId)?.wrapped {
supportChatAdded = current.supportChat == nil && member.supportChat != nil
m = current
m.supportChat = member.supportChat
m.memberProfile = member.memberProfile
}
if case let .group(groupInfo, .memberSupport(member?)?) = cInfo {
var m = getGroupMember(member.groupMemberId)?.wrapped ?? member
let supportChatAdded = m.supportChat == nil && member.supportChat != nil
m.supportChat = member.supportChat
m.memberProfile = member.memberProfile
_ = upsertGroupMember(groupInfo, m)
if supportChatAdded {
objectWillChange.send()
+4 -6
View File
@@ -592,10 +592,8 @@ private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async
} else {
r = await chatApiSendCmd(cmd, bgDelay: msgDelay)
if case let .result(.newChatItems(_, aChatItems)) = r {
await MainActor.run {
for aChatItem in aChatItems {
chatModel.upsertSupportChatMember(aChatItem.chatInfo)
}
if let last = aChatItems.last {
await MainActor.run { chatModel.upsertSupportChatMember(last.chatInfo) }
}
return aChatItems.map { $0.chatItem }
}
@@ -2062,10 +2060,10 @@ func apiLeaveGroup(_ groupId: Int64) async throws -> GroupInfo {
}
// use ChatModel's loadGroupMembers from views
func apiListMembers(_ groupId: Int64) async -> [GroupMember]? {
func apiListMembers(_ groupId: Int64) async -> [GroupMember] {
let r: APIResult<ChatResponse2> = await chatApiSendCmd(.apiListMembers(groupId: groupId))
if case let .result(.groupMembers(_, group)) = r { return group.members }
return nil
return []
}
func filterMembersToAdd(_ ms: [GMember]) -> [Contact] {