gamenight/FrontendAvalonia/FrontendAvalonia/ViewModels/MainViewModel.cs

93 lines
2.7 KiB
C#

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<MenuItemViewModel> _MenuItems = new();
public List<MenuItemViewModel> 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<MenuItemViewModel>();
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<MenuItemViewModel>
{
new()
{
Header = "_Logout",
Command = ReactiveCommand.Create(async () =>
{
GamenightModel.UserToken = null;
await NavigateToGamenightsPage();
}),
CommandParameter = null!,
Items = new List<MenuItemViewModel>(),
}
};
}
else
{
MenuItems = new List<MenuItemViewModel>
{
new()
{
Header = "_Login",
Command = ReactiveCommand.CreateFromTask(NavigateToLoginPage),
CommandParameter = null!,
Items = new List<MenuItemViewModel>(),
}
};
}
}
// The command that navigates a user back.
public ReactiveCommand<Unit, IRoutableViewModel?> GoBack => HostScreen.Router.NavigateBack;
}