Browse Source

implement basic document draft preview

cyberta 4 năm trước cách đây
mục cha
commit
aada291f9d

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -24,6 +24,7 @@
 		3034929F25752FC800A523D0 /* MediaPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3034929E25752FC800A523D0 /* MediaPreview.swift */; };
 		303492A5257546B400A523D0 /* DraftPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492A4257546B400A523D0 /* DraftPreview.swift */; };
 		303492AD2577CAC300A523D0 /* FileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492AC2577CAC300A523D0 /* FileView.swift */; };
+		303492B32577E40700A523D0 /* DocumentPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492B22577E40700A523D0 /* DocumentPreview.swift */; };
 		304219D3243F588500516852 /* DcCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 304219D1243F588500516852 /* DcCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		304219D92440734A00516852 /* DcMsg+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304219D82440734A00516852 /* DcMsg+Extension.swift */; };
 		304F5E44244F571C00462538 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A9FB14A1FB061E2001FEA36 /* Assets.xcassets */; };
@@ -223,6 +224,7 @@
 		3034929E25752FC800A523D0 /* MediaPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreview.swift; sourceTree = "<group>"; };
 		303492A4257546B400A523D0 /* DraftPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraftPreview.swift; sourceTree = "<group>"; };
 		303492AC2577CAC300A523D0 /* FileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileView.swift; sourceTree = "<group>"; };
+		303492B22577E40700A523D0 /* DocumentPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPreview.swift; sourceTree = "<group>"; };
 		304219D1243F588500516852 /* DcCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DcCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		304219D82440734A00516852 /* DcMsg+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DcMsg+Extension.swift"; sourceTree = "<group>"; };
 		3052C609253F082E007D13EA /* MessageLabelDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageLabelDelegate.swift; sourceTree = "<group>"; };
@@ -556,6 +558,7 @@
 				30349290256441E200A523D0 /* QuotePreview.swift */,
 				303492A4257546B400A523D0 /* DraftPreview.swift */,
 				303492AC2577CAC300A523D0 /* FileView.swift */,
+				303492B22577E40700A523D0 /* DocumentPreview.swift */,
 			);
 			path = Views;
 			sourceTree = "<group>";
@@ -1169,6 +1172,7 @@
 				78ED839421D5AF8A00243125 /* QrCodeView.swift in Sources */,
 				3059620E234614E700C80F33 /* DcContact+Extension.swift in Sources */,
 				AED423D7249F580700B6B2BB /* BlockedContactsViewController.swift in Sources */,
+				303492B32577E40700A523D0 /* DocumentPreview.swift in Sources */,
 				3008CB7424F9436C00E6A617 /* AudioPlayerView.swift in Sources */,
 				AED62BCE247687E6009E220D /* LocationStreamingIndicator.swift in Sources */,
 				AE9DAF0F22C278C6004C9591 /* ChatTitleView.swift in Sources */,

+ 21 - 16
deltachat-ios/Chat/ChatViewController.swift

@@ -44,6 +44,13 @@ class ChatViewController: UITableViewController {
         return view
     }()
 
+    lazy var documentPreview: DocumentPreview = {
+        let view = DocumentPreview()
+        view.delegate = self
+        view.translatesAutoresizingMaskIntoConstraints = false
+        return view
+    }()
+
     open override var shouldAutorotate: Bool {
         return false
     }
@@ -403,8 +410,9 @@ class ChatViewController: UITableViewController {
     private func configureDraftArea(draft: DraftModel) {
         quotePreview.configure(draft: draft)
         mediaPreview.configure(draft: draft)
+        documentPreview.configure(draft: draft)
         // setStackViewItems recalculates the proper messageInputBar height
-        messageInputBar.setStackViewItems([quotePreview, mediaPreview], forStack: .top, animated: true)
+        messageInputBar.setStackViewItems([quotePreview, mediaPreview, documentPreview], forStack: .top, animated: true)
     }
 
     override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
@@ -914,6 +922,12 @@ class ChatViewController: UITableViewController {
         }
     }
 
+    private func stageDocument(url: NSURL) {
+        self.draft.setAttachment(viewType: DC_MSG_FILE, path: url.relativePath)
+        self.configureDraftArea(draft: self.draft)
+        self.messageInputBar.inputTextView.becomeFirstResponder()
+    }
+
     private func stageImage(url: NSURL) {
         if url.pathExtension == "gif" {
             stageAnimatedImage(url: url)
@@ -953,7 +967,7 @@ class ChatViewController: UITableViewController {
     private func sendImage(_ image: UIImage, message: String? = nil) {
         DispatchQueue.global().async {
             if let path = DcUtils.saveImage(image: image) {
-                self.sendImageMessage(viewType: DC_MSG_IMAGE, filePath: path)
+                self.sendAttachmentMessage(viewType: DC_MSG_IMAGE, filePath: path)
             }
         }
     }
@@ -969,7 +983,7 @@ class ChatViewController: UITableViewController {
         }
     }*/
 
-    private func sendImageMessage(viewType: Int32, filePath: String, message: String? = nil, quoteMessage: DcMsg? = nil) {
+    private func sendAttachmentMessage(viewType: Int32, filePath: String, message: String? = nil, quoteMessage: DcMsg? = nil) {
         let msg = DcMsg(viewType: viewType)
         msg.setFile(filepath: filePath)
         msg.text = (message ?? "").isEmpty ? nil : message
@@ -979,14 +993,6 @@ class ChatViewController: UITableViewController {
         msg.sendInChat(id: self.chatId)
     }
 
-    private func sendDocumentMessage(url: NSURL) {
-        DispatchQueue.global().async {
-            let msg = DcMsg(viewType: DC_MSG_FILE)
-            msg.setFile(filepath: url.relativePath, mimeType: nil)
-            msg.sendInChat(id: self.chatId)
-        }
-    }
-
     private func sendVoiceMessage(url: NSURL) {
         DispatchQueue.global().async {
             let msg = DcMsg(viewType: DC_MSG_VOICE)
@@ -1202,7 +1208,7 @@ extension ChatViewController: MediaPickerDelegate {
     }
 
     func onDocumentSelected(url: NSURL) {
-        sendDocumentMessage(url: url)
+        stageDocument(url: url)
     }
 
 }
@@ -1214,10 +1220,8 @@ extension ChatViewController: InputBarAccessoryViewDelegate {
             .trimmingCharacters(in: .whitespacesAndNewlines)
         if let filePath = draft.draftAttachment, let viewType = draft.draftViewType {
             switch viewType {
-            case DC_MSG_GIF:
-                self.sendImageMessage(viewType: DC_MSG_GIF, filePath: filePath, message: trimmedText, quoteMessage: draft.quoteMessage)
-            case DC_MSG_IMAGE:
-                self.sendImageMessage(viewType: DC_MSG_IMAGE, filePath: filePath, message: trimmedText, quoteMessage: draft.quoteMessage)
+            case DC_MSG_GIF, DC_MSG_IMAGE, DC_MSG_FILE:
+                self.sendAttachmentMessage(viewType: viewType, filePath: filePath, message: trimmedText, quoteMessage: draft.quoteMessage)
             default:
                 logger.warning("Unsupported viewType for drafted messages.")
             }
@@ -1231,6 +1235,7 @@ extension ChatViewController: InputBarAccessoryViewDelegate {
         inputBar.inputTextView.attributedText = nil
         self.quotePreview.cancel()
         self.mediaPreview.cancel()
+        self.documentPreview.cancel()
     }
 
     func inputBar(_ inputBar: InputBarAccessoryView, textViewTextDidChangeTo text: String) {

+ 38 - 9
deltachat-ios/Chat/Views/DocumentPreview.swift

@@ -1,9 +1,38 @@
-//
-//  DocumentPreview.swift
-//  deltachat-ios
-//
-//  Created by Macci on 02.12.20.
-//  Copyright © 2020 Jonas Reinsch. All rights reserved.
-//
-
-import Foundation
+import UIKit
+import DcCore
+
+public class DocumentPreview: DraftPreview {
+
+    weak var delegate: DraftPreviewDelegate?
+
+    lazy var fileView: FileView = {
+        let view = FileView()
+        view.translatesAutoresizingMaskIntoConstraints = false
+        view.allowLayoutChange = false
+        return view
+    }()
+
+    override func setupSubviews() {
+        super.setupSubviews()
+        mainContentView.addSubview(fileView)
+        fileView.fillSuperview()
+        mainContentView.constraintHeightTo(80).isActive = true
+    }
+    
+    override public func cancel() {
+        fileView.prepareForReuse()
+        delegate?.onCancelAttachment()
+    }
+
+    override public func configure(draft: DraftModel) {
+        if draft.draftViewType == DC_MSG_FILE, let path = draft.draftAttachment {
+            let tmpMsg = DcMsg(viewType: DC_MSG_FILE)
+            tmpMsg.setFile(filepath: path)
+            tmpMsg.text = draft.draftText
+            fileView.configure(message: tmpMsg)
+            isHidden = false
+        } else {
+            isHidden = true
+        }
+    }
+}