73 lines
1.8 KiB
Swift
73 lines
1.8 KiB
Swift
import Models
|
|
import Services
|
|
import SwiftUI
|
|
import Views
|
|
import Transmission
|
|
|
|
@MainActor public struct PrimaryContentView: View {
|
|
@State var showSnackbar = false
|
|
@State var snackbarMessage: String?
|
|
@State var snackbarUndoAction: (() -> Void)?
|
|
|
|
@State private var snackbarTimer: Timer?
|
|
|
|
public var body: some View {
|
|
ZStack {
|
|
WindowLink(level: .alert, transition: .move(edge: .bottom), isPresented: $showSnackbar) {
|
|
InformationalSnackbar(message: snackbarMessage, undoAction: snackbarUndoAction)
|
|
} label: {
|
|
EmptyView()
|
|
}.buttonStyle(.plain)
|
|
|
|
innerBody
|
|
}
|
|
.onReceive(NSNotification.snackBarPublisher) { notification in
|
|
if let message = notification.userInfo?["message"] as? String {
|
|
snackbarUndoAction = notification.userInfo?["undoAction"] as? (() -> Void)
|
|
snackbarMessage = message
|
|
showSnackbar = true
|
|
|
|
let dismissAfter = notification.userInfo?["dismissAfter"] as? Int ?? 2000
|
|
if snackbarTimer == nil {
|
|
startTimer(amount: dismissAfter)
|
|
} else {
|
|
increaseTimeout(amount: dismissAfter)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public var innerBody: some View {
|
|
#if os(iOS)
|
|
if UIDevice.isIPad {
|
|
return AnyView(
|
|
LibrarySplitView()
|
|
)
|
|
} else {
|
|
return AnyView(
|
|
LibraryTabView()
|
|
)
|
|
}
|
|
#else
|
|
return AnyView(splitView)
|
|
#endif
|
|
}
|
|
|
|
func startTimer(amount: Int) {
|
|
self.snackbarTimer = Timer.scheduledTimer(withTimeInterval: TimeInterval(amount / 1000), repeats: false) { _ in
|
|
DispatchQueue.main.async {
|
|
self.showSnackbar = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func stopTimer() {
|
|
snackbarTimer?.invalidate()
|
|
}
|
|
|
|
func increaseTimeout(amount: Int) {
|
|
stopTimer()
|
|
startTimer(amount: amount)
|
|
}
|
|
}
|