//Copyright(c) Alessandro Ghidini.All rights reserved. //Changes and improvements Copyright (c) The MudBlazor Team. using System.Diagnostics; using static System.String; namespace Connected.Components; internal class SnackBarMessageState { private string AnimationId { get; } public bool UserHasInteracted { get; set; } public SnackbarOptions Options { get; } public SnackbarState SnackbarState { get; set; } public Stopwatch Stopwatch { get; } = new Stopwatch(); public SnackBarMessageState(SnackbarOptions options) { Options = options; AnimationId = $"snackbar-{Guid.NewGuid()}"; SnackbarState = SnackbarState.Init; } private string Opacity => ((decimal)Options.MaximumOpacity / 100).ToPercentage(); public bool ShowActionButton => !IsNullOrWhiteSpace(Options.Action); public bool ShowCloseIcon => Options.ShowCloseIcon; public bool HideIcon => Options.HideIcon; public string Icon => Options.Icon; public ThemeColor IconColor => Options.IconColor; public Size IconSize => Options.IconSize; public string ProgressBarStyle { get { var duration = RemainingTransitionMilliseconds(Options.VisibleStateDuration); return $"width:100;animation:{AnimationId} {duration}ms;"; } } public string AnimationStyle { get { const string Template = "opacity: {0}; animation: {1}ms linear {2};"; switch (SnackbarState) { case SnackbarState.Showing: var showingDuration = RemainingTransitionMilliseconds(Options.ShowTransitionDuration); return Format(Template, Opacity, showingDuration, AnimationId); case SnackbarState.Hiding: var hidingDuration = RemainingTransitionMilliseconds(Options.HideTransitionDuration); return Format(Template, 0, hidingDuration, AnimationId); case SnackbarState.Visible: return $"opacity: {Opacity};"; default: return Empty; } } } public string SnackbarClass { get { var result = $"mud-snackbar {Options.SnackbarTypeClass}"; if (Options.Onclick != null && !ShowActionButton) result += " force-cursor"; return result; } } public string TransitionClass { get { var template = "@keyframes " + AnimationId + " {{from{{ {0}: {1}; }} to{{ {0}: {2}; }}}}"; return SnackbarState switch { SnackbarState.Showing => Format(template, "opacity", "0%", Opacity), SnackbarState.Hiding => Format(template, "opacity", Opacity, "0%"), SnackbarState.Visible => Format(template, "width", "100%", "0%"), _ => Empty, }; } } private int RemainingTransitionMilliseconds(int transitionDuration) { var duration = transitionDuration - (int)Stopwatch.ElapsedMilliseconds; return duration >= 0 ? duration : 0; } }