Procházet zdrojové kódy

Extract ChatMessageListView

Sergey před 2 roky
rodič
revize
c1e4cc553a

+ 4 - 0
Chat.xcodeproj/project.pbxproj

@@ -26,6 +26,7 @@
 		2F81974828ACEDC8008D8C45 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F81974728ACEDC8008D8C45 /* User.swift */; };
 		2F81974C28ACFDEA008D8C45 /* Room.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F81974B28ACFDEA008D8C45 /* Room.swift */; };
 		2FB65BD828F9D2C000007021 /* RoomsListCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB65BD728F9D2C000007021 /* RoomsListCellView.swift */; };
+		2FB65BDA28F9EE9300007021 /* ChatMessageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB65BD928F9EE9300007021 /* ChatMessageListView.swift */; };
 		2FCB75E728A425580097BD1D /* RoomsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCB75E628A425580097BD1D /* RoomsListView.swift */; };
 		2FCB75EA28A425900097BD1D /* RoomsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCB75E928A425900097BD1D /* RoomsListViewModel.swift */; };
 		2FCB75ED28A42B1E0097BD1D /* ChatViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCB75EC28A42B1E0097BD1D /* ChatViewModel.swift */; };
@@ -52,6 +53,7 @@
 		2F81974728ACEDC8008D8C45 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
 		2F81974B28ACFDEA008D8C45 /* Room.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Room.swift; sourceTree = "<group>"; };
 		2FB65BD728F9D2C000007021 /* RoomsListCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomsListCellView.swift; sourceTree = "<group>"; };
+		2FB65BD928F9EE9300007021 /* ChatMessageListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessageListView.swift; sourceTree = "<group>"; };
 		2FCB75E628A425580097BD1D /* RoomsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomsListView.swift; sourceTree = "<group>"; };
 		2FCB75E928A425900097BD1D /* RoomsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomsListViewModel.swift; sourceTree = "<group>"; };
 		2FCB75EC28A42B1E0097BD1D /* ChatViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatViewModel.swift; sourceTree = "<group>"; };
@@ -101,6 +103,7 @@
 			isa = PBXGroup;
 			children = (
 				2F604598288D7E00008F005E /* ChatView.swift */,
+				2FB65BD928F9EE9300007021 /* ChatMessageListView.swift */,
 				2F6E936B28F8D74600FAF0E5 /* MessageTextField.swift */,
 				2FCB75EC28A42B1E0097BD1D /* ChatViewModel.swift */,
 			);
@@ -262,6 +265,7 @@
 				2FCB75ED28A42B1E0097BD1D /* ChatViewModel.swift in Sources */,
 				2F24E94828F2FC8A007ECE97 /* AppDelegate.swift in Sources */,
 				2F81974C28ACFDEA008D8C45 /* Room.swift in Sources */,
+				2FB65BDA28F9EE9300007021 /* ChatMessageListView.swift in Sources */,
 				2F6E936C28F8D74600FAF0E5 /* MessageTextField.swift in Sources */,
 				2F60459C288D8000008F005E /* MessageView.swift in Sources */,
 				2F6E936828F8714600FAF0E5 /* Message.swift in Sources */,

+ 44 - 0
Chat/UI/Chat/ChatMessageListView.swift

@@ -0,0 +1,44 @@
+//
+//  ChatMessageListView.swift
+//  Chat (iOS)
+//
+//  Created by Sergey Tarasov on 14.10.2022.
+//
+
+import SwiftUI
+
+struct ChatMessageListView: View {
+	let messages: [Message]
+
+	var body: some View {
+		ScrollView {
+			VStack {
+				ForEach(messages, id: \.id) { message in
+					MessageView(
+						text: message.body,
+						time: "",
+						isSelf: message.fromID == XMPPController.shared.xmppStream.myJID?.bare
+					)
+				}
+			}
+			.padding(.horizontal, .sidePadding)
+			.padding(.vertical, 12)
+			.background(Color.indigo.opacity(0.0))
+		}
+	}
+}
+
+struct ChatMessageListView_Previews: PreviewProvider {
+	static var previews: some View {
+		ChatMessageListView(
+			messages:
+				(0...20).map {
+					Message(
+						id: UUID().uuidString,
+						body: "Message \($0)",
+						fromID: "user@domain.com"
+					)
+				}
+		)
+	}
+}

+ 1 - 34
Chat/UI/Chat/ChatView.swift

@@ -21,40 +21,7 @@ struct ChatView: View, KeyboardReadable {
 
     var body: some View {
         VStack(alignment: .center, spacing: 0) {
-            ScrollView {
-                ScrollViewReader { value in
-                    VStack {
-                        withAnimation {
-							ForEach(viewModel.messages, id: \.id) { message in
-								MessageView(
-									text: message.body,
-									time: "",
-									isSelf: message.fromID == XMPPController.shared.xmppStream.myJID?.bare
-								)
-                            }
-                            .onChange(of: viewModel.messages) { _ in
-								DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
-									withAnimation {
-										value.scrollTo(viewModel.messages.count - 1, anchor: .bottomTrailing)
-									}
-								}
-                            }
-                            .onReceive(keyboardPublisher) { newIsKeyboardVisible in
-                                isKeyboardVisible = newIsKeyboardVisible
-                                withAnimation {
-                                    value.scrollTo(viewModel.messages.count - 2, anchor: .topTrailing)
-                                }
-                            }
-                            .onAppear {
-                                value.scrollTo(viewModel.messages.count - 1, anchor: .top)
-                            }
-                        }
-                    }
-                    .padding(.horizontal, .sidePadding)
-                    .padding(.vertical, 12)
-                    .background(Color.indigo.opacity(0.0))
-                }
-            }
+			ChatMessageListView(messages: viewModel.messages)
             Divider()
 			MessageTextField(message: $viewModel.messageText, action: viewModel.sendMessage)
         }