UI/MainMenu/HomePage.razor
@using Sandbox.UI;
@using Sandbox.UI.Navigation;
@using Sandbox;
@namespace Sandbox
@inherits Panel
@page "/"

<root>

	<div class="options">
	
		<div class="logo"><img src="/ui/logo.png" /></div>
		<div class="spacer" />
		@if ( IsInGameMenu )
		{
			<div class="item" onclick=@ResumeGame>Resume Game</div>
			<div class="spacer" />
		}
		<div class="item" onclick=@NavigateNewGame>Start New Game</div>
		<div class="item" onclick=@NavigateMultiplayer>Find Multiplayer Game</div>
		<div class="spacer" />
		<div class="item" onclick=@OpenOptions>Options</div>
		<div class="spacer" />
		@if ( IsInGameMenu )
		{
			<div class="item" onclick=@Disconnect>Disconnect</div>
		}
		<div class="item" onclick=@Quit>Quit</div>
	</div>

	@if ( NewsList.Count > 0 )
	{
		<div class="news">
			@if (!HideNews)
			{
				<div class="news-item" style="background-image: url('@CurrentNews.Media')">
					<div class="news-footer">
						<span class="news-title" onclick=@OpenNewsUrl>@CurrentNews.Title</span>
						<span class="news-summary">@CurrentNews.Summary</span>
					</div>
				</div>
			}
			<div class="news-dots">
				@for (int i = 0; i < NewsList.Count; i++)
				{
					var idx = i;
					<div class='dot @(idx == NewsIndex ? "selected" : "")' onclick=@(() => SelectNews(idx)) />
				}
				@if (!HideNews)
				{
					<div class="close-btn" onclick=@ToggleNews />
				}
			</div>
		</div>
	}

</root>

@code
{
	List<Sandbox.Services.News> NewsList { get; set; } = new();
	int NewsIndex { get; set; } = 0;
	bool HideNews { get; set; } = false;
	Sandbox.Services.News CurrentNews => NewsList.Count > 0 ? NewsList[NewsIndex] : null;
	MainMenuHost MenuHost => Ancestors.OfType<MainMenuHost>().FirstOrDefault() ?? MainMenuHost.Current;
	bool IsInGameMenu => MenuHost?.IsInGameMenu ?? false;

	protected override void OnAfterTreeRender( bool firstTime )
	{
		base.OnAfterTreeRender( firstTime );
		Style.Set( "position", "absolute" );
		Style.Set( "left", "0px" );
		Style.Set( "top", "0px" );
		Style.Set( "right", "0px" );
		Style.Set( "bottom", "0px" );

		if ( firstTime )
			_ = LoadNews();
	}

	async System.Threading.Tasks.Task LoadNews()
	{
		try
		{
			var posts = await Sandbox.Services.News.GetPackageNews( "softsplit.sandbox", 5 );
			if ( posts is null || posts.Length == 0 ) return;
			NewsList = posts.ToList();
			NewsIndex = 0;
			StateHasChanged();
		}
		catch { }
	}

	void SelectNews( int idx ) { HideNews = false; NewsIndex = idx; StateHasChanged(); }
	void ToggleNews() { HideNews = !HideNews; StateHasChanged(); }
	void ResumeGame() => MenuHost?.ResumeGame();
	void Disconnect() => MenuHost?.DisconnectToMainMenu();

	void OpenNewsUrl()
	{
		if ( CurrentNews is not null )
			Game.Overlay.ShowNewsModal( CurrentNews );
	}

	void NavigateNewGame() => this.GetNavigator()?.Navigate( "/newgame" );
	void NavigateMultiplayer() => Game.Overlay.ShowServerList( new Sandbox.Modals.ServerListConfig( "softsplit.sandbox" ) );
	void OpenOptions() => Game.Overlay.ShowSettingsModal();
	void Quit() => Game.Close();
}