mirror of
https://github.com/Dimillian/IceCubesApp.git
synced 2024-06-09 16:59:35 +00:00
Add a progress indicator when posting a new post
This commit is contained in:
parent
b7e8f63e86
commit
5c1f113c54
|
@ -44,6 +44,9 @@ extension StatusEditor {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStackLayout(spacing: 0) {
|
VStackLayout(spacing: 0) {
|
||||||
|
if mainSEVM.isPosting {
|
||||||
|
ProgressView(value: mainSEVM.postingProgress, total: 100.0)
|
||||||
|
}
|
||||||
EditorView(
|
EditorView(
|
||||||
viewModel: mainSEVM,
|
viewModel: mainSEVM,
|
||||||
followUpSEVMs: $followUpSEVMs,
|
followUpSEVMs: $followUpSEVMs,
|
||||||
|
|
|
@ -105,7 +105,6 @@ extension StatusEditor {
|
||||||
@discardableResult
|
@discardableResult
|
||||||
private func postStatus(with model: ViewModel, isMainPost: Bool) async -> Status? {
|
private func postStatus(with model: ViewModel, isMainPost: Bool) async -> Status? {
|
||||||
let status = await model.postStatus()
|
let status = await model.postStatus()
|
||||||
|
|
||||||
if status != nil, isMainPost {
|
if status != nil, isMainPost {
|
||||||
close()
|
close()
|
||||||
SoundEffectManager.shared.playSound(.tootSent)
|
SoundEffectManager.shared.playSound(.tootSent)
|
||||||
|
|
|
@ -87,7 +87,10 @@ extension StatusEditor {
|
||||||
var spoilerOn: Bool = false
|
var spoilerOn: Bool = false
|
||||||
var spoilerText: String = ""
|
var spoilerText: String = ""
|
||||||
|
|
||||||
|
var postingProgress: Double = 0.0
|
||||||
|
var postingTimer: Timer?
|
||||||
var isPosting: Bool = false
|
var isPosting: Bool = false
|
||||||
|
|
||||||
var mediaPickers: [PhotosPickerItem] = [] {
|
var mediaPickers: [PhotosPickerItem] = [] {
|
||||||
didSet {
|
didSet {
|
||||||
if mediaPickers.count > 4 {
|
if mediaPickers.count > 4 {
|
||||||
|
@ -185,6 +188,19 @@ extension StatusEditor {
|
||||||
func postStatus() async -> Status? {
|
func postStatus() async -> Status? {
|
||||||
guard let client else { return nil }
|
guard let client else { return nil }
|
||||||
do {
|
do {
|
||||||
|
if postingTimer == nil {
|
||||||
|
Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { timer in
|
||||||
|
Task { @MainActor in
|
||||||
|
if self.postingProgress < 100 {
|
||||||
|
self.postingProgress += 0.5
|
||||||
|
}
|
||||||
|
if self.postingProgress >= 100 {
|
||||||
|
self.postingTimer?.invalidate()
|
||||||
|
self.postingTimer = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
isPosting = true
|
isPosting = true
|
||||||
let postStatus: Status?
|
let postStatus: Status?
|
||||||
var pollData: StatusData.PollData?
|
var pollData: StatusData.PollData?
|
||||||
|
@ -204,20 +220,27 @@ extension StatusEditor {
|
||||||
switch mode {
|
switch mode {
|
||||||
case .new, .replyTo, .quote, .mention, .shareExtension:
|
case .new, .replyTo, .quote, .mention, .shareExtension:
|
||||||
postStatus = try await client.post(endpoint: Statuses.postStatus(json: data))
|
postStatus = try await client.post(endpoint: Statuses.postStatus(json: data))
|
||||||
if let postStatus {
|
|
||||||
StreamWatcher.shared.emmitPostEvent(for: postStatus)
|
|
||||||
}
|
|
||||||
case let .edit(status):
|
case let .edit(status):
|
||||||
postStatus = try await client.put(endpoint: Statuses.editStatus(id: status.id, json: data))
|
postStatus = try await client.put(endpoint: Statuses.editStatus(id: status.id, json: data))
|
||||||
if let postStatus {
|
|
||||||
StreamWatcher.shared.emmitEditEvent(for: postStatus)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
HapticManager.shared.fireHaptic(.notification(.success))
|
|
||||||
|
postingTimer?.invalidate()
|
||||||
|
postingTimer = nil
|
||||||
|
|
||||||
|
if let postStatus {
|
||||||
|
StreamWatcher.shared.emmitEditEvent(for: postStatus)
|
||||||
|
HapticManager.shared.fireHaptic(.notification(.success))
|
||||||
|
withAnimation {
|
||||||
|
postingProgress = 99.0
|
||||||
|
}
|
||||||
|
try await Task.sleep(for: .seconds(0.5))
|
||||||
|
}
|
||||||
|
|
||||||
if hasExplicitlySelectedLanguage, let selectedLanguage {
|
if hasExplicitlySelectedLanguage, let selectedLanguage {
|
||||||
preferences?.markLanguageAsSelected(isoCode: selectedLanguage)
|
preferences?.markLanguageAsSelected(isoCode: selectedLanguage)
|
||||||
}
|
}
|
||||||
isPosting = false
|
isPosting = false
|
||||||
|
|
||||||
return postStatus
|
return postStatus
|
||||||
} catch {
|
} catch {
|
||||||
if let error = error as? Models.ServerError {
|
if let error = error as? Models.ServerError {
|
||||||
|
|
|
@ -280,8 +280,8 @@ import SwiftUI
|
||||||
|
|
||||||
func delete() async {
|
func delete() async {
|
||||||
do {
|
do {
|
||||||
_ = try await client.delete(endpoint: Statuses.status(id: status.id))
|
|
||||||
StreamWatcher.shared.emmitDeleteEvent(for: status.id)
|
StreamWatcher.shared.emmitDeleteEvent(for: status.id)
|
||||||
|
_ = try await client.delete(endpoint: Statuses.status(id: status.id))
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import SwiftUI
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
public struct StatusRowMediaPreviewView: View {
|
public struct StatusRowMediaPreviewView: View {
|
||||||
|
@Environment(\.isPresented) private var isPresented
|
||||||
@Environment(\.openWindow) private var openWindow
|
@Environment(\.openWindow) private var openWindow
|
||||||
@Environment(\.extraLeadingInset) private var extraLeadingInset: CGFloat
|
@Environment(\.extraLeadingInset) private var extraLeadingInset: CGFloat
|
||||||
@Environment(\.isCompact) private var isCompact: Bool
|
@Environment(\.isCompact) private var isCompact: Bool
|
||||||
|
@ -31,7 +32,11 @@ public struct StatusRowMediaPreviewView: View {
|
||||||
{
|
{
|
||||||
return sceneDelegate.windowWidth * 0.80
|
return sceneDelegate.windowWidth * 0.80
|
||||||
}
|
}
|
||||||
return sceneDelegate.windowWidth
|
if isPresented && UIDevice.current.userInterfaceIdiom == .pad {
|
||||||
|
return sceneDelegate.windowWidth * 0.50
|
||||||
|
} else {
|
||||||
|
return sceneDelegate.windowWidth
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue