Skip to content

Commit 75f4d22

Browse files
authored
Merge pull request #21988 from wordpress-mobile/task/integrate-media-picker
Site Media: Integrate media picker in site icon picker and featured image picker flows
2 parents 282d36d + 4fb7fa0 commit 75f4d22

File tree

7 files changed

+80
-25
lines changed

7 files changed

+80
-25
lines changed

WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/SiteIconView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class SiteIconView: UIView {
3333
}()
3434

3535
let activityIndicator: UIActivityIndicatorView = {
36-
let indicatorView = UIActivityIndicatorView(style: .large)
36+
let indicatorView = UIActivityIndicatorView(style: .medium)
37+
indicatorView.color = .white
3738
indicatorView.translatesAutoresizingMaskIntoConstraints = false
3839
return indicatorView
3940
}()

WordPress/Classes/ViewRelated/Blog/Site Picker/SitePickerViewController+SiteIcon.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ extension SitePickerViewController {
4242
var actions = [
4343
mediaMenu.makePhotosAction(delegate: presenter),
4444
mediaMenu.makeCameraAction(delegate: presenter),
45-
mediaMenu.makeMediaAction(blog: blog, delegate: presenter)
45+
mediaMenu.makeSiteMediaAction(blog: blog, delegate: presenter)
4646
]
4747
if FeatureFlag.siteIconCreator.enabled {
4848
actions.append(UIAction(

WordPress/Classes/ViewRelated/Blog/Site Settings/SiteIconPickerPresenter.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,24 @@ extension SiteIconPickerPresenter: MediaPickerViewControllerDelegate {
169169
})
170170
}
171171
}
172+
173+
extension SiteIconPickerPresenter: SiteMediaPickerViewControllerDelegate {
174+
func siteMediaPickerViewController(_ viewController: SiteMediaPickerViewController, didFinishWithSelection selection: [Media]) {
175+
guard let media = selection.first else {
176+
onCompletion?(nil, nil)
177+
return
178+
}
179+
180+
WPAnalytics.track(.siteSettingsSiteIconGalleryPicked)
181+
182+
showLoadingMessage()
183+
originalMedia = media
184+
MediaThumbnailCoordinator.shared.thumbnail(for: media, with: CGSize.zero, onCompletion: { [weak self] (image, error) in
185+
guard let image = image else {
186+
self?.showErrorLoadingImageMessage()
187+
return
188+
}
189+
self?.showImageCropViewController(image, presentingViewController: viewController)
190+
})
191+
}
192+
}

WordPress/Classes/ViewRelated/Media/MediaPickerMenu.swift

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ struct MediaPickerMenu {
1515
enum MediaFilter {
1616
case images
1717
case videos
18+
19+
var mediaType: MediaType {
20+
switch self {
21+
case .images: return .image
22+
case .videos: return .video
23+
}
24+
}
1825
}
1926

2027
/// Initializes the options.
@@ -170,19 +177,40 @@ extension MediaPickerMenu {
170177
private static var strongDelegateKey: UInt8 = 0
171178
}
172179

173-
// MARK: - MediaPickerMenu (WordPress Media)
180+
// MARK: - MediaPickerMenu (Site Media)
174181

175182
extension MediaPickerMenu {
176-
func makeMediaAction(blog: Blog, delegate: MediaPickerViewControllerDelegate) -> UIAction {
183+
/// Returns an action for selecting media from the media uploaded by the user
184+
/// to their site.
185+
func makeSiteMediaAction(blog: Blog, delegate: MediaPickerViewControllerDelegate & SiteMediaPickerViewControllerDelegate) -> UIAction {
177186
UIAction(
178187
title: Strings.pickFromMedia,
179188
image: UIImage(systemName: "photo.stack"),
180189
attributes: [],
181-
handler: { _ in showMediaPicker(blog: blog, delegate: delegate) }
190+
handler: { _ in showSiteMediaPicker(blog: blog, delegate: delegate) }
191+
)
192+
}
193+
194+
func showSiteMediaPicker(blog: Blog, delegate: MediaPickerViewControllerDelegate & SiteMediaPickerViewControllerDelegate) {
195+
if Feature.enabled(.mediaModernization) {
196+
showModernSiteMediaPicker(blog: blog, delegate: delegate)
197+
} else {
198+
showLegacySiteMediaPicker(blog: blog, delegate: delegate)
199+
}
200+
}
201+
202+
private func showModernSiteMediaPicker(blog: Blog, delegate: SiteMediaPickerViewControllerDelegate) {
203+
let viewController = SiteMediaPickerViewController(
204+
blog: blog,
205+
filter: filter.map { [$0.mediaType] },
206+
allowsMultipleSelection: isMultipleSelectionEnabled
182207
)
208+
viewController.delegate = delegate
209+
let navigation = UINavigationController(rootViewController: viewController)
210+
presentingViewController?.present(navigation, animated: true)
183211
}
184212

185-
func showMediaPicker(blog: Blog, delegate: MediaPickerViewControllerDelegate) {
213+
private func showLegacySiteMediaPicker(blog: Blog, delegate: MediaPickerViewControllerDelegate) {
186214
let options = WPMediaPickerOptions()
187215
options.showMostRecentFirst = true
188216
if let filter {

WordPress/Classes/ViewRelated/Media/SiteMedia/Controllers/SiteMediaCollectionViewController.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,22 +144,22 @@ final class SiteMediaCollectionViewController: UIViewController, NSFetchedResult
144144
}
145145

146146
private func setSelect(_ isSelected: Bool, for media: Media) {
147+
guard collectionView.allowsMultipleSelection else {
148+
delegate?.siteMediaViewController(self, didUpdateSelection: [media])
149+
return
150+
}
147151
if isSelected {
148152
selection.add(media)
149153
} else {
150154
selection.remove(media)
151155
getViewModel(for: media).badge = nil
152156
}
153-
if collectionView.allowsMultipleSelection {
154-
for (index, media) in selection.enumerated() {
155-
if let media = media as? Media {
156-
getViewModel(for: media).badge = isSelectionOrdered ? .ordered(index: index) : .unordered
157-
} else {
158-
assertionFailure("Invalid selection")
159-
}
157+
for (index, media) in selection.enumerated() {
158+
if let media = media as? Media {
159+
getViewModel(for: media).badge = isSelectionOrdered ? .ordered(index: index) : .unordered
160+
} else {
161+
assertionFailure("Invalid selection")
160162
}
161-
} else {
162-
// Don't display a badge
163163
}
164164
delegate?.siteMediaViewController(self, didUpdateSelection: selectedMedia)
165165
}

WordPress/Classes/ViewRelated/Media/SiteMedia/SiteMediaPickerViewController.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ final class SiteMediaPickerViewController: UIViewController, SiteMediaCollection
3131

3232
title = Strings.title
3333
extendedLayoutIncludesOpaqueBars = true
34+
modalPresentationStyle = .formSheet
3435
}
3536

3637
required init?(coder: NSCoder) {
@@ -43,21 +44,13 @@ final class SiteMediaPickerViewController: UIViewController, SiteMediaCollection
4344
collectionViewController.embed(in: self)
4445
collectionViewController.delegate = self
4546

46-
configureNavigationBarAppearance()
47+
configureDefaultNavigationBarAppearance()
4748
configurationNavigationItems()
4849
startSelection()
4950
}
5051

5152
// MARK: - Configuration
5253

53-
private func configureNavigationBarAppearance() {
54-
let appearance = UINavigationBarAppearance()
55-
navigationItem.standardAppearance = appearance
56-
navigationItem.compactAppearance = appearance
57-
navigationItem.scrollEdgeAppearance = appearance
58-
navigationItem.compactScrollEdgeAppearance = appearance
59-
}
60-
6154
private func configurationNavigationItems() {
6255
let buttonCancel = UIBarButtonItem(systemItem: .cancel, primaryAction: UIAction { [weak self] _ in
6356
self?.buttonDoneTapped()

WordPress/Classes/ViewRelated/Post/PostSettingsViewController+FeaturedImageUpload.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ extension PostSettingsViewController: PHPickerViewControllerDelegate, ImagePicke
3232
return UIMenu(children: [
3333
menu.makePhotosAction(delegate: self),
3434
menu.makeCameraAction(delegate: self),
35-
menu.makeMediaAction(blog: self.apost.blog, delegate: self)
35+
menu.makeSiteMediaAction(blog: self.apost.blog, delegate: self)
3636
])
3737
}
3838

@@ -74,6 +74,18 @@ extension PostSettingsViewController: MediaPickerViewControllerDelegate {
7474
}
7575
}
7676

77+
extension PostSettingsViewController: SiteMediaPickerViewControllerDelegate {
78+
func siteMediaPickerViewController(_ viewController: SiteMediaPickerViewController, didFinishWithSelection selection: [Media]) {
79+
dismiss(animated: true)
80+
81+
guard let media = selection.first else { return }
82+
83+
WPAnalytics.track(.editorPostFeaturedImageChanged, properties: ["via": "settings", "action": "added"])
84+
setFeaturedImage(media: media)
85+
reloadFeaturedImageCell()
86+
}
87+
}
88+
7789
// MARK: - PostSettingsViewController (Featured Image Upload)
7890

7991
extension PostSettingsViewController {

0 commit comments

Comments
 (0)