using System.Windows.Media.Animation; using System.Windows.Threading; namespace Melskin.Controls; #region Internal Implementation internal class ToastManager(IToastHost host) : IToastService { public void Show(string message, ToastType type, TimeSpan? duration = null) { Application.Current.Dispatcher.Invoke(() => { var toast = new ToastControl { Message = message, Type = type }; var fadeInAnim = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(350)); var timer = new DispatcherTimer { Interval = duration ?? TimeSpan.FromSeconds(4) }; timer.Tick += (_, _) => { timer.Stop(); var fadeOutAnim = new DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(350)); fadeOutAnim.Completed += (_, _) => host.RemoveToast(toast); toast.BeginAnimation(UIElement.OpacityProperty, fadeOutAnim); }; toast.Loaded += (_, _) => { toast.BeginAnimation(UIElement.OpacityProperty, fadeInAnim); timer.Start(); }; host.AddToast(toast); }); } public void ShowSuccess(string message, TimeSpan? duration = null) => Show(message, ToastType.Success, duration); public void ShowError(string message, TimeSpan? duration = null) => Show(message, ToastType.Error, duration); public void ShowWarning(string message, TimeSpan? duration = null) => Show(message, ToastType.Warning, duration); public void ShowInfo(string message, TimeSpan? duration = null) => Show(message, ToastType.Info, duration); } #endregion