Răsfoiți Sursa

Added extraction of messages from the MAM module for chats and small changes in views

Sergey 2 ani în urmă
părinte
comite
727e59a8fd

+ 2 - 2
Chat.xcodeproj/xcuserdata/sertrsv.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,12 +7,12 @@
 		<key>Chat (iOS).xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>0</integer>
+			<integer>1</integer>
 		</dict>
 		<key>Chat (macOS).xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>1</integer>
+			<integer>0</integer>
 		</dict>
 	</dict>
 </dict>

+ 1 - 0
Shared/Auth/LoginView.swift

@@ -17,6 +17,7 @@ struct LoginView: View {
                 .textFieldStyle(.roundedBorder)
             SecureField("Password", text: $viewModel.password)
                 .textFieldStyle(.roundedBorder)
+                .textContentType(.password)
             Button {
                 viewModel.didTouchLogIn { success in
                     if success {

+ 32 - 28
Shared/ContentView.swift

@@ -7,12 +7,6 @@
 
 import SwiftUI
 
-enum Tab: Int {
-    case contacts = 0
-    case rooms = 1
-    case settings = 2
-}
-
 struct ContentView: View {
     @ObservedObject var contactsViewModel: ChatListViewModel = ChatListViewModel()
     @ObservedObject var roomsViewModel: RoomsListViewModel = RoomsListViewModel()
@@ -23,41 +17,51 @@ struct ContentView: View {
     var body: some View {
         Group {
             if authStatus {
-                TabView(selection: $selectedTab) {
-                    NavigationView {
+                NavigationView {
+                    TabView(selection: $selectedTab) {
                         ChatListView(viewModel: contactsViewModel)
-                    }
-                    .navigationViewStyle(StackNavigationViewStyle())
-                    .tabItem {
-                        Label("Контакты", systemImage: "person.crop.circle")
-                    }
-                    .tag(Tab.contacts)
+                            .navigationViewStyle(StackNavigationViewStyle())
+                            .tabItem {
+                                Label("Контакты", systemImage: "person.crop.circle")
+                            }
+                            .tag(Tab.contacts)
 
-                    NavigationView {
                         RoomsListView(viewModel: roomsViewModel)
-                    }
-                    .navigationViewStyle(StackNavigationViewStyle())
-                    .tabItem {
-                        Label("Чаты", systemImage: "bubble.left.and.bubble.right")
-                    }
-                    .tag(Tab.rooms)
+                            .navigationViewStyle(StackNavigationViewStyle())
+                            .tabItem {
+                                Label("Чаты", systemImage: "bubble.left.and.bubble.right")
+                            }
+                            .tag(Tab.rooms)
 
-                    NavigationView {
                         Text("")
-                            .navigationTitle("Настройки")
                             .navigationBarTitleDisplayMode(.inline)
+                            .navigationViewStyle(StackNavigationViewStyle())
+                            .tabItem {
+                                Label("Настройки", systemImage: "gear")
+                            }
+                            .tag(Tab.settings)
                     }
-                    .navigationViewStyle(StackNavigationViewStyle())
-                    .tabItem {
-                        Label("Настройки", systemImage: "gear")
-                    }
-                    .tag(Tab.settings)
+                    .navigationBarTitle(returnNaviBarTitle(tabSelection: self.selectedTab))
                 }
             } else {
                 LoginView(viewModel: loginViewModel, authStatus: $authStatus)
             }
         }
     }
+
+    func returnNaviBarTitle(tabSelection: Tab) -> String {
+        switch tabSelection {
+        case .contacts: return "Контакты"
+        case .rooms: return "Чаты"
+        case .settings: return "Настройки"
+        }
+    }
+
+    enum Tab {
+        case contacts
+        case rooms
+        case settings
+    }
 }
 
 struct ContentView_Previews: PreviewProvider {

+ 4 - 29
Shared/Core/ChatListView.swift

@@ -12,6 +12,7 @@ import XMPPFrameworkSwift
 struct ChatListView: View {
     @Environment(\.colorScheme) var colorScheme
     @ObservedObject var viewModel: ChatListViewModel
+
     var body: some View {
         Group {
             if viewModel.users.isEmpty {
@@ -25,36 +26,11 @@ struct ChatListView: View {
                                     .resizable()
                                     .scaledToFit()
                                     .foregroundColor(.secondary.opacity(0.5))
-                                    .padding(.vertical, 8)
-                                VStack(alignment: .leading, spacing: 0) {
-                                    HStack {
-                                        Text(viewModel.nicknames[index])
-                                        Spacer()
-                                        Text("23:04")
-                                            .font(.callout)
-                                            .foregroundColor(.secondary)
-                                    }
-                                    .padding(.vertical, 4)
-                                    HStack {
-                                        VStack {
-                                            Text("Сообщение \(index)")
-                                                .foregroundColor(.secondary)
-                                            Spacer()
-                                        }
-                                        Spacer()
-                                        Text("\(index)")
-                                            .font(.callout)
-                                            .foregroundColor(colorScheme == .light ? .white : .black)
-                                            .padding(.horizontal, 6)
-                                            .background(
-                                                Capsule().foregroundColor(.secondary)
-                                            )
-                                    }
-                                    .padding(.vertical, 6)
-                                }
+                                Text(viewModel.nicknames[index])
+                                Spacer()
                             }
                             .foregroundColor(.primary)
-                            .frame(height: 60)
+                            .frame(height: 30)
                             NavigationLink {
                                 ChatView(viewModel: ChatViewModel(with: viewModel.users[index].jidString))
                             } label: {
@@ -67,7 +43,6 @@ struct ChatListView: View {
                 .listStyle(.plain)
             }
         }
-        .navigationTitle("Контакты")
         .navigationBarTitleDisplayMode(.inline)
         .toolbar {
             ToolbarItem(placement: .navigationBarTrailing) {

+ 9 - 6
Shared/Core/ChatView.swift

@@ -25,14 +25,14 @@ struct ChatView: View, KeyboardReadable {
                 ScrollViewReader { value in
                     VStack {
                         withAnimation {
-                            ForEach(viewModel.messages.indices, id: \.self) { i in
+                            ForEach(viewModel.messages, id: \.self) { message in
                                 HStack {
-                                    if viewModel.messages[i].is(from: StreamManager.shared.stream.myJID ?? XMPPJID()) {
-                                        Spacer()
-                                        MessageView(text: viewModel.messages[i].body ?? "-", time: "23:03", isSelf: true)
+                                    if message.from?.bare == StreamManager.shared.stream.myJID?.bare {
+                                        Spacer(minLength: 40)
+                                        MessageView(text: message.body ?? "-", time: "", isSelf: true)
                                     } else {
-                                        MessageView(text: viewModel.messages[i].body ?? "-", time: "23:03", isSelf: false)
-                                        Spacer()
+                                        MessageView(text: message.body ?? "-", time: "", isSelf: false)
+                                        Spacer(minLength: 40)
                                     }
                                 }
                             }
@@ -88,6 +88,9 @@ struct ChatView: View, KeyboardReadable {
                 }
             }
         }
+        .onAppear {
+            viewModel.fetchMessages()
+        }
     }
 }
 

+ 8 - 6
Shared/Core/ChatViewModel.swift

@@ -17,11 +17,7 @@ class ChatViewModel: NSObject, ObservableObject {
     let manager: RoomManager
 
     @Published var messageText: String = ""
-    @Published var messages: [XMPPMessage] = ChatViewModelExample.messages.map { text in
-        let message = XMPPMessage()
-        message.addBody(text)
-        return message
-    }
+    @Published var messages: [XMPPMessage] = []
 
     init(with jidString: String) {
         self.manager = RoomManager(with: jidString)
@@ -30,7 +26,13 @@ class ChatViewModel: NSObject, ObservableObject {
 
     func fetchMessages() {
         self.manager.fetchMessages()
-        self.messages = manager.messages
+        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
+            self?.messages = self?.manager.messages ?? ChatViewModelExample.messages.map { text in
+                let message = XMPPMessage()
+                message.addBody(text)
+                return message
+            }
+        }
     }
 
     func sendMessage() {

+ 0 - 1
Shared/Core/RoomsListView.swift

@@ -65,7 +65,6 @@ struct RoomsListView: View {
                 .listStyle(.plain)
             }
         }
-        .navigationTitle("Чаты")
         .navigationBarTitleDisplayMode(.inline)
         .toolbar {
             ToolbarItem(placement: .navigationBarTrailing) {

+ 12 - 3
Shared/Managers/RoomManager.swift

@@ -39,8 +39,6 @@ class RoomManager: NSObject {
         field.addChild(DDXMLElement(name: "value", stringValue: self.room.roomJID.bare))
 
         self.mam.retrieveMessageArchive(at: nil, withFields: [field], with: nil)
-        let messages = self.storage.messages() as? [XMPPMessage]
-        debugPrint(messages ?? "Empty")
     }
 }
 
@@ -67,6 +65,17 @@ extension RoomManager: XMPPMessageArchiveManagementDelegate {
         _ xmppMessageArchiveManagement: XMPPMessageArchiveManagement,
         didReceiveMAMMessage message: XMPPMessage
     ) {
-        self.messages.append(message)
+        if let result = message.children?.first,
+           let forwarded = result.children?.first,
+           let msg = forwarded.children?.first as? DDXMLElement {
+            let xmppmsg = XMPPMessage(from: msg)
+            if xmppmsg.isMessageWithBody {
+                self.messages.append(xmppmsg)
+            }
+        }
+    }
+
+    func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet) {
+        
     }
 }