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.
@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 );
}