Advertisement
periclase_software

Untitled

Jan 15th, 2025
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.37 KB | None | 0 0
  1.  
  2. import SwiftUI
  3.  
  4. struct ToastViewModifier: ViewModifier {
  5.    
  6.     @Binding var message: String?
  7.     var style: Toast.Style
  8.     var alignment: Alignment
  9.    
  10.     @State private var workItem: DispatchWorkItem?
  11.    
  12.     func body(content: Content) -> some View {
  13.         content
  14.             .overlay(alignment: alignment) {
  15.                 ZStack {
  16.                     toastView
  17.                 }
  18.                 .animation(.bouncy, value: message)
  19.             }
  20.             .onChange(of: message) { _, _ in
  21.                 showToast()
  22.             }
  23.     }
  24.    
  25.     @ViewBuilder private var toastView: some View {
  26.         if let message {
  27.             Toast(message: message, style: style)
  28.         }
  29.     }
  30.    
  31.     private func showToast() {
  32.         workItem?.cancel()
  33.         let item = DispatchWorkItem {
  34.             withAnimation {
  35.                 self.message = nil
  36.             }
  37.             workItem?.cancel()
  38.             workItem = nil
  39.         }
  40.         workItem = item
  41.         DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: item)
  42.     }
  43. }
  44.  
  45. extension View {
  46.    
  47.     func toast(message: Binding<String?>,
  48.                style: Toast.Style = .default,
  49.                alignment: Alignment = .center) -> some View {
  50.         modifier(
  51.             ToastViewModifier(message: message, style: style, alignment: alignment)
  52.         )
  53.     }
  54. }
  55.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement