Skip to content

Commit c694e39

Browse files
committed
Integrate upload view snackbar
1 parent 99dcda6 commit c694e39

File tree

5 files changed

+100
-7
lines changed

5 files changed

+100
-7
lines changed

WordPress/Classes/Services/MediaCoordinator.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,10 +398,10 @@ class MediaCoordinator: NSObject {
398398
// https://github.com/wordpress-mobile/WordPress-iOS/issues/20298#issuecomment-1465319707
399399
let service = self.mediaServiceFactory.create(coreDataStack.mainContext)
400400
var progress: Progress? = nil
401-
service.uploadMedia(media, automatedRetry: automatedRetry, progress: &progress, success: success, failure: failure)
402-
if let progress {
403-
resultProgress.addChild(progress, withPendingUnitCount: resultProgress.totalUnitCount)
404-
}
401+
// service.uploadMedia(media, automatedRetry: automatedRetry, progress: &progress, success: success, failure: failure)
402+
// if let progress {
403+
// resultProgress.addChild(progress, withPendingUnitCount: resultProgress.totalUnitCount)
404+
// }
405405

406406
uploading(media, progress: resultProgress)
407407

WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public enum FeatureFlag: Int, CaseIterable {
8484
case .newStats:
8585
return false
8686
case .newPublishingSheet:
87-
return BuildConfiguration.current == .debug
87+
return false
8888
}
8989
}
9090

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import SwiftUI
2+
3+
struct PostMediaUploadsSnackbarView: View {
4+
let state: PostMediaUploadsSnackbarState
5+
6+
private let accessoryViewWidth: CGFloat = 20
7+
8+
var body: some View {
9+
HStack(spacing: 10) {
10+
switch state {
11+
case let .uploading(title, details, progress):
12+
if let progress {
13+
MediaUploadProgressView(progress: progress)
14+
.frame(width: accessoryViewWidth)
15+
} else {
16+
ProgressView()
17+
.foregroundStyle(.secondary)
18+
.frame(width: accessoryViewWidth)
19+
}
20+
makeDetailsView(title: title, details: details)
21+
case let .failed(title, details):
22+
Image(systemName: "exclamationmark.triangle.fill")
23+
.foregroundStyle(Color.red)
24+
.frame(width: accessoryViewWidth)
25+
makeDetailsView(title: title, details: details)
26+
}
27+
}
28+
}
29+
30+
private func makeDetailsView(title: String, details: String?) -> some View {
31+
VStack(alignment: .leading) {
32+
Text(title)
33+
.font(.subheadline.weight(.medium))
34+
.foregroundStyle(.primary)
35+
if let details {
36+
Text(details)
37+
.font(.footnote)
38+
.foregroundStyle(.secondary)
39+
}
40+
}
41+
.tint(.primary)
42+
.lineLimit(1)
43+
}
44+
}
45+
46+
enum PostMediaUploadsSnackbarState {
47+
case uploading(title: String, details: String, progress: Double?)
48+
case failed(title: String, details: String? = nil)
49+
}
50+
51+
#Preview {
52+
VStack(spacing: 16) {
53+
PostMediaUploadsSnackbarView(state: .uploading(title: "Uploading media...", details: "2 items remaining", progress: 0.2))
54+
PostMediaUploadsSnackbarView(state: .failed(title: "Failed to upload media"))
55+
PostMediaUploadsSnackbarView(state: .failed(title: "Failed to upload media", details: "Not connected to Internet"))
56+
}
57+
.padding()
58+
}

WordPress/Classes/ViewRelated/Post/Publishing/PublishPostViewController.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import WordPressUI
99
/// the post settings along with some publishing options like the publish date.
1010
final class PublishPostViewController: UIHostingController<PublishPostView> {
1111
private let viewModel: PostSettingsViewModel
12+
private let uploadsViewModel: PostMediaUploadsViewModel
1213

1314
var onCompletion: ((PrepublishingSheetResult) -> Void)?
1415

@@ -19,7 +20,12 @@ final class PublishPostViewController: UIHostingController<PublishPostView> {
1920
context: .publishing
2021
)
2122
self.viewModel = viewModel
22-
super.init(rootView: PublishPostView(viewModel: viewModel))
23+
24+
let uploadsViewModel = PostMediaUploadsViewModel(post: post)
25+
self.uploadsViewModel = uploadsViewModel
26+
27+
let view = PublishPostView(viewModel: viewModel, uploadsViewModel: uploadsViewModel)
28+
super.init(rootView: view)
2329
}
2430

2531
required dynamic init?(coder aDecoder: NSCoder) {
@@ -44,6 +50,7 @@ final class PublishPostViewController: UIHostingController<PublishPostView> {
4450

4551
struct PublishPostView: View {
4652
@ObservedObject var viewModel: PostSettingsViewModel
53+
@ObservedObject var uploadsViewModel: PostMediaUploadsViewModel
4754

4855
@State private var isShowingDiscardChangesAlert = false
4956

@@ -52,6 +59,13 @@ struct PublishPostView: View {
5259
var body: some View {
5360
Form {
5461
Section {
62+
if let state = uploadsViewModel.uploadingSnackbarState {
63+
NavigationLink {
64+
PostMediaUploadsView(viewModel: uploadsViewModel)
65+
} label: {
66+
PostMediaUploadsSnackbarView(state: state)
67+
}
68+
}
5569
BlogListSiteView(site: .init(blog: viewModel.post.blog))
5670
} header: {
5771
SectionHeader(Strings.readyToPublish)
@@ -126,13 +140,16 @@ struct PublishPostView: View {
126140
if viewModel.isSaving {
127141
ProgressView()
128142
} else {
143+
let isDisabled = !uploadsViewModel.isCompleted
144+
129145
Button(viewModel.publishButtonTitle) {
130146
viewModel.buttonPublishTapped()
131147
}
132148
.fontWeight(.medium)
133149
.buttonStyle(.borderedProminent)
134150
.buttonBorderShape(.capsule)
135-
.tint(AppColor.primary)
151+
.tint(isDisabled ? Color(.opaqueSeparator) : AppColor.primary)
152+
.disabled(isDisabled)
136153
}
137154
}
138155
}

WordPress/Classes/ViewRelated/Post/Views/PostMediaUploadsViewModel.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,24 @@ final class PostMediaUploadsViewModel: ObservableObject {
4242
}.store(in: &cancellables)
4343
}
4444

45+
/// - returns `nil` if upload is completed.
46+
var uploadingSnackbarState: PostMediaUploadsSnackbarState? {
47+
guard !isCompleted else {
48+
return nil
49+
}
50+
typealias Strings = PrepublishingSheetStrings
51+
let errors = uploads.compactMap(\.error)
52+
if !errors.isEmpty {
53+
let details = errors.count == 1 ? errors[0].localizedDescription : String(format: Strings.mediaUploadFailedDetailsMultipleFailures, errors.count.description)
54+
return .failed(title: Strings.mediaUploadFailedTitle, details: details)
55+
}
56+
return .uploading(
57+
title: Strings.uploadingMedia,
58+
details: Strings.uploadMediaRemaining(count: uploads.count - completedUploadsCount),
59+
progress: fractionCompleted
60+
)
61+
}
62+
4563
private func didUpdateMedia(_ media: Set<Media>) {
4664
let remainingObjectIDs = Set(media.map(\.objectID))
4765
withAnimation {

0 commit comments

Comments
 (0)