@inherits LayoutComponentBase @using NexusReader.Application.Abstractions.Services @using NexusReader.UI.Shared.Services @using NexusReader.UI.Shared.Models @using NexusReader.UI.Shared.Components.Molecules @using NexusReader.UI.Shared.Components.Organisms @using NexusReader.Application.Queries.Graph @using Microsoft.Extensions.Logging @inject IPlatformService PlatformService @inject IFocusModeService FocusMode @inject IQuizStateService QuizService @inject IReaderInteractionService InteractionService @inject IReaderStateService StateService @inject IKnowledgeGraphService GraphService @inject IJSRuntime JS @inject IIdentityService IdentityService @inject NavigationManager NavigationManager @inject Microsoft.Extensions.Logging.ILogger Logger @implements IAsyncDisposable
@Body
@if (!_isMobile) {
Asystent AI
@if (_activeTab == SidebarTab.Knowledge) {
Contextual Intelligence Panel
@if (_selectedNode != null) {
@(_selectedNode.Group.ToUpper())

@_selectedNode.Label

@if (!string.IsNullOrEmpty(_selectedNode.Description)) {

@_selectedNode.Description

} @if (!string.IsNullOrEmpty(_selectedNode.Summary)) {

Podsumowanie

@_selectedNode.Summary

} @if (_selectedNode.KeyTerms != null && _selectedNode.KeyTerms.Any()) {

Kluczowe Pojęcia

    @foreach (var term in _selectedNode.KeyTerms) {
  • @term
  • }
}
} else {

Wybierz węzeł na wykresie, aby wyświetlić szczegóły architektoniczne.

}
} else {
}
} else {
@if (_activeTab == SidebarTab.Knowledge) {
@if (_selectedNode != null) {
@(_selectedNode.Group.ToUpper())

@_selectedNode.Label

@if (!string.IsNullOrEmpty(_selectedNode.Description)) {

@_selectedNode.Description

} @if (!string.IsNullOrEmpty(_selectedNode.Summary)) {

Podsumowanie

@_selectedNode.Summary

} @if (_selectedNode.KeyTerms != null && _selectedNode.KeyTerms.Any()) {

Kluczowe Pojęcia

    @foreach (var term in _selectedNode.KeyTerms) {
  • @term
  • }
}
} else {

Wybierz pojęcie na wykresie, aby wyświetlić jego podsumowanie.

}
} else {
}
}
Weryfikacja...
An unhandled error has occurred. Reload 🗙
@code { private enum SidebarTab { Knowledge, Quiz } private SidebarTab _activeTab = SidebarTab.Knowledge; private string? _selectedNodeId; private GraphNodeDto? _selectedNode; private string _platformClass = "platform-desktop"; private bool _isMobile = false; private DotNetObjectReference? _selfReference; private IJSObjectReference? _viewportModule; private bool _isAssistantOpen; private int _scrollPercentage { get => StateService.CurrentScrollPercentage; set => StateService.CurrentScrollPercentage = value; } private MobileReaderTab _activeMobileTab { get => StateService.ActiveTab; set => StateService.ActiveTab = value; } protected override void OnInitialized() { FocusMode.OnFocusModeChanged += HandleUpdate; QuizService.OnQuizUpdated += HandleUpdate; QuizService.OnQuizRequested += HandleQuizRequestedAsync; InteractionService.OnNodeSelected += HandleNodeSelectedAsync; InteractionService.OnAssistantRequested += HandleAssistantRequestedAsync; InteractionService.OnScrollPercentChanged += HandleScrollPercentChanged; GraphService.OnGraphUpdated += HandleGraphUpdatedAsync; var context = PlatformService.GetDeviceContext(); if (context.IsSuccess) { _isMobile = context.Value.DeviceType switch { DeviceType.Phone or DeviceType.Tablet => true, _ => false }; _platformClass = _isMobile ? "platform-mobile" : "platform-desktop"; } } private void SetActiveTab(SidebarTab tab) { _activeTab = tab; StateHasChanged(); } private void SetMobileTab(MobileReaderTab tab) { _activeMobileTab = tab; StateHasChanged(); } private void OpenAssistant() { _isAssistantOpen = true; StateHasChanged(); } private void CloseAssistant() { _isAssistantOpen = false; StateHasChanged(); } private async Task HandleScrollPercentChanged(int percent) { _scrollPercentage = percent; await InvokeAsync(StateHasChanged); } private async Task HandleQuizRequestedAsync(string blockId) { _activeTab = SidebarTab.Quiz; if (_isMobile) { _activeMobileTab = MobileReaderTab.Concepts; } await InvokeAsync(StateHasChanged); } private async Task HandleAssistantRequestedAsync() { if (_isMobile) { OpenAssistant(); } else { _activeMobileTab = MobileReaderTab.Concepts; _activeTab = SidebarTab.Quiz; } await InvokeAsync(StateHasChanged); } private async Task HandleNodeSelectedAsync(string nodeId) { _selectedNodeId = nodeId; if (GraphService.CurrentGraphData != null) { _selectedNode = GraphService.CurrentGraphData.Nodes.FirstOrDefault(n => n.Id == nodeId); } if (_isMobile) { _activeMobileTab = MobileReaderTab.Concepts; _activeTab = SidebarTab.Knowledge; } await InvokeAsync(StateHasChanged); } private async Task HandleGraphUpdatedAsync() { _selectedNodeId = null; _selectedNode = null; await InvokeAsync(StateHasChanged); } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { try { var module = await JS.InvokeAsync("import", "./_content/NexusReader.UI.Shared/js/layoutResizer.js"); await module.InvokeVoidAsync("initResizer", ".app-container", "#sidebar-resizer", "--sidebar-width"); } catch (Exception ex) { Logger.LogError(ex, "Failed to initialize layout resizer JS module."); } try { _viewportModule = await JS.InvokeAsync("import", "./_content/NexusReader.UI.Shared/js/viewport.js"); await InitViewportDetectionAsync(); } catch (Exception ex) { Logger.LogError(ex, "Failed to import viewport utilities JS module."); } } } private async Task InitViewportDetectionAsync() { if (_viewportModule == null) return; try { _selfReference = DotNetObjectReference.Create(this); var isMobileViewport = await _viewportModule.InvokeAsync("isMobileViewport"); await OnViewportChanged(isMobileViewport); await _viewportModule.InvokeVoidAsync("registerViewportObserver", _selfReference); } catch (Exception ex) { Logger.LogWarning(ex, "Failed to initialize viewport detection."); } } [JSInvokable] public async Task OnViewportChanged(bool isMobile) { if (_isMobile != isMobile) { _isMobile = isMobile; _platformClass = _isMobile ? "platform-mobile" : "platform-desktop"; await InvokeAsync(StateHasChanged); } } private Task HandleUpdate() => InvokeAsync(StateHasChanged); public async ValueTask DisposeAsync() { FocusMode.OnFocusModeChanged -= HandleUpdate; QuizService.OnQuizUpdated -= HandleUpdate; QuizService.OnQuizRequested -= HandleQuizRequestedAsync; InteractionService.OnNodeSelected -= HandleNodeSelectedAsync; InteractionService.OnAssistantRequested -= HandleAssistantRequestedAsync; InteractionService.OnScrollPercentChanged -= HandleScrollPercentChanged; GraphService.OnGraphUpdated -= HandleGraphUpdatedAsync; try { if (_viewportModule != null) { if (_selfReference != null) { await _viewportModule.InvokeVoidAsync("unregisterViewportObserver", _selfReference); } await _viewportModule.DisposeAsync(); } } catch (Exception ex) { Logger.LogDebug(ex, "Teardown of viewport observer module failed during component disposal."); } _selfReference?.Dispose(); } }