@code { [Parameter] public required string Source { get; set; } [Parameter] public string FallbackSource { get; set; } = "images/web/home/not_found_img_main.png"; // "images/web/home/no_img_main.gif"; [Parameter] public bool LazyLoading { get; set; } = true; [Parameter] public string? ContainerClass { get; set; } [Parameter] public string? OverlayClass { get; set; } [Parameter] public string? ImageClass { get; set; } private string? currentSource; private bool hasSourceErrored = false; private bool hasFallbackSourceErrored = false; private bool _isLoaded; private string? _lastSource; private string ContainerClassees => GetContainerClasses(); private string OverlayClasses => GetOverlayClasses(); private string ImageClasses => GetImageClasses(); private string? LoadingAttribute => LazyLoading ? "lazy" : null; protected override void OnParametersSet() { currentSource = Source; hasSourceErrored = false; hasFallbackSourceErrored = false; if (!string.Equals(_lastSource, Source, StringComparison.Ordinal)) { _lastSource = Source; _isLoaded = false; } } private string GetContainerClasses() { List classNames = ["j-image-container"]; if (!string.IsNullOrEmpty(ContainerClass)) { List customClassNames = ContainerClass .Split(" ") .Select(className => className.Trim()) .Where(className => !string.IsNullOrWhiteSpace(className)) .ToList(); classNames.AddRange(customClassNames); } return string.Join(" ", classNames); } private string GetOverlayClasses() { List classNames = ["j-image-overlay"]; if (!string.IsNullOrEmpty(OverlayClass)) { List customClassNames = OverlayClass .Split(" ") .Select(className => className.Trim()) .Where(className => !string.IsNullOrWhiteSpace(className)) .ToList(); classNames.AddRange(customClassNames); } return string.Join(" ", classNames); } private string GetImageClasses() { List classNames = ["j-image"]; if (!_isLoaded) { classNames.Add("j-lazy-load"); } if (!string.IsNullOrEmpty(ImageClass)) { List customClassNames = ImageClass .Split(" ") .Select(className => className.Trim()) .Where(className => !string.IsNullOrWhiteSpace(className)) .ToList(); classNames.AddRange(customClassNames); } return string.Join(" ", classNames); } private void OnImageLoaded() { _isLoaded = true; } private void OnImageError() { if (!hasSourceErrored && !string.IsNullOrEmpty(FallbackSource)) { hasSourceErrored = true; currentSource = FallbackSource; StateHasChanged(); } else if (!hasFallbackSourceErrored) { hasFallbackSourceErrored = true; currentSource = "images/web/home/not_found_img_main.png"; StateHasChanged(); } } }