Display Circular Indicator on top of media undergoing upload process

Removed existing progress view bar at the top of post view
Added separate stack in PVImageCarouselView for media undergoing the upload process
Changelog-Added: Display uploading indicator in post view
Signed-off-by: Swift Coder <scoder1747@gmail.com>
This commit is contained in:
Swift Coder
2025-05-06 21:14:56 -05:00
committed by Daniel D’Aquino
parent d02847d466
commit e9c1671d06

View File

@@ -79,6 +79,7 @@ struct PostView: View {
var autoSaveModel: AutoSaveIndicatorView.AutoSaveViewModel var autoSaveModel: AutoSaveIndicatorView.AutoSaveViewModel
@State var preUploadedMedia: [PreUploadedMedia] = [] @State var preUploadedMedia: [PreUploadedMedia] = []
@State var mediaUploadUnderProgress: MediaUpload? = nil
@StateObject var image_upload: ImageUploadModel = ImageUploadModel() @StateObject var image_upload: ImageUploadModel = ImageUploadModel()
@StateObject var tagModel: TagModel = TagModel() @StateObject var tagModel: TagModel = TagModel()
@@ -330,11 +331,6 @@ struct PostView: View {
PostButton PostButton
} }
if let progress = image_upload.progress {
ProgressView(value: progress, total: 1.0)
.progressViewStyle(.linear)
}
Divider() Divider()
.foregroundColor(DamusColors.neutral3) .foregroundColor(DamusColors.neutral3)
.padding(.top, 5) .padding(.top, 5)
@@ -346,6 +342,7 @@ struct PostView: View {
@discardableResult @discardableResult
func handle_upload(media: MediaUpload) async -> Bool { func handle_upload(media: MediaUpload) async -> Bool {
mediaUploadUnderProgress = media
let uploader = damus_state.settings.default_media_uploader let uploader = damus_state.settings.default_media_uploader
let img = getImage(media: media) let img = getImage(media: media)
@@ -354,6 +351,7 @@ struct PostView: View {
async let blurhash = calculate_blurhash(img: img) async let blurhash = calculate_blurhash(img: img)
let res = await image_upload.start(media: media, uploader: uploader, mediaType: .normal, keypair: damus_state.keypair) let res = await image_upload.start(media: media, uploader: uploader, mediaType: .normal, keypair: damus_state.keypair)
mediaUploadUnderProgress = nil
switch res { switch res {
case .success(let url): case .success(let url):
guard let url = URL(string: url) else { guard let url = URL(string: url) else {
@@ -401,7 +399,10 @@ struct PostView: View {
} }
.id("post") .id("post")
PVImageCarouselView(media: $uploadedMedias, deviceWidth: deviceSize.size.width) PVImageCarouselView(media: $uploadedMedias,
mediaUnderProgress: $mediaUploadUnderProgress,
imageUploadModel: image_upload,
deviceWidth: deviceSize.size.width)
.onChange(of: uploadedMedias) { media in .onChange(of: uploadedMedias) { media in
post_changed(post: post, media: media) post_changed(post: post, media: media)
} }
@@ -620,6 +621,8 @@ struct PostView_Previews: PreviewProvider {
struct PVImageCarouselView: View { struct PVImageCarouselView: View {
@Binding var media: [UploadedMedia] @Binding var media: [UploadedMedia]
@Binding var mediaUnderProgress: MediaUpload?
@ObservedObject var imageUploadModel: ImageUploadModel
let deviceWidth: CGFloat let deviceWidth: CGFloat
@@ -667,6 +670,25 @@ struct PVImageCarouselView: View {
.padding(.bottom, 35) .padding(.bottom, 35)
} }
} }
if let mediaUP = mediaUnderProgress, let progress = imageUploadModel.progress {
ZStack {
// Media under upload-progress
Image(uiImage: getImage(media: mediaUP))
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: media.count == 0 ? deviceWidth * 0.8 : 250, height: media.count == 0 ? 400 : 250)
.cornerRadius(10)
.opacity(0.3)
.padding()
// Circle showing progress on top of media
Circle()
.trim(from: 0, to: CGFloat(progress))
.stroke(Color.damusPurple, lineWidth: 5.0)
.rotationEffect(.degrees(-90))
.frame(width: 30, height: 30)
.padding()
}
}
} }
.padding() .padding()
} }