Tusker/Tusker/Screens/Report/ReportAddStatusView.swift

103 lines
3.8 KiB
Swift

//
// ReportAddStatusView.swift
// Tusker
//
// Created by Shadowfacts on 1/14/23.
// Copyright © 2023 Shadowfacts. All rights reserved.
//
import SwiftUI
import Pachyderm
struct ReportAddStatusView: View {
@ObservedObject var report: EditedReport
let mastodonController: MastodonController
@Environment(\.dismiss) private var dismiss
@State private var statuses: [StatusMO]?
@State private var error: Error?
var body: some View {
statusesListIfLoaded
.navigationTitle("Add Posts")
}
@ViewBuilder
private var statusesListIfLoaded: some View {
if let statuses {
List {
ForEach(statuses, id: \.id) { status in
Button {
report.statusIDs.append(status.id)
dismiss()
} label: {
ReportStatusView(status: status, mastodonController: mastodonController)
}
}
.appGroupedListRowBackground()
}
.modifier(ScrollBackgroundModifier())
} else {
ZStack {
// because the background needs to fill the entire screen
Color.appGroupedBackground
.edgesIgnoringSafeArea(.all)
ProgressView()
.progressViewStyle(.circular)
.alertWithData("Error Loading Posts", data: $error, actions: { _ in
Button("OK") {}
}, message: { error in
Text(error.localizedDescription)
})
.task { @MainActor in
do {
let req = Account.getStatuses(report.accountID, range: .count(40), excludeReplies: false, excludeReblogs: true)
let (statuses, _) = try await mastodonController.run(req)
await mastodonController.persistentContainer.addAll(statuses: statuses)
self.statuses = statuses.compactMap { mastodonController.persistentContainer.status(for: $0.id) }
} catch {
self.error = error
}
}
}
}
}
}
private struct ScrollBackgroundModifier: ViewModifier {
@Environment(\.colorScheme) private var colorScheme
func body(content: Content) -> some View {
if #available(iOS 16.0, *) {
content
.scrollContentBackground(.hidden)
.background {
// otherwise the pureBlackDarkMode isn't propagated, for some reason?
// even though it is for ReportSelectRulesView??
let traits: UITraitCollection = {
var t = UITraitCollection(userInterfaceStyle: colorScheme == .dark ? .dark : .light)
#if os(visionOS)
t = t.modifyingTraits({ mutableTraits in
mutableTraits.pureBlackDarkMode = true
})
#else
if #available(iOS 17.0, *) {
t = t.modifyingTraits({ mutableTraits in
mutableTraits.pureBlackDarkMode = true
})
} else {
t.obsoletePureBlackDarkMode = true
}
#endif
return t
}()
Color(uiColor: .appGroupedBackground.resolvedColor(with: traits))
.edgesIgnoringSafeArea(.all)
}
} else {
content
}
}
}