From ebe624605bc00292d324f75910df561e1a40f11c Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Sun, 3 Jan 2021 14:37:06 -0800 Subject: [PATCH] wip --- View Controllers/NewStatusViewController.swift | 12 +++++++++++- .../Sources/ViewModels/CompositionViewModel.swift | 13 ++++++++++++- Views/CompositionInputAccessoryView.swift | 11 +++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/View Controllers/NewStatusViewController.swift b/View Controllers/NewStatusViewController.swift index 19424ca..b968957 100644 --- a/View Controllers/NewStatusViewController.swift +++ b/View Controllers/NewStatusViewController.swift @@ -212,6 +212,10 @@ private extension NewStatusViewController { configuration.preferredAssetRepresentationMode = .current + if !compositionViewModel.canAddNonImageAttachment { + configuration.filter = .images + } + let picker = PHPickerViewController(configuration: configuration) picker.modalPresentationStyle = .overFullScreen @@ -259,9 +263,15 @@ private extension NewStatusViewController { picker.sourceType = .camera picker.allowsEditing = true - picker.mediaTypes = [UTType.image.description, UTType.movie.description] picker.modalPresentationStyle = .overFullScreen picker.delegate = self + + if compositionViewModel.canAddNonImageAttachment { + picker.mediaTypes = [UTType.image.description, UTType.movie.description] + } else { + picker.mediaTypes = [UTType.image.description] + } + present(picker, animated: true) } #endif diff --git a/ViewModels/Sources/ViewModels/CompositionViewModel.swift b/ViewModels/Sources/ViewModels/CompositionViewModel.swift index 6944e7e..474b291 100644 --- a/ViewModels/Sources/ViewModels/CompositionViewModel.swift +++ b/ViewModels/Sources/ViewModels/CompositionViewModel.swift @@ -12,8 +12,10 @@ public final class CompositionViewModel: ObservableObject, Identifiable { @Published public var contentWarning = "" @Published public var displayContentWarning = false @Published public private(set) var attachmentViewModels = [CompositionAttachmentViewModel]() - @Published public private(set) var isPostable = false @Published public private(set) var attachmentUpload: AttachmentUpload? + @Published public private(set) var isPostable = false + @Published public private(set) var canAddAttachment = true + @Published public private(set) var canAddNonImageAttachment = true private var cancellables = Set() @@ -25,6 +27,11 @@ public final class CompositionViewModel: ObservableObject, Identifiable { textPresent || attachmentPresent } .assign(to: &$isPostable) + $attachmentViewModels + .combineLatest($attachmentUpload) + .map { $0.count < Self.maxAttachmentCount && $1 == nil } + .assign(to: &$canAddAttachment) + $attachmentViewModels.map(\.isEmpty).assign(to: &$canAddNonImageAttachment) } } @@ -75,3 +82,7 @@ extension CompositionViewModel { .eraseToAnyPublisher() } } + +private extension CompositionViewModel { + static let maxAttachmentCount = 4 +} diff --git a/Views/CompositionInputAccessoryView.swift b/Views/CompositionInputAccessoryView.swift index 971fb41..ed66a92 100644 --- a/Views/CompositionInputAccessoryView.swift +++ b/Views/CompositionInputAccessoryView.swift @@ -60,10 +60,10 @@ private extension CompositionInputAccessoryView { }, for: .touchUpInside) + let cameraButton = UIButton() + #if !IS_SHARE_EXTENSION if AVCaptureDevice.authorizationStatus(for: .video) != .restricted { - let cameraButton = UIButton() - stackView.addArrangedSubview(cameraButton) cameraButton.setImage( UIImage( @@ -121,6 +121,13 @@ private extension CompositionInputAccessoryView { self.parentViewModel.insert(after: self.viewModel) }, for: .touchUpInside) + viewModel.$canAddAttachment + .sink { + mediaButton.isEnabled = $0 + cameraButton.isEnabled = $0 + } + .store(in: &cancellables) + viewModel.$isPostable .sink { [weak self] in self?.addButton.isEnabled = $0 } .store(in: &cancellables)