// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. import SwiftUI import Combine import NaturalLanguage public struct ToastModifier: ViewModifier { @Binding var message: String? @State private var workItem: DispatchWorkItem? public func body(content: Content) -> some View { content .frame(maxWidth: .infinity, maxHeight: .infinity) .overlay( ZStack { mainToastView() }.animation(.spring(), value: message) ) .onReceive(Just(message)) { value in showToast() } } @ViewBuilder func mainToastView() -> some View { if let message: String = message { ToastView_SwiftUI(message) } } private func showToast() { workItem?.cancel() let task = DispatchWorkItem { dismissToast() } workItem = task let duration: TimeInterval = { guard let message: String = message else { return 1.5 } let tokenizer = NLTokenizer(unit: .word) tokenizer.string = message let wordCount = tokenizer.tokens(for: message.startIndex..