@page "/my-books" @attribute [Authorize] @implements IDisposable @using NexusReader.UI.Shared.Components.Organisms @using NexusReader.Application.DTOs.User @using NexusReader.UI.Shared.Services @using Microsoft.Extensions.Logging @using System.Net.Http.Json @inject HttpClient Http @inject IReaderNavigationService ReaderNavigation @inject ILibraryStateService LibraryStateService @inject ILogger Logger

Moje Książki

Twoje aktywne lektury i postępy w nauce z Nexus AI

@if (_isLoading) {
Wczytywanie biblioteki...
@for (int i = 0; i < 3; i++) {
}
} else if (_books == null || !_books.Any()) {

Pusta biblioteka

Nie masz jeszcze żadnych książek na swojej półce. Przejdź do katalogu, aby rozpocząć kurs.

Przeglądaj Katalog
} else {
@foreach (var book in _books) {
@book.Title
Czytaj teraz

@book.Title

@book.Author.Name

@if (book.Progress > 0) {
Postęp: @(book.Progress.ToString("F0"))% (@book.LastChapter)
} else { Nowa }
}
}
@code { private bool _isModalOpen; private bool _isLoading = true; private List? _books; protected override void OnInitialized() { LibraryStateService.OnBooksChanged += HandleBooksChanged; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await LoadBooksAsync(); } } private void HandleBooksChanged() { _ = InvokeAsync(LoadBooksAsync); } private async Task LoadBooksAsync() { _isLoading = true; StateHasChanged(); try { _books = await Http.GetFromJsonAsync>("api/library/books"); _isLoading = false; } catch (Exception ex) { Logger.LogError(ex, "[MyBooks] Failed to load books."); if (OperatingSystem.IsBrowser()) { _isLoading = false; } } finally { StateHasChanged(); } } private async Task RefreshLibrary() { await LoadBooksAsync(); } private void OpenBook(Guid bookId) { ReaderNavigation.NavigateToBook(bookId); } public void Dispose() { LibraryStateService.OnBooksChanged -= HandleBooksChanged; } }