UI/MapLoadingScreen.razor

A UI Razor component for a map loading screen. It shows a backdrop, scrim, spinner, and status label, and fetches package metadata (title and thumbnail) asynchronously to update the displayed title and background image.

Networking
@using System.Threading.Tasks;
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Sandbox

<root>
	<div class="backdrop" style="@BackdropStyle"></div>
	<div class="scrim"></div>
	<div class="content">
		<label class="title">@MapTitle</label>
		<div class="spinner"></div>
		<label class="status">Loading map...</label>
	</div>
</root>

@code
{
	private string MapIdent { get; set; } = "";
	private string MapTitle { get; set; } = "Loading";
	private string BackgroundUrl { get; set; } = "";

	private string BackdropStyle => string.IsNullOrEmpty( BackgroundUrl )
		? ""
		: $"background-image: url( {BackgroundUrl} )";

	public void Show( string mapIdent )
	{
		MapIdent = mapIdent ?? "";
		MapTitle = string.IsNullOrWhiteSpace( MapIdent ) ? "Loading" : MapIdent;
		BackgroundUrl = "";
		StateHasChanged();
		_ = FetchMapArtAsync( MapIdent );
	}

	private async Task FetchMapArtAsync( string mapIdent )
	{
		if ( string.IsNullOrWhiteSpace( mapIdent ) )
			return;

		var package = await Package.FetchAsync( mapIdent, false );
		if ( package is null || MapIdent != mapIdent )
			return;

		MapTitle = string.IsNullOrWhiteSpace( package.Title ) ? mapIdent : package.Title;
		BackgroundUrl = package.Thumb ?? "";
		StateHasChanged();
	}

	protected override int BuildHash() => System.HashCode.Combine( MapIdent, MapTitle, BackgroundUrl );
}