From 1eb3dfb5a516124d1a7def29433ef310cf012e81 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Fri, 13 Jan 2023 12:23:48 +0100 Subject: [PATCH] Editor: Fixes to the first time sizing + paste images --- .../xcshareddata/swiftpm/Package.resolved | 14 ++++---- .../Status/Editor/StatusEditorViewModel.swift | 34 ++++++++++++++----- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index dbc1700b..fad5e152 100644 --- a/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/IceCubesApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/divadretlaw/EmojiText", "state" : { - "revision" : "f349e481499d2c832ab9d2dc28af238e53b1f9b4", - "version" : "1.1.0" + "revision" : "3d8f6196de59634352ed317cf6ab4e292eeaaf44", + "version" : "1.2.0" } }, { @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/kean/Nuke", "state" : { - "revision" : "81f6a3dea0c8ce3b87389c241c48601be07af0b1", - "version" : "11.5.1" + "revision" : "2e9337168d08acccf72c039bf9324be24a1cf7d7", + "version" : "11.5.3" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/scinfu/SwiftSoup.git", "state" : { - "revision" : "6778575285177365cbad3e5b8a72f2a20583cfec", - "version" : "2.4.3" + "revision" : "f707b8680cddb96dc1855632340a572ef37bbb98", + "version" : "2.5.3" } }, { @@ -69,7 +69,7 @@ "location" : "https://github.com/Dimillian/TextView", "state" : { "branch" : "main", - "revision" : "52206e6bcb6de34b2ef6250c4c5111e9b845fb0b" + "revision" : "8bddc899350d74f36ad17efc07d35152929bab64" } } ], diff --git a/Packages/Status/Sources/Status/Editor/StatusEditorViewModel.swift b/Packages/Status/Sources/Status/Editor/StatusEditorViewModel.swift index 2de00707..b075fb9f 100644 --- a/Packages/Status/Sources/Status/Editor/StatusEditorViewModel.swift +++ b/Packages/Status/Sources/Status/Editor/StatusEditorViewModel.swift @@ -23,7 +23,7 @@ public class StatusEditorViewModel: ObservableObject { @Published var statusText = NSMutableAttributedString(string: "") { didSet { - highlightMeta() + processText() checkEmbed() } } @@ -135,7 +135,10 @@ public class StatusEditorViewModel: ObservableObject { mentionString = "@\(status.reblog?.account.acct ?? status.account.acct)" } for mention in status.mentions where mention.acct != currentAccount?.acct { - mentionString += " @\(mention.acct)" + if !mentionString.isEmpty { + mentionString += " " + } + mentionString += "@\(mention.acct)" } mentionString += " " replyToStatus = status @@ -162,7 +165,7 @@ public class StatusEditorViewModel: ObservableObject { } } - private func highlightMeta() { + private func processText() { statusText.addAttributes([.foregroundColor: UIColor(Color.label)], range: NSMakeRange(0, statusText.string.utf16.count)) let hashtagPattern = "(#+[a-zA-Z0-9(_)]{1,})" @@ -174,16 +177,17 @@ public class StatusEditorViewModel: ObservableObject { let mentionRegex = try NSRegularExpression(pattern: mentionPattern, options: []) let urlRegex = try NSRegularExpression(pattern: urlPattern, options: []) + let range = NSMakeRange(0, statusText.string.utf16.count) var ranges = hashtagRegex.matches(in: statusText.string, options: [], - range: NSMakeRange(0, statusText.string.utf16.count)).map { $0.range } + range: range).map { $0.range } ranges.append(contentsOf: mentionRegex.matches(in: statusText.string, options: [], - range: NSMakeRange(0, statusText.string.utf16.count)).map {$0.range}) + range: range).map {$0.range}) let urlRanges = urlRegex.matches(in: statusText.string, options: [], - range: NSMakeRange(0, statusText.string.utf16.count)).map { $0.range } + range:range).map { $0.range } var foundSuggestionRange: Bool = false for nsRange in ranges { @@ -207,6 +211,20 @@ public class StatusEditorViewModel: ObservableObject { .underlineColor: UIColor(theme?.tintColor ?? .brand)], range: NSRange(location: range.location, length: range.length)) } + + var attachementsToRemove: [NSRange] = [] + statusText.enumerateAttribute(.attachment, in: range) { attachement, raneg, _ in + if let attachement = attachement as? NSTextAttachment, let image = attachement.image { + attachementsToRemove.append(range) + mediasImages.append(.init(image: image, mediaAttachement: nil, error: nil)) + } + } + if !attachementsToRemove.isEmpty { + processMediasToUpload() + for range in attachementsToRemove { + statusText.removeAttribute(.attachment, range: range) + } + } } catch { } @@ -303,12 +321,12 @@ public class StatusEditorViewModel: ObservableObject { } DispatchQueue.main.async { [weak self] in self?.mediasImages = medias - self?.processUpload() + self?.processMediasToUpload() } } } - private func processUpload() { + private func processMediasToUpload() { uploadTask?.cancel() let mediasCopy = mediasImages uploadTask = Task {