75 lines
2.0 KiB
Plaintext
75 lines
2.0 KiB
Plaintext
@page "/novel/{NovelId}"
|
|
@using WebNovelPortal.AccessLayers
|
|
|
|
@if (Novel == null)
|
|
{
|
|
<h3>Loading...</h3>
|
|
}
|
|
else
|
|
{
|
|
<h3><a href="@Novel.Novel.Url">@(Novel.Novel.Title)</a></h3>
|
|
<h4>Author: <a href="@Novel.Novel.Author?.Url">@(Novel.Novel.Author?.Name ?? "Anonymous")</a></h4>
|
|
<h4>Date Posted: @Novel.Novel.DatePosted</h4>
|
|
<h4>Date Updated: @Novel.Novel.LastUpdated</h4>
|
|
<h4>Tags</h4>
|
|
<ul>
|
|
@foreach (var tag in Novel.Novel.Tags)
|
|
{
|
|
<li>@tag.TagValue</li>
|
|
}
|
|
</ul>
|
|
<h4>Chapters (Read <input @bind="currentLastChapter" /> / @Novel.Novel.Chapters.Count())</h4>
|
|
@if (currentLastChapter != originalLastChapter)
|
|
{
|
|
<button disabled="@awaitingRequest" @onclick="@UpdateLastReadChapter">Save</button>
|
|
}
|
|
<ol>
|
|
@foreach (var chapter in Novel.Novel.Chapters.OrderBy(i => i.ChapterNumber))
|
|
{
|
|
<li><a href="@chapter.Url">@chapter.Name</a></li>
|
|
}
|
|
</ol>
|
|
}
|
|
|
|
@code {
|
|
[Parameter]
|
|
public string? NovelId { get; set; }
|
|
[Inject]
|
|
public WebApiAccessLayer api { get; set; }
|
|
UserNovel? Novel { get; set; }
|
|
int originalLastChapter;
|
|
int currentLastChapter;
|
|
bool awaitingRequest;
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
await UpdateNovelDetails();
|
|
}
|
|
await base.OnAfterRenderAsync(firstRender);
|
|
}
|
|
|
|
private async Task UpdateNovelDetails()
|
|
{
|
|
Novel = await api.GetNovel(NovelId);
|
|
originalLastChapter = Novel.LastChapterRead;
|
|
currentLastChapter = originalLastChapter;
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task UpdateLastReadChapter()
|
|
{
|
|
SetAwaitingRequest(true);
|
|
await api.UpdateLastChapterRead(Novel.Novel, currentLastChapter);
|
|
await UpdateNovelDetails();
|
|
SetAwaitingRequest(false);
|
|
}
|
|
|
|
private void SetAwaitingRequest(bool enabled)
|
|
{
|
|
awaitingRequest = enabled;
|
|
StateHasChanged();
|
|
}
|
|
|
|
} |