From 89b7df25eaea32ca4d5397465be4eb813f4ce091 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 21 Jan 2024 12:09:47 +0100 Subject: [PATCH] Make caption changable (#1138) --- .../Scene/Compose/ComposeViewController.swift | 3 ++- .../AttachmentViewModel+Upload.swift | 9 +++------ .../Attachment/AttachmentViewModel.swift | 19 +++++++++++++++---- .../ComposeContentViewController.swift | 9 ++++++--- .../ComposeContentViewModel.swift | 8 +++++--- .../Publisher/MastodonStatusPublisher.swift | 7 ++----- .../Scene/ShareViewController.swift | 6 ++++-- 7 files changed, 37 insertions(+), 24 deletions(-) diff --git a/Mastodon/Scene/Compose/ComposeViewController.swift b/Mastodon/Scene/Compose/ComposeViewController.swift index 71c797a9c..864af7512 100644 --- a/Mastodon/Scene/Compose/ComposeViewController.swift +++ b/Mastodon/Scene/Compose/ComposeViewController.swift @@ -284,7 +284,8 @@ extension ComposeViewController { authContext: viewModel.authContext, input: .image(image), sizeLimit: composeContentViewModel.sizeLimit, - delegate: composeContentViewModel + delegate: composeContentViewModel, + caption: nil ) } composeContentViewModel.attachmentViewModels += attachmentViewModels diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel+Upload.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel+Upload.swift index 58259d28c..943fb9cfe 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel+Upload.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel+Upload.swift @@ -120,15 +120,12 @@ extension AttachmentViewModel { } let attachment = output.asAttachment - + let query = Mastodon.API.Media.UploadMediaQuery( file: attachment, thumbnail: nil, - description: { - let caption = caption.trimmingCharacters(in: .whitespacesAndNewlines) - return caption.isEmpty ? nil : caption - }(), - focus: nil // TODO: + description: caption.trimmingCharacters(in: .whitespacesAndNewlines), + focus: nil ) // upload + N * check upload diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel.swift index 714db2a03..0a70ede81 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Attachment/AttachmentViewModel.swift @@ -45,8 +45,10 @@ final public class AttachmentViewModel: NSObject, ObservableObject, Identifiable public let authContext: AuthContext public let input: Input public let sizeLimit: SizeLimit + let originalCaption: String? @Published var caption = "" @Published public private(set) var isCaptionEditable = true + let isEditing: Bool // output @Published public private(set) var output: Output? @@ -75,15 +77,21 @@ final public class AttachmentViewModel: NSObject, ObservableObject, Identifiable authContext: AuthContext, input: Input, sizeLimit: SizeLimit, - delegate: AttachmentViewModelDelegate + delegate: AttachmentViewModelDelegate, + isEditing: Bool = false, + caption: String? ) { self.api = api self.authContext = authContext self.input = input self.sizeLimit = sizeLimit self.delegate = delegate + self.isEditing = isEditing + + self.originalCaption = caption + self.caption = caption ?? "" + super.init() - // end init Timer.publish(every: 1.0 / 60.0, on: .main, in: .common) // 60 FPS .autoconnect() @@ -134,7 +142,9 @@ final public class AttachmentViewModel: NSObject, ObservableObject, Identifiable switch input { case .mastodonAssetUrl: - self.isCaptionEditable = false + if self.isEditing == false { + self.isCaptionEditable = false + } self.uploadState = .finish self.output = output self.uploadResult = .exists @@ -258,7 +268,7 @@ extension AttachmentViewModel { public enum Input: Hashable { case image(UIImage) case url(URL) - case mastodonAssetUrl(URL, String) + case mastodonAssetUrl(url: URL, attachmentId: String) case pickerResult(PHPickerResult) case itemProvider(NSItemProvider) } @@ -321,4 +331,5 @@ extension AttachmentViewModel { func update(uploadResult: UploadResult) { self.uploadResult = uploadResult } + } diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift index 864160e06..063b6f20c 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift @@ -473,7 +473,8 @@ extension ComposeContentViewController: PHPickerViewControllerDelegate { authContext: viewModel.authContext, input: .pickerResult(result), sizeLimit: viewModel.sizeLimit, - delegate: viewModel + delegate: viewModel, + caption: nil ) } viewModel.attachmentViewModels += attachmentViewModels @@ -492,7 +493,8 @@ extension ComposeContentViewController: UIImagePickerControllerDelegate & UINavi authContext: viewModel.authContext, input: .image(image), sizeLimit: viewModel.sizeLimit, - delegate: viewModel + delegate: viewModel, + caption: nil ) viewModel.attachmentViewModels += [attachmentViewModel] } @@ -512,7 +514,8 @@ extension ComposeContentViewController: UIDocumentPickerDelegate { authContext: viewModel.authContext, input: .url(url), sizeLimit: viewModel.sizeLimit, - delegate: viewModel + delegate: viewModel, + caption: nil ) viewModel.attachmentViewModels += [attachmentViewModel] } diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift index bc1f14053..cdd0e88a4 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift @@ -265,14 +265,16 @@ public final class ComposeContentViewModel: NSObject, ObservableObject { self.isVisibilityButtonEnabled = false self.attachmentViewModels = status.entity.mastodonAttachments.compactMap { guard let assetURL = $0.assetURL, let url = URL(string: assetURL) else { return nil } + let attachmentViewModel = AttachmentViewModel( api: context.apiService, authContext: authContext, - input: .mastodonAssetUrl(url, $0.id), + input: .mastodonAssetUrl(url: url, attachmentId: $0.id), sizeLimit: sizeLimit, - delegate: self + delegate: self, + isEditing: true, + caption: $0.altDescription ) - attachmentViewModel.caption = $0.altDescription ?? "" return attachmentViewModel } } diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Publisher/MastodonStatusPublisher.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Publisher/MastodonStatusPublisher.swift index 9db9faed9..42826976f 100644 --- a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Publisher/MastodonStatusPublisher.swift +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/Publisher/MastodonStatusPublisher.swift @@ -124,17 +124,14 @@ extension MastodonStatusPublisher: StatusPublisher { break case let .uploadedMastodonAttachment(attachment): attachmentIDs.append(attachment.id) - - let caption = attachmentViewModel.caption - guard !caption.isEmpty else { continue } - + _ = try await api.updateMedia( domain: authContext.mastodonAuthenticationBox.domain, attachmentID: attachment.id, query: .init( file: nil, thumbnail: nil, - description: caption, + description: attachmentViewModel.caption, focus: nil ), mastodonAuthenticationBox: authContext.mastodonAuthenticationBox diff --git a/ShareActionExtension/Scene/ShareViewController.swift b/ShareActionExtension/Scene/ShareViewController.swift index 4418c52bc..ad1f1f3e5 100644 --- a/ShareActionExtension/Scene/ShareViewController.swift +++ b/ShareActionExtension/Scene/ShareViewController.swift @@ -260,7 +260,8 @@ extension ShareViewController { authContext: authContext, input: .itemProvider(movieProvider), sizeLimit: .init(image: nil, video: nil), - delegate: composeContentViewModel + delegate: composeContentViewModel, + caption: nil ) composeContentViewModel.attachmentViewModels.append(attachmentViewModel) } else if !imageProviders.isEmpty { @@ -270,7 +271,8 @@ extension ShareViewController { authContext: authContext, input: .itemProvider(provider), sizeLimit: .init(image: nil, video: nil), - delegate: composeContentViewModel + delegate: composeContentViewModel, + caption: nil ) } composeContentViewModel.attachmentViewModels.append(contentsOf: attachmentViewModels)