@using NexusReader.UI.Shared.Components.Atoms @using NexusReader.UI.Shared.Services @using NexusReader.Application.Utilities @namespace NexusReader.UI.Shared.Components.Organisms @inject IReaderInteractionService InteractionService
@ScrollPercentage%
Postęp Checkpoints

Checkpoints Sekcji

@if (Checkpoints == null || !Checkpoints.Any()) {

Brak punktów kontrolnych w tym rozdziale.

} else {
@foreach (var cp in Checkpoints) { var isCurrent = cp == InteractionService.CurrentBlockId;
@cp.ToUpper() @(isCurrent ? "Aktualna sekcja" : "Przejdź do sekcji")
}
}
@code { [Parameter] public int ScrollPercentage { get; set; } [Parameter] public MobileReaderTab ActiveTab { get; set; } [Parameter] public EventCallback OnTabChanged { get; set; } [Parameter] public EventCallback OnAssistantClick { get; set; } [Parameter] public List Checkpoints { get; set; } = new(); private bool IsCheckpointsOpen { get; set; } public enum MobileReaderTab { Reader, Graph, Concepts } private double GetDashOffset() { // Circumference of r=16 is 2 * pi * 16 = 100.53 double circumference = 100.53; double progress = Math.Clamp(ScrollPercentage, 0, 100); return circumference - (progress / 100.0) * circumference; } private void ToggleCheckpoints() { IsCheckpointsOpen = !IsCheckpointsOpen; } private async Task SelectCheckpoint(string checkpointId) { IsCheckpointsOpen = false; // Scroll to the targeted block await InteractionService.RequestScrollToBlock(checkpointId); // Ensure user is on the text reading tab to see the scroll happen if (ActiveTab != MobileReaderTab.Reader) { await ChangeTab(MobileReaderTab.Reader); } } private async Task ChangeTab(MobileReaderTab tab) { if (OnTabChanged.HasDelegate) { await OnTabChanged.InvokeAsync(tab); } } private async Task HandleAssistantClick() { if (OnAssistantClick.HasDelegate) { await OnAssistantClick.InvokeAsync(); } } }