using System; using System.Collections; using System.Collections.Generic; using System.Reactive; using System.Threading.Tasks; using System.Windows.Input; using Avalonia.Controls; using Avalonia.Input; using DynamicData.Binding; using FrontendAvalonia.Models; using FrontendAvalonia.Services.GamenightApi; using ReactiveUI; namespace FrontendAvalonia.ViewModels; public class MainViewModel : PageViewModelBase { private GamenightModel GamenightModel { get; } private List _MenuItems = new(); public List MenuItems { get => _MenuItems; set => this.RaiseAndSetIfChanged(ref _MenuItems, value); } public IGamenight? Gamenight { get; } private LoginViewModel LoginViewModel { get; } private GamenightsViewModel GamenightsViewModel { get; } public MainViewModel(IScreen screen, GamenightModel gamenightModel, IGamenight gamenight, LoginViewModel loginViewModel, GamenightsViewModel gamenightsViewModel) :base(screen) { GamenightModel = gamenightModel; MenuItems = new List(); Gamenight = gamenight; LoginViewModel = loginViewModel; GamenightsViewModel = gamenightsViewModel; gamenightModel.WhenAnyValue(m => m.UserToken).Subscribe(CreateMenuItems); } private Task NavigateToLoginPage() { return Task.FromResult(HostScreen.Router.Navigate.Execute(LoginViewModel)); } private Task NavigateToGamenightsPage() { return Task.FromResult(HostScreen.Router.NavigateAndReset.Execute(GamenightsViewModel)); } private void CreateMenuItems(string? userToken) { if (userToken != null) { MenuItems = new List { new() { Header = "_Logout", Command = ReactiveCommand.Create(async () => { GamenightModel.UserToken = null; await NavigateToGamenightsPage(); }), CommandParameter = null!, Items = new List(), } }; } else { MenuItems = new List { new() { Header = "_Login", Command = ReactiveCommand.CreateFromTask(NavigateToLoginPage), CommandParameter = null!, Items = new List(), } }; } } // The command that navigates a user back. public ReactiveCommand GoBack => HostScreen.Router.NavigateBack; }