LANCommander/LANCommander.Server/UI/Pages/Settings/Updates.razor

144 lines
4.8 KiB
Text

@page "/Settings/Updates"
@using LANCommander.Server.Services.Abstractions
@using Markdig
@using Octokit
@using Semver
@inject IMessageService MessageService
@inject UpdateService UpdateService
@inject IGitHubService GitHubService
@inject IVersionProvider VersionProvider
@inject ILogger<Updates> Logger
@attribute [Authorize(Roles = RoleService.AdministratorRoleName)]
<PageHeader Title="Updates">
<PageHeaderExtra>
<Flex Justify="FlexJustify.End" Align="FlexAlign.Center" Gap="FlexGap.Small">
Release Channel:
<EnumSelect TEnum="ReleaseChannel" OnSelectedItemChanged="ReleaseChannelChanged" @bind-Value="Settings.Update.ReleaseChannel" Disabled="Loading" />
<Button Type="@ButtonType.Primary" OnClick="Update" Disabled="@(!UpdateAvailable || Updating)" Loading="Updating">Update</Button>
</Flex>
</PageHeaderExtra>
</PageHeader>
<PageContent>
<Flex Direction="FlexDirection.Vertical" Gap="FlexGap.Small">
@if (!Loading && !UpdateAvailable)
{
<Alert Type="@AlertType.Success" Message="You are on the latest version!" ShowIcon="true" />
}
else if (!Loading && UpdateAvailable)
{
<Alert Type="@AlertType.Info" Message="A newer version of LANCommander is available" ShowIcon="true" />
}
else
{
<Alert Type="@AlertType.Warning" Message="Loading release information..." ShowIcon="true" />
}
@if (Releases != null && Releases.Count() > 0)
{
foreach (var release in Releases)
{
<Card Title="@release.Name">
<TitleTemplate>
@release.Name <span style="font-size: 70%; margin-right: 6px;">@release.PublishedAt.GetValueOrDefault().ToString("MMMM d yyyy")</span>
@if (Releases.First().Equals(release))
{
<Tag Color="@PresetColor.Gold.ToString()">Latest</Tag>
}
@if (release.TagName == $"v{CurrentVersion}")
{
<Tag Color="@PresetColor.Blue.ToString()">Current</Tag>
}
</TitleTemplate>
<Extra>
<a href="@release.HtmlUrl" target="_blank">View Release</a>
</Extra>
<Body>
@((MarkupString)Markdown.ToHtml(release.Body))
</Body>
</Card>
}
}
else
{
for (var i = 0; i < 5; i++)
{
<Card Loading="true" Style="width: 100%;"></Card>
}
}
</Flex>
</PageContent>
@code {
Settings Settings = SettingService.GetSettings();
string RootPath = Path.GetPathRoot(Directory.GetCurrentDirectory());
bool Loading { get; set; } = true;
bool Updating { get; set; } = false;
bool UpdateAvailable { get; set; } = false;
SemVersion LatestVersion { get; set; }
SemVersion CurrentVersion { get; set; }
IEnumerable<Release> Releases { get; set; } = new List<Release>();
protected override async Task OnInitializedAsync()
{
await CheckForUpdate();
}
async Task CheckForUpdate()
{
Loading = true;
await InvokeAsync(StateHasChanged);
await Task.Yield();
CurrentVersion = VersionProvider.GetCurrentVersion();
UpdateAvailable = await UpdateService.UpdateAvailableAsync();
LatestVersion = await GitHubService.GetLatestVersionAsync(Settings.Update.ReleaseChannel);
Releases = await GitHubService.GetReleasesAsync(5);
Loading = false;
await InvokeAsync(StateHasChanged);
await Task.Yield();
}
async Task ReleaseChannelChanged(ReleaseChannel releaseChannel)
{
if (!Loading)
{
Settings = SettingService.GetSettings();
Settings.Update.ReleaseChannel = releaseChannel;
SettingService.SaveSettings(Settings);
MessageService.Success($"Changed release channel to {releaseChannel}!");
}
}
async Task Update()
{
try {
Updating = true;
if (Settings.Launcher.HostUpdates)
await UpdateService.DownloadLauncherReleaseAsync(Releases.First());
await UpdateService.DownloadServerReleaseAsync(Releases.First());
}
catch (NotImplementedException ex) {
MessageService.Error(ex.Message);
Logger.LogError(ex, "An unknown error occurred.");
}
catch (Exception ex)
{
MessageService.Error("An unknown error occurred while updating. Please check the logs");
Logger.LogError(ex, "An unknown error occurred.");
}
}
}