Make caption changable (#1138)

This commit is contained in:
Nathan Mattes 2024-01-21 12:09:47 +01:00
parent d55800d71a
commit 89b7df25ea
7 changed files with 37 additions and 24 deletions

View File

@ -284,7 +284,8 @@ extension ComposeViewController {
authContext: viewModel.authContext,
input: .image(image),
sizeLimit: composeContentViewModel.sizeLimit,
delegate: composeContentViewModel
delegate: composeContentViewModel,
caption: nil
)
}
composeContentViewModel.attachmentViewModels += attachmentViewModels

View File

@ -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

View File

@ -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
}
}

View File

@ -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]
}

View File

@ -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
}
}

View File

@ -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

View File

@ -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)