NewDocV1
This commit is contained in:
+95
@@ -0,0 +1,95 @@
|
||||
# NexusButton
|
||||
|
||||
- File ID: file:1bp3my2:nexusbutton-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Atoms/NexusButton.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A small reusable Blazor button component that renders a <button>, forwards arbitrary attributes, binds a click callback, and supports disabling and child content.
|
||||
|
||||
## Key Details
|
||||
|
||||
Very small presentational Blazor button component: forwards attributes, projects child content, exposes an EventCallback for click handling, and supports disabled state.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Render (component markup): Renders the button element, binds the click event to the passed-in EventCallback, applies Disabled and additional attributes, and renders ChildContent.
|
||||
- NexusButton parameters (component props): Represents the publicly configurable properties for the NexusButton component.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- call-target: unknown
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 2
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (component markup): 7 nodes, 6 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusButton Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1bp3my2_nexusbutton_razor("NexusButton")
|
||||
method_4skxop_render_component_markup[["Render (component markup)"]]
|
||||
type_120koss_nexusbutton_parameters_component_props[/"NexusButton parameters (component props)"/]
|
||||
```
|
||||
|
||||
### NexusButton Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_1bp3my2_nexusbutton_razor("NexusButton")
|
||||
method_4skxop_render_component_markup[["Render (component markup)"]]
|
||||
unresolved_unresolved_1mzosp3_call_target{"Unresolved: OnClick (EventCallback)"}
|
||||
file_1bp3my2_nexusbutton_razor -->|contains| method_4skxop_render_component_markup
|
||||
method_4skxop_render_component_markup -->|unresolved call| unresolved_unresolved_1mzosp3_call_target
|
||||
```
|
||||
|
||||
### Render (component markup)() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_4skxop_render_component_markup__call_1_OnClick_EventCallback_[["OnClick (EventCallback)"]]
|
||||
method_4skxop_render_component_markup__action_1_attribute_propagation_1__linear("capture unmatched attributes")
|
||||
method_4skxop_render_component_markup__action_1_state_binding_1__linear("disabled state")
|
||||
method_4skxop_render_component_markup__action_1_ui_binding_1__linear("click binding")
|
||||
method_4skxop_render_component_markup__action_2_render_2__linear("child content projection")
|
||||
method_4skxop_render_component_markup__entry(["Render (component markup) entry"])
|
||||
method_4skxop_render_component_markup__implicit_return(["return"])
|
||||
method_4skxop_render_component_markup__action_1_attribute_propagation_1__linear -->|MouseEventArgs from the click event passed by Blazor runtime| method_4skxop_render_component_markup__call_1_OnClick_EventCallback_
|
||||
method_4skxop_render_component_markup__action_1_state_binding_1__linear -->|next| method_4skxop_render_component_markup__action_1_ui_binding_1__linear
|
||||
method_4skxop_render_component_markup__action_1_ui_binding_1__linear -->|next| method_4skxop_render_component_markup__action_1_attribute_propagation_1__linear
|
||||
method_4skxop_render_component_markup__action_2_render_2__linear -->|return| method_4skxop_render_component_markup__implicit_return
|
||||
method_4skxop_render_component_markup__call_1_OnClick_EventCallback_ -->|next| method_4skxop_render_component_markup__action_2_render_2__linear
|
||||
method_4skxop_render_component_markup__entry -->|next| method_4skxop_render_component_markup__action_1_state_binding_1__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
# NexusIcon
|
||||
|
||||
- File ID: file:q8opk3:nexusicon-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI component that renders an SVG icon by name; maps a string Name to concrete SVG paths and exposes common component parameters (Size, Class, AdditionalAttributes).
|
||||
|
||||
## Key Details
|
||||
|
||||
Rendering is entirely switch-driven on a normalized Name value; supports attribute passthrough and CSS/size customization; default fallback circle ensures a visible SVG if the name is unrecognized.
|
||||
|
||||
## Symbols
|
||||
|
||||
- NexusIcon: Razor UI component that renders an SVG icon by name; maps a string Name to concrete SVG paths and exposes common component parameters (Size, Class, AdditionalAttributes).
|
||||
- Render (Razor template / component render): Renders an <svg> element and selects SVG child elements based on the lowercase Name parameter; merges additional attributes into the svg element.
|
||||
- NexusIcon (component parameters): Component parameter definitions that control which icon is rendered and how (size, css class, extra attributes).
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (Razor template / component render): 20 nodes, 23 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusIcon Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_rzlm6n_nexusicon("NexusIcon")
|
||||
file_q8opk3_nexusicon_razor("NexusIcon")
|
||||
method_viikop_render_razor_template_component_render[["Render (Razor template / component render)"]]
|
||||
type_1wz8rxq_nexusicon_component_parameters[/"NexusIcon (component parameters)"/]
|
||||
```
|
||||
|
||||
### NexusIcon Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_rzlm6n_nexusicon("NexusIcon")
|
||||
method_viikop_render_razor_template_component_render[["Render (Razor template / component render)"]]
|
||||
class_rzlm6n_nexusicon -->|contains| method_viikop_render_razor_template_component_render
|
||||
```
|
||||
|
||||
### Render (Razor template / component render)() Control Flow
|
||||
|
||||
_Warnings: diagram method_viikop_render_razor_template_component_render__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 23 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_viikop_render_razor_template_component_render__action_1_attribute_merge_1__linear("Merge AdditionalAttributes into svg element via @attributes")
|
||||
method_viikop_render_razor_template_component_render__action_1_parameter_usage_1__linear("Use Size parameter for svg width/height")
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__condition{"Name.ToLowerInvariant() matches specific icon keys"}
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__false("map (lines 8-12)")
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__merge("merge")
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__true("home (lines 4-7)")
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__case_0("case")
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch{"Name.ToLowerInvariant()"}
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch_merge("merge")
|
||||
method_viikop_render_razor_template_component_render__action_2_transformation_2__linear("Normalize Name for matching")
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__condition{"Default icon fallback"}
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__false("false")
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__merge("merge")
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__true("true")
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__condition{"Falls back to alternate path"}
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__false("otherwise")
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__merge("merge")
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__true("fallback")
|
||||
method_viikop_render_razor_template_component_render__entry(["Render (Razor template / component render) entry"])
|
||||
method_viikop_render_razor_template_component_render__implicit_return(["return"])
|
||||
method_viikop_render_razor_template_component_render__action_1_attribute_merge_1__linear -->|next| method_viikop_render_razor_template_component_render__action_2_branch_2__condition
|
||||
method_viikop_render_razor_template_component_render__action_1_parameter_usage_1__linear -->|next| method_viikop_render_razor_template_component_render__action_1_attribute_merge_1__linear
|
||||
method_viikop_render_razor_template_component_render__action_1_parameter_usage_1__linear -->|next| method_viikop_render_razor_template_component_render__action_1_parameter_usage_1__linear
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__condition -->|map lines 8-12| method_viikop_render_razor_template_component_render__action_2_branch_2__false
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__condition -->|home lines 4-7| method_viikop_render_razor_template_component_render__action_2_branch_2__true
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__false -->|next| method_viikop_render_razor_template_component_render__action_2_branch_2__merge
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__merge -->|next| method_viikop_render_razor_template_component_render__action_2_transformation_2__linear
|
||||
method_viikop_render_razor_template_component_render__action_2_branch_2__true -->|next| method_viikop_render_razor_template_component_render__action_2_branch_2__merge
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__case_0 -->|next| method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch_merge
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch -->|case| method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__case_0
|
||||
method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch_merge -->|fallback| method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__condition
|
||||
method_viikop_render_razor_template_component_render__action_2_transformation_2__linear -->|next| method_viikop_render_razor_template_component_render__action_2_render_razor_template_component_render_switch_2_0__switch
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__condition -->|false| method_viikop_render_razor_template_component_render__action_89_fallback_89__false
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__condition -->|true| method_viikop_render_razor_template_component_render__action_89_fallback_89__true
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__false -->|next| method_viikop_render_razor_template_component_render__action_89_fallback_89__merge
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__merge -->|return| method_viikop_render_razor_template_component_render__implicit_return
|
||||
method_viikop_render_razor_template_component_render__action_89_fallback_89__true -->|next| method_viikop_render_razor_template_component_render__action_89_fallback_89__merge
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__condition -->|otherwise| method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__false
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__condition -->|fallback| method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__true
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__false -->|next| method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__merge
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__merge -->|fallback| method_viikop_render_razor_template_component_render__action_89_fallback_89__condition
|
||||
method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__true -->|next| method_viikop_render_razor_template_component_render__action_89_render_razor_template_component_render_fallback_89_1__merge
|
||||
method_viikop_render_razor_template_component_render__entry -->|next| method_viikop_render_razor_template_component_render__action_1_parameter_usage_1__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: control-flow: diagram method_viikop_render_razor_template_component_render__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 23 edges).
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
# NexusSearchBox
|
||||
|
||||
- File ID: file:igeyi7:nexussearchbox-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Atoms/NexusSearchBox.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A Blazor UI component that renders a search input, exposes parameters for placeholder/icon, tracks local search text, invokes a parent-provided search callback when Enter is pressed, and allows clearing the input.
|
||||
|
||||
## Key Details
|
||||
|
||||
Pressing Enter invokes OnSearch.InvokeAsync(SearchValue). ClearSearch sets SearchValue to empty, toggling IsActive and the 'active' CSS class. Component exposes Placeholder, IconClass, and OnSearch parameters.
|
||||
|
||||
## Symbols
|
||||
|
||||
- NexusSearchBox: A Blazor UI component that renders a search input, exposes parameters for placeholder/icon, tracks local search text, invokes a parent-provided search callback when Enter is pressed, and allows clearing the input.
|
||||
- HandleKeyPress(): Handles keyboard input on the search box and triggers the OnSearch callback when Enter is pressed.
|
||||
- ClearSearch(): Clears the local search input value.
|
||||
- IsActive (getter): Computed property that indicates if the search input contains text; used to toggle CSS state.
|
||||
- NexusSearchBox (component): Represents the search box component and its parameters/state for use in Razor UI.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- call-target: self
|
||||
- interaction-target: await OnSearch.InvokeAsync(SearchValue) - raises the search event to parent components.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 3
|
||||
- Executable symbols with control flow: 3
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 2
|
||||
- Control-flow fragments: 3
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- HandleKeyPress: 13 nodes, 14 edges, 1 jumps, 0 unsupported constructs
|
||||
- ClearSearch: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- IsActive (getter): 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusSearchBox Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_c49vab_nexussearchbox("NexusSearchBox")
|
||||
file_igeyi7_nexussearchbox_razor("NexusSearchBox")
|
||||
method_1p9w1qk_isactive_getter[["IsActive (getter)"]]
|
||||
method_1sx9yhe_clearsearch[["ClearSearch()"]]
|
||||
method_j1tqds_handlekeypress[["HandleKeyPress()"]]
|
||||
type_1tp07fo_nexussearchbox_component[/"NexusSearchBox (component)"/]
|
||||
```
|
||||
|
||||
### NexusSearchBox Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_c49vab_nexussearchbox("NexusSearchBox")
|
||||
method_1p9w1qk_isactive_getter[["IsActive (getter)"]]
|
||||
method_1sx9yhe_clearsearch[["ClearSearch()"]]
|
||||
method_j1tqds_handlekeypress[["HandleKeyPress()"]]
|
||||
unresolved_unresolved_1dtlz91_interaction_target{"Unresolved: await OnSearch.InvokeAsync(SearchValue) - raises the search event to parent components."}
|
||||
unresolved_unresolved_1p0z3es_call_target{"Unresolved: OnSearch.InvokeAsync"}
|
||||
class_c49vab_nexussearchbox -->|contains| method_1p9w1qk_isactive_getter
|
||||
class_c49vab_nexussearchbox -->|contains| method_1sx9yhe_clearsearch
|
||||
class_c49vab_nexussearchbox -->|contains| method_j1tqds_handlekeypress
|
||||
class_c49vab_nexussearchbox -->|unresolved interaction| unresolved_unresolved_1dtlz91_interaction_target
|
||||
method_j1tqds_handlekeypress -->|unresolved call| unresolved_unresolved_1p0z3es_call_target
|
||||
```
|
||||
|
||||
### HandleKeyPress() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_j1tqds_handlekeypress__call_31_OnSearch_InvokeAsync[["OnSearch.InvokeAsync"]]
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__condition{"e.Key == \\"Enter\\""}
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__false("no-op")
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__merge("merge")
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__true("invoke callback")
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__condition{"e.Key == \\"Enter\\""}
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__false("false")
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__merge("merge")
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__true("true")
|
||||
method_j1tqds_handlekeypress__action_31_handlekeypress_await_31_1__await[["Waits for async work"]]
|
||||
method_j1tqds_handlekeypress__entry(["HandleKeyPress entry"])
|
||||
method_j1tqds_handlekeypress__action_31_external_call_31__linear("Invokes parent-provided event callback")
|
||||
method_j1tqds_handlekeypress__implicit_return(["return"])
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__condition -->|no-op| method_j1tqds_handlekeypress__action_29_guard_clause_29__false
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__condition -->|invoke callback| method_j1tqds_handlekeypress__action_29_guard_clause_29__true
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__false -->|next| method_j1tqds_handlekeypress__action_29_guard_clause_29__merge
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__merge -->|next| method_j1tqds_handlekeypress__action_31_handlekeypress_await_31_1__await
|
||||
method_j1tqds_handlekeypress__action_29_guard_clause_29__true -->|next| method_j1tqds_handlekeypress__action_29_guard_clause_29__merge
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__condition -->|false| method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__false
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__condition -->|true| method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__true
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__false -->|next| method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__merge
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__merge -->|next| method_j1tqds_handlekeypress__action_29_guard_clause_29__condition
|
||||
method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__true -->|next| method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__merge
|
||||
method_j1tqds_handlekeypress__action_31_external_call_31__linear -->|SearchValue string passed to the parent callback| method_j1tqds_handlekeypress__call_31_OnSearch_InvokeAsync
|
||||
method_j1tqds_handlekeypress__action_31_handlekeypress_await_31_1__await -->|next| method_j1tqds_handlekeypress__action_31_external_call_31__linear
|
||||
method_j1tqds_handlekeypress__call_31_OnSearch_InvokeAsync -->|return| method_j1tqds_handlekeypress__implicit_return
|
||||
method_j1tqds_handlekeypress__entry -->|next| method_j1tqds_handlekeypress__action_29_handlekeypress_branch_29_0__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
# NexusTypography
|
||||
|
||||
- File ID: file:184ajmn:nexustypography-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Atoms/NexusTypography.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that renders typographic content with a variant-driven CSS class and supports arbitrary additional HTML attributes and child content.
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple presentational Razor component (NexusTypography) that maps a Variant enum to a CSS class, supports custom Class and arbitrary AdditionalAttributes, and renders child content.
|
||||
|
||||
## Symbols
|
||||
|
||||
- NexusTypography: Blazor UI component that renders typographic content with a variant-driven CSS class and supports arbitrary additional HTML attributes and child content.
|
||||
- ComponentRender(): Renders a div with computed CSS classes, applies captured additional attributes, and injects ChildContent.
|
||||
- VariantCssClass(): Computes the CSS class name based on the selected TypographyVariant enum value.
|
||||
- TypographyVariant: Enum that represents the typography style variant used to select CSS classes.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 4
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 4
|
||||
- Unresolved references: 2
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- ComponentRender: 7 nodes, 6 edges, 2 jumps, 0 unsupported constructs
|
||||
- VariantCssClass: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusTypography Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_vspg7j_nexustypography("NexusTypography")
|
||||
file_184ajmn_nexustypography_razor("NexusTypography")
|
||||
method_10aseyf_componentrender[["ComponentRender()"]]
|
||||
method_1vxob4r_variantcssclass[["VariantCssClass()"]]
|
||||
type_oa0wy5_typographyvariant[/"TypographyVariant"/]
|
||||
```
|
||||
|
||||
### NexusTypography Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_vspg7j_nexustypography("NexusTypography")
|
||||
method_10aseyf_componentrender[["ComponentRender()"]]
|
||||
method_1vxob4r_variantcssclass[["VariantCssClass()"]]
|
||||
unresolved_unresolved_155aomx_call_target{"Unresolved: ChildContent"}
|
||||
unresolved_unresolved_czqwea_call_target{"Unresolved: VariantCssClass"}
|
||||
class_vspg7j_nexustypography -->|contains| method_10aseyf_componentrender
|
||||
class_vspg7j_nexustypography -->|contains| method_1vxob4r_variantcssclass
|
||||
method_10aseyf_componentrender -->|unresolved call| unresolved_unresolved_155aomx_call_target
|
||||
method_10aseyf_componentrender -->|unresolved call| unresolved_unresolved_czqwea_call_target
|
||||
```
|
||||
|
||||
### ComponentRender() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_10aseyf_componentrender__call_1_VariantCssClass[["VariantCssClass"]]
|
||||
method_10aseyf_componentrender__call_2_ChildContent[["ChildContent"]]
|
||||
method_10aseyf_componentrender__action_1_attribute_capture_1__linear("Capture unmatched attributes")
|
||||
method_10aseyf_componentrender__action_1_render_1__linear("Render root div")
|
||||
method_10aseyf_componentrender__action_2_content_insertion_2__linear("Insert child content")
|
||||
method_10aseyf_componentrender__entry(["ComponentRender entry"])
|
||||
method_10aseyf_componentrender__implicit_return(["return"])
|
||||
method_10aseyf_componentrender__action_1_attribute_capture_1__linear -->|none used to compose CSS class string| method_10aseyf_componentrender__call_1_VariantCssClass
|
||||
method_10aseyf_componentrender__action_1_render_1__linear -->|next| method_10aseyf_componentrender__action_1_attribute_capture_1__linear
|
||||
method_10aseyf_componentrender__action_2_content_insertion_2__linear -->|RenderFragment invoked / placed into the div| method_10aseyf_componentrender__call_2_ChildContent
|
||||
method_10aseyf_componentrender__call_1_VariantCssClass -->|next| method_10aseyf_componentrender__action_2_content_insertion_2__linear
|
||||
method_10aseyf_componentrender__call_2_ChildContent -->|return| method_10aseyf_componentrender__implicit_return
|
||||
method_10aseyf_componentrender__entry -->|next| method_10aseyf_componentrender__action_1_render_1__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+370
@@ -0,0 +1,370 @@
|
||||
# AiAssistantBubble
|
||||
|
||||
- File ID: file:83c16m:aiassistantbubble-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Molecules/AiAssistantBubble.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that shows an AI assistant bubble: fetches a summary/quiz for a given content block, streams word-by-word reveal, exposes action buttons (show more / quiz), and manages streaming cancellation and lifecycle.
|
||||
|
||||
## Key Details
|
||||
|
||||
Core orchestration lives in FetchAndStreamAsync: cancels previous streams, requests summary via KnowledgeCoordinator, falls back to static Dialogue when missing, streams words with cancellation support, and surfaces quiz requests via injected IQuizStateService.
|
||||
|
||||
## Symbols
|
||||
|
||||
- OnParametersSetAsync(): Lifecycle hook: when parameters change, triggers fetching/streaming of AI content if component is interactive and the block id changed.
|
||||
- OnAfterRenderAsync(): Lifecycle hook: on first render marks component interactive and triggers initial fetch/stream if a ContextBlockId is present.
|
||||
- FetchAndStreamAsync(): Orchestrates requesting a summary/quiz from the KnowledgeCoordinator, handles fallbacks, streams the summary word-by-word to the UI, and manages cancellation, errors, and state flags.
|
||||
- HandleActionClick(): Handles UI action button clicks: triggers quiz request when action indicates 'quiz' and forwards action via the OnActionTriggered callback if provided.
|
||||
- Dispose(): Component disposal: cancels and disposes the streaming CancellationTokenSource to stop background streaming when the component is destroyed.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services (IQuizStateService, KnowledgeCoordinator) - referenced via @inject
|
||||
- dependency-target: NexusReader.Application.DTOs.AI (KnowledgePacket) - referenced via using
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: await Coordinator.RequestSummaryAndQuizAsync(contentToAnalyze)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 7
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 4
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnParametersSetAsync: 23 nodes, 26 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 22 nodes, 25 edges, 1 jumps, 0 unsupported constructs
|
||||
- FetchAndStreamAsync: 38 nodes, 42 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleActionClick: 18 nodes, 20 edges, 1 jumps, 0 unsupported constructs
|
||||
- Dispose: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### AiAssistantBubble Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_83c16m_aiassistantbubble_razor("AiAssistantBubble")
|
||||
method_16cvbhq_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_1bl306q_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1naqltb_handleactionclick[["HandleActionClick()"]]
|
||||
method_1p3ftme_dispose[["Dispose()"]]
|
||||
method_9ujebp_fetchandstreamasync[["FetchAndStreamAsync()"]]
|
||||
```
|
||||
|
||||
### AiAssistantBubble Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_83c16m_aiassistantbubble_razor("AiAssistantBubble")
|
||||
method_16cvbhq_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_1bl306q_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1naqltb_handleactionclick[["HandleActionClick()"]]
|
||||
method_1p3ftme_dispose[["Dispose()"]]
|
||||
method_9ujebp_fetchandstreamasync[["FetchAndStreamAsync()"]]
|
||||
unresolved_unresolved_167r83h_call_target{"Unresolved: FetchAndStreamAsync"}
|
||||
unresolved_unresolved_1uzvj3j_call_target{"Unresolved: RequestQuiz"}
|
||||
unresolved_unresolved_4o4ap7_call_target{"Unresolved: RequestSummaryAndQuizAsync"}
|
||||
unresolved_unresolved_d0obx2_interaction_target{"Unresolved: await Coordinator.RequestSummaryAndQuizAsync(contentToAnalyze)"}
|
||||
unresolved_unresolved_d4ewrz_call_target{"Unresolved: FetchAndStreamAsync"}
|
||||
file_83c16m_aiassistantbubble_razor -->|contains| method_16cvbhq_onparameterssetasync
|
||||
file_83c16m_aiassistantbubble_razor -->|contains| method_1bl306q_onafterrenderasync
|
||||
file_83c16m_aiassistantbubble_razor -->|contains| method_1naqltb_handleactionclick
|
||||
file_83c16m_aiassistantbubble_razor -->|contains| method_1p3ftme_dispose
|
||||
file_83c16m_aiassistantbubble_razor -->|contains| method_9ujebp_fetchandstreamasync
|
||||
file_83c16m_aiassistantbubble_razor -->|unresolved interaction| unresolved_unresolved_d0obx2_interaction_target
|
||||
method_16cvbhq_onparameterssetasync -->|unresolved call| unresolved_unresolved_167r83h_call_target
|
||||
method_1bl306q_onafterrenderasync -->|unresolved call| unresolved_unresolved_d4ewrz_call_target
|
||||
method_1naqltb_handleactionclick -->|unresolved call| unresolved_unresolved_1uzvj3j_call_target
|
||||
method_9ujebp_fetchandstreamasync -->|unresolved call| unresolved_unresolved_4o4ap7_call_target
|
||||
```
|
||||
|
||||
### OnParametersSetAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_16cvbhq_onparameterssetasync__fragment_diagram exceeds preferred complexity thresholds (23 nodes, 26 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_16cvbhq_onparameterssetasync__call_66_FetchAndStreamAsync[["FetchAndStreamAsync"]]
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__condition{"!_isInteractive"}
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__false("continue")
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__merge("merge")
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__true("return")
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__condition{"!_isInteractive"}
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__false("false")
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__merge("merge")
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__true("true")
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__condition{"string.IsNullOrEmpty(ContextBlockId) || ContextBlockId == _lastFetchedBlockId"}
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__false("fetch")
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__merge("merge")
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__true("return")
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__condition{"string.IsNullOrEmpty(ContextBlockId) || ContextBlockId == _lastFetchedBlockId"}
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__false("false")
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__merge("merge")
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__true("true")
|
||||
method_16cvbhq_onparameterssetasync__action_65_state_change_65__linear("Update last fetched block id")
|
||||
method_16cvbhq_onparameterssetasync__action_66_onparameterssetasync_await_66_4__await[["Waits for async work"]]
|
||||
method_16cvbhq_onparameterssetasync__entry(["OnParametersSetAsync entry"])
|
||||
method_16cvbhq_onparameterssetasync__action_59_onparameterssetasync_return_59_1__return(["Returns result"])
|
||||
method_16cvbhq_onparameterssetasync__action_63_onparameterssetasync_return_63_3__return(["Returns result"])
|
||||
method_16cvbhq_onparameterssetasync__implicit_return(["return"])
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__condition -->|continue| method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__false
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__condition -->|return| method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__true
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__false -->|next| method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__merge
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__merge -->|next| method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__condition
|
||||
method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__true -->|next| method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__merge
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__condition -->|false| method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__false
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__condition -->|true| method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__true
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__false -->|next| method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__merge
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__merge -->|return| method_16cvbhq_onparameterssetasync__action_59_onparameterssetasync_return_59_1__return
|
||||
method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__true -->|next| method_16cvbhq_onparameterssetasync__action_58_onparameterssetasync_branch_58_0__merge
|
||||
method_16cvbhq_onparameterssetasync__action_59_onparameterssetasync_return_59_1__return -->|next| method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__condition
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__condition -->|fetch| method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__false
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__condition -->|return| method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__true
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__false -->|next| method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__merge
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__merge -->|next| method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__condition
|
||||
method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__true -->|next| method_16cvbhq_onparameterssetasync__action_62_guard_clause_62__merge
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__condition -->|false| method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__false
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__condition -->|true| method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__true
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__false -->|next| method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__merge
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__merge -->|return| method_16cvbhq_onparameterssetasync__action_63_onparameterssetasync_return_63_3__return
|
||||
method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__true -->|next| method_16cvbhq_onparameterssetasync__action_62_onparameterssetasync_branch_62_2__merge
|
||||
method_16cvbhq_onparameterssetasync__action_63_onparameterssetasync_return_63_3__return -->|next| method_16cvbhq_onparameterssetasync__action_65_state_change_65__linear
|
||||
method_16cvbhq_onparameterssetasync__action_65_state_change_65__linear -->|next| method_16cvbhq_onparameterssetasync__action_66_onparameterssetasync_await_66_4__await
|
||||
method_16cvbhq_onparameterssetasync__action_66_onparameterssetasync_await_66_4__await -->|no args| method_16cvbhq_onparameterssetasync__call_66_FetchAndStreamAsync
|
||||
method_16cvbhq_onparameterssetasync__call_66_FetchAndStreamAsync -->|return| method_16cvbhq_onparameterssetasync__implicit_return
|
||||
method_16cvbhq_onparameterssetasync__entry -->|next| method_16cvbhq_onparameterssetasync__action_58_guard_clause_58__condition
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1bl306q_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 25 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1bl306q_onafterrenderasync__call_77_FetchAndStreamAsync[["FetchAndStreamAsync"]]
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__condition{"firstRender"}
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__false("noop")
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__merge("merge")
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__true("initialize interactive + maybe fetch")
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__condition{"firstRender"}
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__false("false")
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__merge("merge")
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__true("true")
|
||||
method_1bl306q_onafterrenderasync__action_73_state_change_73__linear("Enable interactivity flag")
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__condition{"!string.IsNullOrEmpty(ContextBlockId)"}
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__false("skip")
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__merge("merge")
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__true("fetch")
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__condition{"!string.IsNullOrEmpty(ContextBlockId)"}
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__false("false")
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__merge("merge")
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__true("true")
|
||||
method_1bl306q_onafterrenderasync__action_76_state_change_76__linear("Record last fetched id")
|
||||
method_1bl306q_onafterrenderasync__action_77_onafterrenderasync_await_77_2__await[["Waits for async work"]]
|
||||
method_1bl306q_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_1bl306q_onafterrenderasync__implicit_return(["return"])
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__condition -->|noop| method_1bl306q_onafterrenderasync__action_71_branch_71__false
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__condition -->|initialize interactive + maybe fetch| method_1bl306q_onafterrenderasync__action_71_branch_71__true
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__false -->|next| method_1bl306q_onafterrenderasync__action_71_branch_71__merge
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__merge -->|next| method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__condition
|
||||
method_1bl306q_onafterrenderasync__action_71_branch_71__true -->|next| method_1bl306q_onafterrenderasync__action_71_branch_71__merge
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__condition -->|false| method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__false
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__condition -->|true| method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__true
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__false -->|next| method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__merge
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__merge -->|next| method_1bl306q_onafterrenderasync__action_73_state_change_73__linear
|
||||
method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__true -->|next| method_1bl306q_onafterrenderasync__action_71_onafterrenderasync_branch_71_0__merge
|
||||
method_1bl306q_onafterrenderasync__action_73_state_change_73__linear -->|next| method_1bl306q_onafterrenderasync__action_74_guard_clause_74__condition
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__condition -->|skip| method_1bl306q_onafterrenderasync__action_74_guard_clause_74__false
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__condition -->|fetch| method_1bl306q_onafterrenderasync__action_74_guard_clause_74__true
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__false -->|next| method_1bl306q_onafterrenderasync__action_74_guard_clause_74__merge
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__merge -->|next| method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__condition
|
||||
method_1bl306q_onafterrenderasync__action_74_guard_clause_74__true -->|next| method_1bl306q_onafterrenderasync__action_74_guard_clause_74__merge
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__condition -->|false| method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__false
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__condition -->|true| method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__true
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__false -->|next| method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__merge
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__merge -->|next| method_1bl306q_onafterrenderasync__action_76_state_change_76__linear
|
||||
method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__true -->|next| method_1bl306q_onafterrenderasync__action_74_onafterrenderasync_branch_74_1__merge
|
||||
method_1bl306q_onafterrenderasync__action_76_state_change_76__linear -->|next| method_1bl306q_onafterrenderasync__action_77_onafterrenderasync_await_77_2__await
|
||||
method_1bl306q_onafterrenderasync__action_77_onafterrenderasync_await_77_2__await -->|no args| method_1bl306q_onafterrenderasync__call_77_FetchAndStreamAsync
|
||||
method_1bl306q_onafterrenderasync__call_77_FetchAndStreamAsync -->|return| method_1bl306q_onafterrenderasync__implicit_return
|
||||
method_1bl306q_onafterrenderasync__entry -->|next| method_1bl306q_onafterrenderasync__action_71_branch_71__condition
|
||||
```
|
||||
|
||||
### FetchAndStreamAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_9ujebp_fetchandstreamasync__fragment_diagram exceeds preferred complexity thresholds (38 nodes, 42 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_9ujebp_fetchandstreamasync__call_101_RequestSummaryAndQuizAsync[["RequestSummaryAndQuizAsync"]]
|
||||
method_9ujebp_fetchandstreamasync__action_101_fetchandstreamasync_await_101_1__await[["Waits for async work"]]
|
||||
method_9ujebp_fetchandstreamasync__action_102_mapping_102__linear("Apply coordinator result to local packet")
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__condition{"string.IsNullOrWhiteSpace(summary)"}
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__false("false")
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__merge("merge")
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__true("true")
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__condition{"string.IsNullOrWhiteSpace(summary)"}
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__false("continue streaming")
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__merge("merge")
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__true("use Dialogue or default message and return")
|
||||
method_9ujebp_fetchandstreamasync__action_117_state_change_117__linear("Begin streaming")
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_body[["appends words with Task.Delay(40, token) between words"]]
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_entry("foreach (var word in words)")
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_exit("exit loop")
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_body[["foreach (var word in words)"]]
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_entry("var word in words")
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_exit("Leaves the loop when the condition no longer holds.")
|
||||
method_9ujebp_fetchandstreamasync__action_124_cancellation_check_124__linear("Stop streaming if token canceled")
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__condition{"token.IsCancellationRequested"}
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__false("continue")
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__merge("merge")
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__true("exit")
|
||||
method_9ujebp_fetchandstreamasync__action_127_fetchandstreamasync_await_127_6__await[["Waits for async work"]]
|
||||
method_9ujebp_fetchandstreamasync__action_130_error_handling_130__linear("Suppress OperationCanceledException")
|
||||
method_9ujebp_fetchandstreamasync__action_130_fetchandstreamasync_catch_130_7__catch("catch OperationCanceledException")
|
||||
method_9ujebp_fetchandstreamasync__action_134_error_handling_134__linear("On unexpected error set fallback text and log")
|
||||
method_9ujebp_fetchandstreamasync__action_134_fetchandstreamasync_catch_134_8__catch("catch Exception ex")
|
||||
method_9ujebp_fetchandstreamasync__action_139_fetchandstreamasync_finally_139_9__finally("Runs cleanup or finalization")
|
||||
method_9ujebp_fetchandstreamasync__action_139_finally_139__finally("Clear streaming flag and refresh UI")
|
||||
method_9ujebp_fetchandstreamasync__action_85_side_effect_85__linear("Cancel in-progress stream")
|
||||
method_9ujebp_fetchandstreamasync__action_86_side_effect_86__linear("Create new CancellationTokenSource")
|
||||
method_9ujebp_fetchandstreamasync__action_89_state_change_89__linear("Set loading/stream flags and clear displayed text/packet")
|
||||
method_9ujebp_fetchandstreamasync__action_95_fetchandstreamasync_try_95_0__try("Begins protected execution")
|
||||
method_9ujebp_fetchandstreamasync__entry(["FetchAndStreamAsync entry"])
|
||||
method_9ujebp_fetchandstreamasync__action_101_external_call_101__linear("Request summary and quiz from coordinator")
|
||||
method_9ujebp_fetchandstreamasync__action_114_fetchandstreamasync_return_114_3__return(["Returns result"])
|
||||
method_9ujebp_fetchandstreamasync__implicit_return(["return"])
|
||||
method_9ujebp_fetchandstreamasync__action_101_external_call_101__linear -->|calls| method_9ujebp_fetchandstreamasync__call_101_RequestSummaryAndQuizAsync
|
||||
method_9ujebp_fetchandstreamasync__action_101_fetchandstreamasync_await_101_1__await -->|next| method_9ujebp_fetchandstreamasync__action_101_external_call_101__linear
|
||||
method_9ujebp_fetchandstreamasync__action_102_mapping_102__linear -->|next| method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__condition
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__condition -->|false| method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__false
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__condition -->|true| method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__true
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__false -->|next| method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__merge
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__merge -->|return| method_9ujebp_fetchandstreamasync__action_114_fetchandstreamasync_return_114_3__return
|
||||
method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__true -->|next| method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__merge
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__condition -->|continue streaming| method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__false
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__condition -->|use Dialogue or default message and return| method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__true
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__false -->|next| method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__merge
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__merge -->|next| method_9ujebp_fetchandstreamasync__action_106_fetchandstreamasync_branch_106_2__condition
|
||||
method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__true -->|next| method_9ujebp_fetchandstreamasync__action_106_guard_clause_106__merge
|
||||
method_9ujebp_fetchandstreamasync__action_114_fetchandstreamasync_return_114_3__return -->|next| method_9ujebp_fetchandstreamasync__action_117_state_change_117__linear
|
||||
method_9ujebp_fetchandstreamasync__action_117_state_change_117__linear -->|next| method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_entry
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_body -->|continue| method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_entry
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_entry -->|append word + delay| method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_body
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_entry -->|break on cancellation| method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_exit
|
||||
method_9ujebp_fetchandstreamasync__action_121_loop_121__loop_exit -->|next| method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_entry
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_body -->|continue| method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_entry
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_entry -->|var word in words| method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_body
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_entry -->|Leaves the loop when the condition no longer holds.| method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_exit
|
||||
method_9ujebp_fetchandstreamasync__action_122_fetchandstreamasync_loop_122_4__loop_exit -->|next| method_9ujebp_fetchandstreamasync__action_124_cancellation_check_124__linear
|
||||
method_9ujebp_fetchandstreamasync__action_124_cancellation_check_124__linear -->|next| method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__condition
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__condition -->|continue| method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__false
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__condition -->|exit| method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__true
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__false -->|next| method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__merge
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__merge -->|next| method_9ujebp_fetchandstreamasync__action_127_fetchandstreamasync_await_127_6__await
|
||||
method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__true -->|next| method_9ujebp_fetchandstreamasync__action_124_fetchandstreamasync_guard_clause_124_5__merge
|
||||
method_9ujebp_fetchandstreamasync__action_127_fetchandstreamasync_await_127_6__await -->|next| method_9ujebp_fetchandstreamasync__action_130_error_handling_130__linear
|
||||
method_9ujebp_fetchandstreamasync__action_130_error_handling_130__linear -->|exception| method_9ujebp_fetchandstreamasync__action_130_fetchandstreamasync_catch_130_7__catch
|
||||
method_9ujebp_fetchandstreamasync__action_130_fetchandstreamasync_catch_130_7__catch -->|next| method_9ujebp_fetchandstreamasync__action_134_error_handling_134__linear
|
||||
method_9ujebp_fetchandstreamasync__action_134_error_handling_134__linear -->|exception| method_9ujebp_fetchandstreamasync__action_134_fetchandstreamasync_catch_134_8__catch
|
||||
method_9ujebp_fetchandstreamasync__action_134_fetchandstreamasync_catch_134_8__catch -->|next| method_9ujebp_fetchandstreamasync__action_139_fetchandstreamasync_finally_139_9__finally
|
||||
method_9ujebp_fetchandstreamasync__action_139_fetchandstreamasync_finally_139_9__finally -->|next| method_9ujebp_fetchandstreamasync__action_139_finally_139__finally
|
||||
method_9ujebp_fetchandstreamasync__action_139_finally_139__finally -->|return| method_9ujebp_fetchandstreamasync__implicit_return
|
||||
method_9ujebp_fetchandstreamasync__action_85_side_effect_85__linear -->|next| method_9ujebp_fetchandstreamasync__action_86_side_effect_86__linear
|
||||
method_9ujebp_fetchandstreamasync__action_86_side_effect_86__linear -->|next| method_9ujebp_fetchandstreamasync__action_89_state_change_89__linear
|
||||
method_9ujebp_fetchandstreamasync__action_89_state_change_89__linear -->|next| method_9ujebp_fetchandstreamasync__action_95_fetchandstreamasync_try_95_0__try
|
||||
method_9ujebp_fetchandstreamasync__action_95_fetchandstreamasync_try_95_0__try -->|next| method_9ujebp_fetchandstreamasync__action_101_fetchandstreamasync_await_101_1__await
|
||||
method_9ujebp_fetchandstreamasync__call_101_RequestSummaryAndQuizAsync -->|next| method_9ujebp_fetchandstreamasync__action_102_mapping_102__linear
|
||||
method_9ujebp_fetchandstreamasync__entry -->|next| method_9ujebp_fetchandstreamasync__action_85_side_effect_85__linear
|
||||
```
|
||||
|
||||
### HandleActionClick() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1naqltb_handleactionclick__call_150_RequestQuiz[["RequestQuiz"]]
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__condition{"action.Contains(\\"quiz\\", StringComparison.OrdinalIgnoreCase)"}
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__false("skip")
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__merge("merge")
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__true("invoke quiz request")
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__condition{"action.Contains(\\"quiz\\", StringComparison.OrdinalIgnoreCase)"}
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__false("false")
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__merge("merge")
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__true("true")
|
||||
method_1naqltb_handleactionclick__action_150_handleactionclick_await_150_1__await[["Waits for async work"]]
|
||||
method_1naqltb_handleactionclick__action_153_event_153__linear("Invoke external callback when attached")
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__condition{"OnActionTriggered.HasDelegate"}
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__false("false")
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__merge("merge")
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__true("true")
|
||||
method_1naqltb_handleactionclick__action_155_handleactionclick_await_155_3__await[["Waits for async work"]]
|
||||
method_1naqltb_handleactionclick__entry(["HandleActionClick entry"])
|
||||
method_1naqltb_handleactionclick__implicit_return(["return"])
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__condition -->|skip| method_1naqltb_handleactionclick__action_148_branch_148__false
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__condition -->|invoke quiz request| method_1naqltb_handleactionclick__action_148_branch_148__true
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__false -->|next| method_1naqltb_handleactionclick__action_148_branch_148__merge
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__merge -->|next| method_1naqltb_handleactionclick__action_150_handleactionclick_await_150_1__await
|
||||
method_1naqltb_handleactionclick__action_148_branch_148__true -->|next| method_1naqltb_handleactionclick__action_148_branch_148__merge
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__condition -->|false| method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__false
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__condition -->|true| method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__true
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__false -->|next| method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__merge
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__merge -->|next| method_1naqltb_handleactionclick__action_148_branch_148__condition
|
||||
method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__true -->|next| method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__merge
|
||||
method_1naqltb_handleactionclick__action_150_handleactionclick_await_150_1__await -->|ContextBlockId string| method_1naqltb_handleactionclick__call_150_RequestQuiz
|
||||
method_1naqltb_handleactionclick__action_153_event_153__linear -->|next| method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__condition
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__condition -->|false| method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__false
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__condition -->|true| method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__true
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__false -->|next| method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__merge
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__merge -->|next| method_1naqltb_handleactionclick__action_155_handleactionclick_await_155_3__await
|
||||
method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__true -->|next| method_1naqltb_handleactionclick__action_153_handleactionclick_branch_153_2__merge
|
||||
method_1naqltb_handleactionclick__action_155_handleactionclick_await_155_3__await -->|return| method_1naqltb_handleactionclick__implicit_return
|
||||
method_1naqltb_handleactionclick__call_150_RequestQuiz -->|next| method_1naqltb_handleactionclick__action_153_event_153__linear
|
||||
method_1naqltb_handleactionclick__entry -->|next| method_1naqltb_handleactionclick__action_148_handleactionclick_branch_148_0__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 4 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_16cvbhq_onparameterssetasync__fragment_diagram exceeds preferred complexity thresholds (23 nodes, 26 edges).
|
||||
- Warning: control-flow: diagram method_1bl306q_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 25 edges).
|
||||
- Warning: control-flow: diagram method_9ujebp_fetchandstreamasync__fragment_diagram exceeds preferred complexity thresholds (38 nodes, 42 edges).
|
||||
+395
@@ -0,0 +1,395 @@
|
||||
# GroundednessBadge
|
||||
|
||||
- File ID: file:108l4jq:groundednessbadge-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Molecules/GroundednessBadge.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that displays a groundedness badge for an Answer relative to a Context by invoking an application verification command and showing status, icon and rationale.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component caches previous Answer/Context to avoid repeated checks, delays check until component is interactive (first render), derives tenant id from authenticated user (fallback 'global'), dispatches a VerifyGroundednessCommand and applies result on success to control UI state and CSS/icon selection.
|
||||
|
||||
## Symbols
|
||||
|
||||
- GroundednessBadge: Blazor UI component that displays a groundedness badge for an Answer relative to a Context by invoking an application verification command and showing status, icon and rationale.
|
||||
- OnParametersSet(): Resets cached result when Answer or Context parameters change.
|
||||
- OnParametersSetAsync(): Triggers a background groundedness check if component is interactive and inputs are present and no result cached.
|
||||
- OnAfterRenderAsync(): Marks component as interactive on first render and triggers a check if needed.
|
||||
- RunCheck(): Performs the verification: sets checking state, obtains tenant id from auth, requests groundedness verification, stores result on success, and clears checking state.
|
||||
- GetStatusClass(): Maps numeric groundedness score to a CSS status class with thresholds for high/medium/low.
|
||||
- GetIcon(): Selects an icon name based on groundedness score thresholds, with fallback for unknown.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Commands.AI
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services
|
||||
- dependency-target: NexusReader.UI.Shared.Components.Atoms
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Authorization
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: var tenantId = authState.User.FindFirst("TenantId")?.Value ?? "global";
|
||||
- interaction-target: await AuthProvider.GetAuthenticationStateAsync() (reads current user/claims)
|
||||
- interaction-target: await Mediator.Send(new VerifyGroundednessCommand(Answer, Context, tenantId)); (dispatches to application handler)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 7
|
||||
- Executable symbols: 6
|
||||
- Executable symbols with control flow: 6
|
||||
- Grounded edges: 7
|
||||
- Unresolved references: 10
|
||||
- Control-flow fragments: 6
|
||||
- Unresolved jumps: 3
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 8
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnParametersSet: 10 nodes, 11 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnParametersSetAsync: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 16 nodes, 18 edges, 1 jumps, 0 unsupported constructs
|
||||
- RunCheck: 19 nodes, 20 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetStatusClass: 22 nodes, 26 edges, 0 jumps, 0 unsupported constructs
|
||||
- GetIcon: 22 nodes, 26 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### GroundednessBadge Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_3ugxc0_groundednessbadge("GroundednessBadge")
|
||||
file_108l4jq_groundednessbadge_razor("GroundednessBadge")
|
||||
method_1nedo1_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_8ug383_getstatusclass[["GetStatusClass()"]]
|
||||
method_gfuk2l_onparametersset[["OnParametersSet()"]]
|
||||
method_mes1h8_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_xt4lks_runcheck[["RunCheck()"]]
|
||||
method_zopugm_geticon[["GetIcon()"]]
|
||||
```
|
||||
|
||||
### GroundednessBadge Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_3ugxc0_groundednessbadge("GroundednessBadge")
|
||||
method_1nedo1_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_8ug383_getstatusclass[["GetStatusClass()"]]
|
||||
method_gfuk2l_onparametersset[["OnParametersSet()"]]
|
||||
method_mes1h8_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_xt4lks_runcheck[["RunCheck()"]]
|
||||
method_zopugm_geticon[["GetIcon()"]]
|
||||
unresolved_unresolved_1heq3ju_call_target{"Unresolved: RunCheck"}
|
||||
unresolved_unresolved_1ro0lk4_call_target{"Unresolved: RunCheck"}
|
||||
unresolved_unresolved_44hz6e_call_target{"Unresolved: VerifyGroundednessCommand handler"}
|
||||
unresolved_unresolved_e262m7_interaction_target{"Unresolved: var tenantId = authState.User.FindFirst(\\"TenantId\\")?.Value ?? \\"global\\";"}
|
||||
unresolved_unresolved_e58p8m_interaction_target{"Unresolved: await Mediator.Send(new VerifyGroundednessCommand(Answer, Context, tenantId)); (dispatches to application handler)"}
|
||||
unresolved_unresolved_nrgd14_interaction_target{"Unresolved: await AuthProvider.GetAuthenticationStateAsync() (reads current user/claims)"}
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_1nedo1_onafterrenderasync
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_8ug383_getstatusclass
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_gfuk2l_onparametersset
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_mes1h8_onparameterssetasync
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_xt4lks_runcheck
|
||||
class_3ugxc0_groundednessbadge -->|contains| method_zopugm_geticon
|
||||
class_3ugxc0_groundednessbadge -->|unresolved interaction| unresolved_unresolved_e262m7_interaction_target
|
||||
class_3ugxc0_groundednessbadge -->|unresolved interaction| unresolved_unresolved_e58p8m_interaction_target
|
||||
class_3ugxc0_groundednessbadge -->|unresolved interaction| unresolved_unresolved_nrgd14_interaction_target
|
||||
method_1nedo1_onafterrenderasync -->|unresolved call| unresolved_unresolved_1heq3ju_call_target
|
||||
method_mes1h8_onparameterssetasync -->|unresolved call| unresolved_unresolved_1ro0lk4_call_target
|
||||
method_xt4lks_runcheck -->|unresolved call| unresolved_unresolved_44hz6e_call_target
|
||||
```
|
||||
|
||||
### OnParametersSet() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__condition{"Answer != _previousAnswer || Context != _previousContext"}
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__false("update previous values")
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__merge("merge")
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__true("reset _result")
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__condition{"Answer != _previousAnswer || Context != _previousContext"}
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__false("false")
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__merge("merge")
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__true("true")
|
||||
method_gfuk2l_onparametersset__entry(["OnParametersSet entry"])
|
||||
method_gfuk2l_onparametersset__implicit_return(["return"])
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__condition -->|update previous values| method_gfuk2l_onparametersset__action_35_guard_clause_35__false
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__condition -->|reset _result| method_gfuk2l_onparametersset__action_35_guard_clause_35__true
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__false -->|next| method_gfuk2l_onparametersset__action_35_guard_clause_35__merge
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__merge -->|return| method_gfuk2l_onparametersset__implicit_return
|
||||
method_gfuk2l_onparametersset__action_35_guard_clause_35__true -->|next| method_gfuk2l_onparametersset__action_35_guard_clause_35__merge
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__condition -->|false| method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__false
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__condition -->|true| method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__true
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__false -->|next| method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__merge
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__merge -->|next| method_gfuk2l_onparametersset__action_35_guard_clause_35__condition
|
||||
method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__true -->|next| method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__merge
|
||||
method_gfuk2l_onparametersset__entry -->|next| method_gfuk2l_onparametersset__action_35_onparametersset_branch_35_0__condition
|
||||
```
|
||||
|
||||
### OnParametersSetAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_mes1h8_onparameterssetasync__call_47_RunCheck[["RunCheck"]]
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__condition{"_isInteractive && !string.IsNullOrEmpty(Answer) && !string.IsNullOrEmpty(Context) && _result == null"}
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__false("skip")
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__merge("merge")
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__true("invoke RunCheck")
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__condition{"_isInteractive && !string.IsNullOrEmpty(Answer) && !string.IsNullOrEmpty(Context) && _result == null"}
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__false("false")
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__merge("merge")
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__true("true")
|
||||
method_mes1h8_onparameterssetasync__action_47_onparameterssetasync_await_47_1__await[["Waits for async work"]]
|
||||
method_mes1h8_onparameterssetasync__entry(["OnParametersSetAsync entry"])
|
||||
method_mes1h8_onparameterssetasync__implicit_return(["return"])
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__condition -->|skip| method_mes1h8_onparameterssetasync__action_45_guard_clause_45__false
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__condition -->|invoke RunCheck| method_mes1h8_onparameterssetasync__action_45_guard_clause_45__true
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__false -->|next| method_mes1h8_onparameterssetasync__action_45_guard_clause_45__merge
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__merge -->|next| method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__condition
|
||||
method_mes1h8_onparameterssetasync__action_45_guard_clause_45__true -->|next| method_mes1h8_onparameterssetasync__action_45_guard_clause_45__merge
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__condition -->|false| method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__false
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__condition -->|true| method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__true
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__false -->|next| method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__merge
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__merge -->|next| method_mes1h8_onparameterssetasync__action_47_onparameterssetasync_await_47_1__await
|
||||
method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__true -->|next| method_mes1h8_onparameterssetasync__action_45_onparameterssetasync_branch_45_0__merge
|
||||
method_mes1h8_onparameterssetasync__action_47_onparameterssetasync_await_47_1__await -->|no args| method_mes1h8_onparameterssetasync__call_47_RunCheck
|
||||
method_mes1h8_onparameterssetasync__call_47_RunCheck -->|return| method_mes1h8_onparameterssetasync__implicit_return
|
||||
method_mes1h8_onparameterssetasync__entry -->|next| method_mes1h8_onparameterssetasync__action_45_guard_clause_45__condition
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1nedo1_onafterrenderasync__call_58_RunCheck[["RunCheck"]]
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__condition{"firstRender"}
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__false("maybe RunCheck")
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__merge("merge")
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__true("set _isInteractive true")
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__condition{"firstRender"}
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__false("false")
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__merge("merge")
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__true("true")
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__condition{"!string.IsNullOrEmpty(Answer) && !string.IsNullOrEmpty(Context) && _result == null"}
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__false("false")
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__merge("merge")
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__true("true")
|
||||
method_1nedo1_onafterrenderasync__action_58_onafterrenderasync_await_58_2__await[["Waits for async work"]]
|
||||
method_1nedo1_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_1nedo1_onafterrenderasync__implicit_return(["return"])
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__condition -->|maybe RunCheck| method_1nedo1_onafterrenderasync__action_53_guard_clause_53__false
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__condition -->|set _isInteractive true| method_1nedo1_onafterrenderasync__action_53_guard_clause_53__true
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__false -->|next| method_1nedo1_onafterrenderasync__action_53_guard_clause_53__merge
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__merge -->|next| method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__condition
|
||||
method_1nedo1_onafterrenderasync__action_53_guard_clause_53__true -->|next| method_1nedo1_onafterrenderasync__action_53_guard_clause_53__merge
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__condition -->|false| method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__false
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__condition -->|true| method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__true
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__false -->|next| method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__merge
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__merge -->|next| method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__condition
|
||||
method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__true -->|next| method_1nedo1_onafterrenderasync__action_53_onafterrenderasync_branch_53_0__merge
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__condition -->|false| method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__false
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__condition -->|true| method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__true
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__false -->|next| method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__merge
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__merge -->|next| method_1nedo1_onafterrenderasync__action_58_onafterrenderasync_await_58_2__await
|
||||
method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__true -->|next| method_1nedo1_onafterrenderasync__action_56_onafterrenderasync_branch_56_1__merge
|
||||
method_1nedo1_onafterrenderasync__action_58_onafterrenderasync_await_58_2__await -->|no args| method_1nedo1_onafterrenderasync__call_58_RunCheck
|
||||
method_1nedo1_onafterrenderasync__call_58_RunCheck -->|return| method_1nedo1_onafterrenderasync__implicit_return
|
||||
method_1nedo1_onafterrenderasync__entry -->|next| method_1nedo1_onafterrenderasync__action_53_guard_clause_53__condition
|
||||
```
|
||||
|
||||
### RunCheck() Control Flow
|
||||
|
||||
_Warnings: diagram method_xt4lks_runcheck__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 20 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_xt4lks_runcheck__call_71_VerifyGroundednessCommand_handler[["VerifyGroundednessCommand handler"]]
|
||||
method_xt4lks_runcheck__action_65_state_change_65__linear("enter checking")
|
||||
method_xt4lks_runcheck__action_68_runcheck_await_68_0__await[["Waits for async work"]]
|
||||
method_xt4lks_runcheck__action_69_mapping_69__linear("Derive tenant id")
|
||||
method_xt4lks_runcheck__action_71_runcheck_await_71_2__await[["Waits for async work"]]
|
||||
method_xt4lks_runcheck__action_72_branch_72__condition{"res.IsSuccess"}
|
||||
method_xt4lks_runcheck__action_72_branch_72__false("ignore failure")
|
||||
method_xt4lks_runcheck__action_72_branch_72__merge("merge")
|
||||
method_xt4lks_runcheck__action_72_branch_72__true("store result")
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__condition{"res.IsSuccess"}
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__false("false")
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__merge("merge")
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__true("true")
|
||||
method_xt4lks_runcheck__action_77_state_change_77__linear("exit checking")
|
||||
method_xt4lks_runcheck__entry(["RunCheck entry"])
|
||||
method_xt4lks_runcheck__action_68_external_call_68__linear("Get authentication state")
|
||||
method_xt4lks_runcheck__action_69_runcheck_repository_read_69_1__linear[("Reads repository or persistence state")]
|
||||
method_xt4lks_runcheck__action_71_external_call_71__linear("Request groundedness verification")
|
||||
method_xt4lks_runcheck__implicit_return(["return"])
|
||||
method_xt4lks_runcheck__action_65_state_change_65__linear -->|next| method_xt4lks_runcheck__action_68_runcheck_await_68_0__await
|
||||
method_xt4lks_runcheck__action_68_external_call_68__linear -->|next| method_xt4lks_runcheck__action_69_runcheck_repository_read_69_1__linear
|
||||
method_xt4lks_runcheck__action_68_runcheck_await_68_0__await -->|next| method_xt4lks_runcheck__action_68_external_call_68__linear
|
||||
method_xt4lks_runcheck__action_69_mapping_69__linear -->|next| method_xt4lks_runcheck__action_71_runcheck_await_71_2__await
|
||||
method_xt4lks_runcheck__action_69_runcheck_repository_read_69_1__linear -->|next| method_xt4lks_runcheck__action_69_mapping_69__linear
|
||||
method_xt4lks_runcheck__action_71_external_call_71__linear -->|new VerifyGroundednessCommand Answer, Context, tenantId sent via IMediator| method_xt4lks_runcheck__call_71_VerifyGroundednessCommand_handler
|
||||
method_xt4lks_runcheck__action_71_runcheck_await_71_2__await -->|next| method_xt4lks_runcheck__action_71_external_call_71__linear
|
||||
method_xt4lks_runcheck__action_72_branch_72__condition -->|ignore failure| method_xt4lks_runcheck__action_72_branch_72__false
|
||||
method_xt4lks_runcheck__action_72_branch_72__condition -->|store result| method_xt4lks_runcheck__action_72_branch_72__true
|
||||
method_xt4lks_runcheck__action_72_branch_72__false -->|next| method_xt4lks_runcheck__action_72_branch_72__merge
|
||||
method_xt4lks_runcheck__action_72_branch_72__merge -->|next| method_xt4lks_runcheck__action_77_state_change_77__linear
|
||||
method_xt4lks_runcheck__action_72_branch_72__true -->|next| method_xt4lks_runcheck__action_72_branch_72__merge
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__condition -->|false| method_xt4lks_runcheck__action_72_runcheck_branch_72_3__false
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__condition -->|true| method_xt4lks_runcheck__action_72_runcheck_branch_72_3__true
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__false -->|next| method_xt4lks_runcheck__action_72_runcheck_branch_72_3__merge
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__merge -->|next| method_xt4lks_runcheck__action_72_branch_72__condition
|
||||
method_xt4lks_runcheck__action_72_runcheck_branch_72_3__true -->|next| method_xt4lks_runcheck__action_72_runcheck_branch_72_3__merge
|
||||
method_xt4lks_runcheck__action_77_state_change_77__linear -->|return| method_xt4lks_runcheck__implicit_return
|
||||
method_xt4lks_runcheck__call_71_VerifyGroundednessCommand_handler -->|next| method_xt4lks_runcheck__action_72_runcheck_branch_72_3__condition
|
||||
method_xt4lks_runcheck__entry -->|next| method_xt4lks_runcheck__action_65_state_change_65__linear
|
||||
```
|
||||
|
||||
### GetStatusClass() Control Flow
|
||||
|
||||
_Warnings: diagram method_8ug383_getstatusclass__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 26 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__condition{"_result == null"}
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__false("continue")
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__merge("merge")
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__true("exit")
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__condition{"_result == null"}
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__false("evaluate score")
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__merge("merge")
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__true("return empty string")
|
||||
method_8ug383_getstatusclass__action_84_branch_84__condition{"_result.Score >= 0.8, >= 0.5, else"}
|
||||
method_8ug383_getstatusclass__action_84_branch_84__false("status-medium")
|
||||
method_8ug383_getstatusclass__action_84_branch_84__merge("merge")
|
||||
method_8ug383_getstatusclass__action_84_branch_84__true("status-high")
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__condition{"_result.Score >= 0.8"}
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__false("continue")
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__merge("merge")
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__true("exit")
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__condition{"_result.Score >= 0.5"}
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__false("continue")
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__merge("merge")
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__true("exit")
|
||||
method_8ug383_getstatusclass__entry(["GetStatusClass entry"])
|
||||
method_8ug383_getstatusclass__action_86_getstatusclass_return_86_3__return(["Returns result"])
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__condition -->|continue| method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__false
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__condition -->|exit| method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__true
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__false -->|next| method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__merge
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__merge -->|next| method_8ug383_getstatusclass__action_84_branch_84__condition
|
||||
method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__true -->|next| method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__merge
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__condition -->|evaluate score| method_8ug383_getstatusclass__action_83_guard_clause_83__false
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__condition -->|return empty string| method_8ug383_getstatusclass__action_83_guard_clause_83__true
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__false -->|next| method_8ug383_getstatusclass__action_83_guard_clause_83__merge
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__merge -->|next| method_8ug383_getstatusclass__action_83_getstatusclass_guard_clause_83_0__condition
|
||||
method_8ug383_getstatusclass__action_83_guard_clause_83__true -->|next| method_8ug383_getstatusclass__action_83_guard_clause_83__merge
|
||||
method_8ug383_getstatusclass__action_84_branch_84__condition -->|status-medium| method_8ug383_getstatusclass__action_84_branch_84__false
|
||||
method_8ug383_getstatusclass__action_84_branch_84__condition -->|status-high| method_8ug383_getstatusclass__action_84_branch_84__true
|
||||
method_8ug383_getstatusclass__action_84_branch_84__false -->|next| method_8ug383_getstatusclass__action_84_branch_84__merge
|
||||
method_8ug383_getstatusclass__action_84_branch_84__merge -->|next| method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__condition
|
||||
method_8ug383_getstatusclass__action_84_branch_84__true -->|next| method_8ug383_getstatusclass__action_84_branch_84__merge
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__condition -->|continue| method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__false
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__condition -->|exit| method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__true
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__false -->|next| method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__merge
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__merge -->|next| method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__condition
|
||||
method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__true -->|next| method_8ug383_getstatusclass__action_84_getstatusclass_guard_clause_84_1__merge
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__condition -->|continue| method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__false
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__condition -->|exit| method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__true
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__false -->|next| method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__merge
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__merge -->|return| method_8ug383_getstatusclass__action_86_getstatusclass_return_86_3__return
|
||||
method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__true -->|next| method_8ug383_getstatusclass__action_85_getstatusclass_guard_clause_85_2__merge
|
||||
method_8ug383_getstatusclass__entry -->|next| method_8ug383_getstatusclass__action_83_guard_clause_83__condition
|
||||
```
|
||||
|
||||
### GetIcon() Control Flow
|
||||
|
||||
_Warnings: diagram method_zopugm_geticon__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 26 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__condition{"_result == null"}
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__false("continue")
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__merge("merge")
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__true("exit")
|
||||
method_zopugm_geticon__action_91_guard_clause_91__condition{"_result == null"}
|
||||
method_zopugm_geticon__action_91_guard_clause_91__false("evaluate score")
|
||||
method_zopugm_geticon__action_91_guard_clause_91__merge("merge")
|
||||
method_zopugm_geticon__action_91_guard_clause_91__true("return 'help'")
|
||||
method_zopugm_geticon__action_92_branch_92__condition{"_result.Score >= 0.8, >= 0.5, else"}
|
||||
method_zopugm_geticon__action_92_branch_92__false("info-circle")
|
||||
method_zopugm_geticon__action_92_branch_92__merge("merge")
|
||||
method_zopugm_geticon__action_92_branch_92__true("check-circle")
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__condition{"_result.Score >= 0.8"}
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__false("continue")
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__merge("merge")
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__true("exit")
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__condition{"_result.Score >= 0.5"}
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__false("continue")
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__merge("merge")
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__true("exit")
|
||||
method_zopugm_geticon__entry(["GetIcon entry"])
|
||||
method_zopugm_geticon__action_94_geticon_return_94_3__return(["Returns result"])
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__condition -->|continue| method_zopugm_geticon__action_91_geticon_guard_clause_91_0__false
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__condition -->|exit| method_zopugm_geticon__action_91_geticon_guard_clause_91_0__true
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__false -->|next| method_zopugm_geticon__action_91_geticon_guard_clause_91_0__merge
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__merge -->|next| method_zopugm_geticon__action_92_branch_92__condition
|
||||
method_zopugm_geticon__action_91_geticon_guard_clause_91_0__true -->|next| method_zopugm_geticon__action_91_geticon_guard_clause_91_0__merge
|
||||
method_zopugm_geticon__action_91_guard_clause_91__condition -->|evaluate score| method_zopugm_geticon__action_91_guard_clause_91__false
|
||||
method_zopugm_geticon__action_91_guard_clause_91__condition -->|transforms input| method_zopugm_geticon__action_91_guard_clause_91__true
|
||||
method_zopugm_geticon__action_91_guard_clause_91__false -->|next| method_zopugm_geticon__action_91_guard_clause_91__merge
|
||||
method_zopugm_geticon__action_91_guard_clause_91__merge -->|next| method_zopugm_geticon__action_91_geticon_guard_clause_91_0__condition
|
||||
method_zopugm_geticon__action_91_guard_clause_91__true -->|next| method_zopugm_geticon__action_91_guard_clause_91__merge
|
||||
method_zopugm_geticon__action_92_branch_92__condition -->|info-circle| method_zopugm_geticon__action_92_branch_92__false
|
||||
method_zopugm_geticon__action_92_branch_92__condition -->|check-circle| method_zopugm_geticon__action_92_branch_92__true
|
||||
method_zopugm_geticon__action_92_branch_92__false -->|next| method_zopugm_geticon__action_92_branch_92__merge
|
||||
method_zopugm_geticon__action_92_branch_92__merge -->|next| method_zopugm_geticon__action_92_geticon_guard_clause_92_1__condition
|
||||
method_zopugm_geticon__action_92_branch_92__true -->|next| method_zopugm_geticon__action_92_branch_92__merge
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__condition -->|continue| method_zopugm_geticon__action_92_geticon_guard_clause_92_1__false
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__condition -->|exit| method_zopugm_geticon__action_92_geticon_guard_clause_92_1__true
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__false -->|next| method_zopugm_geticon__action_92_geticon_guard_clause_92_1__merge
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__merge -->|next| method_zopugm_geticon__action_93_geticon_guard_clause_93_2__condition
|
||||
method_zopugm_geticon__action_92_geticon_guard_clause_92_1__true -->|next| method_zopugm_geticon__action_92_geticon_guard_clause_92_1__merge
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__condition -->|continue| method_zopugm_geticon__action_93_geticon_guard_clause_93_2__false
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__condition -->|exit| method_zopugm_geticon__action_93_geticon_guard_clause_93_2__true
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__false -->|next| method_zopugm_geticon__action_93_geticon_guard_clause_93_2__merge
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__merge -->|return| method_zopugm_geticon__action_94_geticon_return_94_3__return
|
||||
method_zopugm_geticon__action_93_geticon_guard_clause_93_2__true -->|next| method_zopugm_geticon__action_93_geticon_guard_clause_93_2__merge
|
||||
method_zopugm_geticon__entry -->|next| method_zopugm_geticon__action_91_guard_clause_91__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 3 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_xt4lks_runcheck__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 20 edges).
|
||||
- Warning: control-flow: diagram method_8ug383_getstatusclass__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 26 edges).
|
||||
- Warning: control-flow: diagram method_zopugm_geticon__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 26 edges).
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
# IntelligenceToolbar
|
||||
|
||||
- File ID: file:q33ld0:intelligencetoolbar-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Molecules/IntelligenceToolbar.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that provides an intelligence/AI toolbar with navigation, focus mode toggle, cache clearing and logout actions; wires UI events to injected services and updates UI state on FocusMode changes.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component is event-driven: subscribes to FocusMode events, exposes async actions (clear cache, logout) via injected application services, logs operations to Console, and triggers UI re-renders; markup binds FocusMode.IsFocusModeActive to adjust CSS classes.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IntelligenceToolbar: Blazor UI component that provides an intelligence/AI toolbar with navigation, focus mode toggle, cache clearing and logout actions; wires UI events to injected services and updates UI state on FocusMode changes.
|
||||
- OnInitialized(): Component lifecycle initialization: subscribes to FocusMode change events to trigger UI updates.
|
||||
- HandleClearCache(): Asynchronously requests clearing the AI/knowledge cache via KnowledgeService and logs the outcome.
|
||||
- HandleLogout(): Logs the user out via IdentityService and then navigates to the logout form.
|
||||
- HandleUpdate(): Triggers a UI refresh on the Blazor renderer when FocusMode changes.
|
||||
- Dispose(): Lifecycle cleanup: unsubscribes from FocusMode change events to avoid memory leaks.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions/Services/IKnowledgeService.cs
|
||||
- dependency-target: NexusReader.Application.Abstractions/Services/IIdentityService.cs
|
||||
- dependency-target: Microsoft.AspNetCore.Components/NavigationManager (framework)
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- call-target: NexusReader.Application.Abstractions/Services/IKnowledgeService.cs
|
||||
- call-target: NexusReader.Application.Abstractions/Services/IIdentityService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- interaction-target: await KnowledgeService.ClearCacheAsync()
|
||||
- interaction-target: await IdentityService.LogoutAsync()
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 7
|
||||
- Unresolved references: 9
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 4
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleClearCache: 15 nodes, 16 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleLogout: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleUpdate: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Dispose: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IntelligenceToolbar Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_nsawvo_intelligencetoolbar("IntelligenceToolbar")
|
||||
file_q33ld0_intelligencetoolbar_razor("IntelligenceToolbar")
|
||||
method_1dyzngl_handleclearcache[["HandleClearCache()"]]
|
||||
method_1ef8df_oninitialized[["OnInitialized()"]]
|
||||
method_1nyg1j6_dispose[["Dispose()"]]
|
||||
method_68za1u_handlelogout[["HandleLogout()"]]
|
||||
method_oj5ghm_handleupdate[["HandleUpdate()"]]
|
||||
file_xs3ks1_ifocusmodeservice_cs[/"IFocusModeService"/]
|
||||
file_q33ld0_intelligencetoolbar_razor -->|IFocusModeService| file_xs3ks1_ifocusmodeservice_cs
|
||||
```
|
||||
|
||||
### IntelligenceToolbar Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_nsawvo_intelligencetoolbar("IntelligenceToolbar")
|
||||
method_1dyzngl_handleclearcache[["HandleClearCache()"]]
|
||||
method_1ef8df_oninitialized[["OnInitialized()"]]
|
||||
method_1nyg1j6_dispose[["Dispose()"]]
|
||||
method_68za1u_handlelogout[["HandleLogout()"]]
|
||||
method_oj5ghm_handleupdate[["HandleUpdate()"]]
|
||||
unresolved_unresolved_1cqxa9n_interaction_target{"Unresolved: await IdentityService.LogoutAsync()"}
|
||||
unresolved_unresolved_1vsk4w2_call_target{"Unresolved: LogoutAsync"}
|
||||
unresolved_unresolved_2xgh31_call_target{"Unresolved: OnFocusModeChanged (event add)"}
|
||||
unresolved_unresolved_4foxma_call_target{"Unresolved: OnFocusModeChanged (event remove)"}
|
||||
unresolved_unresolved_854yi0_call_target{"Unresolved: ClearCacheAsync"}
|
||||
unresolved_unresolved_9twudu_interaction_target{"Unresolved: await KnowledgeService.ClearCacheAsync()"}
|
||||
class_nsawvo_intelligencetoolbar -->|contains| method_1dyzngl_handleclearcache
|
||||
class_nsawvo_intelligencetoolbar -->|contains| method_1ef8df_oninitialized
|
||||
class_nsawvo_intelligencetoolbar -->|contains| method_1nyg1j6_dispose
|
||||
class_nsawvo_intelligencetoolbar -->|contains| method_68za1u_handlelogout
|
||||
class_nsawvo_intelligencetoolbar -->|contains| method_oj5ghm_handleupdate
|
||||
class_nsawvo_intelligencetoolbar -->|unresolved interaction| unresolved_unresolved_1cqxa9n_interaction_target
|
||||
class_nsawvo_intelligencetoolbar -->|unresolved interaction| unresolved_unresolved_9twudu_interaction_target
|
||||
method_1dyzngl_handleclearcache -->|unresolved call| unresolved_unresolved_854yi0_call_target
|
||||
method_1ef8df_oninitialized -->|unresolved call| unresolved_unresolved_2xgh31_call_target
|
||||
method_1nyg1j6_dispose -->|unresolved call| unresolved_unresolved_4foxma_call_target
|
||||
method_68za1u_handlelogout -->|unresolved call| unresolved_unresolved_1vsk4w2_call_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1ef8df_oninitialized__call_50_OnFocusModeChanged_event_add_[["OnFocusModeChanged (event add)"]]
|
||||
method_1ef8df_oninitialized__action_50_event_subscribe_50__linear("Subscribe to FocusMode changes")
|
||||
method_1ef8df_oninitialized__entry(["OnInitialized entry"])
|
||||
method_1ef8df_oninitialized__implicit_return(["return"])
|
||||
method_1ef8df_oninitialized__action_50_event_subscribe_50__linear -->|adds HandleUpdate delegate| method_1ef8df_oninitialized__call_50_OnFocusModeChanged_event_add_
|
||||
method_1ef8df_oninitialized__call_50_OnFocusModeChanged_event_add_ -->|return| method_1ef8df_oninitialized__implicit_return
|
||||
method_1ef8df_oninitialized__entry -->|next| method_1ef8df_oninitialized__action_50_event_subscribe_50__linear
|
||||
```
|
||||
|
||||
### HandleClearCache() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1dyzngl_handleclearcache__call_57_ClearCacheAsync[["ClearCacheAsync"]]
|
||||
method_1dyzngl_handleclearcache__action_56_log_56__linear("Requesting cache clear")
|
||||
method_1dyzngl_handleclearcache__action_57_handleclearcache_await_57_0__await[["Waits for async work"]]
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__condition{"result.IsSuccess"}
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__false("no-op")
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__merge("merge")
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__true("log-success")
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__condition{"result.IsSuccess"}
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__false("false")
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__merge("merge")
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__true("true")
|
||||
method_1dyzngl_handleclearcache__action_60_log_60__linear("Cache cleared confirmation")
|
||||
method_1dyzngl_handleclearcache__entry(["HandleClearCache entry"])
|
||||
method_1dyzngl_handleclearcache__action_57_external_call_57__linear("ClearCacheAsync invoked")
|
||||
method_1dyzngl_handleclearcache__implicit_return(["return"])
|
||||
method_1dyzngl_handleclearcache__action_56_log_56__linear -->|next| method_1dyzngl_handleclearcache__action_57_handleclearcache_await_57_0__await
|
||||
method_1dyzngl_handleclearcache__action_57_external_call_57__linear -->|no params, awaited call| method_1dyzngl_handleclearcache__call_57_ClearCacheAsync
|
||||
method_1dyzngl_handleclearcache__action_57_handleclearcache_await_57_0__await -->|next| method_1dyzngl_handleclearcache__action_57_external_call_57__linear
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__condition -->|no-op| method_1dyzngl_handleclearcache__action_58_guard_clause_58__false
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__condition -->|log-success| method_1dyzngl_handleclearcache__action_58_guard_clause_58__true
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__false -->|next| method_1dyzngl_handleclearcache__action_58_guard_clause_58__merge
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__merge -->|next| method_1dyzngl_handleclearcache__action_60_log_60__linear
|
||||
method_1dyzngl_handleclearcache__action_58_guard_clause_58__true -->|next| method_1dyzngl_handleclearcache__action_58_guard_clause_58__merge
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__condition -->|false| method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__false
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__condition -->|true| method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__true
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__false -->|next| method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__merge
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__merge -->|next| method_1dyzngl_handleclearcache__action_58_guard_clause_58__condition
|
||||
method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__true -->|next| method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__merge
|
||||
method_1dyzngl_handleclearcache__action_60_log_60__linear -->|return| method_1dyzngl_handleclearcache__implicit_return
|
||||
method_1dyzngl_handleclearcache__call_57_ClearCacheAsync -->|next| method_1dyzngl_handleclearcache__action_58_handleclearcache_branch_58_1__condition
|
||||
method_1dyzngl_handleclearcache__entry -->|next| method_1dyzngl_handleclearcache__action_56_log_56__linear
|
||||
```
|
||||
|
||||
### HandleLogout() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_68za1u_handlelogout__call_66_LogoutAsync[["LogoutAsync"]]
|
||||
method_68za1u_handlelogout__action_66_handlelogout_await_66_0__await[["Waits for async work"]]
|
||||
method_68za1u_handlelogout__action_67_navigation_67__linear("Navigate to logout form")
|
||||
method_68za1u_handlelogout__entry(["HandleLogout entry"])
|
||||
method_68za1u_handlelogout__action_66_external_call_66__linear("Logout invoked")
|
||||
method_68za1u_handlelogout__implicit_return(["return"])
|
||||
method_68za1u_handlelogout__action_66_external_call_66__linear -->|no params, awaited call| method_68za1u_handlelogout__call_66_LogoutAsync
|
||||
method_68za1u_handlelogout__action_66_handlelogout_await_66_0__await -->|next| method_68za1u_handlelogout__action_66_external_call_66__linear
|
||||
method_68za1u_handlelogout__action_67_navigation_67__linear -->|return| method_68za1u_handlelogout__implicit_return
|
||||
method_68za1u_handlelogout__call_66_LogoutAsync -->|next| method_68za1u_handlelogout__action_67_navigation_67__linear
|
||||
method_68za1u_handlelogout__entry -->|next| method_68za1u_handlelogout__action_66_handlelogout_await_66_0__await
|
||||
```
|
||||
|
||||
### Dispose() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1nyg1j6_dispose__call_74_OnFocusModeChanged_event_remove_[["OnFocusModeChanged (event remove)"]]
|
||||
method_1nyg1j6_dispose__action_74_event_unsubscribe_74__linear("Unsubscribe from FocusMode changes")
|
||||
method_1nyg1j6_dispose__entry(["Dispose entry"])
|
||||
method_1nyg1j6_dispose__implicit_return(["return"])
|
||||
method_1nyg1j6_dispose__action_74_event_unsubscribe_74__linear -->|removes HandleUpdate delegate| method_1nyg1j6_dispose__call_74_OnFocusModeChanged_event_remove_
|
||||
method_1nyg1j6_dispose__call_74_OnFocusModeChanged_event_remove_ -->|return| method_1nyg1j6_dispose__implicit_return
|
||||
method_1nyg1j6_dispose__entry -->|next| method_1nyg1j6_dispose__action_74_event_unsubscribe_74__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 4 unresolved jumps.
|
||||
+377
@@ -0,0 +1,377 @@
|
||||
# KnowledgeCheck
|
||||
|
||||
- File ID: file:yno7se:knowledgecheck-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Molecules/KnowledgeCheck.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that renders a knowledge-check quiz, manages local answer state, reacts to quiz service updates, and submits answers via MediatR with haptic feedback via a platform service.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component maintains a local dictionary mapping QuizQuestionDto -> (SelectedIndex, IsCorrect), subscribes/unsubscribes to quiz updates, uses MediatR to send SubmitAnswerCommand, and uses IPlatformService for haptic feedback on interactions.
|
||||
|
||||
## Symbols
|
||||
|
||||
- OnInitialized(): Lifecycle initialization: subscribes to the QuizService update event to refresh UI when quiz state changes.
|
||||
- HandleUpdate(): Requests a UI re-render on the Blazor synchronization context when the quiz service signals an update.
|
||||
- Dispose(): Lifecycle cleanup: unsubscribes from the QuizService update event.
|
||||
- SelectOptionAsync(): Handles user's option selection: prevents double submissions, triggers haptic feedback, submits an answer command via Mediator, updates local state, and triggers success/error vibration and UI refresh.
|
||||
- AllQuestionsAnswered(): Determines whether all quiz questions have been answered by comparing local state count with current quiz question count.
|
||||
- GetBlockClass(): Returns a CSS class for a question block based on local correctness state (correct/incorrect) or empty when unanswered.
|
||||
- GetOptionClass(): Returns CSS class for an option depending on selection, correctness, revealed-correct when incorrect, or faded for others.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries.Quiz (Quiz DTOs)
|
||||
- dependency-target: NexusReader.Application.Commands.Quiz (SubmitAnswerCommand)
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (IPlatformService, IQuizStateService)
|
||||
- dependency-target: MediatR (IMediator) - external library
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: NexusReader.Application.Commands.Quiz
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: await PlatformService.VibrateAsync(40)
|
||||
- interaction-target: var res = await Mediator.Send(cmd)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 7
|
||||
- Executable symbols: 7
|
||||
- Executable symbols with control flow: 7
|
||||
- Grounded edges: 7
|
||||
- Unresolved references: 14
|
||||
- Control-flow fragments: 7
|
||||
- Unresolved jumps: 8
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 8
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleUpdate: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Dispose: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
- SelectOptionAsync: 36 nodes, 40 edges, 5 jumps, 0 unsupported constructs
|
||||
- AllQuestionsAnswered: 9 nodes, 9 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetBlockClass: 10 nodes, 11 edges, 0 jumps, 0 unsupported constructs
|
||||
- GetOptionClass: 28 nodes, 33 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### KnowledgeCheck Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_yno7se_knowledgecheck_razor("KnowledgeCheck")
|
||||
method_13emvrm_oninitialized[["OnInitialized()"]]
|
||||
method_1b8lqka_handleupdate[["HandleUpdate()"]]
|
||||
method_1dimc2e_getblockclass[["GetBlockClass()"]]
|
||||
method_1q9e63q_getoptionclass[["GetOptionClass()"]]
|
||||
method_9q9eda_dispose[["Dispose()"]]
|
||||
method_cgrv35_selectoptionasync[["SelectOptionAsync()"]]
|
||||
method_ty8u23_allquestionsanswered[["AllQuestionsAnswered()"]]
|
||||
```
|
||||
|
||||
### KnowledgeCheck Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_yno7se_knowledgecheck_razor("KnowledgeCheck")
|
||||
method_13emvrm_oninitialized[["OnInitialized()"]]
|
||||
method_1b8lqka_handleupdate[["HandleUpdate()"]]
|
||||
method_1dimc2e_getblockclass[["GetBlockClass()"]]
|
||||
method_1q9e63q_getoptionclass[["GetOptionClass()"]]
|
||||
method_9q9eda_dispose[["Dispose()"]]
|
||||
method_cgrv35_selectoptionasync[["SelectOptionAsync()"]]
|
||||
method_ty8u23_allquestionsanswered[["AllQuestionsAnswered()"]]
|
||||
unresolved_unresolved_149jext_call_target{"Unresolved: QuizService.OnQuizUpdated (event add)"}
|
||||
unresolved_unresolved_16bacnb_interaction_target{"Unresolved: var res = await Mediator.Send(cmd)"}
|
||||
unresolved_unresolved_1ai32n7_interaction_target{"Unresolved: await PlatformService.VibrateAsync(40)"}
|
||||
unresolved_unresolved_1h17smo_call_target{"Unresolved: PlatformService.VibrateAsync"}
|
||||
unresolved_unresolved_1hll04e_call_target{"Unresolved: PlatformService.VibrateErrorAsync"}
|
||||
unresolved_unresolved_1msmcsp_call_target{"Unresolved: PlatformService.VibrateSuccessAsync"}
|
||||
unresolved_unresolved_1xwqjw3_call_target{"Unresolved: SubmitAnswerCommand..ctor"}
|
||||
unresolved_unresolved_5f31sk_call_target{"Unresolved: QuizService.OnQuizUpdated (event remove)"}
|
||||
unresolved_unresolved_a4jvef_call_target{"Unresolved: IMediator.Send"}
|
||||
unresolved_unresolved_jnv1ge_call_target{"Unresolved: QuizService.CurrentQuiz"}
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_13emvrm_oninitialized
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_1b8lqka_handleupdate
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_1dimc2e_getblockclass
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_1q9e63q_getoptionclass
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_9q9eda_dispose
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_cgrv35_selectoptionasync
|
||||
file_yno7se_knowledgecheck_razor -->|contains| method_ty8u23_allquestionsanswered
|
||||
file_yno7se_knowledgecheck_razor -->|unresolved interaction| unresolved_unresolved_16bacnb_interaction_target
|
||||
file_yno7se_knowledgecheck_razor -->|unresolved interaction| unresolved_unresolved_1ai32n7_interaction_target
|
||||
method_13emvrm_oninitialized -->|unresolved call| unresolved_unresolved_149jext_call_target
|
||||
method_9q9eda_dispose -->|unresolved call| unresolved_unresolved_5f31sk_call_target
|
||||
method_cgrv35_selectoptionasync -->|unresolved call| unresolved_unresolved_1h17smo_call_target
|
||||
method_cgrv35_selectoptionasync -->|unresolved call| unresolved_unresolved_1hll04e_call_target
|
||||
method_cgrv35_selectoptionasync -->|unresolved call| unresolved_unresolved_1msmcsp_call_target
|
||||
method_cgrv35_selectoptionasync -->|unresolved call| unresolved_unresolved_1xwqjw3_call_target
|
||||
method_cgrv35_selectoptionasync -->|unresolved call| unresolved_unresolved_a4jvef_call_target
|
||||
method_ty8u23_allquestionsanswered -->|unresolved call| unresolved_unresolved_jnv1ge_call_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_13emvrm_oninitialized__call_58_QuizService_OnQuizUpdated_event_add_[["QuizService.OnQuizUpdated (event add)"]]
|
||||
method_13emvrm_oninitialized__action_58_event_subscribe_58__linear("Subscribe to quiz updates")
|
||||
method_13emvrm_oninitialized__entry(["OnInitialized entry"])
|
||||
method_13emvrm_oninitialized__implicit_return(["return"])
|
||||
method_13emvrm_oninitialized__action_58_event_subscribe_58__linear -->|HandleUpdate delegate| method_13emvrm_oninitialized__call_58_QuizService_OnQuizUpdated_event_add_
|
||||
method_13emvrm_oninitialized__call_58_QuizService_OnQuizUpdated_event_add_ -->|return| method_13emvrm_oninitialized__implicit_return
|
||||
method_13emvrm_oninitialized__entry -->|next| method_13emvrm_oninitialized__action_58_event_subscribe_58__linear
|
||||
```
|
||||
|
||||
### Dispose() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_9q9eda_dispose__call_65_QuizService_OnQuizUpdated_event_remove_[["QuizService.OnQuizUpdated (event remove)"]]
|
||||
method_9q9eda_dispose__action_65_event_unsubscribe_65__linear("Unsubscribe from quiz updates")
|
||||
method_9q9eda_dispose__entry(["Dispose entry"])
|
||||
method_9q9eda_dispose__implicit_return(["return"])
|
||||
method_9q9eda_dispose__action_65_event_unsubscribe_65__linear -->|HandleUpdate delegate| method_9q9eda_dispose__call_65_QuizService_OnQuizUpdated_event_remove_
|
||||
method_9q9eda_dispose__call_65_QuizService_OnQuizUpdated_event_remove_ -->|return| method_9q9eda_dispose__implicit_return
|
||||
method_9q9eda_dispose__entry -->|next| method_9q9eda_dispose__action_65_event_unsubscribe_65__linear
|
||||
```
|
||||
|
||||
### SelectOptionAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_cgrv35_selectoptionasync__fragment_diagram exceeds preferred complexity thresholds (36 nodes, 40 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_cgrv35_selectoptionasync__call_73_PlatformService_VibrateAsync[["PlatformService.VibrateAsync"]]
|
||||
method_cgrv35_selectoptionasync__call_75_SubmitAnswerCommand_ctor[["SubmitAnswerCommand..ctor"]]
|
||||
method_cgrv35_selectoptionasync__call_76_IMediator_Send[["IMediator.Send"]]
|
||||
method_cgrv35_selectoptionasync__call_81_PlatformService_VibrateSuccessAsync[["PlatformService.VibrateSuccessAsync"]]
|
||||
method_cgrv35_selectoptionasync__call_83_PlatformService_VibrateErrorAsync[["PlatformService.VibrateErrorAsync"]]
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__condition{"_states.ContainsKey(question)"}
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__false("continue")
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__merge("merge")
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__true("return (ignored)")
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__condition{"_states.ContainsKey(question)"}
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__false("continue")
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__merge("merge")
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__true("exit")
|
||||
method_cgrv35_selectoptionasync__action_73_selectoptionasync_await_73_1__await[["Waits for async work"]]
|
||||
method_cgrv35_selectoptionasync__action_75_create_command_75__linear("Build submit command")
|
||||
method_cgrv35_selectoptionasync__action_76_selectoptionasync_await_76_2__await[["Waits for async work"]]
|
||||
method_cgrv35_selectoptionasync__action_78_state_write_78__linear("Record selected index and correctness")
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__condition{"res.IsSuccess"}
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__false("failure -> VibrateErrorAsync")
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__merge("merge")
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__true("success -> VibrateSuccessAsync")
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__condition{"res.IsSuccess"}
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__false("false")
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__merge("merge")
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__true("true")
|
||||
method_cgrv35_selectoptionasync__action_81_selectoptionasync_await_81_4__await[["Waits for async work"]]
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__condition{"Falls back to alternate path"}
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__false("otherwise")
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__merge("merge")
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__true("fallback")
|
||||
method_cgrv35_selectoptionasync__action_83_selectoptionasync_await_83_6__await[["Waits for async work"]]
|
||||
method_cgrv35_selectoptionasync__action_85_ui_update_85__linear("Trigger UI refresh")
|
||||
method_cgrv35_selectoptionasync__entry(["SelectOptionAsync entry"])
|
||||
method_cgrv35_selectoptionasync__action_73_external_call_73__linear("Haptic feedback before submit")
|
||||
method_cgrv35_selectoptionasync__action_76_external_call_76__linear("Send command to mediator")
|
||||
method_cgrv35_selectoptionasync__implicit_return(["return"])
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__condition -->|continue| method_cgrv35_selectoptionasync__action_70_guard_clause_70__false
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__condition -->|return ignored| method_cgrv35_selectoptionasync__action_70_guard_clause_70__true
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__false -->|next| method_cgrv35_selectoptionasync__action_70_guard_clause_70__merge
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__merge -->|next| method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__condition
|
||||
method_cgrv35_selectoptionasync__action_70_guard_clause_70__true -->|next| method_cgrv35_selectoptionasync__action_70_guard_clause_70__merge
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__condition -->|continue| method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__false
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__condition -->|exit| method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__true
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__false -->|next| method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__merge
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__merge -->|next| method_cgrv35_selectoptionasync__action_73_selectoptionasync_await_73_1__await
|
||||
method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__true -->|next| method_cgrv35_selectoptionasync__action_70_selectoptionasync_guard_clause_70_0__merge
|
||||
method_cgrv35_selectoptionasync__action_73_external_call_73__linear -->|40 ms vibration duration| method_cgrv35_selectoptionasync__call_73_PlatformService_VibrateAsync
|
||||
method_cgrv35_selectoptionasync__action_73_selectoptionasync_await_73_1__await -->|next| method_cgrv35_selectoptionasync__action_73_external_call_73__linear
|
||||
method_cgrv35_selectoptionasync__action_75_create_command_75__linear -->|index, question.CorrectIndex| method_cgrv35_selectoptionasync__call_75_SubmitAnswerCommand_ctor
|
||||
method_cgrv35_selectoptionasync__action_76_external_call_76__linear -->|SubmitAnswerCommand| method_cgrv35_selectoptionasync__call_76_IMediator_Send
|
||||
method_cgrv35_selectoptionasync__action_76_selectoptionasync_await_76_2__await -->|next| method_cgrv35_selectoptionasync__action_76_external_call_76__linear
|
||||
method_cgrv35_selectoptionasync__action_78_state_write_78__linear -->|next| method_cgrv35_selectoptionasync__action_80_branch_80__condition
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__condition -->|failure -> VibrateErrorAsync| method_cgrv35_selectoptionasync__action_80_branch_80__false
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__condition -->|success -> VibrateSuccessAsync| method_cgrv35_selectoptionasync__action_80_branch_80__true
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__false -->|next| method_cgrv35_selectoptionasync__action_80_branch_80__merge
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__merge -->|next| method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__condition
|
||||
method_cgrv35_selectoptionasync__action_80_branch_80__true -->|next| method_cgrv35_selectoptionasync__action_80_branch_80__merge
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__condition -->|false| method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__false
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__condition -->|true| method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__true
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__false -->|next| method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__merge
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__merge -->|next| method_cgrv35_selectoptionasync__action_81_selectoptionasync_await_81_4__await
|
||||
method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__true -->|next| method_cgrv35_selectoptionasync__action_80_selectoptionasync_branch_80_3__merge
|
||||
method_cgrv35_selectoptionasync__action_81_selectoptionasync_await_81_4__await -->|no args| method_cgrv35_selectoptionasync__call_81_PlatformService_VibrateSuccessAsync
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__condition -->|otherwise| method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__false
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__condition -->|fallback| method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__true
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__false -->|next| method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__merge
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__merge -->|next| method_cgrv35_selectoptionasync__action_83_selectoptionasync_await_83_6__await
|
||||
method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__true -->|next| method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__merge
|
||||
method_cgrv35_selectoptionasync__action_83_selectoptionasync_await_83_6__await -->|no args| method_cgrv35_selectoptionasync__call_83_PlatformService_VibrateErrorAsync
|
||||
method_cgrv35_selectoptionasync__action_85_ui_update_85__linear -->|return| method_cgrv35_selectoptionasync__implicit_return
|
||||
method_cgrv35_selectoptionasync__call_73_PlatformService_VibrateAsync -->|next| method_cgrv35_selectoptionasync__action_75_create_command_75__linear
|
||||
method_cgrv35_selectoptionasync__call_75_SubmitAnswerCommand_ctor -->|next| method_cgrv35_selectoptionasync__action_76_selectoptionasync_await_76_2__await
|
||||
method_cgrv35_selectoptionasync__call_76_IMediator_Send -->|next| method_cgrv35_selectoptionasync__action_78_state_write_78__linear
|
||||
method_cgrv35_selectoptionasync__call_81_PlatformService_VibrateSuccessAsync -->|fallback| method_cgrv35_selectoptionasync__action_82_selectoptionasync_fallback_82_5__condition
|
||||
method_cgrv35_selectoptionasync__call_83_PlatformService_VibrateErrorAsync -->|next| method_cgrv35_selectoptionasync__action_85_ui_update_85__linear
|
||||
method_cgrv35_selectoptionasync__entry -->|next| method_cgrv35_selectoptionasync__action_70_guard_clause_70__condition
|
||||
```
|
||||
|
||||
### AllQuestionsAnswered() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_ty8u23_allquestionsanswered__call_90_QuizService_CurrentQuiz[["QuizService.CurrentQuiz"]]
|
||||
method_ty8u23_allquestionsanswered__action_90_comparison_90__linear("Compare answered count to question count")
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__condition{"QuizService.CurrentQuiz != null"}
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__false("continue")
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__merge("merge")
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__true("false if null")
|
||||
method_ty8u23_allquestionsanswered__entry(["AllQuestionsAnswered entry"])
|
||||
method_ty8u23_allquestionsanswered__action_90_allquestionsanswered_return_90_0__return(["Returns result"])
|
||||
method_ty8u23_allquestionsanswered__implicit_return(["return"])
|
||||
method_ty8u23_allquestionsanswered__action_90_allquestionsanswered_return_90_0__return -->|next| method_ty8u23_allquestionsanswered__action_90_guard_clause_90__condition
|
||||
method_ty8u23_allquestionsanswered__action_90_comparison_90__linear -->|read property to check null and access Questions.Count| method_ty8u23_allquestionsanswered__call_90_QuizService_CurrentQuiz
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__condition -->|continue| method_ty8u23_allquestionsanswered__action_90_guard_clause_90__false
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__condition -->|false if null| method_ty8u23_allquestionsanswered__action_90_guard_clause_90__true
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__false -->|next| method_ty8u23_allquestionsanswered__action_90_guard_clause_90__merge
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__merge -->|next| method_ty8u23_allquestionsanswered__action_90_comparison_90__linear
|
||||
method_ty8u23_allquestionsanswered__action_90_guard_clause_90__true -->|next| method_ty8u23_allquestionsanswered__action_90_guard_clause_90__merge
|
||||
method_ty8u23_allquestionsanswered__call_90_QuizService_CurrentQuiz -->|return| method_ty8u23_allquestionsanswered__implicit_return
|
||||
method_ty8u23_allquestionsanswered__entry -->|return| method_ty8u23_allquestionsanswered__action_90_allquestionsanswered_return_90_0__return
|
||||
```
|
||||
|
||||
### GetBlockClass() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__condition{"_states.TryGetValue(question, out state)"}
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__false("return state-based class")
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__merge("merge")
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__true("return empty string")
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__condition{"!_states.TryGetValue(question, out var state)"}
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__false("continue")
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__merge("merge")
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__true("exit")
|
||||
method_1dimc2e_getblockclass__entry(["GetBlockClass entry"])
|
||||
method_1dimc2e_getblockclass__action_97_getblockclass_return_97_1__return(["Returns result"])
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__condition -->|return state-based class| method_1dimc2e_getblockclass__action_96_branch_96__false
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__condition -->|return empty string| method_1dimc2e_getblockclass__action_96_branch_96__true
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__false -->|next| method_1dimc2e_getblockclass__action_96_branch_96__merge
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__merge -->|next| method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__condition
|
||||
method_1dimc2e_getblockclass__action_96_branch_96__true -->|next| method_1dimc2e_getblockclass__action_96_branch_96__merge
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__condition -->|continue| method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__false
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__condition -->|exit| method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__true
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__false -->|next| method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__merge
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__merge -->|return| method_1dimc2e_getblockclass__action_97_getblockclass_return_97_1__return
|
||||
method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__true -->|next| method_1dimc2e_getblockclass__action_96_getblockclass_guard_clause_96_0__merge
|
||||
method_1dimc2e_getblockclass__entry -->|next| method_1dimc2e_getblockclass__action_96_branch_96__condition
|
||||
```
|
||||
|
||||
### GetOptionClass() Control Flow
|
||||
|
||||
_Warnings: diagram method_1q9e63q_getoptionclass__fragment_diagram exceeds preferred complexity thresholds (28 nodes, 33 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__condition{"!_states.TryGetValue(question, out var state)"}
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__false("continue")
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__true("exit")
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__condition{"!_states.TryGetValue(question, out state)"}
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__false("continue")
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__true("return empty")
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__condition{"state.SelectedIndex == index"}
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__false("check revealed correct")
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__true("option-correct / option-incorrect")
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__condition{"state.SelectedIndex == index"}
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__false("false")
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__true("true")
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__condition{"state.IsCorrect == false && question.CorrectIndex == index"}
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__false("option-faded")
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__true("option-revealed-correct")
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__condition{"state.IsCorrect == false && question.CorrectIndex == index"}
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__false("false")
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__merge("merge")
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__true("true")
|
||||
method_1q9e63q_getoptionclass__entry(["GetOptionClass entry"])
|
||||
method_1q9e63q_getoptionclass__action_105_getoptionclass_return_105_2__return(["Returns result"])
|
||||
method_1q9e63q_getoptionclass__action_108_getoptionclass_return_108_4__return(["Returns result"])
|
||||
method_1q9e63q_getoptionclass__action_110_getoptionclass_return_110_5__return(["Returns result"])
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__condition -->|continue| method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__false
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__condition -->|exit| method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__true
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__false -->|next| method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__merge
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__merge -->|next| method_1q9e63q_getoptionclass__action_104_branch_104__condition
|
||||
method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__true -->|next| method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__merge
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__condition -->|continue| method_1q9e63q_getoptionclass__action_102_guard_clause_102__false
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__condition -->|return empty| method_1q9e63q_getoptionclass__action_102_guard_clause_102__true
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__false -->|next| method_1q9e63q_getoptionclass__action_102_guard_clause_102__merge
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__merge -->|next| method_1q9e63q_getoptionclass__action_102_getoptionclass_guard_clause_102_0__condition
|
||||
method_1q9e63q_getoptionclass__action_102_guard_clause_102__true -->|next| method_1q9e63q_getoptionclass__action_102_guard_clause_102__merge
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__condition -->|check revealed correct| method_1q9e63q_getoptionclass__action_104_branch_104__false
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__condition -->|option-correct / option-incorrect| method_1q9e63q_getoptionclass__action_104_branch_104__true
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__false -->|next| method_1q9e63q_getoptionclass__action_104_branch_104__merge
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__merge -->|next| method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__condition
|
||||
method_1q9e63q_getoptionclass__action_104_branch_104__true -->|next| method_1q9e63q_getoptionclass__action_104_branch_104__merge
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__condition -->|false| method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__false
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__condition -->|true| method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__true
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__false -->|next| method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__merge
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__merge -->|return| method_1q9e63q_getoptionclass__action_105_getoptionclass_return_105_2__return
|
||||
method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__true -->|next| method_1q9e63q_getoptionclass__action_104_getoptionclass_branch_104_1__merge
|
||||
method_1q9e63q_getoptionclass__action_105_getoptionclass_return_105_2__return -->|next| method_1q9e63q_getoptionclass__action_107_branch_107__condition
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__condition -->|option-faded| method_1q9e63q_getoptionclass__action_107_branch_107__false
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__condition -->|option-revealed-correct| method_1q9e63q_getoptionclass__action_107_branch_107__true
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__false -->|next| method_1q9e63q_getoptionclass__action_107_branch_107__merge
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__merge -->|next| method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__condition
|
||||
method_1q9e63q_getoptionclass__action_107_branch_107__true -->|next| method_1q9e63q_getoptionclass__action_107_branch_107__merge
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__condition -->|false| method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__false
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__condition -->|true| method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__true
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__false -->|next| method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__merge
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__merge -->|return| method_1q9e63q_getoptionclass__action_108_getoptionclass_return_108_4__return
|
||||
method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__true -->|next| method_1q9e63q_getoptionclass__action_107_getoptionclass_branch_107_3__merge
|
||||
method_1q9e63q_getoptionclass__action_108_getoptionclass_return_108_4__return -->|return| method_1q9e63q_getoptionclass__action_110_getoptionclass_return_110_5__return
|
||||
method_1q9e63q_getoptionclass__entry -->|next| method_1q9e63q_getoptionclass__action_102_guard_clause_102__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 8 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_cgrv35_selectoptionasync__fragment_diagram exceeds preferred complexity thresholds (36 nodes, 40 edges).
|
||||
- Warning: control-flow: diagram method_1q9e63q_getoptionclass__fragment_diagram exceeds preferred complexity thresholds (28 nodes, 33 edges).
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
# SelectionAiPanel
|
||||
|
||||
- File ID: file:1ez5kuw:selectionaipanel-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Molecules/SelectionAiPanel.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that shows an AI assistant panel for a user text selection, requests summaries/quizzes via an injected KnowledgeCoordinator, and notifies the reader interaction service when closed.
|
||||
|
||||
## Key Details
|
||||
|
||||
Razor component renders conditional UI based on SelectedText and Coordinates; it orchestrates async calls to an injected KnowledgeCoordinator to get AI-derived content and uses IReaderInteractionService to clear/propagate selection state. UI event handlers map directly to async methods that manage loading state and packet caching.
|
||||
|
||||
## Symbols
|
||||
|
||||
- SelectionAiPanel: Blazor UI component that shows an AI assistant panel for a user text selection, requests summaries/quizzes via an injected KnowledgeCoordinator, and notifies the reader interaction service when closed.
|
||||
- IsVisible(): Computed property indicating if the selection panel should be shown (non-empty SelectedText and Coordinates present).
|
||||
- PositionBelow(): Determines whether the panel should be positioned below the selection based on Coordinates.Top.
|
||||
- OnParametersSet(): Lifecycle method called when component parameters change; logs state and resets the cached KnowledgePacket.
|
||||
- PanelStyle(): Builds inline CSS positioning string for the panel using Coordinates and PositionBelow; returns empty string when Coordinates is null.
|
||||
- RequestSummary(): Orchestrates an async request to the KnowledgeCoordinator to produce a summary/quiz for the selected text (optionally including full page context) and stores the resulting KnowledgePacket.
|
||||
- GenerateFullQuiz(): Requests a summary/quiz for the entire page content, then closes the panel.
|
||||
- CloseAsync(): Clears the cached packet and notifies the reader interaction service that selection has been cleared, effectively closing the panel.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Services/KnowledgeCoordinator.cs
|
||||
- imports NexusReader.UI.Shared/Services/IReaderInteractionService.cs
|
||||
- imports NexusReader.Application/DTOs/AI/KnowledgePacket.cs
|
||||
|
||||
## Calls
|
||||
|
||||
- calls NexusReader.UI.Shared/Services/KnowledgeCoordinator.cs
|
||||
- calls NexusReader.UI.Shared/Services/KnowledgeCoordinator.cs
|
||||
- calls NexusReader.UI.Shared/Services/IReaderInteractionService.cs
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Models/SelectionCoordinates.cs
|
||||
- call-target: self
|
||||
- interaction-target: Awaits Coordinator.RequestSummaryAndQuizAsync(...)
|
||||
- interaction-target: Awaits Coordinator.RequestSummaryAndQuizAsync(FullPageContent)
|
||||
- interaction-target: Awaits InteractionService.NotifyTextSelected(string.Empty, string.Empty, null!) to clear selection globally
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 8
|
||||
- Executable symbols: 7
|
||||
- Executable symbols with control flow: 7
|
||||
- Grounded edges: 14
|
||||
- Unresolved references: 5
|
||||
- Control-flow fragments: 7
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- IsVisible: 6 nodes, 6 edges, 0 jumps, 0 unsupported constructs
|
||||
- PositionBelow: 6 nodes, 6 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnParametersSet: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- PanelStyle: 7 nodes, 7 edges, 0 jumps, 0 unsupported constructs
|
||||
- RequestSummary: 16 nodes, 17 edges, 1 jumps, 0 unsupported constructs
|
||||
- GenerateFullQuiz: 11 nodes, 10 edges, 2 jumps, 0 unsupported constructs
|
||||
- CloseAsync: 8 nodes, 7 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### SelectionAiPanel Neighborhood
|
||||
|
||||
_Warnings: diagram file_1ez5kuw_selectionaipanel_razor_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 6 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_5wh0z0_selectionaipanel("SelectionAiPanel")
|
||||
file_1ez5kuw_selectionaipanel_razor("SelectionAiPanel")
|
||||
method_1bkauax_generatefullquiz[["GenerateFullQuiz()"]]
|
||||
method_1g73g8y_positionbelow[["PositionBelow()"]]
|
||||
method_1kikefa_isvisible[["IsVisible()"]]
|
||||
method_1oq28g8_requestsummary[["RequestSummary()"]]
|
||||
method_1pecu6b_closeasync[["CloseAsync()"]]
|
||||
method_8m5lws_panelstyle[["PanelStyle()"]]
|
||||
method_ilkln5_onparametersset[["OnParametersSet()"]]
|
||||
file_1szg1zb_ireaderinteractionservice_cs[/"IReaderInteractionService"/]
|
||||
file_hjtala_knowledgepacket_cs[/"KnowledgePacket"/]
|
||||
file_uvydt4_knowledgecoordinator_cs[/"KnowledgeCoordinator"/]
|
||||
method_2y4xzb_requestsummaryandquizasync[/"KnowledgeCoordinator"/]
|
||||
method_p2mw02_notifytextselected[/"IReaderInteractionService"/]
|
||||
file_1ez5kuw_selectionaipanel_razor -->|IReaderInteractionService| file_1szg1zb_ireaderinteractionservice_cs
|
||||
file_1ez5kuw_selectionaipanel_razor -->|KnowledgePacket| file_hjtala_knowledgepacket_cs
|
||||
file_1ez5kuw_selectionaipanel_razor -->|KnowledgeCoordinator| file_uvydt4_knowledgecoordinator_cs
|
||||
method_1bkauax_generatefullquiz -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1oq28g8_requestsummary -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1pecu6b_closeasync -->|IReaderInteractionService| method_p2mw02_notifytextselected
|
||||
```
|
||||
|
||||
### SelectionAiPanel Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_5wh0z0_selectionaipanel("SelectionAiPanel")
|
||||
method_1bkauax_generatefullquiz[["GenerateFullQuiz()"]]
|
||||
method_1g73g8y_positionbelow[["PositionBelow()"]]
|
||||
method_1kikefa_isvisible[["IsVisible()"]]
|
||||
method_1oq28g8_requestsummary[["RequestSummary()"]]
|
||||
method_1pecu6b_closeasync[["CloseAsync()"]]
|
||||
method_8m5lws_panelstyle[["PanelStyle()"]]
|
||||
method_ilkln5_onparametersset[["OnParametersSet()"]]
|
||||
method_2y4xzb_requestsummaryandquizasync[/"KnowledgeCoordinator"/]
|
||||
method_p2mw02_notifytextselected[/"IReaderInteractionService"/]
|
||||
unresolved_unresolved_1wlc2qr_interaction_target{"Unresolved: Awaits InteractionService.NotifyTextSelected(string.Empty, string.Empty, null!) to clear selection globally"}
|
||||
unresolved_unresolved_bj4qwl_interaction_target{"Unresolved: Awaits Coordinator.RequestSummaryAndQuizAsync(FullPageContent)"}
|
||||
unresolved_unresolved_ie7r18_call_target{"Unresolved: CloseAsync"}
|
||||
unresolved_unresolved_zyw832_interaction_target{"Unresolved: Awaits Coordinator.RequestSummaryAndQuizAsync(...)"}
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_1bkauax_generatefullquiz
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_1g73g8y_positionbelow
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_1kikefa_isvisible
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_1oq28g8_requestsummary
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_1pecu6b_closeasync
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_8m5lws_panelstyle
|
||||
class_5wh0z0_selectionaipanel -->|contains| method_ilkln5_onparametersset
|
||||
class_5wh0z0_selectionaipanel -->|unresolved interaction| unresolved_unresolved_1wlc2qr_interaction_target
|
||||
class_5wh0z0_selectionaipanel -->|unresolved interaction| unresolved_unresolved_bj4qwl_interaction_target
|
||||
class_5wh0z0_selectionaipanel -->|unresolved interaction| unresolved_unresolved_zyw832_interaction_target
|
||||
method_1bkauax_generatefullquiz -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1bkauax_generatefullquiz -->|unresolved call| unresolved_unresolved_ie7r18_call_target
|
||||
method_1oq28g8_requestsummary -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1pecu6b_closeasync -->|IReaderInteractionService| method_p2mw02_notifytextselected
|
||||
```
|
||||
|
||||
### SelectionAiPanel Method Interactions
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
method_1bkauax_generatefullquiz[["GenerateFullQuiz()"]]
|
||||
method_1g73g8y_positionbelow[["PositionBelow()"]]
|
||||
method_1kikefa_isvisible[["IsVisible()"]]
|
||||
method_1oq28g8_requestsummary[["RequestSummary()"]]
|
||||
method_1pecu6b_closeasync[["CloseAsync()"]]
|
||||
method_8m5lws_panelstyle[["PanelStyle()"]]
|
||||
method_ilkln5_onparametersset[["OnParametersSet()"]]
|
||||
method_2y4xzb_requestsummaryandquizasync("KnowledgeCoordinator")
|
||||
method_p2mw02_notifytextselected("IReaderInteractionService")
|
||||
method_1bkauax_generatefullquiz -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1oq28g8_requestsummary -->|KnowledgeCoordinator| method_2y4xzb_requestsummaryandquizasync
|
||||
method_1pecu6b_closeasync -->|IReaderInteractionService| method_p2mw02_notifytextselected
|
||||
```
|
||||
|
||||
### RequestSummary() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1oq28g8_requestsummary__call_83_RequestSummaryAndQuizAsync[["RequestSummaryAndQuizAsync"]]
|
||||
method_1oq28g8_requestsummary__action_41_ui_action_binding_41__linear("Invoked from button")
|
||||
method_1oq28g8_requestsummary__action_78_state_mutation_78__linear("Set loading start")
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__condition{"!string.IsNullOrWhiteSpace(FullPageContent)"}
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__false("no extra context")
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__merge("merge")
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__true("include full page context")
|
||||
method_1oq28g8_requestsummary__action_83_requestsummary_await_83_0__await[["Waits for async work"]]
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__condition{"result.IsSuccess"}
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__false("Packet cleared")
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__merge("merge")
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__true("Packet assigned")
|
||||
method_1oq28g8_requestsummary__action_85_state_mutation_85__linear("Set loading end")
|
||||
method_1oq28g8_requestsummary__entry(["RequestSummary entry"])
|
||||
method_1oq28g8_requestsummary__action_83_external_call_83__linear("Coordinator request")
|
||||
method_1oq28g8_requestsummary__implicit_return(["return"])
|
||||
method_1oq28g8_requestsummary__action_41_ui_action_binding_41__linear -->|next| method_1oq28g8_requestsummary__action_78_state_mutation_78__linear
|
||||
method_1oq28g8_requestsummary__action_78_state_mutation_78__linear -->|next| method_1oq28g8_requestsummary__action_79_branch_79__condition
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__condition -->|no extra context| method_1oq28g8_requestsummary__action_79_branch_79__false
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__condition -->|include full page context| method_1oq28g8_requestsummary__action_79_branch_79__true
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__false -->|next| method_1oq28g8_requestsummary__action_79_branch_79__merge
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__merge -->|next| method_1oq28g8_requestsummary__action_83_requestsummary_await_83_0__await
|
||||
method_1oq28g8_requestsummary__action_79_branch_79__true -->|next| method_1oq28g8_requestsummary__action_79_branch_79__merge
|
||||
method_1oq28g8_requestsummary__action_83_external_call_83__linear -->|string: contextPrompt + SelectedText includes FullPageContent if not empty| method_1oq28g8_requestsummary__call_83_RequestSummaryAndQuizAsync
|
||||
method_1oq28g8_requestsummary__action_83_requestsummary_await_83_0__await -->|next| method_1oq28g8_requestsummary__action_83_external_call_83__linear
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__condition -->|Packet cleared| method_1oq28g8_requestsummary__action_84_fallback_84__false
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__condition -->|Packet assigned| method_1oq28g8_requestsummary__action_84_fallback_84__true
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__false -->|next| method_1oq28g8_requestsummary__action_84_fallback_84__merge
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__merge -->|next| method_1oq28g8_requestsummary__action_85_state_mutation_85__linear
|
||||
method_1oq28g8_requestsummary__action_84_fallback_84__true -->|next| method_1oq28g8_requestsummary__action_84_fallback_84__merge
|
||||
method_1oq28g8_requestsummary__action_85_state_mutation_85__linear -->|return| method_1oq28g8_requestsummary__implicit_return
|
||||
method_1oq28g8_requestsummary__call_83_RequestSummaryAndQuizAsync -->|fallback| method_1oq28g8_requestsummary__action_84_fallback_84__condition
|
||||
method_1oq28g8_requestsummary__entry -->|next| method_1oq28g8_requestsummary__action_41_ui_action_binding_41__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: neighborhood-view: diagram file_1ez5kuw_selectionaipanel_razor_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 6 edges).
|
||||
+340
@@ -0,0 +1,340 @@
|
||||
# BookIngestionModal
|
||||
|
||||
- File ID: file:8kve74:bookingestionmodal-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/BookIngestionModal.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI component that provides a modal for uploading .epub files, extracting metadata client-side, and sending an ingest request to the server to add a book to the user's library.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component performs client-side EPUB parsing via IEpubMetadataExtractor, encodes content/cover as base64, posts to api/library/ingest, and navigates to the created book on success. It includes guards for file type/size, error handling with user-facing ErrorMessage, and clears large byte buffers on dispose.
|
||||
|
||||
## Symbols
|
||||
|
||||
- BookIngestionModal: Razor UI component that provides a modal for uploading .epub files, extracting metadata client-side, and sending an ingest request to the server to add a book to the user's library.
|
||||
- CloseModal(): Closes the modal, resets internal state, and notifies consumers that IsOpen changed.
|
||||
- Reset(): Clears parsing/verification/ingestion flags and temporary data (metadata, errors, drag state, epub bytes).
|
||||
- OnDragEnter(): Sets drag-over UI state when a drag enters the drop zone.
|
||||
- OnDragLeave(): Clears drag-over UI state when a drag leaves the drop zone.
|
||||
- HandleFileSelected(): Handles file selection or drop: validates file type/size, reads bytes, invokes metadata extractor, and transitions UI to verification or error state.
|
||||
- SaveToLibrary(): Sends the ingested ebook (metadata + base64 content) to the server API and on success closes the modal and navigates to the new book.
|
||||
- DisposeAsync(): Clears the large epub byte array so it can be garbage-collected and completes disposal.
|
||||
- IngestResult: Represents the server response when an ebook is ingested; contains the new book Id.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (IEpubMetadataExtractor)
|
||||
- dependency-target: NexusReader.Application.Queries.Reader
|
||||
- dependency-target: NexusReader.Application.Commands.Library (IngestEbookRequest)
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- interaction-target: ErrorMessage = result.Errors.FirstOrDefault()?.Message ?? "Failed to parse EPUB.";
|
||||
- interaction-target: MetadataExtractor.ExtractMetadataAsync(memoryStream) -> result (IsSuccess / Value / Errors)
|
||||
- interaction-target: Http.PostAsJsonAsync("api/library/ingest", request)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 9
|
||||
- Executable symbols: 7
|
||||
- Executable symbols with control flow: 7
|
||||
- Grounded edges: 9
|
||||
- Unresolved references: 10
|
||||
- Control-flow fragments: 7
|
||||
- Unresolved jumps: 2
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- CloseModal: 7 nodes, 6 edges, 1 jumps, 0 unsupported constructs
|
||||
- Reset: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnDragEnter: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnDragLeave: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleFileSelected: 44 nodes, 50 edges, 1 jumps, 0 unsupported constructs
|
||||
- SaveToLibrary: 42 nodes, 47 edges, 2 jumps, 0 unsupported constructs
|
||||
- DisposeAsync: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### BookIngestionModal Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_twnl84_bookingestionmodal("BookIngestionModal")
|
||||
file_8kve74_bookingestionmodal_razor("BookIngestionModal")
|
||||
method_10uf4tt_savetolibrary[["SaveToLibrary()"]]
|
||||
method_1ptxaoh_handlefileselected[["HandleFileSelected()"]]
|
||||
method_1u9mlsa_ondragenter[["OnDragEnter()"]]
|
||||
method_46fkcr_disposeasync[["DisposeAsync()"]]
|
||||
method_6bf66s_ondragleave[["OnDragLeave()"]]
|
||||
method_d54w6c_reset[["Reset()"]]
|
||||
method_ujsh2c_closemodal[["CloseModal()"]]
|
||||
type_1p7g8wz_ingestresult[/"IngestResult"/]
|
||||
```
|
||||
|
||||
### BookIngestionModal Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_twnl84_bookingestionmodal("BookIngestionModal")
|
||||
method_10uf4tt_savetolibrary[["SaveToLibrary()"]]
|
||||
method_1ptxaoh_handlefileselected[["HandleFileSelected()"]]
|
||||
method_1u9mlsa_ondragenter[["OnDragEnter()"]]
|
||||
method_46fkcr_disposeasync[["DisposeAsync()"]]
|
||||
method_6bf66s_ondragleave[["OnDragLeave()"]]
|
||||
method_d54w6c_reset[["Reset()"]]
|
||||
method_ujsh2c_closemodal[["CloseModal()"]]
|
||||
unresolved_unresolved_143kb_interaction_target{"Unresolved: MetadataExtractor.ExtractMetadataAsync(memoryStream) -> result (IsSuccess / Value / Errors)"}
|
||||
unresolved_unresolved_18cvbct_interaction_target{"Unresolved: ErrorMessage = result.Errors.FirstOrDefault()?.Message ?? \\"Failed to parse EPUB.\\";"}
|
||||
unresolved_unresolved_1d5dsj5_call_target{"Unresolved: Reset"}
|
||||
unresolved_unresolved_1uo9v3m_call_target{"Unresolved: NavigateToBook"}
|
||||
unresolved_unresolved_adir2u_call_target{"Unresolved: CloseModal"}
|
||||
unresolved_unresolved_b3cagp_interaction_target{"Unresolved: Http.PostAsJsonAsync(\\"api/library/ingest\\", request)"}
|
||||
unresolved_unresolved_ewrxdq_call_target{"Unresolved: ExtractMetadataAsync"}
|
||||
class_twnl84_bookingestionmodal -->|contains| method_10uf4tt_savetolibrary
|
||||
class_twnl84_bookingestionmodal -->|contains| method_1ptxaoh_handlefileselected
|
||||
class_twnl84_bookingestionmodal -->|contains| method_1u9mlsa_ondragenter
|
||||
class_twnl84_bookingestionmodal -->|contains| method_46fkcr_disposeasync
|
||||
class_twnl84_bookingestionmodal -->|contains| method_6bf66s_ondragleave
|
||||
class_twnl84_bookingestionmodal -->|contains| method_d54w6c_reset
|
||||
class_twnl84_bookingestionmodal -->|contains| method_ujsh2c_closemodal
|
||||
class_twnl84_bookingestionmodal -->|unresolved interaction| unresolved_unresolved_143kb_interaction_target
|
||||
class_twnl84_bookingestionmodal -->|unresolved interaction| unresolved_unresolved_18cvbct_interaction_target
|
||||
class_twnl84_bookingestionmodal -->|unresolved interaction| unresolved_unresolved_b3cagp_interaction_target
|
||||
method_10uf4tt_savetolibrary -->|unresolved call| unresolved_unresolved_1uo9v3m_call_target
|
||||
method_10uf4tt_savetolibrary -->|unresolved call| unresolved_unresolved_adir2u_call_target
|
||||
method_1ptxaoh_handlefileselected -->|unresolved call| unresolved_unresolved_ewrxdq_call_target
|
||||
method_ujsh2c_closemodal -->|unresolved call| unresolved_unresolved_1d5dsj5_call_target
|
||||
```
|
||||
|
||||
### HandleFileSelected() Control Flow
|
||||
|
||||
_Warnings: diagram method_1ptxaoh_handlefileselected__fragment_diagram exceeds preferred complexity thresholds (44 nodes, 50 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1ptxaoh_handlefileselected__call_174_ExtractMetadataAsync[["ExtractMetadataAsync"]]
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__condition{"file == null"}
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__false("otherwise")
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__true("return")
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__condition{"file == null"}
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__false("continue")
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__true("exit")
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__condition{"file.Name endsWith .epub"}
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__false("continue")
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__true("invalid->set ErrorMessage")
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__condition{"!file.Name.EndsWith(\\".epub\\", StringComparison.OrdinalIgnoreCase)"}
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__false("false")
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__true("true")
|
||||
method_1ptxaoh_handlefileselected__action_163_state_change_163__linear("Start parsing")
|
||||
method_1ptxaoh_handlefileselected__action_166_handlefileselected_try_166_3__try("Begins protected execution")
|
||||
method_1ptxaoh_handlefileselected__action_168_io_168__linear("Read uploaded file into memory")
|
||||
method_1ptxaoh_handlefileselected__action_170_handlefileselected_await_170_4__await[["Waits for async work"]]
|
||||
method_1ptxaoh_handlefileselected__action_174_handlefileselected_await_174_5__await[["Waits for async work"]]
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__condition{"Metadata extraction success check"}
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__false("false")
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__true("true")
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__condition{"result.IsSuccess"}
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__false("false")
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__true("true")
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__condition{"Falls back to alternate path"}
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__false("otherwise")
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__merge("merge")
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__true("fallback")
|
||||
method_1ptxaoh_handlefileselected__action_186_error_handling_186__linear("Catch exceptions during upload/parsing")
|
||||
method_1ptxaoh_handlefileselected__action_186_handlefileselected_catch_186_9__catch("catch Exception ex")
|
||||
method_1ptxaoh_handlefileselected__action_188_handlefileselected_log_188_10__linear("Logs runtime state")
|
||||
method_1ptxaoh_handlefileselected__action_191_handlefileselected_finally_191_11__finally("Runs cleanup or finalization")
|
||||
method_1ptxaoh_handlefileselected__action_193_finalize_193__linear("Stop parsing and refresh UI")
|
||||
method_1ptxaoh_handlefileselected__entry(["HandleFileSelected entry"])
|
||||
method_1ptxaoh_handlefileselected__action_174_external_call_174__linear("Extract EPUB metadata")
|
||||
method_1ptxaoh_handlefileselected__action_183_handlefileselected_repository_read_183_8__linear[("Reads repository or persistence state")]
|
||||
method_1ptxaoh_handlefileselected__action_159_handlefileselected_return_159_2__return(["Returns result"])
|
||||
method_1ptxaoh_handlefileselected__implicit_return(["return"])
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__condition -->|otherwise| method_1ptxaoh_handlefileselected__action_154_guard_clause_154__false
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__condition -->|return| method_1ptxaoh_handlefileselected__action_154_guard_clause_154__true
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__false -->|next| method_1ptxaoh_handlefileselected__action_154_guard_clause_154__merge
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__merge -->|next| method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__condition
|
||||
method_1ptxaoh_handlefileselected__action_154_guard_clause_154__true -->|next| method_1ptxaoh_handlefileselected__action_154_guard_clause_154__merge
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__condition -->|continue| method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__false
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__condition -->|exit| method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__true
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__false -->|next| method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__merge
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__merge -->|next| method_1ptxaoh_handlefileselected__action_156_guard_clause_156__condition
|
||||
method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__true -->|next| method_1ptxaoh_handlefileselected__action_154_handlefileselected_guard_clause_154_0__merge
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__condition -->|continue| method_1ptxaoh_handlefileselected__action_156_guard_clause_156__false
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__condition -->|invalid -> set ErrorMessage| method_1ptxaoh_handlefileselected__action_156_guard_clause_156__true
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__false -->|next| method_1ptxaoh_handlefileselected__action_156_guard_clause_156__merge
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__merge -->|next| method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__condition
|
||||
method_1ptxaoh_handlefileselected__action_156_guard_clause_156__true -->|next| method_1ptxaoh_handlefileselected__action_156_guard_clause_156__merge
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__condition -->|false| method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__false
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__condition -->|true| method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__true
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__false -->|next| method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__merge
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__merge -->|return| method_1ptxaoh_handlefileselected__action_159_handlefileselected_return_159_2__return
|
||||
method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__true -->|next| method_1ptxaoh_handlefileselected__action_156_handlefileselected_branch_156_1__merge
|
||||
method_1ptxaoh_handlefileselected__action_159_handlefileselected_return_159_2__return -->|next| method_1ptxaoh_handlefileselected__action_163_state_change_163__linear
|
||||
method_1ptxaoh_handlefileselected__action_163_state_change_163__linear -->|next| method_1ptxaoh_handlefileselected__action_166_handlefileselected_try_166_3__try
|
||||
method_1ptxaoh_handlefileselected__action_166_handlefileselected_try_166_3__try -->|next| method_1ptxaoh_handlefileselected__action_168_io_168__linear
|
||||
method_1ptxaoh_handlefileselected__action_168_io_168__linear -->|next| method_1ptxaoh_handlefileselected__action_170_handlefileselected_await_170_4__await
|
||||
method_1ptxaoh_handlefileselected__action_170_handlefileselected_await_170_4__await -->|next| method_1ptxaoh_handlefileselected__action_174_handlefileselected_await_174_5__await
|
||||
method_1ptxaoh_handlefileselected__action_174_external_call_174__linear -->|memoryStream stream of uploaded .epub| method_1ptxaoh_handlefileselected__call_174_ExtractMetadataAsync
|
||||
method_1ptxaoh_handlefileselected__action_174_handlefileselected_await_174_5__await -->|next| method_1ptxaoh_handlefileselected__action_174_external_call_174__linear
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__condition -->|false| method_1ptxaoh_handlefileselected__action_176_branch_176__false
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__condition -->|true| method_1ptxaoh_handlefileselected__action_176_branch_176__true
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__false -->|next| method_1ptxaoh_handlefileselected__action_176_branch_176__merge
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__merge -->|next| method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__condition
|
||||
method_1ptxaoh_handlefileselected__action_176_branch_176__true -->|next| method_1ptxaoh_handlefileselected__action_176_branch_176__merge
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__condition -->|false| method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__false
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__condition -->|true| method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__true
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__false -->|next| method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__merge
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__merge -->|fallback| method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__condition
|
||||
method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__true -->|next| method_1ptxaoh_handlefileselected__action_176_handlefileselected_branch_176_6__merge
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__condition -->|otherwise| method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__false
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__condition -->|fallback| method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__true
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__false -->|next| method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__merge
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__merge -->|next| method_1ptxaoh_handlefileselected__action_183_handlefileselected_repository_read_183_8__linear
|
||||
method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__true -->|next| method_1ptxaoh_handlefileselected__action_181_handlefileselected_fallback_181_7__merge
|
||||
method_1ptxaoh_handlefileselected__action_183_handlefileselected_repository_read_183_8__linear -->|exception| method_1ptxaoh_handlefileselected__action_186_handlefileselected_catch_186_9__catch
|
||||
method_1ptxaoh_handlefileselected__action_186_error_handling_186__linear -->|next| method_1ptxaoh_handlefileselected__action_188_handlefileselected_log_188_10__linear
|
||||
method_1ptxaoh_handlefileselected__action_186_handlefileselected_catch_186_9__catch -->|next| method_1ptxaoh_handlefileselected__action_186_error_handling_186__linear
|
||||
method_1ptxaoh_handlefileselected__action_188_handlefileselected_log_188_10__linear -->|next| method_1ptxaoh_handlefileselected__action_191_handlefileselected_finally_191_11__finally
|
||||
method_1ptxaoh_handlefileselected__action_191_handlefileselected_finally_191_11__finally -->|next| method_1ptxaoh_handlefileselected__action_193_finalize_193__linear
|
||||
method_1ptxaoh_handlefileselected__action_193_finalize_193__linear -->|return| method_1ptxaoh_handlefileselected__implicit_return
|
||||
method_1ptxaoh_handlefileselected__call_174_ExtractMetadataAsync -->|next| method_1ptxaoh_handlefileselected__action_176_branch_176__condition
|
||||
method_1ptxaoh_handlefileselected__entry -->|next| method_1ptxaoh_handlefileselected__action_154_guard_clause_154__condition
|
||||
```
|
||||
|
||||
### SaveToLibrary() Control Flow
|
||||
|
||||
_Warnings: diagram method_10uf4tt_savetolibrary__fragment_diagram exceeds preferred complexity thresholds (42 nodes, 47 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_10uf4tt_savetolibrary__call_223_CloseModal[["CloseModal"]]
|
||||
method_10uf4tt_savetolibrary__call_224_NavigateToBook[["NavigateToBook"]]
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__condition{"Metadata != null && _epubBytes != null"}
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__false("otherwise")
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__true("return if missing")
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__condition{"Metadata == null || _epubBytes == null"}
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__false("continue")
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__true("exit")
|
||||
method_10uf4tt_savetolibrary__action_202_state_change_202__linear("Start ingesting")
|
||||
method_10uf4tt_savetolibrary__action_206_savetolibrary_try_206_1__try("Begins protected execution")
|
||||
method_10uf4tt_savetolibrary__action_208_mapping_208__linear("Build ingest request DTO")
|
||||
method_10uf4tt_savetolibrary__action_216_savetolibrary_await_216_2__await[["Waits for async work"]]
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__condition{"Handle response success/failure"}
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__false("false")
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__true("true")
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__condition{"response.IsSuccessStatusCode"}
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__false("false")
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__true("true")
|
||||
method_10uf4tt_savetolibrary__action_220_io_220__linear("Read response and parse result")
|
||||
method_10uf4tt_savetolibrary__action_220_savetolibrary_await_220_4__await[["Waits for async work"]]
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__condition{"result != null"}
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__false("false")
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__true("true")
|
||||
method_10uf4tt_savetolibrary__action_223_savetolibrary_await_223_6__await[["Waits for async work"]]
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__condition{"Falls back to alternate path"}
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__false("otherwise")
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__merge("merge")
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__true("fallback")
|
||||
method_10uf4tt_savetolibrary__action_229_savetolibrary_await_229_8__await[["Waits for async work"]]
|
||||
method_10uf4tt_savetolibrary__action_232_error_handling_232__linear("Catch exceptions during ingest")
|
||||
method_10uf4tt_savetolibrary__action_232_savetolibrary_catch_232_9__catch("catch Exception ex")
|
||||
method_10uf4tt_savetolibrary__action_234_savetolibrary_log_234_10__linear("Logs runtime state")
|
||||
method_10uf4tt_savetolibrary__action_237_savetolibrary_finally_237_11__finally("Runs cleanup or finalization")
|
||||
method_10uf4tt_savetolibrary__action_239_finalize_239__linear("Stop ingesting and refresh UI")
|
||||
method_10uf4tt_savetolibrary__entry(["SaveToLibrary entry"])
|
||||
method_10uf4tt_savetolibrary__action_216_external_call_216__linear("POST ingest request to server API")
|
||||
method_10uf4tt_savetolibrary__implicit_return(["return"])
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__condition -->|otherwise| method_10uf4tt_savetolibrary__action_200_guard_clause_200__false
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__condition -->|return if missing| method_10uf4tt_savetolibrary__action_200_guard_clause_200__true
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__false -->|next| method_10uf4tt_savetolibrary__action_200_guard_clause_200__merge
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__merge -->|next| method_10uf4tt_savetolibrary__action_202_state_change_202__linear
|
||||
method_10uf4tt_savetolibrary__action_200_guard_clause_200__true -->|next| method_10uf4tt_savetolibrary__action_200_guard_clause_200__merge
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__condition -->|continue| method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__false
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__condition -->|exit| method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__true
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__false -->|next| method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__merge
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__merge -->|next| method_10uf4tt_savetolibrary__action_200_guard_clause_200__condition
|
||||
method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__true -->|next| method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__merge
|
||||
method_10uf4tt_savetolibrary__action_202_state_change_202__linear -->|next| method_10uf4tt_savetolibrary__action_206_savetolibrary_try_206_1__try
|
||||
method_10uf4tt_savetolibrary__action_206_savetolibrary_try_206_1__try -->|next| method_10uf4tt_savetolibrary__action_208_mapping_208__linear
|
||||
method_10uf4tt_savetolibrary__action_208_mapping_208__linear -->|next| method_10uf4tt_savetolibrary__action_216_savetolibrary_await_216_2__await
|
||||
method_10uf4tt_savetolibrary__action_216_external_call_216__linear -->|next| method_10uf4tt_savetolibrary__action_218_branch_218__condition
|
||||
method_10uf4tt_savetolibrary__action_216_savetolibrary_await_216_2__await -->|next| method_10uf4tt_savetolibrary__action_216_external_call_216__linear
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__condition -->|false| method_10uf4tt_savetolibrary__action_218_branch_218__false
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__condition -->|true| method_10uf4tt_savetolibrary__action_218_branch_218__true
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__false -->|next| method_10uf4tt_savetolibrary__action_218_branch_218__merge
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__merge -->|next| method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__condition
|
||||
method_10uf4tt_savetolibrary__action_218_branch_218__true -->|next| method_10uf4tt_savetolibrary__action_218_branch_218__merge
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__condition -->|false| method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__false
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__condition -->|true| method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__true
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__false -->|next| method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__merge
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__merge -->|next| method_10uf4tt_savetolibrary__action_220_savetolibrary_await_220_4__await
|
||||
method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__true -->|next| method_10uf4tt_savetolibrary__action_218_savetolibrary_branch_218_3__merge
|
||||
method_10uf4tt_savetolibrary__action_220_io_220__linear -->|next| method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__condition
|
||||
method_10uf4tt_savetolibrary__action_220_savetolibrary_await_220_4__await -->|next| method_10uf4tt_savetolibrary__action_220_io_220__linear
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__condition -->|false| method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__false
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__condition -->|true| method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__true
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__false -->|next| method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__merge
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__merge -->|next| method_10uf4tt_savetolibrary__action_223_savetolibrary_await_223_6__await
|
||||
method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__true -->|next| method_10uf4tt_savetolibrary__action_221_savetolibrary_branch_221_5__merge
|
||||
method_10uf4tt_savetolibrary__action_223_savetolibrary_await_223_6__await -->|none| method_10uf4tt_savetolibrary__call_223_CloseModal
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__condition -->|otherwise| method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__false
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__condition -->|fallback| method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__true
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__false -->|next| method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__merge
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__merge -->|next| method_10uf4tt_savetolibrary__action_229_savetolibrary_await_229_8__await
|
||||
method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__true -->|next| method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__merge
|
||||
method_10uf4tt_savetolibrary__action_229_savetolibrary_await_229_8__await -->|exception| method_10uf4tt_savetolibrary__action_232_savetolibrary_catch_232_9__catch
|
||||
method_10uf4tt_savetolibrary__action_232_error_handling_232__linear -->|next| method_10uf4tt_savetolibrary__action_234_savetolibrary_log_234_10__linear
|
||||
method_10uf4tt_savetolibrary__action_232_savetolibrary_catch_232_9__catch -->|next| method_10uf4tt_savetolibrary__action_232_error_handling_232__linear
|
||||
method_10uf4tt_savetolibrary__action_234_savetolibrary_log_234_10__linear -->|next| method_10uf4tt_savetolibrary__action_237_savetolibrary_finally_237_11__finally
|
||||
method_10uf4tt_savetolibrary__action_237_savetolibrary_finally_237_11__finally -->|next| method_10uf4tt_savetolibrary__action_239_finalize_239__linear
|
||||
method_10uf4tt_savetolibrary__action_239_finalize_239__linear -->|return| method_10uf4tt_savetolibrary__implicit_return
|
||||
method_10uf4tt_savetolibrary__call_223_CloseModal -->|result.Id Guid| method_10uf4tt_savetolibrary__call_224_NavigateToBook
|
||||
method_10uf4tt_savetolibrary__call_224_NavigateToBook -->|fallback| method_10uf4tt_savetolibrary__action_227_savetolibrary_fallback_227_7__condition
|
||||
method_10uf4tt_savetolibrary__entry -->|next| method_10uf4tt_savetolibrary__action_200_savetolibrary_guard_clause_200_0__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 2 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_1ptxaoh_handlefileselected__fragment_diagram exceeds preferred complexity thresholds (44 nodes, 50 edges).
|
||||
- Warning: control-flow: diagram method_10uf4tt_savetolibrary__fragment_diagram exceeds preferred complexity thresholds (42 nodes, 47 edges).
|
||||
+213
@@ -0,0 +1,213 @@
|
||||
# CurrentReadingWidget
|
||||
|
||||
- File ID: file:1uvdam9:currentreadingwidget-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/CurrentReadingWidget.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that displays the user's current reading/book progress card and provides navigation actions to continue reading or go to the library.
|
||||
|
||||
## Key Details
|
||||
|
||||
Razor component that conditionally renders a book card or empty state, exposes a LastReadBookDto parameter, uses NavigationManager for route changes, and composes NexusIcon child components.
|
||||
|
||||
## Symbols
|
||||
|
||||
- CurrentReadingWidget: Blazor UI component that displays the user's current reading/book progress card and provides navigation actions to continue reading or go to the library.
|
||||
- Render (Razor markup): Renders the current-reading card UI and chooses between book view and empty state based on Book parameter.
|
||||
- HandleContinueReading(): Handles the Continue Reading button click by navigating to the reader route for the current book and chapter.
|
||||
- NavigateToLibrary (inline lambda): Inline click handler that navigates to the /library route.
|
||||
- Book (component parameter): Component parameter that provides the last-read book details used to populate the UI.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.DTOs.User
|
||||
- dependency-target: framework:Microsoft.AspNetCore.Components.NavigationManager
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- interaction-target: NavigationManager.NavigateTo($"/reader/{Book.Id}?chapter={Book.LastChapterIndex}") (framework call)
|
||||
- interaction-target: NavigationManager.NavigateTo("/library") (framework call in inline lambda)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 6
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 2
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (Razor markup): 31 nodes, 36 edges, 2 jumps, 0 unsupported constructs
|
||||
- HandleContinueReading: 11 nodes, 12 edges, 0 jumps, 0 unsupported constructs
|
||||
- NavigateToLibrary (inline lambda): 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Book (component parameter): 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### CurrentReadingWidget Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1tn889i_currentreadingwidget("CurrentReadingWidget")
|
||||
file_1uvdam9_currentreadingwidget_razor("CurrentReadingWidget")
|
||||
method_1lzfzn4_book_component_parameter[["Book (component parameter)"]]
|
||||
method_b9ya71_navigatetolibrary_inline_lambda[["NavigateToLibrary (inline lambda)"]]
|
||||
method_lwiyp5_render_razor_markup[["Render (Razor markup)"]]
|
||||
method_yy00ql_handlecontinuereading[["HandleContinueReading()"]]
|
||||
file_q8opk3_nexusicon_razor[/"NexusIcon"/]
|
||||
file_1uvdam9_currentreadingwidget_razor -->|NexusIcon| file_q8opk3_nexusicon_razor
|
||||
```
|
||||
|
||||
### CurrentReadingWidget Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1tn889i_currentreadingwidget("CurrentReadingWidget")
|
||||
method_1lzfzn4_book_component_parameter[["Book (component parameter)"]]
|
||||
method_b9ya71_navigatetolibrary_inline_lambda[["NavigateToLibrary (inline lambda)"]]
|
||||
method_lwiyp5_render_razor_markup[["Render (Razor markup)"]]
|
||||
method_yy00ql_handlecontinuereading[["HandleContinueReading()"]]
|
||||
unresolved_unresolved_19nu1lk_call_target{"Unresolved: NexusIcon"}
|
||||
unresolved_unresolved_1krli3s_interaction_target{"Unresolved: NavigationManager.NavigateTo($\\"/reader/{Book.Id}?chapter={Book.LastChapterIndex}\\") (framework call)"}
|
||||
unresolved_unresolved_u1e1jv_interaction_target{"Unresolved: NavigationManager.NavigateTo(\\"/library\\") (framework call in inline lambda)"}
|
||||
class_1tn889i_currentreadingwidget -->|contains| method_1lzfzn4_book_component_parameter
|
||||
class_1tn889i_currentreadingwidget -->|contains| method_b9ya71_navigatetolibrary_inline_lambda
|
||||
class_1tn889i_currentreadingwidget -->|contains| method_lwiyp5_render_razor_markup
|
||||
class_1tn889i_currentreadingwidget -->|contains| method_yy00ql_handlecontinuereading
|
||||
class_1tn889i_currentreadingwidget -->|unresolved interaction| unresolved_unresolved_1krli3s_interaction_target
|
||||
class_1tn889i_currentreadingwidget -->|unresolved interaction| unresolved_unresolved_u1e1jv_interaction_target
|
||||
method_lwiyp5_render_razor_markup -->|unresolved call| unresolved_unresolved_19nu1lk_call_target
|
||||
method_lwiyp5_render_razor_markup -->|unresolved call| unresolved_unresolved_19nu1lk_call_target
|
||||
```
|
||||
|
||||
### Render (Razor markup)() Control Flow
|
||||
|
||||
_Warnings: diagram method_lwiyp5_render_razor_markup__fragment_diagram exceeds preferred complexity thresholds (31 nodes, 36 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_lwiyp5_render_razor_markup__call_46_NexusIcon[["NexusIcon"]]
|
||||
method_lwiyp5_render_razor_markup__call_56_NexusIcon[["NexusIcon"]]
|
||||
method_lwiyp5_render_razor_markup__action_25_render_data_25__linear("Progress display and inline style width")
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__condition{"!string.IsNullOrEmpty(Book.Description)"}
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__false("show empty excerpt")
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__true("show description")
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__condition{"!string.IsNullOrEmpty(Book.Description)"}
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__false("false")
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__true("true")
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__condition{"Falls back to alternate path"}
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__false("otherwise")
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__true("fallback")
|
||||
method_lwiyp5_render_razor_markup__action_44_ui_binding_44__linear("Button click binds to HandleContinueReading")
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__condition{"Falls back to alternate path"}
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__false("otherwise")
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__true("fallback")
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__condition{"Conditional rendering based on Book presence"}
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__false("false")
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__true("true")
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__condition{"Book != null"}
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__false("false")
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__merge("merge")
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__true("true")
|
||||
method_lwiyp5_render_razor_markup__action_62_ui_binding_62__linear("Inline navigation lambda - navigate to /library")
|
||||
method_lwiyp5_render_razor_markup__entry(["Render (Razor markup) entry"])
|
||||
method_lwiyp5_render_razor_markup__implicit_return(["return"])
|
||||
method_lwiyp5_render_razor_markup__action_25_render_data_25__linear -->|next| method_lwiyp5_render_razor_markup__action_29_guard_clause_29__condition
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__condition -->|show empty excerpt| method_lwiyp5_render_razor_markup__action_29_guard_clause_29__false
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__condition -->|show description| method_lwiyp5_render_razor_markup__action_29_guard_clause_29__true
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__false -->|next| method_lwiyp5_render_razor_markup__action_29_guard_clause_29__merge
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__merge -->|next| method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__condition
|
||||
method_lwiyp5_render_razor_markup__action_29_guard_clause_29__true -->|next| method_lwiyp5_render_razor_markup__action_29_guard_clause_29__merge
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__condition -->|false| method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__false
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__condition -->|true| method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__true
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__false -->|next| method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__merge
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__merge -->|fallback| method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__condition
|
||||
method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__true -->|next| method_lwiyp5_render_razor_markup__action_29_render_razor_markup_branch_29_1__merge
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__condition -->|otherwise| method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__false
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__condition -->|fallback| method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__true
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__false -->|next| method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__merge
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__merge -->|next| method_lwiyp5_render_razor_markup__action_44_ui_binding_44__linear
|
||||
method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__true -->|next| method_lwiyp5_render_razor_markup__action_35_render_razor_markup_fallback_35_2__merge
|
||||
method_lwiyp5_render_razor_markup__action_44_ui_binding_44__linear -->|Name= arrow-right , Size=16| method_lwiyp5_render_razor_markup__call_46_NexusIcon
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__condition -->|otherwise| method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__false
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__condition -->|fallback| method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__true
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__false -->|next| method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__merge
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__merge -->|Name= book-open , Size=48| method_lwiyp5_render_razor_markup__call_56_NexusIcon
|
||||
method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__true -->|next| method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__merge
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__condition -->|false| method_lwiyp5_render_razor_markup__action_6_branch_6__false
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__condition -->|true| method_lwiyp5_render_razor_markup__action_6_branch_6__true
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__false -->|next| method_lwiyp5_render_razor_markup__action_6_branch_6__merge
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__merge -->|next| method_lwiyp5_render_razor_markup__action_25_render_data_25__linear
|
||||
method_lwiyp5_render_razor_markup__action_6_branch_6__true -->|next| method_lwiyp5_render_razor_markup__action_6_branch_6__merge
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__condition -->|false| method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__false
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__condition -->|true| method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__true
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__false -->|next| method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__merge
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__merge -->|next| method_lwiyp5_render_razor_markup__action_6_branch_6__condition
|
||||
method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__true -->|next| method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__merge
|
||||
method_lwiyp5_render_razor_markup__action_62_ui_binding_62__linear -->|return| method_lwiyp5_render_razor_markup__implicit_return
|
||||
method_lwiyp5_render_razor_markup__call_46_NexusIcon -->|fallback| method_lwiyp5_render_razor_markup__action_52_render_razor_markup_fallback_52_3__condition
|
||||
method_lwiyp5_render_razor_markup__call_56_NexusIcon -->|next| method_lwiyp5_render_razor_markup__action_62_ui_binding_62__linear
|
||||
method_lwiyp5_render_razor_markup__entry -->|next| method_lwiyp5_render_razor_markup__action_6_render_razor_markup_branch_6_0__condition
|
||||
```
|
||||
|
||||
### HandleContinueReading() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__condition{"Book != null"}
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__false("no-op")
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__merge("merge")
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__true("continue (navigate)")
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__condition{"Book != null"}
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__false("false")
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__merge("merge")
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__true("true")
|
||||
method_yy00ql_handlecontinuereading__entry(["HandleContinueReading entry"])
|
||||
method_yy00ql_handlecontinuereading__action_76_external_call_76__linear("Navigate to reader route")
|
||||
method_yy00ql_handlecontinuereading__implicit_return(["return"])
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__condition -->|no-op| method_yy00ql_handlecontinuereading__action_74_guard_clause_74__false
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__condition -->|continue navigate| method_yy00ql_handlecontinuereading__action_74_guard_clause_74__true
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__false -->|next| method_yy00ql_handlecontinuereading__action_74_guard_clause_74__merge
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__merge -->|next| method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__condition
|
||||
method_yy00ql_handlecontinuereading__action_74_guard_clause_74__true -->|next| method_yy00ql_handlecontinuereading__action_74_guard_clause_74__merge
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__condition -->|false| method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__false
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__condition -->|true| method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__true
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__false -->|next| method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__merge
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__merge -->|next| method_yy00ql_handlecontinuereading__action_76_external_call_76__linear
|
||||
method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__true -->|next| method_yy00ql_handlecontinuereading__action_74_handlecontinuereading_branch_74_0__merge
|
||||
method_yy00ql_handlecontinuereading__action_76_external_call_76__linear -->|return| method_yy00ql_handlecontinuereading__implicit_return
|
||||
method_yy00ql_handlecontinuereading__entry -->|next| method_yy00ql_handlecontinuereading__action_74_guard_clause_74__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 2 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_lwiyp5_render_razor_markup__fragment_diagram exceeds preferred complexity thresholds (31 nodes, 36 edges).
|
||||
+210
@@ -0,0 +1,210 @@
|
||||
# GlobalIntelligencePanel
|
||||
|
||||
- File ID: file:1niza9w:globalintelligencepanel-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/GlobalIntelligencePanel.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that renders a 'Global Intelligence' semantic search panel, shows loading/results/empty states, and forwards search queries via an EventCallback.
|
||||
|
||||
## Key Details
|
||||
|
||||
Public parameters: Results: List<SemanticSearchResultDto>? (line 50), IsLoading: bool (line 51), OnPerformSearch: EventCallback<string> (line 52). Markup contains conditional rendering and a foreach loop to present results; HandleSearch (line 56) sets HasSearched and invokes OnPerformSearch.InvokeAsync(query).
|
||||
|
||||
## Symbols
|
||||
|
||||
- GlobalIntelligencePanel: Blazor UI component that renders a 'Global Intelligence' semantic search panel, shows loading/results/empty states, and forwards search queries via an EventCallback.
|
||||
- Render (component markup): Renders the Global Intelligence panel and conditionally displays loading, search results (with a loop), or an empty state.
|
||||
- HandleSearch(): Invoked when the child search box triggers a search; marks that a search occurred and forwards the query via OnPerformSearch EventCallback.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs (referenced via @using)
|
||||
- dependency-target: NexusReader.UI.Shared/Components/Atoms/NexusSearchBox.razor (used as child component)
|
||||
- call-target: unknown
|
||||
- interaction-target: Awaits EventCallback.InvokeAsync(query) to notify parent component or consumer of the search.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 4
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (component markup): 41 nodes, 50 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleSearch: 7 nodes, 6 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### GlobalIntelligencePanel Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_cps3pc_globalintelligencepanel("GlobalIntelligencePanel")
|
||||
file_1niza9w_globalintelligencepanel_razor("GlobalIntelligencePanel")
|
||||
method_cylg7j_render_component_markup[["Render (component markup)"]]
|
||||
method_h9z30t_handlesearch[["HandleSearch()"]]
|
||||
```
|
||||
|
||||
### GlobalIntelligencePanel Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_cps3pc_globalintelligencepanel("GlobalIntelligencePanel")
|
||||
method_cylg7j_render_component_markup[["Render (component markup)"]]
|
||||
method_h9z30t_handlesearch[["HandleSearch()"]]
|
||||
unresolved_unresolved_ayzqd8_interaction_target{"Unresolved: Awaits EventCallback.InvokeAsync(query) to notify parent component or consumer of the search."}
|
||||
unresolved_unresolved_v7y5t4_call_target{"Unresolved: OnPerformSearch.InvokeAsync"}
|
||||
class_cps3pc_globalintelligencepanel -->|contains| method_cylg7j_render_component_markup
|
||||
class_cps3pc_globalintelligencepanel -->|contains| method_h9z30t_handlesearch
|
||||
class_cps3pc_globalintelligencepanel -->|unresolved interaction| unresolved_unresolved_ayzqd8_interaction_target
|
||||
method_h9z30t_handlesearch -->|unresolved call| unresolved_unresolved_v7y5t4_call_target
|
||||
```
|
||||
|
||||
### Render (component markup)() Control Flow
|
||||
|
||||
_Warnings: diagram method_cylg7j_render_component_markup__fragment_diagram exceeds preferred complexity thresholds (41 nodes, 50 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__condition{"IsLoading ? show loading : (Results != null && Results.Any()) ? show results : HasSearched ? show empty"}
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__false("results")
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__true("loading")
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__condition{"IsLoading"}
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__false("false")
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__true("true")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__condition{"Results != null && Results.Any()"}
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__false("false")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__true("true")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__condition{"Falls back to alternate path"}
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__false("otherwise")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__true("fallback")
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_body[["Iterates Results to render each search result (lines 23-37)."]]
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_entry("foreach over Results when non-empty")
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_exit("exit loop")
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_body[["@foreach (var result in Results)"]]
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_entry("var result in Results")
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_exit("Leaves the loop when the condition no longer holds.")
|
||||
method_cylg7j_render_component_markup__action_27_mapping_27__linear("Show relevance percentage")
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__condition{"!string.IsNullOrEmpty(result.SourceBookTitle)"}
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__false("skip source")
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__true("render source")
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__condition{"!string.IsNullOrEmpty(result.SourceBookTitle)"}
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__false("false")
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__true("true")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__condition{"HasSearched"}
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__false("false")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__true("true")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__condition{"Falls back to alternate path"}
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__false("otherwise")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__merge("merge")
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__true("fallback")
|
||||
method_cylg7j_render_component_markup__entry(["Render (component markup) entry"])
|
||||
method_cylg7j_render_component_markup__implicit_return(["return"])
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__condition -->|results| method_cylg7j_render_component_markup__action_14_branch_14__false
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__condition -->|loading| method_cylg7j_render_component_markup__action_14_branch_14__true
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__false -->|next| method_cylg7j_render_component_markup__action_14_branch_14__merge
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__merge -->|next| method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__condition
|
||||
method_cylg7j_render_component_markup__action_14_branch_14__true -->|next| method_cylg7j_render_component_markup__action_14_branch_14__merge
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__condition -->|false| method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__false
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__condition -->|true| method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__true
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__false -->|next| method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__merge
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__merge -->|fallback| method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__condition
|
||||
method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__true -->|next| method_cylg7j_render_component_markup__action_14_render_component_markup_branch_14_0__merge
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__condition -->|false| method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__false
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__condition -->|true| method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__true
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__false -->|next| method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__merge
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__merge -->|next| method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_entry
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__true -->|next| method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__merge
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__condition -->|otherwise| method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__false
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__condition -->|fallback| method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__true
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__false -->|next| method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__merge
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__merge -->|next| method_cylg7j_render_component_markup__action_21_render_component_markup_branch_21_1__condition
|
||||
method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__true -->|next| method_cylg7j_render_component_markup__action_21_render_component_markup_fallback_21_2__merge
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_body -->|continue| method_cylg7j_render_component_markup__action_23_loop_23__loop_entry
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_entry -->|foreach over Results when non-empty| method_cylg7j_render_component_markup__action_23_loop_23__loop_body
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_entry -->|exit| method_cylg7j_render_component_markup__action_23_loop_23__loop_exit
|
||||
method_cylg7j_render_component_markup__action_23_loop_23__loop_exit -->|next| method_cylg7j_render_component_markup__action_27_mapping_27__linear
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_body -->|continue| method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_entry
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_entry -->|var result in Results| method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_body
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_entry -->|Leaves the loop when the condition no longer holds.| method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_exit
|
||||
method_cylg7j_render_component_markup__action_23_render_component_markup_loop_23_3__loop_exit -->|next| method_cylg7j_render_component_markup__action_23_loop_23__loop_entry
|
||||
method_cylg7j_render_component_markup__action_27_mapping_27__linear -->|next| method_cylg7j_render_component_markup__action_28_guard_clause_28__condition
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__condition -->|skip source| method_cylg7j_render_component_markup__action_28_guard_clause_28__false
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__condition -->|render source| method_cylg7j_render_component_markup__action_28_guard_clause_28__true
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__false -->|next| method_cylg7j_render_component_markup__action_28_guard_clause_28__merge
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__merge -->|next| method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__condition
|
||||
method_cylg7j_render_component_markup__action_28_guard_clause_28__true -->|next| method_cylg7j_render_component_markup__action_28_guard_clause_28__merge
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__condition -->|false| method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__false
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__condition -->|true| method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__true
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__false -->|next| method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__merge
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__merge -->|fallback| method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__condition
|
||||
method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__true -->|next| method_cylg7j_render_component_markup__action_28_render_component_markup_branch_28_4__merge
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__condition -->|false| method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__false
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__condition -->|true| method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__true
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__false -->|next| method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__merge
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__merge -->|return| method_cylg7j_render_component_markup__implicit_return
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__true -->|next| method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__merge
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__condition -->|otherwise| method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__false
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__condition -->|fallback| method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__true
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__false -->|next| method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__merge
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__merge -->|next| method_cylg7j_render_component_markup__action_39_render_component_markup_branch_39_5__condition
|
||||
method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__true -->|next| method_cylg7j_render_component_markup__action_39_render_component_markup_fallback_39_6__merge
|
||||
method_cylg7j_render_component_markup__entry -->|next| method_cylg7j_render_component_markup__action_14_branch_14__condition
|
||||
```
|
||||
|
||||
### HandleSearch() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_h9z30t_handlesearch__call_59_OnPerformSearch_InvokeAsync[["OnPerformSearch.InvokeAsync"]]
|
||||
method_h9z30t_handlesearch__action_56_async_56__linear("Async forward")
|
||||
method_h9z30t_handlesearch__action_58_state_change_58__linear("Set HasSearched")
|
||||
method_h9z30t_handlesearch__action_59_handlesearch_await_59_0__await[["Waits for async work"]]
|
||||
method_h9z30t_handlesearch__entry(["HandleSearch entry"])
|
||||
method_h9z30t_handlesearch__action_59_external_call_59__linear("Forward search to parent/handler")
|
||||
method_h9z30t_handlesearch__implicit_return(["return"])
|
||||
method_h9z30t_handlesearch__action_56_async_56__linear -->|next| method_h9z30t_handlesearch__action_58_state_change_58__linear
|
||||
method_h9z30t_handlesearch__action_58_state_change_58__linear -->|next| method_h9z30t_handlesearch__action_59_handlesearch_await_59_0__await
|
||||
method_h9z30t_handlesearch__action_59_external_call_59__linear -->|query string passed from child search box| method_h9z30t_handlesearch__call_59_OnPerformSearch_InvokeAsync
|
||||
method_h9z30t_handlesearch__action_59_handlesearch_await_59_0__await -->|next| method_h9z30t_handlesearch__action_59_external_call_59__linear
|
||||
method_h9z30t_handlesearch__call_59_OnPerformSearch_InvokeAsync -->|return| method_h9z30t_handlesearch__implicit_return
|
||||
method_h9z30t_handlesearch__entry -->|next| method_h9z30t_handlesearch__action_56_async_56__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_cylg7j_render_component_markup__fragment_diagram exceeds preferred complexity thresholds (41 nodes, 50 edges).
|
||||
+648
@@ -0,0 +1,648 @@
|
||||
# KnowledgeGraph
|
||||
|
||||
- File ID: file:jo64ly:knowledgegraph-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/KnowledgeGraph.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that renders and manages an interactive knowledge graph visualization via JS interop, wiring app-level graph services and user interactions to the client-side graph module.
|
||||
|
||||
## Key Details
|
||||
|
||||
Wires graph service events to a JS D3-like module, mounts/unmounts the client module, guards on missing _module, swallows JS interop exceptions during focus simulation and disposal, and exposes node clicks to application via InteractionService and EventCallback.
|
||||
|
||||
## Symbols
|
||||
|
||||
- KnowledgeGraph: Blazor UI component that renders and manages an interactive knowledge graph visualization via JS interop, wiring app-level graph services and user interactions to the client-side graph module.
|
||||
- OnInitialized(): Subscribe component handlers to FocusMode and GraphService events during component initialization.
|
||||
- HandleGraphUpdate(): Respond to graph data changes by instructing the JS graph module to clear or update and force a UI re-render.
|
||||
- HandleActiveNodeChange(): Tell the JS graph module to highlight/set the active node when the active node changes in the graph service.
|
||||
- HandleLoadingChange(): Trigger a UI re-render when the graph loading state changes.
|
||||
- OnAfterRenderAsync(): On first render, initialize the JS graph module and, if data already exists, perform an initial graph update.
|
||||
- InitializeGraphAsync(): Import the client JS module, create a DotNet helper reference and mount the graph with initial data.
|
||||
- ZoomIn(): Request the JS graph module to zoom in.
|
||||
- ZoomOut(): Request the JS graph module to zoom out.
|
||||
- ZoomReset(): Request the JS graph module to reset zoom/transform.
|
||||
- OnNodeClicked(): Called from JS when a node is clicked: notify the interaction service and forward the event to any parent via EventCallback.
|
||||
- HandleFocusSimulation(): Respond to focus-mode toggles by pausing or resuming the client JS graph simulation.
|
||||
- DisposeAsync(): Unsubscribe event handlers, unmount and dispose the JS module and DotNet helper when the component is disposed.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IReaderInteractionService
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IFocusModeService
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: self
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: self
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderInteractionService
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: NexusReader.UI.Shared/Services/IKnowledgeGraphService
|
||||
- call-target: ./_content/NexusReader.UI.Shared/js/knowledgeGraph.js
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 13
|
||||
- Executable symbols: 12
|
||||
- Executable symbols with control flow: 12
|
||||
- Grounded edges: 13
|
||||
- Unresolved references: 29
|
||||
- Control-flow fragments: 12
|
||||
- Unresolved jumps: 23
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 13
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 10 nodes, 9 edges, 4 jumps, 0 unsupported constructs
|
||||
- HandleGraphUpdate: 29 nodes, 33 edges, 3 jumps, 0 unsupported constructs
|
||||
- HandleActiveNodeChange: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleLoadingChange: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 19 nodes, 21 edges, 3 jumps, 0 unsupported constructs
|
||||
- InitializeGraphAsync: 9 nodes, 8 edges, 2 jumps, 0 unsupported constructs
|
||||
- ZoomIn: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- ZoomOut: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- ZoomReset: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnNodeClicked: 16 nodes, 17 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleFocusSimulation: 30 nodes, 34 edges, 3 jumps, 0 unsupported constructs
|
||||
- DisposeAsync: 20 nodes, 20 edges, 5 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### KnowledgeGraph Neighborhood
|
||||
|
||||
_Warnings: diagram file_jo64ly_knowledgegraph_razor_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_11lr4zo_knowledgegraph("KnowledgeGraph")
|
||||
file_jo64ly_knowledgegraph_razor("KnowledgeGraph")
|
||||
method_129w46l_zoomreset[["ZoomReset()"]]
|
||||
method_14hlcms_handlegraphupdate[["HandleGraphUpdate()"]]
|
||||
method_16kjevr_handleactivenodechange[["HandleActiveNodeChange()"]]
|
||||
method_1ari3ha_oninitialized[["OnInitialized()"]]
|
||||
method_1cayj92_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1l8ubet_zoomout[["ZoomOut()"]]
|
||||
method_1muyu85_zoomin[["ZoomIn()"]]
|
||||
method_1to2smv_initializegraphasync[["InitializeGraphAsync()"]]
|
||||
method_1xjbcak_handleloadingchange[["HandleLoadingChange()"]]
|
||||
method_66cucs_onnodeclicked[["OnNodeClicked()"]]
|
||||
method_lvsss7_disposeasync[["DisposeAsync()"]]
|
||||
method_qjg1lv_handlefocussimulation[["HandleFocusSimulation()"]]
|
||||
```
|
||||
|
||||
### KnowledgeGraph Execution Overview
|
||||
|
||||
_Warnings: diagram file_jo64ly_knowledgegraph_razor_execution_view exceeds preferred complexity thresholds (38 nodes, 37 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
class_11lr4zo_knowledgegraph("KnowledgeGraph")
|
||||
method_129w46l_zoomreset[["ZoomReset()"]]
|
||||
method_14hlcms_handlegraphupdate[["HandleGraphUpdate()"]]
|
||||
method_16kjevr_handleactivenodechange[["HandleActiveNodeChange()"]]
|
||||
method_1ari3ha_oninitialized[["OnInitialized()"]]
|
||||
method_1cayj92_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1l8ubet_zoomout[["ZoomOut()"]]
|
||||
method_1muyu85_zoomin[["ZoomIn()"]]
|
||||
method_1to2smv_initializegraphasync[["InitializeGraphAsync()"]]
|
||||
method_1xjbcak_handleloadingchange[["HandleLoadingChange()"]]
|
||||
method_66cucs_onnodeclicked[["OnNodeClicked()"]]
|
||||
method_lvsss7_disposeasync[["DisposeAsync()"]]
|
||||
method_qjg1lv_handlefocussimulation[["HandleFocusSimulation()"]]
|
||||
unresolved_unresolved_10ntjpd_call_target{"Unresolved: pause"}
|
||||
unresolved_unresolved_13n5skw_call_target{"Unresolved: CurrentGraphData"}
|
||||
unresolved_unresolved_15rvkdv_call_target{"Unresolved: OnActiveNodeChanged"}
|
||||
unresolved_unresolved_18xu0uy_call_target{"Unresolved: InitializeGraphAsync"}
|
||||
unresolved_unresolved_1dic9oz_call_target{"Unresolved: OnLoadingChanged"}
|
||||
unresolved_unresolved_1ftxrfl_call_target{"Unresolved: zoomIn"}
|
||||
unresolved_unresolved_1jt5jy8_call_target{"Unresolved: zoomReset"}
|
||||
unresolved_unresolved_1k2kio7_call_target{"Unresolved: OnFocusModeChanged"}
|
||||
unresolved_unresolved_1t03yb9_call_target{"Unresolved: CurrentGraphData"}
|
||||
unresolved_unresolved_1t911zi_call_target{"Unresolved: unmount"}
|
||||
unresolved_unresolved_1tm32an_call_target{"Unresolved: clear"}
|
||||
unresolved_unresolved_1torkt6_call_target{"Unresolved: CurrentGraphData"}
|
||||
unresolved_unresolved_1uyw1m_call_target{"Unresolved: mount"}
|
||||
unresolved_unresolved_1xrm9ho_call_target{"Unresolved: NotifyNodeSelected"}
|
||||
unresolved_unresolved_3gfwx2_call_target{"Unresolved: zoomOut"}
|
||||
unresolved_unresolved_4132f3_call_target{"Unresolved: updateData"}
|
||||
unresolved_unresolved_7hdicu_call_target{"Unresolved: OnLoadingChanged"}
|
||||
unresolved_unresolved_7i1fw4_call_target{"Unresolved: OnGraphUpdated"}
|
||||
unresolved_unresolved_87xiei_call_target{"Unresolved: setActiveNode"}
|
||||
unresolved_unresolved_9u6o3t_call_target{"Unresolved: OnGraphUpdated"}
|
||||
unresolved_unresolved_itxtwm_call_target{"Unresolved: resume"}
|
||||
unresolved_unresolved_kwph20_call_target{"Unresolved: OnActiveNodeChanged"}
|
||||
unresolved_unresolved_pxnbrk_call_target{"Unresolved: OnFocusModeChanged"}
|
||||
unresolved_unresolved_tch553_call_target{"Unresolved: IsFocusModeActive"}
|
||||
unresolved_unresolved_z3vcy7_call_target{"Unresolved: HandleGraphUpdate"}
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_129w46l_zoomreset
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_14hlcms_handlegraphupdate
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_16kjevr_handleactivenodechange
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1ari3ha_oninitialized
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1cayj92_onafterrenderasync
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1l8ubet_zoomout
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1muyu85_zoomin
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1to2smv_initializegraphasync
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_1xjbcak_handleloadingchange
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_66cucs_onnodeclicked
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_lvsss7_disposeasync
|
||||
class_11lr4zo_knowledgegraph -->|contains| method_qjg1lv_handlefocussimulation
|
||||
method_129w46l_zoomreset -->|unresolved call| unresolved_unresolved_1jt5jy8_call_target
|
||||
method_14hlcms_handlegraphupdate -->|unresolved call| unresolved_unresolved_1t03yb9_call_target
|
||||
method_14hlcms_handlegraphupdate -->|unresolved call| unresolved_unresolved_1tm32an_call_target
|
||||
method_14hlcms_handlegraphupdate -->|unresolved call| unresolved_unresolved_4132f3_call_target
|
||||
method_16kjevr_handleactivenodechange -->|unresolved call| unresolved_unresolved_87xiei_call_target
|
||||
method_1ari3ha_oninitialized -->|unresolved call| unresolved_unresolved_7hdicu_call_target
|
||||
method_1ari3ha_oninitialized -->|unresolved call| unresolved_unresolved_9u6o3t_call_target
|
||||
method_1ari3ha_oninitialized -->|unresolved call| unresolved_unresolved_kwph20_call_target
|
||||
method_1ari3ha_oninitialized -->|unresolved call| unresolved_unresolved_pxnbrk_call_target
|
||||
method_1cayj92_onafterrenderasync -->|unresolved call| unresolved_unresolved_13n5skw_call_target
|
||||
method_1cayj92_onafterrenderasync -->|unresolved call| unresolved_unresolved_18xu0uy_call_target
|
||||
method_1cayj92_onafterrenderasync -->|unresolved call| unresolved_unresolved_z3vcy7_call_target
|
||||
method_1l8ubet_zoomout -->|unresolved call| unresolved_unresolved_3gfwx2_call_target
|
||||
method_1muyu85_zoomin -->|unresolved call| unresolved_unresolved_1ftxrfl_call_target
|
||||
method_1to2smv_initializegraphasync -->|unresolved call| unresolved_unresolved_1torkt6_call_target
|
||||
method_1to2smv_initializegraphasync -->|unresolved call| unresolved_unresolved_1uyw1m_call_target
|
||||
method_66cucs_onnodeclicked -->|unresolved call| unresolved_unresolved_1xrm9ho_call_target
|
||||
method_lvsss7_disposeasync -->|unresolved call| unresolved_unresolved_15rvkdv_call_target
|
||||
method_lvsss7_disposeasync -->|unresolved call| unresolved_unresolved_1dic9oz_call_target
|
||||
method_lvsss7_disposeasync -->|unresolved call| unresolved_unresolved_1k2kio7_call_target
|
||||
method_lvsss7_disposeasync -->|unresolved call| unresolved_unresolved_1t911zi_call_target
|
||||
method_lvsss7_disposeasync -->|unresolved call| unresolved_unresolved_7i1fw4_call_target
|
||||
method_qjg1lv_handlefocussimulation -->|unresolved call| unresolved_unresolved_10ntjpd_call_target
|
||||
method_qjg1lv_handlefocussimulation -->|unresolved call| unresolved_unresolved_itxtwm_call_target
|
||||
method_qjg1lv_handlefocussimulation -->|unresolved call| unresolved_unresolved_tch553_call_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1ari3ha_oninitialized__call_43_OnFocusModeChanged[["OnFocusModeChanged"]]
|
||||
method_1ari3ha_oninitialized__call_44_OnGraphUpdated[["OnGraphUpdated"]]
|
||||
method_1ari3ha_oninitialized__call_45_OnActiveNodeChanged[["OnActiveNodeChanged"]]
|
||||
method_1ari3ha_oninitialized__call_46_OnLoadingChanged[["OnLoadingChanged"]]
|
||||
method_1ari3ha_oninitialized__action_43_event_subscribe_43__linear("Subscribe FocusMode change")
|
||||
method_1ari3ha_oninitialized__action_44_event_subscribe_44__linear("Subscribe graph updates")
|
||||
method_1ari3ha_oninitialized__action_45_event_subscribe_45__linear("Subscribe active node")
|
||||
method_1ari3ha_oninitialized__action_46_event_subscribe_46__linear("Subscribe loading state")
|
||||
method_1ari3ha_oninitialized__entry(["OnInitialized entry"])
|
||||
method_1ari3ha_oninitialized__implicit_return(["return"])
|
||||
method_1ari3ha_oninitialized__action_43_event_subscribe_43__linear -->|subscribe HandleFocusSimulation| method_1ari3ha_oninitialized__call_43_OnFocusModeChanged
|
||||
method_1ari3ha_oninitialized__action_44_event_subscribe_44__linear -->|subscribe HandleGraphUpdate| method_1ari3ha_oninitialized__call_44_OnGraphUpdated
|
||||
method_1ari3ha_oninitialized__action_45_event_subscribe_45__linear -->|subscribe HandleActiveNodeChange| method_1ari3ha_oninitialized__call_45_OnActiveNodeChanged
|
||||
method_1ari3ha_oninitialized__action_46_event_subscribe_46__linear -->|subscribe HandleLoadingChange| method_1ari3ha_oninitialized__call_46_OnLoadingChanged
|
||||
method_1ari3ha_oninitialized__call_43_OnFocusModeChanged -->|next| method_1ari3ha_oninitialized__action_44_event_subscribe_44__linear
|
||||
method_1ari3ha_oninitialized__call_44_OnGraphUpdated -->|next| method_1ari3ha_oninitialized__action_45_event_subscribe_45__linear
|
||||
method_1ari3ha_oninitialized__call_45_OnActiveNodeChanged -->|next| method_1ari3ha_oninitialized__action_46_event_subscribe_46__linear
|
||||
method_1ari3ha_oninitialized__call_46_OnLoadingChanged -->|return| method_1ari3ha_oninitialized__implicit_return
|
||||
method_1ari3ha_oninitialized__entry -->|next| method_1ari3ha_oninitialized__action_43_event_subscribe_43__linear
|
||||
```
|
||||
|
||||
### HandleGraphUpdate() Control Flow
|
||||
|
||||
_Warnings: diagram method_14hlcms_handlegraphupdate__fragment_diagram exceeds preferred complexity thresholds (29 nodes, 33 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_14hlcms_handlegraphupdate__call_53_CurrentGraphData[["CurrentGraphData"]]
|
||||
method_14hlcms_handlegraphupdate__call_55_clear[["clear"]]
|
||||
method_14hlcms_handlegraphupdate__call_59_updateData[["updateData"]]
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__condition{"_module == null"}
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__false("otherwise")
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__merge("merge")
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__true("return")
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__condition{"_module == null"}
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__false("continue")
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__merge("merge")
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__true("exit")
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__condition{"GraphService.CurrentGraphData == null"}
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__false("update")
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__merge("merge")
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__true("clear")
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__condition{"GraphService.CurrentGraphData == null"}
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__false("false")
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__merge("merge")
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__true("true")
|
||||
method_14hlcms_handlegraphupdate__action_55_handlegraphupdate_await_55_2__await[["Waits for async work"]]
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__condition{"Falls back to alternate path"}
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__false("otherwise")
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__merge("merge")
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__true("fallback")
|
||||
method_14hlcms_handlegraphupdate__action_59_handlegraphupdate_await_59_4__await[["Waits for async work"]]
|
||||
method_14hlcms_handlegraphupdate__action_62_handlegraphupdate_await_62_5__await[["Waits for async work"]]
|
||||
method_14hlcms_handlegraphupdate__action_62_ui_refresh_62__linear("Trigger StateHasChanged")
|
||||
method_14hlcms_handlegraphupdate__entry(["HandleGraphUpdate entry"])
|
||||
method_14hlcms_handlegraphupdate__implicit_return(["return"])
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__condition -->|otherwise| method_14hlcms_handlegraphupdate__action_51_guard_clause_51__false
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__condition -->|return| method_14hlcms_handlegraphupdate__action_51_guard_clause_51__true
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__false -->|next| method_14hlcms_handlegraphupdate__action_51_guard_clause_51__merge
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__merge -->|next| method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__condition
|
||||
method_14hlcms_handlegraphupdate__action_51_guard_clause_51__true -->|next| method_14hlcms_handlegraphupdate__action_51_guard_clause_51__merge
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__condition -->|continue| method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__false
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__condition -->|exit| method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__true
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__false -->|next| method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__merge
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__merge -->|next| method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__condition
|
||||
method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__true -->|next| method_14hlcms_handlegraphupdate__action_51_handlegraphupdate_guard_clause_51_0__merge
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__condition -->|update| method_14hlcms_handlegraphupdate__action_53_branch_53__false
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__condition -->|clear| method_14hlcms_handlegraphupdate__action_53_branch_53__true
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__false -->|next| method_14hlcms_handlegraphupdate__action_53_branch_53__merge
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__merge -->|read current graph DTO| method_14hlcms_handlegraphupdate__call_53_CurrentGraphData
|
||||
method_14hlcms_handlegraphupdate__action_53_branch_53__true -->|next| method_14hlcms_handlegraphupdate__action_53_branch_53__merge
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__condition -->|false| method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__false
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__condition -->|true| method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__true
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__false -->|next| method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__merge
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__merge -->|next| method_14hlcms_handlegraphupdate__action_53_branch_53__condition
|
||||
method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__true -->|next| method_14hlcms_handlegraphupdate__action_53_handlegraphupdate_branch_53_1__merge
|
||||
method_14hlcms_handlegraphupdate__action_55_handlegraphupdate_await_55_2__await -->|no args| method_14hlcms_handlegraphupdate__call_55_clear
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__condition -->|otherwise| method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__false
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__condition -->|fallback| method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__true
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__false -->|next| method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__merge
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__merge -->|next| method_14hlcms_handlegraphupdate__action_59_handlegraphupdate_await_59_4__await
|
||||
method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__true -->|next| method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__merge
|
||||
method_14hlcms_handlegraphupdate__action_59_handlegraphupdate_await_59_4__await -->|GraphService.CurrentGraphData| method_14hlcms_handlegraphupdate__call_59_updateData
|
||||
method_14hlcms_handlegraphupdate__action_62_handlegraphupdate_await_62_5__await -->|next| method_14hlcms_handlegraphupdate__action_62_ui_refresh_62__linear
|
||||
method_14hlcms_handlegraphupdate__action_62_ui_refresh_62__linear -->|return| method_14hlcms_handlegraphupdate__implicit_return
|
||||
method_14hlcms_handlegraphupdate__call_53_CurrentGraphData -->|next| method_14hlcms_handlegraphupdate__action_55_handlegraphupdate_await_55_2__await
|
||||
method_14hlcms_handlegraphupdate__call_55_clear -->|fallback| method_14hlcms_handlegraphupdate__action_57_handlegraphupdate_fallback_57_3__condition
|
||||
method_14hlcms_handlegraphupdate__call_59_updateData -->|next| method_14hlcms_handlegraphupdate__action_62_handlegraphupdate_await_62_5__await
|
||||
method_14hlcms_handlegraphupdate__entry -->|next| method_14hlcms_handlegraphupdate__action_51_guard_clause_51__condition
|
||||
```
|
||||
|
||||
### HandleActiveNodeChange() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_16kjevr_handleactivenodechange__call_68_setActiveNode[["setActiveNode"]]
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__condition{"_module == null"}
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__false("otherwise")
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__merge("merge")
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__true("return")
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__condition{"_module == null"}
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__false("continue")
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__merge("merge")
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__true("exit")
|
||||
method_16kjevr_handleactivenodechange__action_68_handleactivenodechange_await_68_1__await[["Waits for async work"]]
|
||||
method_16kjevr_handleactivenodechange__entry(["HandleActiveNodeChange entry"])
|
||||
method_16kjevr_handleactivenodechange__implicit_return(["return"])
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__condition -->|otherwise| method_16kjevr_handleactivenodechange__action_67_guard_clause_67__false
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__condition -->|return| method_16kjevr_handleactivenodechange__action_67_guard_clause_67__true
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__false -->|next| method_16kjevr_handleactivenodechange__action_67_guard_clause_67__merge
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__merge -->|next| method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__condition
|
||||
method_16kjevr_handleactivenodechange__action_67_guard_clause_67__true -->|next| method_16kjevr_handleactivenodechange__action_67_guard_clause_67__merge
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__condition -->|continue| method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__false
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__condition -->|exit| method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__true
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__false -->|next| method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__merge
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__merge -->|next| method_16kjevr_handleactivenodechange__action_68_handleactivenodechange_await_68_1__await
|
||||
method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__true -->|next| method_16kjevr_handleactivenodechange__action_67_handleactivenodechange_guard_clause_67_0__merge
|
||||
method_16kjevr_handleactivenodechange__action_68_handleactivenodechange_await_68_1__await -->|nodeId| method_16kjevr_handleactivenodechange__call_68_setActiveNode
|
||||
method_16kjevr_handleactivenodechange__call_68_setActiveNode -->|return| method_16kjevr_handleactivenodechange__implicit_return
|
||||
method_16kjevr_handleactivenodechange__entry -->|next| method_16kjevr_handleactivenodechange__action_67_guard_clause_67__condition
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1cayj92_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 21 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1cayj92_onafterrenderasync__call_80_InitializeGraphAsync[["InitializeGraphAsync"]]
|
||||
method_1cayj92_onafterrenderasync__call_82_CurrentGraphData[["CurrentGraphData"]]
|
||||
method_1cayj92_onafterrenderasync__call_84_HandleGraphUpdate[["HandleGraphUpdate"]]
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__condition{"firstRender == true"}
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__false("skip")
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__merge("merge")
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__true("init")
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__condition{"firstRender"}
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__false("false")
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__merge("merge")
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__true("true")
|
||||
method_1cayj92_onafterrenderasync__action_80_onafterrenderasync_await_80_1__await[["Waits for async work"]]
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__condition{"GraphService.CurrentGraphData != null"}
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__false("false")
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__merge("merge")
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__true("true")
|
||||
method_1cayj92_onafterrenderasync__action_84_onafterrenderasync_await_84_3__await[["Waits for async work"]]
|
||||
method_1cayj92_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_1cayj92_onafterrenderasync__implicit_return(["return"])
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__condition -->|skip| method_1cayj92_onafterrenderasync__action_78_guard_clause_78__false
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__condition -->|init| method_1cayj92_onafterrenderasync__action_78_guard_clause_78__true
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__false -->|next| method_1cayj92_onafterrenderasync__action_78_guard_clause_78__merge
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__merge -->|next| method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__condition
|
||||
method_1cayj92_onafterrenderasync__action_78_guard_clause_78__true -->|next| method_1cayj92_onafterrenderasync__action_78_guard_clause_78__merge
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__condition -->|false| method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__false
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__condition -->|true| method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__true
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__false -->|next| method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__merge
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__merge -->|next| method_1cayj92_onafterrenderasync__action_80_onafterrenderasync_await_80_1__await
|
||||
method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__true -->|next| method_1cayj92_onafterrenderasync__action_78_onafterrenderasync_branch_78_0__merge
|
||||
method_1cayj92_onafterrenderasync__action_80_onafterrenderasync_await_80_1__await -->|no args| method_1cayj92_onafterrenderasync__call_80_InitializeGraphAsync
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__condition -->|false| method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__false
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__condition -->|true| method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__true
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__false -->|next| method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__merge
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__merge -->|read current graph DTO| method_1cayj92_onafterrenderasync__call_82_CurrentGraphData
|
||||
method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__true -->|next| method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__merge
|
||||
method_1cayj92_onafterrenderasync__action_84_onafterrenderasync_await_84_3__await -->|no args| method_1cayj92_onafterrenderasync__call_84_HandleGraphUpdate
|
||||
method_1cayj92_onafterrenderasync__call_80_InitializeGraphAsync -->|next| method_1cayj92_onafterrenderasync__action_82_onafterrenderasync_branch_82_2__condition
|
||||
method_1cayj92_onafterrenderasync__call_82_CurrentGraphData -->|next| method_1cayj92_onafterrenderasync__action_84_onafterrenderasync_await_84_3__await
|
||||
method_1cayj92_onafterrenderasync__call_84_HandleGraphUpdate -->|return| method_1cayj92_onafterrenderasync__implicit_return
|
||||
method_1cayj92_onafterrenderasync__entry -->|next| method_1cayj92_onafterrenderasync__action_78_guard_clause_78__condition
|
||||
```
|
||||
|
||||
### InitializeGraphAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1to2smv_initializegraphasync__call_93_CurrentGraphData[["CurrentGraphData"]]
|
||||
method_1to2smv_initializegraphasync__call_93_mount[["mount"]]
|
||||
method_1to2smv_initializegraphasync__action_91_external_load_91__linear("Import JS module")
|
||||
method_1to2smv_initializegraphasync__action_91_initializegraphasync_await_91_0__await[["Waits for async work"]]
|
||||
method_1to2smv_initializegraphasync__action_92_interop_setup_92__linear("Create DotNetObjectReference")
|
||||
method_1to2smv_initializegraphasync__action_93_initializegraphasync_await_93_1__await[["Waits for async work"]]
|
||||
method_1to2smv_initializegraphasync__action_93_interop_call_93__linear("Mount graph")
|
||||
method_1to2smv_initializegraphasync__entry(["InitializeGraphAsync entry"])
|
||||
method_1to2smv_initializegraphasync__implicit_return(["return"])
|
||||
method_1to2smv_initializegraphasync__action_91_external_load_91__linear -->|next| method_1to2smv_initializegraphasync__action_92_interop_setup_92__linear
|
||||
method_1to2smv_initializegraphasync__action_91_initializegraphasync_await_91_0__await -->|next| method_1to2smv_initializegraphasync__action_91_external_load_91__linear
|
||||
method_1to2smv_initializegraphasync__action_92_interop_setup_92__linear -->|next| method_1to2smv_initializegraphasync__action_93_initializegraphasync_await_93_1__await
|
||||
method_1to2smv_initializegraphasync__action_93_initializegraphasync_await_93_1__await -->|next| method_1to2smv_initializegraphasync__action_93_interop_call_93__linear
|
||||
method_1to2smv_initializegraphasync__action_93_interop_call_93__linear -->|ContainerId, GraphService.CurrentGraphData, dotNet helper| method_1to2smv_initializegraphasync__call_93_mount
|
||||
method_1to2smv_initializegraphasync__call_93_CurrentGraphData -->|return| method_1to2smv_initializegraphasync__implicit_return
|
||||
method_1to2smv_initializegraphasync__call_93_mount -->|pass current graph DTO into mount| method_1to2smv_initializegraphasync__call_93_CurrentGraphData
|
||||
method_1to2smv_initializegraphasync__entry -->|next| method_1to2smv_initializegraphasync__action_91_initializegraphasync_await_91_0__await
|
||||
```
|
||||
|
||||
### ZoomIn() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1muyu85_zoomin__call_96_zoomIn[["zoomIn"]]
|
||||
method_1muyu85_zoomin__action_96_interop_call_96__linear("zoomIn")
|
||||
method_1muyu85_zoomin__action_96_zoomin_await_96_0__await[["Waits for async work"]]
|
||||
method_1muyu85_zoomin__entry(["ZoomIn entry"])
|
||||
method_1muyu85_zoomin__implicit_return(["return"])
|
||||
method_1muyu85_zoomin__action_96_interop_call_96__linear -->|next| method_1muyu85_zoomin__action_96_zoomin_await_96_0__await
|
||||
method_1muyu85_zoomin__action_96_zoomin_await_96_0__await -->|no args| method_1muyu85_zoomin__call_96_zoomIn
|
||||
method_1muyu85_zoomin__call_96_zoomIn -->|return| method_1muyu85_zoomin__implicit_return
|
||||
method_1muyu85_zoomin__entry -->|next| method_1muyu85_zoomin__action_96_interop_call_96__linear
|
||||
```
|
||||
|
||||
### ZoomOut() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1l8ubet_zoomout__call_97_zoomOut[["zoomOut"]]
|
||||
method_1l8ubet_zoomout__action_97_interop_call_97__linear("zoomOut")
|
||||
method_1l8ubet_zoomout__action_97_zoomout_await_97_0__await[["Waits for async work"]]
|
||||
method_1l8ubet_zoomout__entry(["ZoomOut entry"])
|
||||
method_1l8ubet_zoomout__implicit_return(["return"])
|
||||
method_1l8ubet_zoomout__action_97_interop_call_97__linear -->|next| method_1l8ubet_zoomout__action_97_zoomout_await_97_0__await
|
||||
method_1l8ubet_zoomout__action_97_zoomout_await_97_0__await -->|no args| method_1l8ubet_zoomout__call_97_zoomOut
|
||||
method_1l8ubet_zoomout__call_97_zoomOut -->|return| method_1l8ubet_zoomout__implicit_return
|
||||
method_1l8ubet_zoomout__entry -->|next| method_1l8ubet_zoomout__action_97_interop_call_97__linear
|
||||
```
|
||||
|
||||
### ZoomReset() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_129w46l_zoomreset__call_98_zoomReset[["zoomReset"]]
|
||||
method_129w46l_zoomreset__action_98_interop_call_98__linear("zoomReset")
|
||||
method_129w46l_zoomreset__action_98_zoomreset_await_98_0__await[["Waits for async work"]]
|
||||
method_129w46l_zoomreset__entry(["ZoomReset entry"])
|
||||
method_129w46l_zoomreset__implicit_return(["return"])
|
||||
method_129w46l_zoomreset__action_98_interop_call_98__linear -->|next| method_129w46l_zoomreset__action_98_zoomreset_await_98_0__await
|
||||
method_129w46l_zoomreset__action_98_zoomreset_await_98_0__await -->|no args| method_129w46l_zoomreset__call_98_zoomReset
|
||||
method_129w46l_zoomreset__call_98_zoomReset -->|return| method_129w46l_zoomreset__implicit_return
|
||||
method_129w46l_zoomreset__entry -->|next| method_129w46l_zoomreset__action_98_interop_call_98__linear
|
||||
```
|
||||
|
||||
### OnNodeClicked() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_66cucs_onnodeclicked__call_103_NotifyNodeSelected[["NotifyNodeSelected"]]
|
||||
method_66cucs_onnodeclicked__action_100_js_invokable_100__linear("Exposed to JS")
|
||||
method_66cucs_onnodeclicked__action_103_external_notification_103__linear("Notify InteractionService")
|
||||
method_66cucs_onnodeclicked__action_103_onnodeclicked_await_103_1__await[["Waits for async work"]]
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__condition{"OnNodeSelected.HasDelegate"}
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__false("skip")
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__merge("merge")
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__true("invoke")
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__condition{"OnNodeSelected.HasDelegate"}
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__false("false")
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__merge("merge")
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__true("true")
|
||||
method_66cucs_onnodeclicked__action_107_onnodeclicked_await_107_3__await[["Waits for async work"]]
|
||||
method_66cucs_onnodeclicked__entry(["OnNodeClicked entry"])
|
||||
method_66cucs_onnodeclicked__action_103_onnodeclicked_notification_103_0__linear[/"Sends notification"/]
|
||||
method_66cucs_onnodeclicked__implicit_return(["return"])
|
||||
method_66cucs_onnodeclicked__action_100_js_invokable_100__linear -->|next| method_66cucs_onnodeclicked__action_103_onnodeclicked_await_103_1__await
|
||||
method_66cucs_onnodeclicked__action_103_external_notification_103__linear -->|nodeId| method_66cucs_onnodeclicked__call_103_NotifyNodeSelected
|
||||
method_66cucs_onnodeclicked__action_103_onnodeclicked_await_103_1__await -->|next| method_66cucs_onnodeclicked__action_103_onnodeclicked_notification_103_0__linear
|
||||
method_66cucs_onnodeclicked__action_103_onnodeclicked_notification_103_0__linear -->|next| method_66cucs_onnodeclicked__action_103_external_notification_103__linear
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__condition -->|skip| method_66cucs_onnodeclicked__action_105_guard_clause_105__false
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__condition -->|invoke| method_66cucs_onnodeclicked__action_105_guard_clause_105__true
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__false -->|next| method_66cucs_onnodeclicked__action_105_guard_clause_105__merge
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__merge -->|next| method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__condition
|
||||
method_66cucs_onnodeclicked__action_105_guard_clause_105__true -->|next| method_66cucs_onnodeclicked__action_105_guard_clause_105__merge
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__condition -->|false| method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__false
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__condition -->|true| method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__true
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__false -->|next| method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__merge
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__merge -->|next| method_66cucs_onnodeclicked__action_107_onnodeclicked_await_107_3__await
|
||||
method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__true -->|next| method_66cucs_onnodeclicked__action_105_onnodeclicked_branch_105_2__merge
|
||||
method_66cucs_onnodeclicked__action_107_onnodeclicked_await_107_3__await -->|return| method_66cucs_onnodeclicked__implicit_return
|
||||
method_66cucs_onnodeclicked__call_103_NotifyNodeSelected -->|next| method_66cucs_onnodeclicked__action_105_guard_clause_105__condition
|
||||
method_66cucs_onnodeclicked__entry -->|next| method_66cucs_onnodeclicked__action_100_js_invokable_100__linear
|
||||
```
|
||||
|
||||
### HandleFocusSimulation() Control Flow
|
||||
|
||||
_Warnings: diagram method_qjg1lv_handlefocussimulation__fragment_diagram exceeds preferred complexity thresholds (30 nodes, 34 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_qjg1lv_handlefocussimulation__call_117_IsFocusModeActive[["IsFocusModeActive"]]
|
||||
method_qjg1lv_handlefocussimulation__call_118_pause[["pause"]]
|
||||
method_qjg1lv_handlefocussimulation__call_120_resume[["resume"]]
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__condition{"_module == null"}
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__false("otherwise")
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__merge("merge")
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__true("return")
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__condition{"_module == null"}
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__false("continue")
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__merge("merge")
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__true("exit")
|
||||
method_qjg1lv_handlefocussimulation__action_115_handlefocussimulation_try_115_1__try("Begins protected execution")
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__condition{"FocusMode.IsFocusModeActive"}
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__false("resume")
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__merge("merge")
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__true("pause")
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__condition{"FocusMode.IsFocusModeActive"}
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__false("false")
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__merge("merge")
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__true("true")
|
||||
method_qjg1lv_handlefocussimulation__action_118_handlefocussimulation_await_118_3__await[["Waits for async work"]]
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__condition{"Falls back to alternate path"}
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__false("otherwise")
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__merge("merge")
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__true("fallback")
|
||||
method_qjg1lv_handlefocussimulation__action_120_handlefocussimulation_await_120_5__await[["Waits for async work"]]
|
||||
method_qjg1lv_handlefocussimulation__action_122_error_handling_122__linear("Swallow exceptions from JS interop")
|
||||
method_qjg1lv_handlefocussimulation__action_122_handlefocussimulation_catch_122_6__catch("Handles exception path")
|
||||
method_qjg1lv_handlefocussimulation__entry(["HandleFocusSimulation entry"])
|
||||
method_qjg1lv_handlefocussimulation__implicit_return(["return"])
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__condition -->|otherwise| method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__false
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__condition -->|return| method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__true
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__false -->|next| method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__merge
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__merge -->|next| method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__condition
|
||||
method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__true -->|next| method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__merge
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__condition -->|continue| method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__false
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__condition -->|exit| method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__true
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__false -->|next| method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__merge
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__merge -->|next| method_qjg1lv_handlefocussimulation__action_115_handlefocussimulation_try_115_1__try
|
||||
method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__true -->|next| method_qjg1lv_handlefocussimulation__action_114_handlefocussimulation_guard_clause_114_0__merge
|
||||
method_qjg1lv_handlefocussimulation__action_115_handlefocussimulation_try_115_1__try -->|next| method_qjg1lv_handlefocussimulation__action_117_branch_117__condition
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__condition -->|resume| method_qjg1lv_handlefocussimulation__action_117_branch_117__false
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__condition -->|pause| method_qjg1lv_handlefocussimulation__action_117_branch_117__true
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__false -->|next| method_qjg1lv_handlefocussimulation__action_117_branch_117__merge
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__merge -->|next| method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__condition
|
||||
method_qjg1lv_handlefocussimulation__action_117_branch_117__true -->|next| method_qjg1lv_handlefocussimulation__action_117_branch_117__merge
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__condition -->|false| method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__false
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__condition -->|true| method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__true
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__false -->|next| method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__merge
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__merge -->|read boolean| method_qjg1lv_handlefocussimulation__call_117_IsFocusModeActive
|
||||
method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__true -->|next| method_qjg1lv_handlefocussimulation__action_117_handlefocussimulation_branch_117_2__merge
|
||||
method_qjg1lv_handlefocussimulation__action_118_handlefocussimulation_await_118_3__await -->|no args| method_qjg1lv_handlefocussimulation__call_118_pause
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__condition -->|otherwise| method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__false
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__condition -->|fallback| method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__true
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__false -->|next| method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__merge
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__merge -->|next| method_qjg1lv_handlefocussimulation__action_120_handlefocussimulation_await_120_5__await
|
||||
method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__true -->|next| method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__merge
|
||||
method_qjg1lv_handlefocussimulation__action_120_handlefocussimulation_await_120_5__await -->|no args| method_qjg1lv_handlefocussimulation__call_120_resume
|
||||
method_qjg1lv_handlefocussimulation__action_122_error_handling_122__linear -->|exception| method_qjg1lv_handlefocussimulation__action_122_handlefocussimulation_catch_122_6__catch
|
||||
method_qjg1lv_handlefocussimulation__action_122_handlefocussimulation_catch_122_6__catch -->|return| method_qjg1lv_handlefocussimulation__implicit_return
|
||||
method_qjg1lv_handlefocussimulation__call_117_IsFocusModeActive -->|next| method_qjg1lv_handlefocussimulation__action_118_handlefocussimulation_await_118_3__await
|
||||
method_qjg1lv_handlefocussimulation__call_118_pause -->|fallback| method_qjg1lv_handlefocussimulation__action_119_handlefocussimulation_fallback_119_4__condition
|
||||
method_qjg1lv_handlefocussimulation__call_120_resume -->|next| method_qjg1lv_handlefocussimulation__action_122_error_handling_122__linear
|
||||
method_qjg1lv_handlefocussimulation__entry -->|next| method_qjg1lv_handlefocussimulation__action_114_guard_clause_114__condition
|
||||
```
|
||||
|
||||
### DisposeAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_lvsss7_disposeasync__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 20 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_lvsss7_disposeasync__call_127_OnFocusModeChanged[["OnFocusModeChanged"]]
|
||||
method_lvsss7_disposeasync__call_128_OnGraphUpdated[["OnGraphUpdated"]]
|
||||
method_lvsss7_disposeasync__call_129_OnActiveNodeChanged[["OnActiveNodeChanged"]]
|
||||
method_lvsss7_disposeasync__call_130_OnLoadingChanged[["OnLoadingChanged"]]
|
||||
method_lvsss7_disposeasync__call_136_unmount[["unmount"]]
|
||||
method_lvsss7_disposeasync__action_127_event_unsubscribe_127__linear("Unsubscribe FocusMode change")
|
||||
method_lvsss7_disposeasync__action_128_event_unsubscribe_128__linear("Unsubscribe graph events")
|
||||
method_lvsss7_disposeasync__action_132_disposeasync_try_132_0__try("Begins protected execution")
|
||||
method_lvsss7_disposeasync__action_132_error_handling_132__linear("Swallow exceptions during dispose")
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__condition{"_module is not null"}
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__false("false")
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__merge("merge")
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__true("true")
|
||||
method_lvsss7_disposeasync__action_136_disposeasync_await_136_2__await[["Waits for async work"]]
|
||||
method_lvsss7_disposeasync__action_136_interop_call_136__linear("Unmount JS module")
|
||||
method_lvsss7_disposeasync__action_137_dispose_137__linear("Dispose JS module and DotNet helper")
|
||||
method_lvsss7_disposeasync__action_137_disposeasync_await_137_3__await[["Waits for async work"]]
|
||||
method_lvsss7_disposeasync__action_140_disposeasync_catch_140_4__catch("Handles exception path")
|
||||
method_lvsss7_disposeasync__entry(["DisposeAsync entry"])
|
||||
method_lvsss7_disposeasync__implicit_return(["return"])
|
||||
method_lvsss7_disposeasync__action_127_event_unsubscribe_127__linear -->|unsubscribe HandleFocusSimulation| method_lvsss7_disposeasync__call_127_OnFocusModeChanged
|
||||
method_lvsss7_disposeasync__action_128_event_unsubscribe_128__linear -->|unsubscribe HandleGraphUpdate| method_lvsss7_disposeasync__call_128_OnGraphUpdated
|
||||
method_lvsss7_disposeasync__action_132_disposeasync_try_132_0__try -->|next| method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__condition
|
||||
method_lvsss7_disposeasync__action_132_error_handling_132__linear -->|next| method_lvsss7_disposeasync__action_132_disposeasync_try_132_0__try
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__condition -->|false| method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__false
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__condition -->|true| method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__true
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__false -->|next| method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__merge
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__merge -->|next| method_lvsss7_disposeasync__action_136_disposeasync_await_136_2__await
|
||||
method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__true -->|next| method_lvsss7_disposeasync__action_134_disposeasync_branch_134_1__merge
|
||||
method_lvsss7_disposeasync__action_136_disposeasync_await_136_2__await -->|next| method_lvsss7_disposeasync__action_136_interop_call_136__linear
|
||||
method_lvsss7_disposeasync__action_136_interop_call_136__linear -->|ContainerId| method_lvsss7_disposeasync__call_136_unmount
|
||||
method_lvsss7_disposeasync__action_137_dispose_137__linear -->|exception| method_lvsss7_disposeasync__action_140_disposeasync_catch_140_4__catch
|
||||
method_lvsss7_disposeasync__action_137_disposeasync_await_137_3__await -->|next| method_lvsss7_disposeasync__action_137_dispose_137__linear
|
||||
method_lvsss7_disposeasync__action_140_disposeasync_catch_140_4__catch -->|return| method_lvsss7_disposeasync__implicit_return
|
||||
method_lvsss7_disposeasync__call_127_OnFocusModeChanged -->|next| method_lvsss7_disposeasync__action_128_event_unsubscribe_128__linear
|
||||
method_lvsss7_disposeasync__call_128_OnGraphUpdated -->|unsubscribe HandleActiveNodeChange| method_lvsss7_disposeasync__call_129_OnActiveNodeChanged
|
||||
method_lvsss7_disposeasync__call_129_OnActiveNodeChanged -->|unsubscribe HandleLoadingChange| method_lvsss7_disposeasync__call_130_OnLoadingChanged
|
||||
method_lvsss7_disposeasync__call_130_OnLoadingChanged -->|next| method_lvsss7_disposeasync__action_132_error_handling_132__linear
|
||||
method_lvsss7_disposeasync__call_136_unmount -->|next| method_lvsss7_disposeasync__action_137_disposeasync_await_137_3__await
|
||||
method_lvsss7_disposeasync__entry -->|next| method_lvsss7_disposeasync__action_127_event_unsubscribe_127__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 23 unresolved jumps.
|
||||
- Warning: neighborhood-view: diagram file_jo64ly_knowledgegraph_razor_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges).
|
||||
- Warning: execution-overview: diagram file_jo64ly_knowledgegraph_razor_execution_view exceeds preferred complexity thresholds (38 nodes, 37 edges).
|
||||
- Warning: control-flow: diagram method_14hlcms_handlegraphupdate__fragment_diagram exceeds preferred complexity thresholds (29 nodes, 33 edges).
|
||||
- Warning: control-flow: diagram method_1cayj92_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 21 edges).
|
||||
- Warning: control-flow: diagram method_qjg1lv_handlefocussimulation__fragment_diagram exceeds preferred complexity thresholds (30 nodes, 34 edges).
|
||||
- Warning: control-flow: diagram method_lvsss7_disposeasync__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 20 edges).
|
||||
+630
@@ -0,0 +1,630 @@
|
||||
# ReaderCanvas
|
||||
|
||||
- File ID: file:3sb16d:readercanvas-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI component that renders an ebook reader canvas, manages chapter loading, selection/highlight UX, JS observers/selection interop, and synchronizes reading progress across devices.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component heavily coordinates between JS observer modules, a KnowledgeCoordinator, SyncService and navigation; it guards against missing ebook selection, handles JS initialization failures with logged warnings, and temporarily highlights blocks with a timed clear.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ReaderCanvas: Razor UI component that renders an ebook reader canvas, manages chapter loading, selection/highlight UX, JS observers/selection interop, and synchronizes reading progress across devices.
|
||||
- OnInitializedAsync(): Component initialization: clears coordinator and subscribes to theme, navigation, interaction and sync events.
|
||||
- OnParametersSetAsync(): Triggered when component parameters are set; loads the chapter for the current navigation index.
|
||||
- OnNavigationChanged(): Handles navigation changes by resetting selection/JS state and reloading the chapter.
|
||||
- OnAfterRenderAsync(): After render hook: initializes sync, processes full page with coordinator on first render, and initializes JS observers/listeners when needed.
|
||||
- InitializeSelectionListenerAsync(): Loads a JS module and registers a DOM selection listener via JS interop; logs warning on failure.
|
||||
- InitializeObserverAsync(): Loads JS observer module and initializes scroll/visibility observer; logs warning on failure.
|
||||
- HandleBlockReached(): Invoked from JS when a block becomes visible; notifies coordinator and updates sync progress if ViewModel present.
|
||||
- HandleSyncProgressReceived(): Receives progress from other devices, logs it, scrolls to the corresponding node and requests UI update.
|
||||
- HandleTextSelected(): JS-invokable handler that records selected text, block id and coordinates and triggers UI update.
|
||||
- HandleSelectionCleared(): Clears current text selection state and requests UI update.
|
||||
- HandleScrollRequested(): Handler that triggers a scroll to a specific block node.
|
||||
- HandleHighlightRequested(): Highlights a block temporarily by setting a highlighted id, triggers UI updates and clears it after a delay.
|
||||
- GetFullPageContent(): Builds a plain-text representation of all text blocks (IDs + content) for coordinator processing or full-page use.
|
||||
- LoadChapterAsync(): Loads a reader page (chapter) via Mediator, updates view model and navigation metadata, handles errors and UI loading state, and triggers coordinator/process sync when interactive.
|
||||
- ScrollToNodeAsync(): Uses JS interop to scroll a DOM element into view by id with smooth behavior and logs warnings on failure.
|
||||
- HandleUpdate(): Lightweight helper that requests a StateHasChanged invocation asynchronously.
|
||||
- Dispose(): Unsubscribes all previously registered event handlers to avoid leaks when component is disposed.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries.Reader (GetReaderPageQuery)
|
||||
- dependency-target: NexusReader.UI.Shared.Services (Coordinator, NavigationService, InteractionService, SyncService, ThemeService, FocusMode, IReaderInteractionService, IReaderNavigationService, IThemeService)
|
||||
- dependency-target: MediatR (Mediator.Send)
|
||||
- dependency-target: JS modules: ./_content/NexusReader.UI.Shared/js/selectionHandler.js
|
||||
- dependency-target: JS modules: ./_content/NexusReader.UI.Shared/js/readerObserver.js
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: var userId = authState.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
|
||||
- interaction-target: StatusMessage = $"Błąd: {result.Errors.FirstOrDefault()?.Message ?? "Nie udało się wczytać treści"}";
|
||||
- interaction-target: JS.InvokeAsync('import', './_content/.../selectionHandler.js')
|
||||
- interaction-target: JS.InvokeAsync('import', './_content/.../readerObserver.js')
|
||||
- interaction-target: JS.InvokeVoidAsync('eval', script)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 18
|
||||
- Executable symbols: 17
|
||||
- Executable symbols with control flow: 17
|
||||
- Grounded edges: 18
|
||||
- Unresolved references: 31
|
||||
- Control-flow fragments: 17
|
||||
- Unresolved jumps: 15
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 11
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitializedAsync: 8 nodes, 7 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnParametersSetAsync: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnNavigationChanged: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 31 nodes, 35 edges, 4 jumps, 0 unsupported constructs
|
||||
- InitializeSelectionListenerAsync: 11 nodes, 10 edges, 2 jumps, 0 unsupported constructs
|
||||
- InitializeObserverAsync: 11 nodes, 10 edges, 2 jumps, 0 unsupported constructs
|
||||
- HandleBlockReached: 16 nodes, 17 edges, 2 jumps, 0 unsupported constructs
|
||||
- HandleSyncProgressReceived: 8 nodes, 7 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleTextSelected: 7 nodes, 6 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleSelectionCleared: 5 nodes, 4 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleScrollRequested: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleHighlightRequested: 12 nodes, 12 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetFullPageContent: 13 nodes, 14 edges, 0 jumps, 0 unsupported constructs
|
||||
- LoadChapterAsync: 40 nodes, 44 edges, 4 jumps, 0 unsupported constructs
|
||||
- ScrollToNodeAsync: 9 nodes, 8 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleUpdate: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Dispose: 6 nodes, 5 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReaderCanvas Neighborhood
|
||||
|
||||
_Warnings: diagram file_3sb16d_readercanvas_razor_neighborhood_view exceeds preferred complexity thresholds (19 nodes, 0 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_scmh0y_readercanvas("ReaderCanvas")
|
||||
file_3sb16d_readercanvas_razor("ReaderCanvas")
|
||||
method_105vz8s_scrolltonodeasync[["ScrollToNodeAsync()"]]
|
||||
method_16xot65_handletextselected[["HandleTextSelected()"]]
|
||||
method_1ejbaxq_handlescrollrequested[["HandleScrollRequested()"]]
|
||||
method_1h2dsti_dispose[["Dispose()"]]
|
||||
method_1i9kqly_getfullpagecontent[["GetFullPageContent()"]]
|
||||
method_1k0kfjg_onnavigationchanged[["OnNavigationChanged()"]]
|
||||
method_1l7jj8x_initializeobserverasync[["InitializeObserverAsync()"]]
|
||||
method_1nqcmix_handlehighlightrequested[["HandleHighlightRequested()"]]
|
||||
method_1p3f1im_handleblockreached[["HandleBlockReached()"]]
|
||||
method_1pp2oro_oninitializedasync[["OnInitializedAsync()"]]
|
||||
method_1qikoos_handleupdate[["HandleUpdate()"]]
|
||||
method_1rioxzo_handleselectioncleared[["HandleSelectionCleared()"]]
|
||||
method_ero6bp_loadchapterasync[["LoadChapterAsync()"]]
|
||||
method_etczkb_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_o7fqko_handlesyncprogressreceived[["HandleSyncProgressReceived()"]]
|
||||
method_qspmus_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_w4053o_initializeselectionlistenerasync[["InitializeSelectionListenerAsync()"]]
|
||||
```
|
||||
|
||||
### ReaderCanvas Execution Overview
|
||||
|
||||
_Warnings: diagram file_3sb16d_readercanvas_razor_execution_view exceeds preferred complexity thresholds (44 nodes, 43 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
class_scmh0y_readercanvas("ReaderCanvas")
|
||||
method_105vz8s_scrolltonodeasync[["ScrollToNodeAsync()"]]
|
||||
method_16xot65_handletextselected[["HandleTextSelected()"]]
|
||||
method_1ejbaxq_handlescrollrequested[["HandleScrollRequested()"]]
|
||||
method_1h2dsti_dispose[["Dispose()"]]
|
||||
method_1i9kqly_getfullpagecontent[["GetFullPageContent()"]]
|
||||
method_1k0kfjg_onnavigationchanged[["OnNavigationChanged()"]]
|
||||
method_1l7jj8x_initializeobserverasync[["InitializeObserverAsync()"]]
|
||||
method_1nqcmix_handlehighlightrequested[["HandleHighlightRequested()"]]
|
||||
method_1p3f1im_handleblockreached[["HandleBlockReached()"]]
|
||||
method_1pp2oro_oninitializedasync[["OnInitializedAsync()"]]
|
||||
method_1qikoos_handleupdate[["HandleUpdate()"]]
|
||||
method_1rioxzo_handleselectioncleared[["HandleSelectionCleared()"]]
|
||||
method_ero6bp_loadchapterasync[["LoadChapterAsync()"]]
|
||||
method_etczkb_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_o7fqko_handlesyncprogressreceived[["HandleSyncProgressReceived()"]]
|
||||
method_qspmus_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_w4053o_initializeselectionlistenerasync[["InitializeSelectionListenerAsync()"]]
|
||||
unresolved_unresolved_10oitcb_call_target{"Unresolved: LoadChapterAsync"}
|
||||
unresolved_unresolved_1290kf4_interaction_target{"Unresolved: var userId = authState.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;"}
|
||||
unresolved_unresolved_14tu9s8_call_target{"Unresolved: UpdateProgressAsync"}
|
||||
unresolved_unresolved_1bfvgf7_interaction_target{"Unresolved: JS.InvokeAsync('import', './_content/.../selectionHandler.js')"}
|
||||
unresolved_unresolved_1clpv1o_call_target{"Unresolved: ScrollToNodeAsync"}
|
||||
unresolved_unresolved_1ecszuf_call_target{"Unresolved: ScrollToNodeAsync"}
|
||||
unresolved_unresolved_1nywp45_interaction_target{"Unresolved: JS.InvokeVoidAsync('eval', script)"}
|
||||
unresolved_unresolved_1o4rxvq_call_target{"Unresolved: ProcessFullPageAsync"}
|
||||
unresolved_unresolved_1ojxmgq_call_target{"Unresolved: GetAuthenticationStateAsync"}
|
||||
unresolved_unresolved_1pzrppn_call_target{"Unresolved: ClearAsync"}
|
||||
unresolved_unresolved_1tl9hd6_call_target{"Unresolved: InitializeAsync"}
|
||||
unresolved_unresolved_1xmlex9_call_target{"Unresolved: UpdateMetadataAsync"}
|
||||
unresolved_unresolved_1ykg7qx_call_target{"Unresolved: Send"}
|
||||
unresolved_unresolved_49c7i_call_target{"Unresolved: InvokeVoidAsync"}
|
||||
unresolved_unresolved_4b0xv6_call_target{"Unresolved: LoadChapterAsync"}
|
||||
unresolved_unresolved_cztvzm_call_target{"Unresolved: OnBlockReachedAsync"}
|
||||
unresolved_unresolved_dmm0s1_call_target{"Unresolved: ProcessFullPageAsync"}
|
||||
unresolved_unresolved_er2dng_call_target{"Unresolved: InitializeSelectionListenerAsync"}
|
||||
unresolved_unresolved_ihgsmk_call_target{"Unresolved: InitializeObserverAsync"}
|
||||
unresolved_unresolved_ovldpq_call_target{"Unresolved: InvokeVoidAsync"}
|
||||
unresolved_unresolved_oww71w_call_target{"Unresolved: InvokeAsync"}
|
||||
unresolved_unresolved_raqq7q_interaction_target{"Unresolved: JS.InvokeAsync('import', './_content/.../readerObserver.js')"}
|
||||
unresolved_unresolved_rtadvy_call_target{"Unresolved: Delay"}
|
||||
unresolved_unresolved_wp86mw_interaction_target{"Unresolved: StatusMessage = $\\"Błąd: {result.Errors.FirstOrDefault()?.Message ?? \\"Nie udało się wczytać treści\\"}\\";"}
|
||||
unresolved_unresolved_y0aono_call_target{"Unresolved: InvokeAsync"}
|
||||
unresolved_unresolved_z4tu8x_call_target{"Unresolved: InvokeVoidAsync"}
|
||||
class_scmh0y_readercanvas -->|contains| method_105vz8s_scrolltonodeasync
|
||||
class_scmh0y_readercanvas -->|contains| method_16xot65_handletextselected
|
||||
class_scmh0y_readercanvas -->|contains| method_1ejbaxq_handlescrollrequested
|
||||
class_scmh0y_readercanvas -->|contains| method_1h2dsti_dispose
|
||||
class_scmh0y_readercanvas -->|contains| method_1i9kqly_getfullpagecontent
|
||||
class_scmh0y_readercanvas -->|contains| method_1k0kfjg_onnavigationchanged
|
||||
class_scmh0y_readercanvas -->|contains| method_1l7jj8x_initializeobserverasync
|
||||
class_scmh0y_readercanvas -->|contains| method_1nqcmix_handlehighlightrequested
|
||||
class_scmh0y_readercanvas -->|contains| method_1p3f1im_handleblockreached
|
||||
class_scmh0y_readercanvas -->|contains| method_1pp2oro_oninitializedasync
|
||||
class_scmh0y_readercanvas -->|contains| method_1qikoos_handleupdate
|
||||
class_scmh0y_readercanvas -->|contains| method_1rioxzo_handleselectioncleared
|
||||
class_scmh0y_readercanvas -->|contains| method_ero6bp_loadchapterasync
|
||||
class_scmh0y_readercanvas -->|contains| method_etczkb_onparameterssetasync
|
||||
class_scmh0y_readercanvas -->|contains| method_o7fqko_handlesyncprogressreceived
|
||||
class_scmh0y_readercanvas -->|contains| method_qspmus_onafterrenderasync
|
||||
class_scmh0y_readercanvas -->|contains| method_w4053o_initializeselectionlistenerasync
|
||||
class_scmh0y_readercanvas -->|unresolved interaction| unresolved_unresolved_1290kf4_interaction_target
|
||||
class_scmh0y_readercanvas -->|unresolved interaction| unresolved_unresolved_1bfvgf7_interaction_target
|
||||
class_scmh0y_readercanvas -->|unresolved interaction| unresolved_unresolved_1nywp45_interaction_target
|
||||
class_scmh0y_readercanvas -->|unresolved interaction| unresolved_unresolved_raqq7q_interaction_target
|
||||
class_scmh0y_readercanvas -->|unresolved interaction| unresolved_unresolved_wp86mw_interaction_target
|
||||
method_105vz8s_scrolltonodeasync -->|unresolved call| unresolved_unresolved_z4tu8x_call_target
|
||||
method_1ejbaxq_handlescrollrequested -->|unresolved call| unresolved_unresolved_1ecszuf_call_target
|
||||
method_1k0kfjg_onnavigationchanged -->|unresolved call| unresolved_unresolved_4b0xv6_call_target
|
||||
method_1l7jj8x_initializeobserverasync -->|unresolved call| unresolved_unresolved_ovldpq_call_target
|
||||
method_1l7jj8x_initializeobserverasync -->|unresolved call| unresolved_unresolved_oww71w_call_target
|
||||
method_1nqcmix_handlehighlightrequested -->|unresolved call| unresolved_unresolved_rtadvy_call_target
|
||||
method_1p3f1im_handleblockreached -->|unresolved call| unresolved_unresolved_14tu9s8_call_target
|
||||
method_1p3f1im_handleblockreached -->|unresolved call| unresolved_unresolved_cztvzm_call_target
|
||||
method_1pp2oro_oninitializedasync -->|unresolved call| unresolved_unresolved_1pzrppn_call_target
|
||||
method_ero6bp_loadchapterasync -->|unresolved call| unresolved_unresolved_1o4rxvq_call_target
|
||||
method_ero6bp_loadchapterasync -->|unresolved call| unresolved_unresolved_1ojxmgq_call_target
|
||||
method_ero6bp_loadchapterasync -->|unresolved call| unresolved_unresolved_1xmlex9_call_target
|
||||
method_ero6bp_loadchapterasync -->|unresolved call| unresolved_unresolved_1ykg7qx_call_target
|
||||
method_etczkb_onparameterssetasync -->|unresolved call| unresolved_unresolved_10oitcb_call_target
|
||||
method_o7fqko_handlesyncprogressreceived -->|unresolved call| unresolved_unresolved_1clpv1o_call_target
|
||||
method_qspmus_onafterrenderasync -->|unresolved call| unresolved_unresolved_1tl9hd6_call_target
|
||||
method_qspmus_onafterrenderasync -->|unresolved call| unresolved_unresolved_dmm0s1_call_target
|
||||
method_qspmus_onafterrenderasync -->|unresolved call| unresolved_unresolved_er2dng_call_target
|
||||
method_qspmus_onafterrenderasync -->|unresolved call| unresolved_unresolved_ihgsmk_call_target
|
||||
method_w4053o_initializeselectionlistenerasync -->|unresolved call| unresolved_unresolved_49c7i_call_target
|
||||
method_w4053o_initializeselectionlistenerasync -->|unresolved call| unresolved_unresolved_y0aono_call_target
|
||||
```
|
||||
|
||||
### OnInitializedAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1pp2oro_oninitializedasync__call_73_ClearAsync[["ClearAsync"]]
|
||||
method_1pp2oro_oninitializedasync__action_73_oninitializedasync_await_73_0__await[["Waits for async work"]]
|
||||
method_1pp2oro_oninitializedasync__action_74_subscribe_event_74__linear("Subscribe theme change")
|
||||
method_1pp2oro_oninitializedasync__action_75_subscribe_event_75__linear("Subscribe navigation change")
|
||||
method_1pp2oro_oninitializedasync__action_77_subscribe_event_77__linear("Subscribe interaction events")
|
||||
method_1pp2oro_oninitializedasync__action_80_subscribe_event_80__linear("Subscribe sync progress")
|
||||
method_1pp2oro_oninitializedasync__entry(["OnInitializedAsync entry"])
|
||||
method_1pp2oro_oninitializedasync__implicit_return(["return"])
|
||||
method_1pp2oro_oninitializedasync__action_73_oninitializedasync_await_73_0__await -->|none| method_1pp2oro_oninitializedasync__call_73_ClearAsync
|
||||
method_1pp2oro_oninitializedasync__action_74_subscribe_event_74__linear -->|next| method_1pp2oro_oninitializedasync__action_75_subscribe_event_75__linear
|
||||
method_1pp2oro_oninitializedasync__action_75_subscribe_event_75__linear -->|next| method_1pp2oro_oninitializedasync__action_77_subscribe_event_77__linear
|
||||
method_1pp2oro_oninitializedasync__action_77_subscribe_event_77__linear -->|next| method_1pp2oro_oninitializedasync__action_80_subscribe_event_80__linear
|
||||
method_1pp2oro_oninitializedasync__action_80_subscribe_event_80__linear -->|return| method_1pp2oro_oninitializedasync__implicit_return
|
||||
method_1pp2oro_oninitializedasync__call_73_ClearAsync -->|next| method_1pp2oro_oninitializedasync__action_74_subscribe_event_74__linear
|
||||
method_1pp2oro_oninitializedasync__entry -->|next| method_1pp2oro_oninitializedasync__action_73_oninitializedasync_await_73_0__await
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_qspmus_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (31 nodes, 35 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_qspmus_onafterrenderasync__call_101_InitializeAsync[["InitializeAsync"]]
|
||||
method_qspmus_onafterrenderasync__call_105_ProcessFullPageAsync[["ProcessFullPageAsync"]]
|
||||
method_qspmus_onafterrenderasync__call_112_InitializeObserverAsync[["InitializeObserverAsync"]]
|
||||
method_qspmus_onafterrenderasync__call_113_InitializeSelectionListenerAsync[["InitializeSelectionListenerAsync"]]
|
||||
method_qspmus_onafterrenderasync__action_101_onafterrenderasync_await_101_1__await[["Waits for async work"]]
|
||||
method_qspmus_onafterrenderasync__action_102_state_change_102__linear("Enable interactivity")
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__condition{"ViewModel != null"}
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__false("false")
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__merge("merge")
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__true("true")
|
||||
method_qspmus_onafterrenderasync__action_105_onafterrenderasync_await_105_3__await[["Waits for async work"]]
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__condition{"ViewModel != null && !_isJsInitialized"}
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__false("otherwise")
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__merge("merge")
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__true("init JS observer/listener")
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__condition{"ViewModel != null && !_isJsInitialized"}
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__false("false")
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__merge("merge")
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__true("true")
|
||||
method_qspmus_onafterrenderasync__action_112_onafterrenderasync_await_112_5__await[["Waits for async work"]]
|
||||
method_qspmus_onafterrenderasync__action_113_onafterrenderasync_await_113_6__await[["Waits for async work"]]
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__condition{"firstRender == true"}
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__false("process page")
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__merge("merge")
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__true("init sync")
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__condition{"firstRender"}
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__false("false")
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__merge("merge")
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__true("true")
|
||||
method_qspmus_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_qspmus_onafterrenderasync__implicit_return(["return"])
|
||||
method_qspmus_onafterrenderasync__action_101_onafterrenderasync_await_101_1__await -->|none SyncService.InitializeAsync| method_qspmus_onafterrenderasync__call_101_InitializeAsync
|
||||
method_qspmus_onafterrenderasync__action_102_state_change_102__linear -->|next| method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__condition
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__condition -->|false| method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__false
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__condition -->|true| method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__true
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__false -->|next| method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__merge
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__merge -->|next| method_qspmus_onafterrenderasync__action_105_onafterrenderasync_await_105_3__await
|
||||
method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__true -->|next| method_qspmus_onafterrenderasync__action_103_onafterrenderasync_branch_103_2__merge
|
||||
method_qspmus_onafterrenderasync__action_105_onafterrenderasync_await_105_3__await -->|GetFullPageContent| method_qspmus_onafterrenderasync__call_105_ProcessFullPageAsync
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__condition -->|otherwise| method_qspmus_onafterrenderasync__action_109_guard_clause_109__false
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__condition -->|init JS observer / listener| method_qspmus_onafterrenderasync__action_109_guard_clause_109__true
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__false -->|next| method_qspmus_onafterrenderasync__action_109_guard_clause_109__merge
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__merge -->|next| method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__condition
|
||||
method_qspmus_onafterrenderasync__action_109_guard_clause_109__true -->|next| method_qspmus_onafterrenderasync__action_109_guard_clause_109__merge
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__condition -->|false| method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__false
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__condition -->|true| method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__true
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__false -->|next| method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__merge
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__merge -->|next| method_qspmus_onafterrenderasync__action_112_onafterrenderasync_await_112_5__await
|
||||
method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__true -->|next| method_qspmus_onafterrenderasync__action_109_onafterrenderasync_branch_109_4__merge
|
||||
method_qspmus_onafterrenderasync__action_112_onafterrenderasync_await_112_5__await -->|none| method_qspmus_onafterrenderasync__call_112_InitializeObserverAsync
|
||||
method_qspmus_onafterrenderasync__action_113_onafterrenderasync_await_113_6__await -->|none| method_qspmus_onafterrenderasync__call_113_InitializeSelectionListenerAsync
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__condition -->|process page| method_qspmus_onafterrenderasync__action_99_guard_clause_99__false
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__condition -->|init sync| method_qspmus_onafterrenderasync__action_99_guard_clause_99__true
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__false -->|next| method_qspmus_onafterrenderasync__action_99_guard_clause_99__merge
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__merge -->|next| method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__condition
|
||||
method_qspmus_onafterrenderasync__action_99_guard_clause_99__true -->|next| method_qspmus_onafterrenderasync__action_99_guard_clause_99__merge
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__condition -->|false| method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__false
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__condition -->|true| method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__true
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__false -->|next| method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__merge
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__merge -->|next| method_qspmus_onafterrenderasync__action_101_onafterrenderasync_await_101_1__await
|
||||
method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__true -->|next| method_qspmus_onafterrenderasync__action_99_onafterrenderasync_branch_99_0__merge
|
||||
method_qspmus_onafterrenderasync__call_101_InitializeAsync -->|next| method_qspmus_onafterrenderasync__action_102_state_change_102__linear
|
||||
method_qspmus_onafterrenderasync__call_105_ProcessFullPageAsync -->|next| method_qspmus_onafterrenderasync__action_109_guard_clause_109__condition
|
||||
method_qspmus_onafterrenderasync__call_112_InitializeObserverAsync -->|next| method_qspmus_onafterrenderasync__action_113_onafterrenderasync_await_113_6__await
|
||||
method_qspmus_onafterrenderasync__call_113_InitializeSelectionListenerAsync -->|return| method_qspmus_onafterrenderasync__implicit_return
|
||||
method_qspmus_onafterrenderasync__entry -->|next| method_qspmus_onafterrenderasync__action_99_guard_clause_99__condition
|
||||
```
|
||||
|
||||
### InitializeSelectionListenerAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_w4053o_initializeselectionlistenerasync__call_121_InvokeAsync[["InvokeAsync"]]
|
||||
method_w4053o_initializeselectionlistenerasync__call_122_InvokeVoidAsync[["InvokeVoidAsync"]]
|
||||
method_w4053o_initializeselectionlistenerasync__action_119_initializeselectionlistenerasync_try_119_0__try("Begins protected execution")
|
||||
method_w4053o_initializeselectionlistenerasync__action_119_try_catch_119__linear("Fallback on JS init error")
|
||||
method_w4053o_initializeselectionlistenerasync__action_121_initializeselectionlistenerasync_await_121_1__await[["Waits for async work"]]
|
||||
method_w4053o_initializeselectionlistenerasync__action_122_initializeselectionlistenerasync_await_122_2__await[["Waits for async work"]]
|
||||
method_w4053o_initializeselectionlistenerasync__action_124_initializeselectionlistenerasync_catch_124_3__catch("catch Exception ex")
|
||||
method_w4053o_initializeselectionlistenerasync__action_126_initializeselectionlistenerasync_log_126_4__linear("Logs runtime state")
|
||||
method_w4053o_initializeselectionlistenerasync__entry(["InitializeSelectionListenerAsync entry"])
|
||||
method_w4053o_initializeselectionlistenerasync__action_121_external_call_121__linear("Import JS selection module")
|
||||
method_w4053o_initializeselectionlistenerasync__implicit_return(["return"])
|
||||
method_w4053o_initializeselectionlistenerasync__action_119_initializeselectionlistenerasync_try_119_0__try -->|next| method_w4053o_initializeselectionlistenerasync__action_121_initializeselectionlistenerasync_await_121_1__await
|
||||
method_w4053o_initializeselectionlistenerasync__action_119_try_catch_119__linear -->|next| method_w4053o_initializeselectionlistenerasync__action_119_initializeselectionlistenerasync_try_119_0__try
|
||||
method_w4053o_initializeselectionlistenerasync__action_121_external_call_121__linear -->|calls| method_w4053o_initializeselectionlistenerasync__call_121_InvokeAsync
|
||||
method_w4053o_initializeselectionlistenerasync__action_121_initializeselectionlistenerasync_await_121_1__await -->|next| method_w4053o_initializeselectionlistenerasync__action_121_external_call_121__linear
|
||||
method_w4053o_initializeselectionlistenerasync__action_122_initializeselectionlistenerasync_await_122_2__await -->|initSelectionListener , DotNetObjectReference.Create this, _containerRef| method_w4053o_initializeselectionlistenerasync__call_122_InvokeVoidAsync
|
||||
method_w4053o_initializeselectionlistenerasync__action_124_initializeselectionlistenerasync_catch_124_3__catch -->|next| method_w4053o_initializeselectionlistenerasync__action_126_initializeselectionlistenerasync_log_126_4__linear
|
||||
method_w4053o_initializeselectionlistenerasync__action_126_initializeselectionlistenerasync_log_126_4__linear -->|return| method_w4053o_initializeselectionlistenerasync__implicit_return
|
||||
method_w4053o_initializeselectionlistenerasync__call_121_InvokeAsync -->|next| method_w4053o_initializeselectionlistenerasync__action_122_initializeselectionlistenerasync_await_122_2__await
|
||||
method_w4053o_initializeselectionlistenerasync__call_122_InvokeVoidAsync -->|exception| method_w4053o_initializeselectionlistenerasync__action_124_initializeselectionlistenerasync_catch_124_3__catch
|
||||
method_w4053o_initializeselectionlistenerasync__entry -->|next| method_w4053o_initializeselectionlistenerasync__action_119_try_catch_119__linear
|
||||
```
|
||||
|
||||
### InitializeObserverAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1l7jj8x_initializeobserverasync__call_134_InvokeAsync[["InvokeAsync"]]
|
||||
method_1l7jj8x_initializeobserverasync__call_135_InvokeVoidAsync[["InvokeVoidAsync"]]
|
||||
method_1l7jj8x_initializeobserverasync__action_132_initializeobserverasync_try_132_0__try("Begins protected execution")
|
||||
method_1l7jj8x_initializeobserverasync__action_132_try_catch_132__linear("Fallback on observer init error")
|
||||
method_1l7jj8x_initializeobserverasync__action_134_initializeobserverasync_await_134_1__await[["Waits for async work"]]
|
||||
method_1l7jj8x_initializeobserverasync__action_135_initializeobserverasync_await_135_2__await[["Waits for async work"]]
|
||||
method_1l7jj8x_initializeobserverasync__action_137_initializeobserverasync_catch_137_3__catch("catch Exception ex")
|
||||
method_1l7jj8x_initializeobserverasync__action_139_initializeobserverasync_log_139_4__linear("Logs runtime state")
|
||||
method_1l7jj8x_initializeobserverasync__entry(["InitializeObserverAsync entry"])
|
||||
method_1l7jj8x_initializeobserverasync__action_134_external_call_134__linear("Import JS observer module")
|
||||
method_1l7jj8x_initializeobserverasync__implicit_return(["return"])
|
||||
method_1l7jj8x_initializeobserverasync__action_132_initializeobserverasync_try_132_0__try -->|next| method_1l7jj8x_initializeobserverasync__action_134_initializeobserverasync_await_134_1__await
|
||||
method_1l7jj8x_initializeobserverasync__action_132_try_catch_132__linear -->|next| method_1l7jj8x_initializeobserverasync__action_132_initializeobserverasync_try_132_0__try
|
||||
method_1l7jj8x_initializeobserverasync__action_134_external_call_134__linear -->|calls| method_1l7jj8x_initializeobserverasync__call_134_InvokeAsync
|
||||
method_1l7jj8x_initializeobserverasync__action_134_initializeobserverasync_await_134_1__await -->|next| method_1l7jj8x_initializeobserverasync__action_134_external_call_134__linear
|
||||
method_1l7jj8x_initializeobserverasync__action_135_initializeobserverasync_await_135_2__await -->|initObserver , DotNetObjectReference.Create this, .reader-flow-container , .block-wrapper| method_1l7jj8x_initializeobserverasync__call_135_InvokeVoidAsync
|
||||
method_1l7jj8x_initializeobserverasync__action_137_initializeobserverasync_catch_137_3__catch -->|next| method_1l7jj8x_initializeobserverasync__action_139_initializeobserverasync_log_139_4__linear
|
||||
method_1l7jj8x_initializeobserverasync__action_139_initializeobserverasync_log_139_4__linear -->|return| method_1l7jj8x_initializeobserverasync__implicit_return
|
||||
method_1l7jj8x_initializeobserverasync__call_134_InvokeAsync -->|next| method_1l7jj8x_initializeobserverasync__action_135_initializeobserverasync_await_135_2__await
|
||||
method_1l7jj8x_initializeobserverasync__call_135_InvokeVoidAsync -->|exception| method_1l7jj8x_initializeobserverasync__action_137_initializeobserverasync_catch_137_3__catch
|
||||
method_1l7jj8x_initializeobserverasync__entry -->|next| method_1l7jj8x_initializeobserverasync__action_132_try_catch_132__linear
|
||||
```
|
||||
|
||||
### HandleBlockReached() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1p3f1im_handleblockreached__call_146_OnBlockReachedAsync[["OnBlockReachedAsync"]]
|
||||
method_1p3f1im_handleblockreached__call_152_UpdateProgressAsync[["UpdateProgressAsync"]]
|
||||
method_1p3f1im_handleblockreached__action_146_external_invocation_146__linear("Notify coordinator of block reached")
|
||||
method_1p3f1im_handleblockreached__action_146_handleblockreached_await_146_0__await[["Waits for async work"]]
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__condition{"ViewModel != null"}
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__false("call UpdateProgressAsync")
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__merge("merge")
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__true("compute progress")
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__condition{"ViewModel != null"}
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__false("false")
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__merge("merge")
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__true("true")
|
||||
method_1p3f1im_handleblockreached__action_150_computation_150__linear("Compute progress percent")
|
||||
method_1p3f1im_handleblockreached__action_152_handleblockreached_await_152_2__await[["Waits for async work"]]
|
||||
method_1p3f1im_handleblockreached__entry(["HandleBlockReached entry"])
|
||||
method_1p3f1im_handleblockreached__implicit_return(["return"])
|
||||
method_1p3f1im_handleblockreached__action_146_external_invocation_146__linear -->|blockId, content Coordinator| method_1p3f1im_handleblockreached__call_146_OnBlockReachedAsync
|
||||
method_1p3f1im_handleblockreached__action_146_handleblockreached_await_146_0__await -->|next| method_1p3f1im_handleblockreached__action_146_external_invocation_146__linear
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__condition -->|call UpdateProgressAsync| method_1p3f1im_handleblockreached__action_148_guard_clause_148__false
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__condition -->|compute progress| method_1p3f1im_handleblockreached__action_148_guard_clause_148__true
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__false -->|next| method_1p3f1im_handleblockreached__action_148_guard_clause_148__merge
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__merge -->|next| method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__condition
|
||||
method_1p3f1im_handleblockreached__action_148_guard_clause_148__true -->|next| method_1p3f1im_handleblockreached__action_148_guard_clause_148__merge
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__condition -->|false| method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__false
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__condition -->|true| method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__true
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__false -->|next| method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__merge
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__merge -->|next| method_1p3f1im_handleblockreached__action_150_computation_150__linear
|
||||
method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__true -->|next| method_1p3f1im_handleblockreached__action_148_handleblockreached_branch_148_1__merge
|
||||
method_1p3f1im_handleblockreached__action_150_computation_150__linear -->|next| method_1p3f1im_handleblockreached__action_152_handleblockreached_await_152_2__await
|
||||
method_1p3f1im_handleblockreached__action_152_handleblockreached_await_152_2__await -->|blockId, ViewModel.EbookId, progress, ViewModel.ChapterTitle, ViewModel.CurrentChapterIndex SyncService| method_1p3f1im_handleblockreached__call_152_UpdateProgressAsync
|
||||
method_1p3f1im_handleblockreached__call_146_OnBlockReachedAsync -->|next| method_1p3f1im_handleblockreached__action_148_guard_clause_148__condition
|
||||
method_1p3f1im_handleblockreached__call_152_UpdateProgressAsync -->|return| method_1p3f1im_handleblockreached__implicit_return
|
||||
method_1p3f1im_handleblockreached__entry -->|next| method_1p3f1im_handleblockreached__action_146_handleblockreached_await_146_0__await
|
||||
```
|
||||
|
||||
### HandleHighlightRequested() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1nqcmix_handlehighlightrequested__call_196_Delay[["Delay"]]
|
||||
method_1nqcmix_handlehighlightrequested__action_194_state_change_194__linear("Set highlighted block")
|
||||
method_1nqcmix_handlehighlightrequested__action_195_handlehighlightrequested_await_195_0__await[["Waits for async work"]]
|
||||
method_1nqcmix_handlehighlightrequested__action_196_handlehighlightrequested_await_196_1__await[["Waits for async work"]]
|
||||
method_1nqcmix_handlehighlightrequested__action_196_timed_fallback_196__linear("Clear highlight after timeout")
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__condition{"_highlightedBlockId == blockId"}
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__false("false")
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__merge("merge")
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__true("true")
|
||||
method_1nqcmix_handlehighlightrequested__action_200_handlehighlightrequested_await_200_3__await[["Waits for async work"]]
|
||||
method_1nqcmix_handlehighlightrequested__entry(["HandleHighlightRequested entry"])
|
||||
method_1nqcmix_handlehighlightrequested__implicit_return(["return"])
|
||||
method_1nqcmix_handlehighlightrequested__action_194_state_change_194__linear -->|next| method_1nqcmix_handlehighlightrequested__action_195_handlehighlightrequested_await_195_0__await
|
||||
method_1nqcmix_handlehighlightrequested__action_195_handlehighlightrequested_await_195_0__await -->|next| method_1nqcmix_handlehighlightrequested__action_196_handlehighlightrequested_await_196_1__await
|
||||
method_1nqcmix_handlehighlightrequested__action_196_handlehighlightrequested_await_196_1__await -->|next| method_1nqcmix_handlehighlightrequested__action_196_timed_fallback_196__linear
|
||||
method_1nqcmix_handlehighlightrequested__action_196_timed_fallback_196__linear -->|3000ms Task.Delay| method_1nqcmix_handlehighlightrequested__call_196_Delay
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__condition -->|false| method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__false
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__condition -->|true| method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__true
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__false -->|next| method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__merge
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__merge -->|next| method_1nqcmix_handlehighlightrequested__action_200_handlehighlightrequested_await_200_3__await
|
||||
method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__true -->|next| method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__merge
|
||||
method_1nqcmix_handlehighlightrequested__action_200_handlehighlightrequested_await_200_3__await -->|return| method_1nqcmix_handlehighlightrequested__implicit_return
|
||||
method_1nqcmix_handlehighlightrequested__call_196_Delay -->|next| method_1nqcmix_handlehighlightrequested__action_197_handlehighlightrequested_branch_197_2__condition
|
||||
method_1nqcmix_handlehighlightrequested__entry -->|next| method_1nqcmix_handlehighlightrequested__action_194_state_change_194__linear
|
||||
```
|
||||
|
||||
### GetFullPageContent() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__condition{"ViewModel == null"}
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__false("continue")
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__merge("merge")
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__true("exit")
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__condition{"ViewModel == null"}
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__false("build content")
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__merge("merge")
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__true("return ''")
|
||||
method_1i9kqly_getfullpagecontent__action_207_mapping_207__linear("Concatenate text blocks")
|
||||
method_1i9kqly_getfullpagecontent__action_209_getfullpagecontent_mapping_209_2__linear("Maps data or transforms shape")
|
||||
method_1i9kqly_getfullpagecontent__entry(["GetFullPageContent entry"])
|
||||
method_1i9kqly_getfullpagecontent__action_207_getfullpagecontent_return_207_1__return(["Returns result"])
|
||||
method_1i9kqly_getfullpagecontent__implicit_return(["return"])
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__condition -->|continue| method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__false
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__condition -->|exit| method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__true
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__false -->|next| method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__merge
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__merge -->|return| method_1i9kqly_getfullpagecontent__action_207_getfullpagecontent_return_207_1__return
|
||||
method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__true -->|next| method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__merge
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__condition -->|build content| method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__false
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__condition -->|transforms input| method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__true
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__false -->|next| method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__merge
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__merge -->|next| method_1i9kqly_getfullpagecontent__action_206_getfullpagecontent_guard_clause_206_0__condition
|
||||
method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__true -->|next| method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__merge
|
||||
method_1i9kqly_getfullpagecontent__action_207_getfullpagecontent_return_207_1__return -->|next| method_1i9kqly_getfullpagecontent__action_207_mapping_207__linear
|
||||
method_1i9kqly_getfullpagecontent__action_207_mapping_207__linear -->|next| method_1i9kqly_getfullpagecontent__action_209_getfullpagecontent_mapping_209_2__linear
|
||||
method_1i9kqly_getfullpagecontent__action_209_getfullpagecontent_mapping_209_2__linear -->|return| method_1i9kqly_getfullpagecontent__implicit_return
|
||||
method_1i9kqly_getfullpagecontent__entry -->|next| method_1i9kqly_getfullpagecontent__action_206_guard_clause_206__condition
|
||||
```
|
||||
|
||||
### LoadChapterAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_ero6bp_loadchapterasync__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 44 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_ero6bp_loadchapterasync__call_218_GetAuthenticationStateAsync[["GetAuthenticationStateAsync"]]
|
||||
method_ero6bp_loadchapterasync__call_230_Send[["Send"]]
|
||||
method_ero6bp_loadchapterasync__call_234_UpdateMetadataAsync[["UpdateMetadataAsync"]]
|
||||
method_ero6bp_loadchapterasync__call_238_ProcessFullPageAsync[["ProcessFullPageAsync"]]
|
||||
method_ero6bp_loadchapterasync__action_214_state_change_214__linear("Enter loading state")
|
||||
method_ero6bp_loadchapterasync__action_218_loadchapterasync_await_218_0__await[["Waits for async work"]]
|
||||
method_ero6bp_loadchapterasync__action_221_persistence_guard_221__linear("Guard for no ebook selected")
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__condition{"ebookId == Guid.Empty"}
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__false("false")
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__merge("merge")
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__true("true")
|
||||
method_ero6bp_loadchapterasync__action_230_external_query_230__linear("Query reader page via mediator")
|
||||
method_ero6bp_loadchapterasync__action_230_loadchapterasync_await_230_4__await[["Waits for async work"]]
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__condition{"Handle result success/failure"}
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__false("false")
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__merge("merge")
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__true("true")
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__condition{"result.IsSuccess"}
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__false("false")
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__merge("merge")
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__true("true")
|
||||
method_ero6bp_loadchapterasync__action_234_loadchapterasync_await_234_6__await[["Waits for async work"]]
|
||||
method_ero6bp_loadchapterasync__action_236_conditional_orchestration_236__linear("Process full page when interactive")
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__condition{"_isInteractive"}
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__false("false")
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__merge("merge")
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__true("true")
|
||||
method_ero6bp_loadchapterasync__action_238_loadchapterasync_await_238_8__await[["Waits for async work"]]
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__condition{"Falls back to alternate path"}
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__false("otherwise")
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__merge("merge")
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__true("fallback")
|
||||
method_ero6bp_loadchapterasync__action_245_loadchapterasync_log_245_11__linear("Logs runtime state")
|
||||
method_ero6bp_loadchapterasync__action_245_loadchapterasync_mapping_245_12__linear("Maps data or transforms shape")
|
||||
method_ero6bp_loadchapterasync__action_248_state_change_248__linear("Exit loading state")
|
||||
method_ero6bp_loadchapterasync__entry(["LoadChapterAsync entry"])
|
||||
method_ero6bp_loadchapterasync__action_219_loadchapterasync_repository_read_219_1__linear[("Reads repository or persistence state")]
|
||||
method_ero6bp_loadchapterasync__action_244_loadchapterasync_repository_read_244_10__linear[("Reads repository or persistence state")]
|
||||
method_ero6bp_loadchapterasync__action_227_loadchapterasync_return_227_3__return(["Returns result"])
|
||||
method_ero6bp_loadchapterasync__implicit_return(["return"])
|
||||
method_ero6bp_loadchapterasync__action_214_state_change_214__linear -->|next| method_ero6bp_loadchapterasync__action_218_loadchapterasync_await_218_0__await
|
||||
method_ero6bp_loadchapterasync__action_218_loadchapterasync_await_218_0__await -->|none AuthStateProvider| method_ero6bp_loadchapterasync__call_218_GetAuthenticationStateAsync
|
||||
method_ero6bp_loadchapterasync__action_219_loadchapterasync_repository_read_219_1__linear -->|next| method_ero6bp_loadchapterasync__action_221_persistence_guard_221__linear
|
||||
method_ero6bp_loadchapterasync__action_221_persistence_guard_221__linear -->|next| method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__condition
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__condition -->|false| method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__false
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__condition -->|true| method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__true
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__false -->|next| method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__merge
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__merge -->|return| method_ero6bp_loadchapterasync__action_227_loadchapterasync_return_227_3__return
|
||||
method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__true -->|next| method_ero6bp_loadchapterasync__action_222_loadchapterasync_branch_222_2__merge
|
||||
method_ero6bp_loadchapterasync__action_227_loadchapterasync_return_227_3__return -->|next| method_ero6bp_loadchapterasync__action_230_loadchapterasync_await_230_4__await
|
||||
method_ero6bp_loadchapterasync__action_230_external_query_230__linear -->|GetReaderPageQuery ebookId, index, userId via Mediator| method_ero6bp_loadchapterasync__call_230_Send
|
||||
method_ero6bp_loadchapterasync__action_230_loadchapterasync_await_230_4__await -->|next| method_ero6bp_loadchapterasync__action_230_external_query_230__linear
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__condition -->|false| method_ero6bp_loadchapterasync__action_231_branch_231__false
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__condition -->|true| method_ero6bp_loadchapterasync__action_231_branch_231__true
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__false -->|next| method_ero6bp_loadchapterasync__action_231_branch_231__merge
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__merge -->|next| method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__condition
|
||||
method_ero6bp_loadchapterasync__action_231_branch_231__true -->|next| method_ero6bp_loadchapterasync__action_231_branch_231__merge
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__condition -->|false| method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__false
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__condition -->|true| method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__true
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__false -->|next| method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__merge
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__merge -->|next| method_ero6bp_loadchapterasync__action_234_loadchapterasync_await_234_6__await
|
||||
method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__true -->|next| method_ero6bp_loadchapterasync__action_231_loadchapterasync_branch_231_5__merge
|
||||
method_ero6bp_loadchapterasync__action_234_loadchapterasync_await_234_6__await -->|ViewModel.CurrentChapterIndex, ViewModel.TotalChapters, ViewModel.ChapterTitle NavigationService| method_ero6bp_loadchapterasync__call_234_UpdateMetadataAsync
|
||||
method_ero6bp_loadchapterasync__action_236_conditional_orchestration_236__linear -->|next| method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__condition
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__condition -->|false| method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__false
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__condition -->|true| method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__true
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__false -->|next| method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__merge
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__merge -->|next| method_ero6bp_loadchapterasync__action_238_loadchapterasync_await_238_8__await
|
||||
method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__true -->|next| method_ero6bp_loadchapterasync__action_236_loadchapterasync_branch_236_7__merge
|
||||
method_ero6bp_loadchapterasync__action_238_loadchapterasync_await_238_8__await -->|GetFullPageContent Coordinator| method_ero6bp_loadchapterasync__call_238_ProcessFullPageAsync
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__condition -->|otherwise| method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__false
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__condition -->|fallback| method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__true
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__false -->|next| method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__merge
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__merge -->|next| method_ero6bp_loadchapterasync__action_244_loadchapterasync_repository_read_244_10__linear
|
||||
method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__true -->|next| method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__merge
|
||||
method_ero6bp_loadchapterasync__action_244_loadchapterasync_repository_read_244_10__linear -->|next| method_ero6bp_loadchapterasync__action_245_loadchapterasync_mapping_245_12__linear
|
||||
method_ero6bp_loadchapterasync__action_245_loadchapterasync_log_245_11__linear -->|next| method_ero6bp_loadchapterasync__action_248_state_change_248__linear
|
||||
method_ero6bp_loadchapterasync__action_245_loadchapterasync_mapping_245_12__linear -->|next| method_ero6bp_loadchapterasync__action_245_loadchapterasync_log_245_11__linear
|
||||
method_ero6bp_loadchapterasync__action_248_state_change_248__linear -->|return| method_ero6bp_loadchapterasync__implicit_return
|
||||
method_ero6bp_loadchapterasync__call_218_GetAuthenticationStateAsync -->|next| method_ero6bp_loadchapterasync__action_219_loadchapterasync_repository_read_219_1__linear
|
||||
method_ero6bp_loadchapterasync__call_230_Send -->|next| method_ero6bp_loadchapterasync__action_231_branch_231__condition
|
||||
method_ero6bp_loadchapterasync__call_234_UpdateMetadataAsync -->|next| method_ero6bp_loadchapterasync__action_236_conditional_orchestration_236__linear
|
||||
method_ero6bp_loadchapterasync__call_238_ProcessFullPageAsync -->|fallback| method_ero6bp_loadchapterasync__action_241_loadchapterasync_fallback_241_9__condition
|
||||
method_ero6bp_loadchapterasync__entry -->|next| method_ero6bp_loadchapterasync__action_214_state_change_214__linear
|
||||
```
|
||||
|
||||
### ScrollToNodeAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_105vz8s_scrolltonodeasync__call_256_InvokeVoidAsync[["InvokeVoidAsync"]]
|
||||
method_105vz8s_scrolltonodeasync__action_254_scrolltonodeasync_try_254_0__try("Begins protected execution")
|
||||
method_105vz8s_scrolltonodeasync__action_256_scrolltonodeasync_await_256_1__await[["Waits for async work"]]
|
||||
method_105vz8s_scrolltonodeasync__action_258_scrolltonodeasync_catch_258_2__catch("catch Exception ex")
|
||||
method_105vz8s_scrolltonodeasync__action_258_try_catch_258__linear("Log on scroll failure")
|
||||
method_105vz8s_scrolltonodeasync__action_260_scrolltonodeasync_log_260_3__linear("Logs runtime state")
|
||||
method_105vz8s_scrolltonodeasync__entry(["ScrollToNodeAsync entry"])
|
||||
method_105vz8s_scrolltonodeasync__action_256_external_call_256__linear("Scroll DOM node via JS eval")
|
||||
method_105vz8s_scrolltonodeasync__implicit_return(["return"])
|
||||
method_105vz8s_scrolltonodeasync__action_254_scrolltonodeasync_try_254_0__try -->|next| method_105vz8s_scrolltonodeasync__action_256_scrolltonodeasync_await_256_1__await
|
||||
method_105vz8s_scrolltonodeasync__action_256_external_call_256__linear -->|calls| method_105vz8s_scrolltonodeasync__call_256_InvokeVoidAsync
|
||||
method_105vz8s_scrolltonodeasync__action_256_scrolltonodeasync_await_256_1__await -->|next| method_105vz8s_scrolltonodeasync__action_256_external_call_256__linear
|
||||
method_105vz8s_scrolltonodeasync__action_258_scrolltonodeasync_catch_258_2__catch -->|next| method_105vz8s_scrolltonodeasync__action_260_scrolltonodeasync_log_260_3__linear
|
||||
method_105vz8s_scrolltonodeasync__action_258_try_catch_258__linear -->|exception| method_105vz8s_scrolltonodeasync__action_258_scrolltonodeasync_catch_258_2__catch
|
||||
method_105vz8s_scrolltonodeasync__action_260_scrolltonodeasync_log_260_3__linear -->|return| method_105vz8s_scrolltonodeasync__implicit_return
|
||||
method_105vz8s_scrolltonodeasync__call_256_InvokeVoidAsync -->|next| method_105vz8s_scrolltonodeasync__action_258_try_catch_258__linear
|
||||
method_105vz8s_scrolltonodeasync__entry -->|next| method_105vz8s_scrolltonodeasync__action_254_scrolltonodeasync_try_254_0__try
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 15 unresolved jumps.
|
||||
- Warning: neighborhood-view: diagram file_3sb16d_readercanvas_razor_neighborhood_view exceeds preferred complexity thresholds (19 nodes, 0 edges).
|
||||
- Warning: execution-overview: diagram file_3sb16d_readercanvas_razor_execution_view exceeds preferred complexity thresholds (44 nodes, 43 edges).
|
||||
- Warning: control-flow: diagram method_qspmus_onafterrenderasync__fragment_diagram exceeds preferred complexity thresholds (31 nodes, 35 edges).
|
||||
- Warning: control-flow: diagram method_ero6bp_loadchapterasync__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 44 edges).
|
||||
+264
@@ -0,0 +1,264 @@
|
||||
# ReaderFooter
|
||||
|
||||
- File ID: file:1foudu6:readerfooter-razor
|
||||
- Path: NexusReader.UI.Shared/Components/Organisms/ReaderFooter.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI component that renders the reader footer: chapter navigation, progress bar and meta info; observes navigation changes to update UI.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component is event-driven: subscribes to NavigationService.OnNavigationChanged to refresh UI; uses injected IReaderNavigationService for navigation commands and data; guards against single-chapter progress calculation.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ReaderFooter: Blazor UI component that renders the reader footer: chapter navigation, progress bar and meta info; observes navigation changes to update UI.
|
||||
- Render (Razor markup): Renders footer HTML: navigation buttons, chapter info, progress bar and meta info; wires button onclicks to navigation service methods and displays computed progress/time/battery.
|
||||
- OnInitialized(): Component lifecycle init: subscribes to navigation change events to refresh UI.
|
||||
- HandleNavigationChanged(): Async event handler invoked on navigation changes; requests a UI re-render on the component thread.
|
||||
- CalculateProgress(): Computes and returns the reader progress percentage based on current chapter index and total chapters.
|
||||
- Dispose(): Lifecycle cleanup: unsubscribes event handlers to avoid memory leaks.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
|
||||
## Calls
|
||||
|
||||
- calls NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- calls NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: self
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: self
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 9
|
||||
- Unresolved references: 10
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 8
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 7
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (Razor markup): 19 nodes, 20 edges, 7 jumps, 0 unsupported constructs
|
||||
- OnInitialized: 5 nodes, 4 edges, 2 jumps, 0 unsupported constructs
|
||||
- HandleNavigationChanged: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- CalculateProgress: 14 nodes, 15 edges, 2 jumps, 0 unsupported constructs
|
||||
- Dispose: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReaderFooter Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_gqmtg_readerfooter("ReaderFooter")
|
||||
file_1foudu6_readerfooter_razor("ReaderFooter")
|
||||
method_150wzsg_dispose[["Dispose()"]]
|
||||
method_1ac31ry_handlenavigationchanged[["HandleNavigationChanged()"]]
|
||||
method_1ak3em3_calculateprogress[["CalculateProgress()"]]
|
||||
method_1se6qsi_oninitialized[["OnInitialized()"]]
|
||||
method_tmysty_render_razor_markup[["Render (Razor markup)"]]
|
||||
file_wgkae9_ireadernavigationservice_cs[/"IReaderNavigationService"/]
|
||||
method_12odud7_gotopreviouschapter[/"IReaderNavigationService"/]
|
||||
method_1dvbk1u_gotonextchapter[/"IReaderNavigationService"/]
|
||||
file_1foudu6_readerfooter_razor -->|IReaderNavigationService| file_wgkae9_ireadernavigationservice_cs
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_12odud7_gotopreviouschapter
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_1dvbk1u_gotonextchapter
|
||||
```
|
||||
|
||||
### ReaderFooter Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_gqmtg_readerfooter("ReaderFooter")
|
||||
method_150wzsg_dispose[["Dispose()"]]
|
||||
method_1ac31ry_handlenavigationchanged[["HandleNavigationChanged()"]]
|
||||
method_1ak3em3_calculateprogress[["CalculateProgress()"]]
|
||||
method_1se6qsi_oninitialized[["OnInitialized()"]]
|
||||
method_tmysty_render_razor_markup[["Render (Razor markup)"]]
|
||||
method_12odud7_gotopreviouschapter[/"IReaderNavigationService"/]
|
||||
method_1dvbk1u_gotonextchapter[/"IReaderNavigationService"/]
|
||||
unresolved_unresolved_16fjgig_call_target{"Unresolved: TotalChapters (property)"}
|
||||
unresolved_unresolved_19qrwhc_call_target{"Unresolved: TotalChapters (property)"}
|
||||
unresolved_unresolved_1bw9ru3_call_target{"Unresolved: HandleNavigationChanged"}
|
||||
unresolved_unresolved_1di6ghi_call_target{"Unresolved: CurrentChapterIndex (property)"}
|
||||
unresolved_unresolved_1rzriwn_call_target{"Unresolved: ChapterTitle (property)"}
|
||||
unresolved_unresolved_gjvq32_call_target{"Unresolved: CurrentChapterIndex (property)"}
|
||||
unresolved_unresolved_i4ys3x_call_target{"Unresolved: CalculateProgress"}
|
||||
unresolved_unresolved_pfzdgu_call_target{"Unresolved: OnNavigationChanged (event)"}
|
||||
unresolved_unresolved_t92f63_call_target{"Unresolved: OnNavigationChanged (event)"}
|
||||
class_gqmtg_readerfooter -->|contains| method_150wzsg_dispose
|
||||
class_gqmtg_readerfooter -->|contains| method_1ac31ry_handlenavigationchanged
|
||||
class_gqmtg_readerfooter -->|contains| method_1ak3em3_calculateprogress
|
||||
class_gqmtg_readerfooter -->|contains| method_1se6qsi_oninitialized
|
||||
class_gqmtg_readerfooter -->|contains| method_tmysty_render_razor_markup
|
||||
method_150wzsg_dispose -->|unresolved call| unresolved_unresolved_pfzdgu_call_target
|
||||
method_1ak3em3_calculateprogress -->|unresolved call| unresolved_unresolved_19qrwhc_call_target
|
||||
method_1ak3em3_calculateprogress -->|unresolved call| unresolved_unresolved_gjvq32_call_target
|
||||
method_1se6qsi_oninitialized -->|unresolved call| unresolved_unresolved_1bw9ru3_call_target
|
||||
method_1se6qsi_oninitialized -->|unresolved call| unresolved_unresolved_t92f63_call_target
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_12odud7_gotopreviouschapter
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_1dvbk1u_gotonextchapter
|
||||
method_tmysty_render_razor_markup -->|unresolved call| unresolved_unresolved_16fjgig_call_target
|
||||
method_tmysty_render_razor_markup -->|unresolved call| unresolved_unresolved_1di6ghi_call_target
|
||||
method_tmysty_render_razor_markup -->|unresolved call| unresolved_unresolved_1di6ghi_call_target
|
||||
method_tmysty_render_razor_markup -->|unresolved call| unresolved_unresolved_1rzriwn_call_target
|
||||
method_tmysty_render_razor_markup -->|unresolved call| unresolved_unresolved_i4ys3x_call_target
|
||||
```
|
||||
|
||||
### ReaderFooter Method Interactions
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
method_150wzsg_dispose[["Dispose()"]]
|
||||
method_1ac31ry_handlenavigationchanged[["HandleNavigationChanged()"]]
|
||||
method_1ak3em3_calculateprogress[["CalculateProgress()"]]
|
||||
method_1se6qsi_oninitialized[["OnInitialized()"]]
|
||||
method_tmysty_render_razor_markup[["Render (Razor markup)"]]
|
||||
method_12odud7_gotopreviouschapter("IReaderNavigationService")
|
||||
method_1dvbk1u_gotonextchapter("IReaderNavigationService")
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_12odud7_gotopreviouschapter
|
||||
method_tmysty_render_razor_markup -->|IReaderNavigationService| method_1dvbk1u_gotonextchapter
|
||||
```
|
||||
|
||||
### Render (Razor markup)() Control Flow
|
||||
|
||||
_Warnings: diagram method_tmysty_render_razor_markup__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 20 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_tmysty_render_razor_markup__call_13_ChapterTitle_property_[["ChapterTitle (property)"]]
|
||||
method_tmysty_render_razor_markup__call_14_CurrentChapterIndex_property_[["CurrentChapterIndex (property)"]]
|
||||
method_tmysty_render_razor_markup__call_14_TotalChapters_property_[["TotalChapters (property)"]]
|
||||
method_tmysty_render_razor_markup__call_17_GoToNextChapter[["GoToNextChapter"]]
|
||||
method_tmysty_render_razor_markup__call_23_CalculateProgress[["CalculateProgress"]]
|
||||
method_tmysty_render_razor_markup__call_8_CurrentChapterIndex_property_[["CurrentChapterIndex (property)"]]
|
||||
method_tmysty_render_razor_markup__call_8_GoToPreviousChapter[["GoToPreviousChapter"]]
|
||||
method_tmysty_render_razor_markup__action_13_ui_binding_13__linear("Displays chapter title and counts")
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__condition{"NavigationService.CurrentChapterIndex >= NavigationService.TotalChapters - 1"}
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__false("enabled")
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__merge("merge")
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__true("disabled")
|
||||
method_tmysty_render_razor_markup__action_23_render_call_23__linear("Requests progress percent")
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__condition{"NavigationService.CurrentChapterIndex == 0"}
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__false("enabled")
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__merge("merge")
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__true("disabled")
|
||||
method_tmysty_render_razor_markup__entry(["Render (Razor markup) entry"])
|
||||
method_tmysty_render_razor_markup__implicit_return(["return"])
|
||||
method_tmysty_render_razor_markup__action_13_ui_binding_13__linear -->|string title read for display| method_tmysty_render_razor_markup__call_13_ChapterTitle_property_
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__condition -->|enabled| method_tmysty_render_razor_markup__action_17_guard_clause_17__false
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__condition -->|disabled| method_tmysty_render_razor_markup__action_17_guard_clause_17__true
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__false -->|next| method_tmysty_render_razor_markup__action_17_guard_clause_17__merge
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__merge -->|none event handler| method_tmysty_render_razor_markup__call_17_GoToNextChapter
|
||||
method_tmysty_render_razor_markup__action_17_guard_clause_17__true -->|next| method_tmysty_render_razor_markup__action_17_guard_clause_17__merge
|
||||
method_tmysty_render_razor_markup__action_23_render_call_23__linear -->|no params returns width percentage| method_tmysty_render_razor_markup__call_23_CalculateProgress
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__condition -->|enabled| method_tmysty_render_razor_markup__action_8_guard_clause_8__false
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__condition -->|disabled| method_tmysty_render_razor_markup__action_8_guard_clause_8__true
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__false -->|next| method_tmysty_render_razor_markup__action_8_guard_clause_8__merge
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__merge -->|none event handler| method_tmysty_render_razor_markup__call_8_GoToPreviousChapter
|
||||
method_tmysty_render_razor_markup__action_8_guard_clause_8__true -->|next| method_tmysty_render_razor_markup__action_8_guard_clause_8__merge
|
||||
method_tmysty_render_razor_markup__call_13_ChapterTitle_property_ -->|integer index used for display| method_tmysty_render_razor_markup__call_14_CurrentChapterIndex_property_
|
||||
method_tmysty_render_razor_markup__call_14_CurrentChapterIndex_property_ -->|total chapters used for display| method_tmysty_render_razor_markup__call_14_TotalChapters_property_
|
||||
method_tmysty_render_razor_markup__call_14_TotalChapters_property_ -->|next| method_tmysty_render_razor_markup__action_17_guard_clause_17__condition
|
||||
method_tmysty_render_razor_markup__call_17_GoToNextChapter -->|next| method_tmysty_render_razor_markup__action_23_render_call_23__linear
|
||||
method_tmysty_render_razor_markup__call_23_CalculateProgress -->|return| method_tmysty_render_razor_markup__implicit_return
|
||||
method_tmysty_render_razor_markup__call_8_CurrentChapterIndex_property_ -->|next| method_tmysty_render_razor_markup__action_13_ui_binding_13__linear
|
||||
method_tmysty_render_razor_markup__call_8_GoToPreviousChapter -->|integer index used for button disable and display| method_tmysty_render_razor_markup__call_8_CurrentChapterIndex_property_
|
||||
method_tmysty_render_razor_markup__entry -->|next| method_tmysty_render_razor_markup__action_8_guard_clause_8__condition
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1se6qsi_oninitialized__call_36_HandleNavigationChanged[["HandleNavigationChanged"]]
|
||||
method_1se6qsi_oninitialized__call_36_OnNavigationChanged_event_[["OnNavigationChanged (event)"]]
|
||||
method_1se6qsi_oninitialized__action_36_event_subscribe_36__linear("Subscribe to navigation changes")
|
||||
method_1se6qsi_oninitialized__entry(["OnInitialized entry"])
|
||||
method_1se6qsi_oninitialized__implicit_return(["return"])
|
||||
method_1se6qsi_oninitialized__action_36_event_subscribe_36__linear -->|adds HandleNavigationChanged delegate| method_1se6qsi_oninitialized__call_36_OnNavigationChanged_event_
|
||||
method_1se6qsi_oninitialized__call_36_HandleNavigationChanged -->|return| method_1se6qsi_oninitialized__implicit_return
|
||||
method_1se6qsi_oninitialized__call_36_OnNavigationChanged_event_ -->|delegate reference assigned to event| method_1se6qsi_oninitialized__call_36_HandleNavigationChanged
|
||||
method_1se6qsi_oninitialized__entry -->|next| method_1se6qsi_oninitialized__action_36_event_subscribe_36__linear
|
||||
```
|
||||
|
||||
### CalculateProgress() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1ak3em3_calculateprogress__call_46_TotalChapters_property_[["TotalChapters (property)"]]
|
||||
method_1ak3em3_calculateprogress__call_47_CurrentChapterIndex_property_[["CurrentChapterIndex (property)"]]
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__condition{"NavigationService.TotalChapters <= 1"}
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__false("continue")
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__merge("merge")
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__true("exit")
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__condition{"NavigationService.TotalChapters <= 1"}
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__false("continue")
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__merge("merge")
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__true("return 0")
|
||||
method_1ak3em3_calculateprogress__action_47_calculation_47__linear("Compute percentage")
|
||||
method_1ak3em3_calculateprogress__entry(["CalculateProgress entry"])
|
||||
method_1ak3em3_calculateprogress__action_47_calculateprogress_return_47_1__return(["Returns result"])
|
||||
method_1ak3em3_calculateprogress__implicit_return(["return"])
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__condition -->|continue| method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__false
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__condition -->|exit| method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__true
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__false -->|next| method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__merge
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__merge -->|reads total chapter count| method_1ak3em3_calculateprogress__call_46_TotalChapters_property_
|
||||
method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__true -->|next| method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__merge
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__condition -->|continue| method_1ak3em3_calculateprogress__action_46_guard_clause_46__false
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__condition -->|return 0| method_1ak3em3_calculateprogress__action_46_guard_clause_46__true
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__false -->|next| method_1ak3em3_calculateprogress__action_46_guard_clause_46__merge
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__merge -->|next| method_1ak3em3_calculateprogress__action_46_calculateprogress_guard_clause_46_0__condition
|
||||
method_1ak3em3_calculateprogress__action_46_guard_clause_46__true -->|next| method_1ak3em3_calculateprogress__action_46_guard_clause_46__merge
|
||||
method_1ak3em3_calculateprogress__action_47_calculateprogress_return_47_1__return -->|next| method_1ak3em3_calculateprogress__action_47_calculation_47__linear
|
||||
method_1ak3em3_calculateprogress__action_47_calculation_47__linear -->|reads current chapter index used in calculation| method_1ak3em3_calculateprogress__call_47_CurrentChapterIndex_property_
|
||||
method_1ak3em3_calculateprogress__call_46_TotalChapters_property_ -->|return| method_1ak3em3_calculateprogress__action_47_calculateprogress_return_47_1__return
|
||||
method_1ak3em3_calculateprogress__call_47_CurrentChapterIndex_property_ -->|return| method_1ak3em3_calculateprogress__implicit_return
|
||||
method_1ak3em3_calculateprogress__entry -->|next| method_1ak3em3_calculateprogress__action_46_guard_clause_46__condition
|
||||
```
|
||||
|
||||
### Dispose() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_150wzsg_dispose__call_52_OnNavigationChanged_event_[["OnNavigationChanged (event)"]]
|
||||
method_150wzsg_dispose__action_52_event_unsubscribe_52__linear("Unsubscribe navigation change handler")
|
||||
method_150wzsg_dispose__entry(["Dispose entry"])
|
||||
method_150wzsg_dispose__implicit_return(["return"])
|
||||
method_150wzsg_dispose__action_52_event_unsubscribe_52__linear -->|removes HandleNavigationChanged delegate| method_150wzsg_dispose__call_52_OnNavigationChanged_event_
|
||||
method_150wzsg_dispose__call_52_OnNavigationChanged_event_ -->|return| method_150wzsg_dispose__implicit_return
|
||||
method_150wzsg_dispose__entry -->|next| method_150wzsg_dispose__action_52_event_unsubscribe_52__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 8 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_tmysty_render_razor_markup__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 20 edges).
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
# RedirectToLogin
|
||||
|
||||
- File ID: file:82rsqa:redirecttologin-razor
|
||||
- Path: NexusReader.UI.Shared/Components/RedirectToLogin.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI component that immediately redirects the current user to the /account/login page, preserving the current path as a returnUrl query parameter when present.
|
||||
|
||||
## Key Details
|
||||
|
||||
Performs immediate client-side redirect on initialization; preserves current relative path as an encoded returnUrl query parameter when present.
|
||||
|
||||
## Symbols
|
||||
|
||||
- OnInitialized(): Component lifecycle method that computes a relative returnUrl and redirects the browser to the login page, appending returnUrl if present.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: Microsoft.AspNetCore.Components.NavigationManager (framework)
|
||||
- interaction-target: var returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri) — reads NavigationManager.Uri and calls ToBaseRelativePath
|
||||
- interaction-target: NavigationManager.NavigateTo("/account/login")
|
||||
- interaction-target: NavigationManager.NavigateTo($"/account/login?returnUrl={Uri.EscapeDataString(returnUrl)}") — uses Uri.EscapeDataString to encode the return URL
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 1
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 1
|
||||
- Unresolved references: 4
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 17 nodes, 19 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### RedirectToLogin Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_82rsqa_redirecttologin_razor("RedirectToLogin")
|
||||
method_upe53r_oninitialized[["OnInitialized()"]]
|
||||
```
|
||||
|
||||
### RedirectToLogin Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_82rsqa_redirecttologin_razor("RedirectToLogin")
|
||||
method_upe53r_oninitialized[["OnInitialized()"]]
|
||||
unresolved_unresolved_1kmwu7d_interaction_target{"Unresolved: NavigationManager.NavigateTo(\\"/account/login\\")"}
|
||||
unresolved_unresolved_1xw5601_interaction_target{"Unresolved: NavigationManager.NavigateTo($\\"/account/login?returnUrl={Uri.EscapeDataString(returnUrl)}\\") — uses Uri.EscapeDataString to encode the return URL"}
|
||||
unresolved_unresolved_7whfp5_interaction_target{"Unresolved: var returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri) — reads NavigationManager.Uri and calls ToBaseRelativePath"}
|
||||
file_82rsqa_redirecttologin_razor -->|contains| method_upe53r_oninitialized
|
||||
file_82rsqa_redirecttologin_razor -->|unresolved interaction| unresolved_unresolved_1kmwu7d_interaction_target
|
||||
file_82rsqa_redirecttologin_razor -->|unresolved interaction| unresolved_unresolved_1xw5601_interaction_target
|
||||
file_82rsqa_redirecttologin_razor -->|unresolved interaction| unresolved_unresolved_7whfp5_interaction_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__condition{"Falls back to alternate path"}
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__false("otherwise")
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__merge("merge")
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__true("fallback")
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__condition{"string.IsNullOrWhiteSpace(returnUrl)"}
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__false("navigate to /account/login?returnUrl=... (with escaped returnUrl)")
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__merge("merge")
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__true("navigate to /account/login (no returnUrl)")
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__condition{"string.IsNullOrWhiteSpace(returnUrl)"}
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__false("false")
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__merge("merge")
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__true("true")
|
||||
method_upe53r_oninitialized__entry(["OnInitialized entry"])
|
||||
method_upe53r_oninitialized__action_13_external_call_13__linear("Navigate to login with encoded returnUrl")
|
||||
method_upe53r_oninitialized__action_6_external_call_6__linear("Read current URI and compute base-relative path")
|
||||
method_upe53r_oninitialized__action_9_external_call_9__linear("Navigate to login without returnUrl")
|
||||
method_upe53r_oninitialized__implicit_return(["return"])
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__condition -->|otherwise| method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__false
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__condition -->|fallback| method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__true
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__false -->|next| method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__merge
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__merge -->|next| method_upe53r_oninitialized__action_13_external_call_13__linear
|
||||
method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__true -->|next| method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__merge
|
||||
method_upe53r_oninitialized__action_13_external_call_13__linear -->|return| method_upe53r_oninitialized__implicit_return
|
||||
method_upe53r_oninitialized__action_6_external_call_6__linear -->|next| method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__condition
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__condition -->|transforms input| method_upe53r_oninitialized__action_7_guard_clause_7__false
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__condition -->|navigate to / account / login no returnUrl| method_upe53r_oninitialized__action_7_guard_clause_7__true
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__false -->|next| method_upe53r_oninitialized__action_7_guard_clause_7__merge
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__merge -->|next| method_upe53r_oninitialized__action_9_external_call_9__linear
|
||||
method_upe53r_oninitialized__action_7_guard_clause_7__true -->|next| method_upe53r_oninitialized__action_7_guard_clause_7__merge
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__condition -->|false| method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__false
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__condition -->|true| method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__true
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__false -->|next| method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__merge
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__merge -->|next| method_upe53r_oninitialized__action_7_guard_clause_7__condition
|
||||
method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__true -->|next| method_upe53r_oninitialized__action_7_oninitialized_branch_7_0__merge
|
||||
method_upe53r_oninitialized__action_9_external_call_9__linear -->|fallback| method_upe53r_oninitialized__action_11_oninitialized_fallback_11_1__condition
|
||||
method_upe53r_oninitialized__entry -->|next| method_upe53r_oninitialized__action_6_external_call_6__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,58 @@
|
||||
# AuthLayout
|
||||
|
||||
- File ID: file:18yxzxe:authlayout-razor
|
||||
- Path: NexusReader.UI.Shared/Layout/AuthLayout.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor layout component that renders a full-screen, fixed authentication shell, injects a shared CSS resource, and renders child content via the layout Body.
|
||||
|
||||
## Key Details
|
||||
|
||||
Provides a fixed, centered full-viewport shell for authentication pages; simply includes a stylesheet and renders child content via @Body. No runtime methods or external project method calls are present.
|
||||
|
||||
## Symbols
|
||||
|
||||
- AuthLayout: Blazor layout component that renders a full-screen, fixed authentication shell, injects a shared CSS resource, and renders child content via the layout Body.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: _content/NexusReader.UI.Shared/css/nexus-auth.css
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 1
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 1
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### AuthLayout Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1k4its0_authlayout("AuthLayout")
|
||||
file_18yxzxe_authlayout_razor("AuthLayout")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,180 @@
|
||||
# MainHubLayout
|
||||
|
||||
- File ID: file:1ain1yo:mainhublayout-razor
|
||||
- Path: NexusReader.UI.Shared/Layout/MainHubLayout.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Renders the main application hub layout (sidebar + main content) for authenticated users and coordinates initial identity sync and logout behavior.
|
||||
|
||||
## Key Details
|
||||
|
||||
Uses an _isSyncing flag to avoid concurrent profile-sync attempts. On init, checks authentication state and if unauthenticated attempts a server-side profile sync (cookie-based). Logout calls the identity service and then forces navigation to an account logout form.
|
||||
|
||||
## Symbols
|
||||
|
||||
- MainHubLayout: Renders the main application hub layout (sidebar + main content) for authenticated users and coordinates initial identity sync and logout behavior.
|
||||
- OnInitializedAsync(): Component initialization: avoids duplicate syncs, checks authentication state, and attempts to sync profile from server if the user is not authenticated.
|
||||
- HandleLogout(): Performs logout via the identity service and redirects the browser to a logout form route.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services/IIdentityService.cs
|
||||
- dependency-target: NexusReader.UI.Shared.Components/Molecules/NexusIcon.razor
|
||||
- call-target: NexusReader.Application.Abstractions.Services/IIdentityService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/IIdentityService.cs
|
||||
- interaction-target: await AuthStateProvider.GetAuthenticationStateAsync() (framework call)
|
||||
- interaction-target: await IdentityService.GetProfileAsync(); (project service)
|
||||
- interaction-target: await IdentityService.LogoutAsync(); (project service)
|
||||
- interaction-target: NavigationManager.NavigateTo("/account/logout-form", true) (framework navigation)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 8
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 2
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitializedAsync: 24 nodes, 27 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleLogout: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### MainHubLayout Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_vf4020_mainhublayout("MainHubLayout")
|
||||
file_1ain1yo_mainhublayout_razor("MainHubLayout")
|
||||
method_64smty_handlelogout[["HandleLogout()"]]
|
||||
method_p4hxqo_oninitializedasync[["OnInitializedAsync()"]]
|
||||
```
|
||||
|
||||
### MainHubLayout Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_vf4020_mainhublayout("MainHubLayout")
|
||||
method_64smty_handlelogout[["HandleLogout()"]]
|
||||
method_p4hxqo_oninitializedasync[["OnInitializedAsync()"]]
|
||||
unresolved_unresolved_15jy0tl_call_target{"Unresolved: LogoutAsync"}
|
||||
unresolved_unresolved_17ozmdg_call_target{"Unresolved: GetProfileAsync"}
|
||||
unresolved_unresolved_1k8045k_interaction_target{"Unresolved: NavigationManager.NavigateTo(\\"/account/logout-form\\", true) (framework navigation)"}
|
||||
unresolved_unresolved_1mo1qcu_interaction_target{"Unresolved: await AuthStateProvider.GetAuthenticationStateAsync() (framework call)"}
|
||||
unresolved_unresolved_6dhnk4_interaction_target{"Unresolved: await IdentityService.GetProfileAsync(); (project service)"}
|
||||
unresolved_unresolved_n5pbzn_interaction_target{"Unresolved: await IdentityService.LogoutAsync(); (project service)"}
|
||||
class_vf4020_mainhublayout -->|contains| method_64smty_handlelogout
|
||||
class_vf4020_mainhublayout -->|contains| method_p4hxqo_oninitializedasync
|
||||
class_vf4020_mainhublayout -->|unresolved interaction| unresolved_unresolved_1k8045k_interaction_target
|
||||
class_vf4020_mainhublayout -->|unresolved interaction| unresolved_unresolved_1mo1qcu_interaction_target
|
||||
class_vf4020_mainhublayout -->|unresolved interaction| unresolved_unresolved_6dhnk4_interaction_target
|
||||
class_vf4020_mainhublayout -->|unresolved interaction| unresolved_unresolved_n5pbzn_interaction_target
|
||||
method_64smty_handlelogout -->|unresolved call| unresolved_unresolved_15jy0tl_call_target
|
||||
method_p4hxqo_oninitializedasync -->|unresolved call| unresolved_unresolved_17ozmdg_call_target
|
||||
```
|
||||
|
||||
### OnInitializedAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_p4hxqo_oninitializedasync__fragment_diagram exceeds preferred complexity thresholds (24 nodes, 27 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_p4hxqo_oninitializedasync__call_103_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_p4hxqo_oninitializedasync__action_101_state_change_101__linear("Mark sync in progress")
|
||||
method_p4hxqo_oninitializedasync__action_103_oninitializedasync_await_103_3__await[["Waits for async work"]]
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__condition{"_isSyncing"}
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__false("continue")
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__merge("merge")
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__true("return")
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__condition{"_isSyncing"}
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__false("continue")
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__merge("merge")
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__true("exit")
|
||||
method_p4hxqo_oninitializedasync__action_98_oninitializedasync_await_98_1__await[["Waits for async work"]]
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__condition{"!authState.User.Identity?.IsAuthenticated ?? true"}
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__false("call IdentityService.GetProfileAsync")
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__merge("merge")
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__true("set _isSyncing true")
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__condition{"!authState.User.Identity?.IsAuthenticated ?? true"}
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__false("false")
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__merge("merge")
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__true("true")
|
||||
method_p4hxqo_oninitializedasync__entry(["OnInitializedAsync entry"])
|
||||
method_p4hxqo_oninitializedasync__action_103_external_call_103__linear("Attempt to fetch profile from server")
|
||||
method_p4hxqo_oninitializedasync__action_98_external_call_98__linear("Read authentication state")
|
||||
method_p4hxqo_oninitializedasync__implicit_return(["return"])
|
||||
method_p4hxqo_oninitializedasync__action_101_state_change_101__linear -->|next| method_p4hxqo_oninitializedasync__action_103_oninitializedasync_await_103_3__await
|
||||
method_p4hxqo_oninitializedasync__action_103_external_call_103__linear -->|none| method_p4hxqo_oninitializedasync__call_103_GetProfileAsync
|
||||
method_p4hxqo_oninitializedasync__action_103_oninitializedasync_await_103_3__await -->|next| method_p4hxqo_oninitializedasync__action_103_external_call_103__linear
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__condition -->|continue| method_p4hxqo_oninitializedasync__action_96_guard_clause_96__false
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__condition -->|return| method_p4hxqo_oninitializedasync__action_96_guard_clause_96__true
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__false -->|next| method_p4hxqo_oninitializedasync__action_96_guard_clause_96__merge
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__merge -->|next| method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__condition
|
||||
method_p4hxqo_oninitializedasync__action_96_guard_clause_96__true -->|next| method_p4hxqo_oninitializedasync__action_96_guard_clause_96__merge
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__condition -->|continue| method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__false
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__condition -->|exit| method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__true
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__false -->|next| method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__merge
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__merge -->|next| method_p4hxqo_oninitializedasync__action_98_oninitializedasync_await_98_1__await
|
||||
method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__true -->|next| method_p4hxqo_oninitializedasync__action_96_oninitializedasync_guard_clause_96_0__merge
|
||||
method_p4hxqo_oninitializedasync__action_98_external_call_98__linear -->|next| method_p4hxqo_oninitializedasync__action_99_branch_99__condition
|
||||
method_p4hxqo_oninitializedasync__action_98_oninitializedasync_await_98_1__await -->|next| method_p4hxqo_oninitializedasync__action_98_external_call_98__linear
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__condition -->|call IdentityService.GetProfileAsync| method_p4hxqo_oninitializedasync__action_99_branch_99__false
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__condition -->|set _isSyncing true| method_p4hxqo_oninitializedasync__action_99_branch_99__true
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__false -->|next| method_p4hxqo_oninitializedasync__action_99_branch_99__merge
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__merge -->|next| method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__condition
|
||||
method_p4hxqo_oninitializedasync__action_99_branch_99__true -->|next| method_p4hxqo_oninitializedasync__action_99_branch_99__merge
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__condition -->|false| method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__false
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__condition -->|true| method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__true
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__false -->|next| method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__merge
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__merge -->|next| method_p4hxqo_oninitializedasync__action_101_state_change_101__linear
|
||||
method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__true -->|next| method_p4hxqo_oninitializedasync__action_99_oninitializedasync_branch_99_2__merge
|
||||
method_p4hxqo_oninitializedasync__call_103_GetProfileAsync -->|return| method_p4hxqo_oninitializedasync__implicit_return
|
||||
method_p4hxqo_oninitializedasync__entry -->|next| method_p4hxqo_oninitializedasync__action_96_guard_clause_96__condition
|
||||
```
|
||||
|
||||
### HandleLogout() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_64smty_handlelogout__call_109_LogoutAsync[["LogoutAsync"]]
|
||||
method_64smty_handlelogout__action_109_handlelogout_await_109_0__await[["Waits for async work"]]
|
||||
method_64smty_handlelogout__entry(["HandleLogout entry"])
|
||||
method_64smty_handlelogout__action_109_external_call_109__linear("Invoke logout on identity service")
|
||||
method_64smty_handlelogout__action_110_external_call_110__linear("Navigate to logout page")
|
||||
method_64smty_handlelogout__implicit_return(["return"])
|
||||
method_64smty_handlelogout__action_109_external_call_109__linear -->|none| method_64smty_handlelogout__call_109_LogoutAsync
|
||||
method_64smty_handlelogout__action_109_handlelogout_await_109_0__await -->|next| method_64smty_handlelogout__action_109_external_call_109__linear
|
||||
method_64smty_handlelogout__action_110_external_call_110__linear -->|return| method_64smty_handlelogout__implicit_return
|
||||
method_64smty_handlelogout__call_109_LogoutAsync -->|next| method_64smty_handlelogout__action_110_external_call_110__linear
|
||||
method_64smty_handlelogout__entry -->|next| method_64smty_handlelogout__action_109_handlelogout_await_109_0__await
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 2 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_p4hxqo_oninitializedasync__fragment_diagram exceeds preferred complexity thresholds (24 nodes, 27 edges).
|
||||
@@ -0,0 +1,235 @@
|
||||
# ReaderLayout
|
||||
|
||||
- File ID: file:mm1vnb:readerlayout-razor
|
||||
- Path: NexusReader.UI.Shared/Layout/ReaderLayout.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor layout component that renders the reader UI (main content, AI sidebar, footer) and manages runtime concerns: device/platform detection, event subscriptions for UI updates, and JS interop to initialize a layout resizer.
|
||||
|
||||
## Key Details
|
||||
|
||||
Renders an AI sidebar only for authorized users, subscribes to two services for UI updates, sets platform CSS based on device detection, and initializes a client-side resizer via JS interop on first render with error logging on failure.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ReaderLayout: Razor layout component that renders the reader UI (main content, AI sidebar, footer) and manages runtime concerns: device/platform detection, event subscriptions for UI updates, and JS interop to initialize a layout resizer.
|
||||
- OnInitialized(): Component initialization: subscribes to FocusMode and Quiz update events and determines device type to set platform CSS class.
|
||||
- OnAfterRenderAsync(): After-render lifecycle: on first render, attempts to import a JS module and initialize a resizer; logs on failure.
|
||||
- HandleUpdate(): Invokes a UI refresh on the component's synchronization context (wraps StateHasChanged in InvokeAsync).
|
||||
- Dispose(): Component disposal: unsubscribes from FocusMode and Quiz update events to avoid memory leaks.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (PlatformService.GetDeviceContext usage)
|
||||
- dependency-target: NexusReader.UI.Shared.Services (FocusMode, IQuizStateService referenced)
|
||||
- dependency-target: IJSRuntime (JS interop import - framework)
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: NexusReader.Application.Abstractions.Services (unknown path)
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: if (context.IsSuccess)
|
||||
- interaction-target: _isMobile = context.Value.DeviceType switch
|
||||
- interaction-target: await JS.InvokeAsync<IJSObjectReference>("import", "./_content/.../layoutResizer.js"); then module.InvokeVoidAsync("initResizer", ".app-container", "#sidebar-resizer", "--sidebar-width") (JS interop)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 11
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 5
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 5
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 22 nodes, 24 edges, 3 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 18 nodes, 19 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleUpdate: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Dispose: 6 nodes, 5 edges, 2 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReaderLayout Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_15qe4r2_readerlayout("ReaderLayout")
|
||||
file_mm1vnb_readerlayout_razor("ReaderLayout")
|
||||
method_11o3hgs_oninitialized[["OnInitialized()"]]
|
||||
method_1m8qyhe_handleupdate[["HandleUpdate()"]]
|
||||
method_1r68c5i_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_zb4rdj_dispose[["Dispose()"]]
|
||||
```
|
||||
|
||||
### ReaderLayout Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_15qe4r2_readerlayout("ReaderLayout")
|
||||
method_11o3hgs_oninitialized[["OnInitialized()"]]
|
||||
method_1m8qyhe_handleupdate[["HandleUpdate()"]]
|
||||
method_1r68c5i_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_zb4rdj_dispose[["Dispose()"]]
|
||||
unresolved_unresolved_1d3viv2_interaction_target{"Unresolved: if (context.IsSuccess)"}
|
||||
unresolved_unresolved_1f9xkjs_call_target{"Unresolved: FocusMode.OnFocusModeChanged += HandleUpdate (event subscribe)"}
|
||||
unresolved_unresolved_1wlsy2d_call_target{"Unresolved: GetDeviceContext"}
|
||||
unresolved_unresolved_1y5usm8_call_target{"Unresolved: QuizService.OnQuizUpdated += HandleUpdate (event subscribe)"}
|
||||
unresolved_unresolved_na1slj_call_target{"Unresolved: FocusMode.OnFocusModeChanged -= HandleUpdate (event unsubscribe)"}
|
||||
unresolved_unresolved_pm6tjt_interaction_target{"Unresolved: await JS.InvokeAsync<IJSObjectReference>(\\"import\\", \\"./_content/.../layoutResizer.js\\"); then module.InvokeVoidAsync(\\"initResizer\\", \\".app-container\\", \\"#sidebar-resizer\\", \\"--sidebar-width\\") (JS interop)"}
|
||||
unresolved_unresolved_vgq4n3_call_target{"Unresolved: QuizService.OnQuizUpdated -= HandleUpdate (event unsubscribe)"}
|
||||
unresolved_unresolved_xu9xg_interaction_target{"Unresolved: _isMobile = context.Value.DeviceType switch"}
|
||||
class_15qe4r2_readerlayout -->|contains| method_11o3hgs_oninitialized
|
||||
class_15qe4r2_readerlayout -->|contains| method_1m8qyhe_handleupdate
|
||||
class_15qe4r2_readerlayout -->|contains| method_1r68c5i_onafterrenderasync
|
||||
class_15qe4r2_readerlayout -->|contains| method_zb4rdj_dispose
|
||||
class_15qe4r2_readerlayout -->|unresolved interaction| unresolved_unresolved_1d3viv2_interaction_target
|
||||
class_15qe4r2_readerlayout -->|unresolved interaction| unresolved_unresolved_pm6tjt_interaction_target
|
||||
class_15qe4r2_readerlayout -->|unresolved interaction| unresolved_unresolved_xu9xg_interaction_target
|
||||
method_11o3hgs_oninitialized -->|unresolved call| unresolved_unresolved_1f9xkjs_call_target
|
||||
method_11o3hgs_oninitialized -->|unresolved call| unresolved_unresolved_1wlsy2d_call_target
|
||||
method_11o3hgs_oninitialized -->|unresolved call| unresolved_unresolved_1y5usm8_call_target
|
||||
method_zb4rdj_dispose -->|unresolved call| unresolved_unresolved_na1slj_call_target
|
||||
method_zb4rdj_dispose -->|unresolved call| unresolved_unresolved_vgq4n3_call_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
_Warnings: diagram method_11o3hgs_oninitialized__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 24 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_11o3hgs_oninitialized__call_75_FocusMode_OnFocusModeChanged_HandleUpdate_event_subscribe_[["FocusMode.OnFocusModeChanged += HandleUpdate (event subscribe)"]]
|
||||
method_11o3hgs_oninitialized__call_76_QuizService_OnQuizUpdated_HandleUpdate_event_subscribe_[["QuizService.OnQuizUpdated += HandleUpdate (event subscribe)"]]
|
||||
method_11o3hgs_oninitialized__call_78_GetDeviceContext[["GetDeviceContext"]]
|
||||
method_11o3hgs_oninitialized__action_75_event_subscribe_75__linear("Subscribe to focus mode changes")
|
||||
method_11o3hgs_oninitialized__action_76_event_subscribe_76__linear("Subscribe to quiz updates")
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__condition{"context.IsSuccess"}
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__false("skip")
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__merge("merge")
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__true("apply device type mapping")
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__condition{"context.IsSuccess"}
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__false("false")
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__merge("merge")
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__true("true")
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__condition{"Device type mapping"}
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__false("false")
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__merge("merge")
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__true("true")
|
||||
method_11o3hgs_oninitialized__action_87_state_mutation_87__linear("Set platform CSS class")
|
||||
method_11o3hgs_oninitialized__entry(["OnInitialized entry"])
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_repository_read_79_1__linear[("Reads repository or persistence state")]
|
||||
method_11o3hgs_oninitialized__action_81_oninitialized_repository_read_81_2__linear[("Reads repository or persistence state")]
|
||||
method_11o3hgs_oninitialized__implicit_return(["return"])
|
||||
method_11o3hgs_oninitialized__action_75_event_subscribe_75__linear -->|delegate HandleUpdate| method_11o3hgs_oninitialized__call_75_FocusMode_OnFocusModeChanged_HandleUpdate_event_subscribe_
|
||||
method_11o3hgs_oninitialized__action_76_event_subscribe_76__linear -->|delegate HandleUpdate| method_11o3hgs_oninitialized__call_76_QuizService_OnQuizUpdated_HandleUpdate_event_subscribe_
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__condition -->|skip| method_11o3hgs_oninitialized__action_79_guard_clause_79__false
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__condition -->|apply device type mapping| method_11o3hgs_oninitialized__action_79_guard_clause_79__true
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__false -->|next| method_11o3hgs_oninitialized__action_79_guard_clause_79__merge
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__merge -->|next| method_11o3hgs_oninitialized__action_81_oninitialized_repository_read_81_2__linear
|
||||
method_11o3hgs_oninitialized__action_79_guard_clause_79__true -->|next| method_11o3hgs_oninitialized__action_79_guard_clause_79__merge
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__condition -->|false| method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__false
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__condition -->|true| method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__true
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__false -->|next| method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__merge
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__merge -->|next| method_11o3hgs_oninitialized__action_79_guard_clause_79__condition
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__true -->|next| method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__merge
|
||||
method_11o3hgs_oninitialized__action_79_oninitialized_repository_read_79_1__linear -->|next| method_11o3hgs_oninitialized__action_79_oninitialized_branch_79_0__condition
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__condition -->|false| method_11o3hgs_oninitialized__action_81_branch_81__false
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__condition -->|true| method_11o3hgs_oninitialized__action_81_branch_81__true
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__false -->|next| method_11o3hgs_oninitialized__action_81_branch_81__merge
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__merge -->|next| method_11o3hgs_oninitialized__action_87_state_mutation_87__linear
|
||||
method_11o3hgs_oninitialized__action_81_branch_81__true -->|next| method_11o3hgs_oninitialized__action_81_branch_81__merge
|
||||
method_11o3hgs_oninitialized__action_81_oninitialized_repository_read_81_2__linear -->|next| method_11o3hgs_oninitialized__action_81_branch_81__condition
|
||||
method_11o3hgs_oninitialized__action_87_state_mutation_87__linear -->|return| method_11o3hgs_oninitialized__implicit_return
|
||||
method_11o3hgs_oninitialized__call_75_FocusMode_OnFocusModeChanged_HandleUpdate_event_subscribe_ -->|next| method_11o3hgs_oninitialized__action_76_event_subscribe_76__linear
|
||||
method_11o3hgs_oninitialized__call_76_QuizService_OnQuizUpdated_HandleUpdate_event_subscribe_ -->|no params returns context with IsSuccess and Value.DeviceType| method_11o3hgs_oninitialized__call_78_GetDeviceContext
|
||||
method_11o3hgs_oninitialized__call_78_GetDeviceContext -->|next| method_11o3hgs_oninitialized__action_79_oninitialized_repository_read_79_1__linear
|
||||
method_11o3hgs_oninitialized__entry -->|next| method_11o3hgs_oninitialized__action_75_event_subscribe_75__linear
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1r68c5i_onafterrenderasync__action_100_onafterrenderasync_await_100_3__await[["Waits for async work"]]
|
||||
method_1r68c5i_onafterrenderasync__action_102_onafterrenderasync_catch_102_4__catch("catch Exception ex")
|
||||
method_1r68c5i_onafterrenderasync__action_104_logging_104__linear("Log JS initialization failure")
|
||||
method_1r68c5i_onafterrenderasync__action_104_onafterrenderasync_log_104_5__linear("Logs runtime state")
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__condition{"firstRender == true"}
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__false("skip")
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__merge("merge")
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__true("initialize JS resizer")
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__condition{"firstRender"}
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__false("false")
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__merge("merge")
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__true("true")
|
||||
method_1r68c5i_onafterrenderasync__action_97_onafterrenderasync_try_97_1__try("Begins protected execution")
|
||||
method_1r68c5i_onafterrenderasync__action_97_try_catch_97__linear("JS interop initialization with error handling")
|
||||
method_1r68c5i_onafterrenderasync__action_99_onafterrenderasync_await_99_2__await[["Waits for async work"]]
|
||||
method_1r68c5i_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_1r68c5i_onafterrenderasync__action_99_external_call_99__linear("Import JS module and call init function")
|
||||
method_1r68c5i_onafterrenderasync__implicit_return(["return"])
|
||||
method_1r68c5i_onafterrenderasync__action_100_onafterrenderasync_await_100_3__await -->|exception| method_1r68c5i_onafterrenderasync__action_102_onafterrenderasync_catch_102_4__catch
|
||||
method_1r68c5i_onafterrenderasync__action_102_onafterrenderasync_catch_102_4__catch -->|next| method_1r68c5i_onafterrenderasync__action_104_onafterrenderasync_log_104_5__linear
|
||||
method_1r68c5i_onafterrenderasync__action_104_logging_104__linear -->|return| method_1r68c5i_onafterrenderasync__implicit_return
|
||||
method_1r68c5i_onafterrenderasync__action_104_onafterrenderasync_log_104_5__linear -->|next| method_1r68c5i_onafterrenderasync__action_104_logging_104__linear
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__condition -->|skip| method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__false
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__condition -->|initialize JS resizer| method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__true
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__false -->|next| method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__merge
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__merge -->|next| method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__condition
|
||||
method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__true -->|next| method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__merge
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__condition -->|false| method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__false
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__condition -->|true| method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__true
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__false -->|next| method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__merge
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__merge -->|next| method_1r68c5i_onafterrenderasync__action_97_try_catch_97__linear
|
||||
method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__true -->|next| method_1r68c5i_onafterrenderasync__action_95_onafterrenderasync_branch_95_0__merge
|
||||
method_1r68c5i_onafterrenderasync__action_97_onafterrenderasync_try_97_1__try -->|next| method_1r68c5i_onafterrenderasync__action_99_onafterrenderasync_await_99_2__await
|
||||
method_1r68c5i_onafterrenderasync__action_97_try_catch_97__linear -->|next| method_1r68c5i_onafterrenderasync__action_97_onafterrenderasync_try_97_1__try
|
||||
method_1r68c5i_onafterrenderasync__action_99_external_call_99__linear -->|next| method_1r68c5i_onafterrenderasync__action_100_onafterrenderasync_await_100_3__await
|
||||
method_1r68c5i_onafterrenderasync__action_99_onafterrenderasync_await_99_2__await -->|next| method_1r68c5i_onafterrenderasync__action_99_external_call_99__linear
|
||||
method_1r68c5i_onafterrenderasync__entry -->|next| method_1r68c5i_onafterrenderasync__action_95_guard_clause_95__condition
|
||||
```
|
||||
|
||||
### Dispose() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_zb4rdj_dispose__call_113_FocusMode_OnFocusModeChanged_HandleUpdate_event_unsubscribe_[["FocusMode.OnFocusModeChanged -= HandleUpdate (event unsubscribe)"]]
|
||||
method_zb4rdj_dispose__call_114_QuizService_OnQuizUpdated_HandleUpdate_event_unsubscribe_[["QuizService.OnQuizUpdated -= HandleUpdate (event unsubscribe)"]]
|
||||
method_zb4rdj_dispose__action_113_event_unsubscribe_113__linear("Unsubscribe from focus mode changes")
|
||||
method_zb4rdj_dispose__action_114_event_unsubscribe_114__linear("Unsubscribe from quiz updates")
|
||||
method_zb4rdj_dispose__entry(["Dispose entry"])
|
||||
method_zb4rdj_dispose__implicit_return(["return"])
|
||||
method_zb4rdj_dispose__action_113_event_unsubscribe_113__linear -->|delegate HandleUpdate| method_zb4rdj_dispose__call_113_FocusMode_OnFocusModeChanged_HandleUpdate_event_unsubscribe_
|
||||
method_zb4rdj_dispose__action_114_event_unsubscribe_114__linear -->|delegate HandleUpdate| method_zb4rdj_dispose__call_114_QuizService_OnQuizUpdated_HandleUpdate_event_unsubscribe_
|
||||
method_zb4rdj_dispose__call_113_FocusMode_OnFocusModeChanged_HandleUpdate_event_unsubscribe_ -->|next| method_zb4rdj_dispose__action_114_event_unsubscribe_114__linear
|
||||
method_zb4rdj_dispose__call_114_QuizService_OnQuizUpdated_HandleUpdate_event_unsubscribe_ -->|return| method_zb4rdj_dispose__implicit_return
|
||||
method_zb4rdj_dispose__entry -->|next| method_zb4rdj_dispose__action_113_event_unsubscribe_113__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 5 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_11o3hgs_oninitialized__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 24 edges).
|
||||
@@ -0,0 +1,57 @@
|
||||
# ReconnectModal
|
||||
|
||||
- File ID: file:uzi8zg:reconnectmodal-razor
|
||||
- Path: NexusReader.UI.Shared/Layout/ReconnectModal.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI component that renders a reconnect modal dialog for the client, exposing DOM elements and IDs used by a companion JavaScript module to manage reconnect/resume UI states.
|
||||
|
||||
## Key Details
|
||||
|
||||
Static dialog markup (lines 4-32) defines states via CSS classes and well-known element IDs: dialog id 'components-reconnect-modal', buttons 'components-reconnect-button' and 'components-resume-button', and span 'components-seconds-to-next-attempt'. Behavior is delegated to the referenced JS module; no C# methods or types are declared in this file.
|
||||
|
||||
## Symbols
|
||||
|
||||
- No extracted symbols.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: _content/NexusReader.UI.Shared/Layout/ReconnectModal.razor.js
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 0
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 0
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReconnectModal Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_uzi8zg_reconnectmodal_razor("ReconnectModal")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+429
@@ -0,0 +1,429 @@
|
||||
# ReconnectModal.razor
|
||||
|
||||
- File ID: file:1wkle85:reconnectmodal-razor-js
|
||||
- Path: NexusReader.UI.Shared/Layout/ReconnectModal.razor.js
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Client-side script for the Reconnect modal component: attaches UI event handlers and orchestrates reconnect/resume flows (using Blazor interop), handling retries, visibility-driven retries, and fallback reloads.
|
||||
|
||||
## Key Details
|
||||
|
||||
Orchestrates reconnect/resume flows with three outcome semantics from Blazor.reconnect (true = success, false = server reached but circuit rejected, throw = server unreachable). Uses visibility events to defer retries when offline/unreachable.
|
||||
|
||||
## Symbols
|
||||
|
||||
- <module_init>(): Top-level initialization: obtains DOM elements and registers event listeners for reconnect state and button clicks.
|
||||
- handleReconnectStateChanged(): Handles incoming reconnect-state change events and performs UI actions (show/hide modal), schedules visibility-driven retries, or forces page reload on rejection.
|
||||
- retry(): Attempts to reconnect via Blazor.reconnect; if server reachable but circuit rejected attempts resume, otherwise reloads; on network error schedules visibility-driven retry.
|
||||
- resume(): Attempts to resume an existing circuit via Blazor.resumeCircuit; reloads on failure or toggles UI class on exception.
|
||||
- retryWhenDocumentBecomesVisible(): Visibility-change handler that triggers retry() when the document becomes visible.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: unknown (Blazor interop and browser DOM APIs referenced)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 18
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 11
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- <module_init>: 9 nodes, 8 edges, 3 jumps, 0 unsupported constructs
|
||||
- handleReconnectStateChanged: 39 nodes, 46 edges, 4 jumps, 0 unsupported constructs
|
||||
- retry: 37 nodes, 42 edges, 6 jumps, 0 unsupported constructs
|
||||
- resume: 17 nodes, 18 edges, 3 jumps, 0 unsupported constructs
|
||||
- retryWhenDocumentBecomesVisible: 18 nodes, 21 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReconnectModal.razor Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1wkle85_reconnectmodal_razor_js("ReconnectModal.razor")
|
||||
method_12nt8as_resume[["resume()"]]
|
||||
method_15ixuxd_module_init[["<module_init>()"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible[["retryWhenDocumentBecomesVisible()"]]
|
||||
method_1n08b99_handlereconnectstatechanged[["handleReconnectStateChanged()"]]
|
||||
method_mdoq3y_retry[["retry()"]]
|
||||
```
|
||||
|
||||
### ReconnectModal.razor Execution Overview
|
||||
|
||||
_Warnings: diagram file_1wkle85_reconnectmodal_razor_js_execution_view exceeds preferred complexity thresholds (23 nodes, 22 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
file_1wkle85_reconnectmodal_razor_js("ReconnectModal.razor")
|
||||
method_12nt8as_resume[["resume()"]]
|
||||
method_15ixuxd_module_init[["<module_init>()"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible[["retryWhenDocumentBecomesVisible()"]]
|
||||
method_1n08b99_handlereconnectstatechanged[["handleReconnectStateChanged()"]]
|
||||
method_mdoq3y_retry[["retry()"]]
|
||||
unresolved_unresolved_10kruh6_call_target{"Unresolved: resume"}
|
||||
unresolved_unresolved_11ky44a_call_target{"Unresolved: location.reload"}
|
||||
unresolved_unresolved_1drhmzn_call_target{"Unresolved: location.reload"}
|
||||
unresolved_unresolved_1pbt6sg_call_target{"Unresolved: retryWhenDocumentBecomesVisible"}
|
||||
unresolved_unresolved_1q5jveu_call_target{"Unresolved: reconnectModal.classList.replace"}
|
||||
unresolved_unresolved_1sxr8qr_call_target{"Unresolved: Blazor.resumeCircuit"}
|
||||
unresolved_unresolved_1w3gmn3_call_target{"Unresolved: retry"}
|
||||
unresolved_unresolved_1yjs71m_call_target{"Unresolved: retryWhenDocumentBecomesVisible"}
|
||||
unresolved_unresolved_3slkrk_call_target{"Unresolved: document.removeEventListener"}
|
||||
unresolved_unresolved_5x2oyh_call_target{"Unresolved: retry"}
|
||||
unresolved_unresolved_66tchk_call_target{"Unresolved: Blazor.resumeCircuit"}
|
||||
unresolved_unresolved_8mchpn_call_target{"Unresolved: handleReconnectStateChanged"}
|
||||
unresolved_unresolved_f7i5v_call_target{"Unresolved: reconnectModal.close"}
|
||||
unresolved_unresolved_m2lwlj_call_target{"Unresolved: reconnectModal.showModal"}
|
||||
unresolved_unresolved_psft95_call_target{"Unresolved: reconnectModal.close"}
|
||||
unresolved_unresolved_ulfrfc_call_target{"Unresolved: Blazor.reconnect"}
|
||||
unresolved_unresolved_wqabat_call_target{"Unresolved: location.reload"}
|
||||
file_1wkle85_reconnectmodal_razor_js -->|contains| method_12nt8as_resume
|
||||
file_1wkle85_reconnectmodal_razor_js -->|contains| method_15ixuxd_module_init
|
||||
file_1wkle85_reconnectmodal_razor_js -->|contains| method_1js2qbs_retrywhendocumentbecomesvisible
|
||||
file_1wkle85_reconnectmodal_razor_js -->|contains| method_1n08b99_handlereconnectstatechanged
|
||||
file_1wkle85_reconnectmodal_razor_js -->|contains| method_mdoq3y_retry
|
||||
method_12nt8as_resume -->|unresolved call| unresolved_unresolved_11ky44a_call_target
|
||||
method_12nt8as_resume -->|unresolved call| unresolved_unresolved_1q5jveu_call_target
|
||||
method_12nt8as_resume -->|unresolved call| unresolved_unresolved_66tchk_call_target
|
||||
method_15ixuxd_module_init -->|unresolved call| unresolved_unresolved_10kruh6_call_target
|
||||
method_15ixuxd_module_init -->|unresolved call| unresolved_unresolved_5x2oyh_call_target
|
||||
method_15ixuxd_module_init -->|unresolved call| unresolved_unresolved_8mchpn_call_target
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible -->|unresolved call| unresolved_unresolved_1w3gmn3_call_target
|
||||
method_1n08b99_handlereconnectstatechanged -->|unresolved call| unresolved_unresolved_1yjs71m_call_target
|
||||
method_1n08b99_handlereconnectstatechanged -->|unresolved call| unresolved_unresolved_m2lwlj_call_target
|
||||
method_1n08b99_handlereconnectstatechanged -->|unresolved call| unresolved_unresolved_psft95_call_target
|
||||
method_1n08b99_handlereconnectstatechanged -->|unresolved call| unresolved_unresolved_wqabat_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_1drhmzn_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_1pbt6sg_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_1sxr8qr_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_3slkrk_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_f7i5v_call_target
|
||||
method_mdoq3y_retry -->|unresolved call| unresolved_unresolved_ulfrfc_call_target
|
||||
```
|
||||
|
||||
### handleReconnectStateChanged() Control Flow
|
||||
|
||||
_Warnings: diagram method_1n08b99_handlereconnectstatechanged__fragment_diagram exceeds preferred complexity thresholds (39 nodes, 46 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1n08b99_handlereconnectstatechanged__call_13_reconnectModal_showModal[["reconnectModal.showModal"]]
|
||||
method_1n08b99_handlereconnectstatechanged__call_15_reconnectModal_close[["reconnectModal.close"]]
|
||||
method_1n08b99_handlereconnectstatechanged__call_17_retryWhenDocumentBecomesVisible[["retryWhenDocumentBecomesVisible"]]
|
||||
method_1n08b99_handlereconnectstatechanged__call_19_location_reload[["location.reload"]]
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__condition{"event.detail.state === 'show' | 'hide' | 'failed' | 'rejected'"}
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__false("hide -> close modal")
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__true("show -> show modal")
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__condition{"event.detail.state === \\"show\\""}
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__false("false")
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__true("true")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__condition{"event.detail.state === \\"hide\\""}
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__false("false")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__true("true")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__condition{"Falls back to alternate path"}
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__false("otherwise")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__true("fallback")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__condition{"event.detail.state === \\"failed\\""}
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__false("false")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__true("true")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__condition{"Falls back to alternate path"}
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__false("otherwise")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__true("fallback")
|
||||
method_1n08b99_handlereconnectstatechanged__action_17_event_registration_17__linear("Schedules retry on visibilitychange when failed")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__condition{"event.detail.state === \\"rejected\\""}
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__false("false")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__true("true")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__condition{"Falls back to alternate path"}
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__false("otherwise")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__merge("merge")
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__true("fallback")
|
||||
method_1n08b99_handlereconnectstatechanged__entry(["handleReconnectStateChanged entry"])
|
||||
method_1n08b99_handlereconnectstatechanged__implicit_return(["return"])
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__condition -->|hide -> close modal| method_1n08b99_handlereconnectstatechanged__action_12_branch_12__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__condition -->|show -> show modal| method_1n08b99_handlereconnectstatechanged__action_12_branch_12__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__false -->|next| method_1n08b99_handlereconnectstatechanged__action_12_branch_12__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__merge -->|next| method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__condition
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_branch_12__true -->|next| method_1n08b99_handlereconnectstatechanged__action_12_branch_12__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__condition -->|false| method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__condition -->|true| method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__false -->|next| method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__merge -->|none| method_1n08b99_handlereconnectstatechanged__call_13_reconnectModal_showModal
|
||||
method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__true -->|next| method_1n08b99_handlereconnectstatechanged__action_12_handlereconnectstatechanged_branch_12_0__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__condition -->|false| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__condition -->|true| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__false -->|next| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__merge -->|none| method_1n08b99_handlereconnectstatechanged__call_15_reconnectModal_close
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__true -->|next| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__condition -->|otherwise| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__condition -->|fallback| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__false -->|next| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__merge -->|next| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_branch_14_1__condition
|
||||
method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__true -->|next| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__condition -->|false| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__condition -->|true| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__false -->|next| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__merge -->|next| method_1n08b99_handlereconnectstatechanged__action_17_event_registration_17__linear
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__true -->|next| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__condition -->|otherwise| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__condition -->|fallback| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__false -->|next| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__merge -->|next| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_branch_16_3__condition
|
||||
method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__true -->|next| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_17_event_registration_17__linear -->|registered as visibilitychange handler| method_1n08b99_handlereconnectstatechanged__call_17_retryWhenDocumentBecomesVisible
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__condition -->|false| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__condition -->|true| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__false -->|next| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__merge -->|none| method_1n08b99_handlereconnectstatechanged__call_19_location_reload
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__true -->|next| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__condition -->|otherwise| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__false
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__condition -->|fallback| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__true
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__false -->|next| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__merge
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__merge -->|next| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_branch_18_5__condition
|
||||
method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__true -->|next| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__merge
|
||||
method_1n08b99_handlereconnectstatechanged__call_13_reconnectModal_showModal -->|fallback| method_1n08b99_handlereconnectstatechanged__action_14_handlereconnectstatechanged_fallback_14_2__condition
|
||||
method_1n08b99_handlereconnectstatechanged__call_15_reconnectModal_close -->|fallback| method_1n08b99_handlereconnectstatechanged__action_16_handlereconnectstatechanged_fallback_16_4__condition
|
||||
method_1n08b99_handlereconnectstatechanged__call_17_retryWhenDocumentBecomesVisible -->|fallback| method_1n08b99_handlereconnectstatechanged__action_18_handlereconnectstatechanged_fallback_18_6__condition
|
||||
method_1n08b99_handlereconnectstatechanged__call_19_location_reload -->|return| method_1n08b99_handlereconnectstatechanged__implicit_return
|
||||
method_1n08b99_handlereconnectstatechanged__entry -->|next| method_1n08b99_handlereconnectstatechanged__action_12_branch_12__condition
|
||||
```
|
||||
|
||||
### retry() Control Flow
|
||||
|
||||
_Warnings: diagram method_mdoq3y_retry__fragment_diagram exceeds preferred complexity thresholds (37 nodes, 42 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_mdoq3y_retry__call_24_document_removeEventListener[["document.removeEventListener"]]
|
||||
method_mdoq3y_retry__call_31_Blazor_reconnect[["Blazor.reconnect"]]
|
||||
method_mdoq3y_retry__call_35_Blazor_resumeCircuit[["Blazor.resumeCircuit"]]
|
||||
method_mdoq3y_retry__call_37_location_reload[["location.reload"]]
|
||||
method_mdoq3y_retry__call_39_reconnectModal_close[["reconnectModal.close"]]
|
||||
method_mdoq3y_retry__call_44_retryWhenDocumentBecomesVisible[["retryWhenDocumentBecomesVisible"]]
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_body[["async function retry() {"]]
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_entry("Retries work after a recoverable failure")
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_exit("Stops retrying when the attempt budget is exhausted or the call succeeds.")
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__condition{"always executed at start"}
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__false("otherwise")
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__merge("merge")
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__true("listener removed")
|
||||
method_mdoq3y_retry__action_26_retry_try_26_1__try("Begins protected execution")
|
||||
method_mdoq3y_retry__action_26_try_catch_26__linear("Network call with fallback")
|
||||
method_mdoq3y_retry__action_31_branch_31__condition{"successful === true | false | throws"}
|
||||
method_mdoq3y_retry__action_31_branch_31__false("true -> implicit success (no UI change here)")
|
||||
method_mdoq3y_retry__action_31_branch_31__merge("merge")
|
||||
method_mdoq3y_retry__action_31_branch_31__true("false -> attempt resumeCircuit")
|
||||
method_mdoq3y_retry__action_31_retry_await_31_2__await[["Waits for async work"]]
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__condition{"!successful"}
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__false("false")
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__merge("merge")
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__true("true")
|
||||
method_mdoq3y_retry__action_35_retry_await_35_4__await[["Waits for async work"]]
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__condition{"!resumeSuccessful"}
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__false("false")
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__merge("merge")
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__true("true")
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__condition{"Falls back to alternate path"}
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__false("otherwise")
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__merge("merge")
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__true("fallback")
|
||||
method_mdoq3y_retry__action_42_retry_catch_42_7__catch("catch err")
|
||||
method_mdoq3y_retry__action_44_event_registration_44__linear("Schedules visibility retry on exception")
|
||||
method_mdoq3y_retry__entry(["retry entry"])
|
||||
method_mdoq3y_retry__implicit_return(["return"])
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_body -->|retry| method_mdoq3y_retry__action_23_retry_retry_23_0__loop_entry
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_entry -->|retry| method_mdoq3y_retry__action_23_retry_retry_23_0__loop_body
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_entry -->|Stops retrying when the attempt budget is exhausted or the call succeeds.| method_mdoq3y_retry__action_23_retry_retry_23_0__loop_exit
|
||||
method_mdoq3y_retry__action_23_retry_retry_23_0__loop_exit -->|next| method_mdoq3y_retry__action_24_guard_clause_24__condition
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__condition -->|otherwise| method_mdoq3y_retry__action_24_guard_clause_24__false
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__condition -->|listener removed| method_mdoq3y_retry__action_24_guard_clause_24__true
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__false -->|next| method_mdoq3y_retry__action_24_guard_clause_24__merge
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__merge -->|removes visibilitychange handler retryWhenDocumentBecomesVisible| method_mdoq3y_retry__call_24_document_removeEventListener
|
||||
method_mdoq3y_retry__action_24_guard_clause_24__true -->|next| method_mdoq3y_retry__action_24_guard_clause_24__merge
|
||||
method_mdoq3y_retry__action_26_retry_try_26_1__try -->|next| method_mdoq3y_retry__action_31_retry_await_31_2__await
|
||||
method_mdoq3y_retry__action_26_try_catch_26__linear -->|next| method_mdoq3y_retry__action_26_retry_try_26_1__try
|
||||
method_mdoq3y_retry__action_31_branch_31__condition -->|true -> implicit success no UI change here| method_mdoq3y_retry__action_31_branch_31__false
|
||||
method_mdoq3y_retry__action_31_branch_31__condition -->|false -> attempt resumeCircuit| method_mdoq3y_retry__action_31_branch_31__true
|
||||
method_mdoq3y_retry__action_31_branch_31__false -->|next| method_mdoq3y_retry__action_31_branch_31__merge
|
||||
method_mdoq3y_retry__action_31_branch_31__merge -->|awaits reconnect returns true false throws| method_mdoq3y_retry__call_31_Blazor_reconnect
|
||||
method_mdoq3y_retry__action_31_branch_31__true -->|next| method_mdoq3y_retry__action_31_branch_31__merge
|
||||
method_mdoq3y_retry__action_31_retry_await_31_2__await -->|next| method_mdoq3y_retry__action_31_branch_31__condition
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__condition -->|false| method_mdoq3y_retry__action_32_retry_branch_32_3__false
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__condition -->|true| method_mdoq3y_retry__action_32_retry_branch_32_3__true
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__false -->|next| method_mdoq3y_retry__action_32_retry_branch_32_3__merge
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__merge -->|next| method_mdoq3y_retry__action_35_retry_await_35_4__await
|
||||
method_mdoq3y_retry__action_32_retry_branch_32_3__true -->|next| method_mdoq3y_retry__action_32_retry_branch_32_3__merge
|
||||
method_mdoq3y_retry__action_35_retry_await_35_4__await -->|attempts to resume server circuit when reconnect reached server but was rejected| method_mdoq3y_retry__call_35_Blazor_resumeCircuit
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__condition -->|false| method_mdoq3y_retry__action_36_retry_branch_36_5__false
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__condition -->|true| method_mdoq3y_retry__action_36_retry_branch_36_5__true
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__false -->|next| method_mdoq3y_retry__action_36_retry_branch_36_5__merge
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__merge -->|reloads page when resume failed| method_mdoq3y_retry__call_37_location_reload
|
||||
method_mdoq3y_retry__action_36_retry_branch_36_5__true -->|next| method_mdoq3y_retry__action_36_retry_branch_36_5__merge
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__condition -->|otherwise| method_mdoq3y_retry__action_38_retry_fallback_38_6__false
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__condition -->|fallback| method_mdoq3y_retry__action_38_retry_fallback_38_6__true
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__false -->|next| method_mdoq3y_retry__action_38_retry_fallback_38_6__merge
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__merge -->|closes modal when resume succeeded| method_mdoq3y_retry__call_39_reconnectModal_close
|
||||
method_mdoq3y_retry__action_38_retry_fallback_38_6__true -->|next| method_mdoq3y_retry__action_38_retry_fallback_38_6__merge
|
||||
method_mdoq3y_retry__action_42_retry_catch_42_7__catch -->|next| method_mdoq3y_retry__action_44_event_registration_44__linear
|
||||
method_mdoq3y_retry__action_44_event_registration_44__linear -->|registered on visibilitychange in catch path| method_mdoq3y_retry__call_44_retryWhenDocumentBecomesVisible
|
||||
method_mdoq3y_retry__call_24_document_removeEventListener -->|next| method_mdoq3y_retry__action_26_try_catch_26__linear
|
||||
method_mdoq3y_retry__call_31_Blazor_reconnect -->|next| method_mdoq3y_retry__action_32_retry_branch_32_3__condition
|
||||
method_mdoq3y_retry__call_35_Blazor_resumeCircuit -->|next| method_mdoq3y_retry__action_36_retry_branch_36_5__condition
|
||||
method_mdoq3y_retry__call_37_location_reload -->|fallback| method_mdoq3y_retry__action_38_retry_fallback_38_6__condition
|
||||
method_mdoq3y_retry__call_39_reconnectModal_close -->|exception| method_mdoq3y_retry__action_42_retry_catch_42_7__catch
|
||||
method_mdoq3y_retry__call_44_retryWhenDocumentBecomesVisible -->|return| method_mdoq3y_retry__implicit_return
|
||||
method_mdoq3y_retry__entry -->|next| method_mdoq3y_retry__action_23_retry_retry_23_0__loop_entry
|
||||
```
|
||||
|
||||
### resume() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_12nt8as_resume__call_50_Blazor_resumeCircuit[["Blazor.resumeCircuit"]]
|
||||
method_12nt8as_resume__call_52_location_reload[["location.reload"]]
|
||||
method_12nt8as_resume__call_55_reconnectModal_classList_replace[["reconnectModal.classList.replace"]]
|
||||
method_12nt8as_resume__action_49_resume_try_49_0__try("Begins protected execution")
|
||||
method_12nt8as_resume__action_49_try_catch_49__linear("Attempt resume with fallback UI update")
|
||||
method_12nt8as_resume__action_50_resume_await_50_1__await[["Waits for async work"]]
|
||||
method_12nt8as_resume__action_51_branch_51__condition{"successful === false triggers reload"}
|
||||
method_12nt8as_resume__action_51_branch_51__false("close/noop")
|
||||
method_12nt8as_resume__action_51_branch_51__merge("merge")
|
||||
method_12nt8as_resume__action_51_branch_51__true("reload")
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__condition{"!successful"}
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__false("false")
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__merge("merge")
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__true("true")
|
||||
method_12nt8as_resume__action_54_resume_catch_54_3__catch("Handles exception path")
|
||||
method_12nt8as_resume__entry(["resume entry"])
|
||||
method_12nt8as_resume__implicit_return(["return"])
|
||||
method_12nt8as_resume__action_49_resume_try_49_0__try -->|next| method_12nt8as_resume__action_49_try_catch_49__linear
|
||||
method_12nt8as_resume__action_49_try_catch_49__linear -->|next| method_12nt8as_resume__action_50_resume_await_50_1__await
|
||||
method_12nt8as_resume__action_50_resume_await_50_1__await -->|awaits resume result boolean| method_12nt8as_resume__call_50_Blazor_resumeCircuit
|
||||
method_12nt8as_resume__action_51_branch_51__condition -->|close / noop| method_12nt8as_resume__action_51_branch_51__false
|
||||
method_12nt8as_resume__action_51_branch_51__condition -->|reload| method_12nt8as_resume__action_51_branch_51__true
|
||||
method_12nt8as_resume__action_51_branch_51__false -->|next| method_12nt8as_resume__action_51_branch_51__merge
|
||||
method_12nt8as_resume__action_51_branch_51__merge -->|next| method_12nt8as_resume__action_51_resume_branch_51_2__condition
|
||||
method_12nt8as_resume__action_51_branch_51__true -->|next| method_12nt8as_resume__action_51_branch_51__merge
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__condition -->|false| method_12nt8as_resume__action_51_resume_branch_51_2__false
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__condition -->|true| method_12nt8as_resume__action_51_resume_branch_51_2__true
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__false -->|next| method_12nt8as_resume__action_51_resume_branch_51_2__merge
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__merge -->|reloads when resume returned false| method_12nt8as_resume__call_52_location_reload
|
||||
method_12nt8as_resume__action_51_resume_branch_51_2__true -->|next| method_12nt8as_resume__action_51_resume_branch_51_2__merge
|
||||
method_12nt8as_resume__action_54_resume_catch_54_3__catch -->|replaces paused CSS class with resume-failed on exception| method_12nt8as_resume__call_55_reconnectModal_classList_replace
|
||||
method_12nt8as_resume__call_50_Blazor_resumeCircuit -->|next| method_12nt8as_resume__action_51_branch_51__condition
|
||||
method_12nt8as_resume__call_52_location_reload -->|exception| method_12nt8as_resume__action_54_resume_catch_54_3__catch
|
||||
method_12nt8as_resume__call_55_reconnectModal_classList_replace -->|return| method_12nt8as_resume__implicit_return
|
||||
method_12nt8as_resume__entry -->|next| method_12nt8as_resume__action_49_resume_try_49_0__try
|
||||
```
|
||||
|
||||
### retryWhenDocumentBecomesVisible() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__call_61_retry[["retry"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_body[["async function retryWhenDocumentBecomesVisible() {"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_entry("Retries work after a recoverable failure")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_exit("Stops retrying when the attempt budget is exhausted or the call succeeds.")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__condition{"document.visibilityState === 'visible'"}
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__false("not visible -> no-op")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__merge("merge")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__true("visible -> call retry")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__condition{"document.visibilityState === \\"visible\\""}
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__false("false")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__merge("merge")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__true("true")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_await_61_3__await[["Waits for async work"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_body[["await retry();"]]
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_entry("Retries work after a recoverable failure")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_exit("Stops retrying when the attempt budget is exhausted or the call succeeds.")
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__entry(["retryWhenDocumentBecomesVisible entry"])
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__implicit_return(["return"])
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_body -->|retry| method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_entry
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_entry -->|retry| method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_body
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_entry -->|Stops retrying when the attempt budget is exhausted or the call succeeds.| method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_exit
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_exit -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__condition
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__condition -->|not visible -> no-op| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__false
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__condition -->|visible -> call retry| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__true
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__false -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__merge
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__merge -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__condition
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__true -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_guard_clause_60__merge
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__condition -->|false| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__false
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__condition -->|true| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__true
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__false -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__merge
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__merge -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_await_61_3__await
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__true -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_60_retrywhendocumentbecomesvisible_branch_60_1__merge
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_await_61_3__await -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_entry
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_body -->|retry| method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_entry
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_entry -->|retry| method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_body
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_entry -->|Stops retrying when the attempt budget is exhausted or the call succeeds.| method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_exit
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__action_61_retrywhendocumentbecomesvisible_retry_61_2__loop_exit -->|calls| method_1js2qbs_retrywhendocumentbecomesvisible__call_61_retry
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__call_61_retry -->|return| method_1js2qbs_retrywhendocumentbecomesvisible__implicit_return
|
||||
method_1js2qbs_retrywhendocumentbecomesvisible__entry -->|next| method_1js2qbs_retrywhendocumentbecomesvisible__action_59_retrywhendocumentbecomesvisible_retry_59_0__loop_entry
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 11 unresolved jumps.
|
||||
- Warning: execution-overview: diagram file_1wkle85_reconnectmodal_razor_js_execution_view exceeds preferred complexity thresholds (23 nodes, 22 edges).
|
||||
- Warning: control-flow: diagram method_1n08b99_handlereconnectstatechanged__fragment_diagram exceeds preferred complexity thresholds (39 nodes, 46 edges).
|
||||
- Warning: control-flow: diagram method_mdoq3y_retry__fragment_diagram exceeds preferred complexity thresholds (37 nodes, 42 edges).
|
||||
@@ -0,0 +1,57 @@
|
||||
# NexusReader.UI.Shared
|
||||
|
||||
- File ID: file:69lwdf:nexusreader-ui-shared-csproj
|
||||
- Path: NexusReader.UI.Shared/NexusReader.UI.Shared.csproj
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Project file for the NexusReader.UI.Shared Razor library; declares target framework, Blazor/SignalR/MediatR package dependencies and a project reference to the application layer to enable shared UI components and cross-layer types.
|
||||
|
||||
## Key Details
|
||||
|
||||
TargetFramework: net10.0; Nullable and ImplicitUsings enabled; GenerateRuntimeConfigurationFiles=true; PackageReferences: Microsoft.AspNetCore.Components.Authorization, Microsoft.AspNetCore.Components.Web, MediatR, Microsoft.AspNetCore.WebUtilities, Microsoft.Extensions.Logging.Abstractions, Microsoft.AspNetCore.SignalR.Client; ProjectReference to NexusReader.Application.
|
||||
|
||||
## Symbols
|
||||
|
||||
- No extracted symbols.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: ../NexusReader.Application/NexusReader.Application.csproj
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 0
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 0
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusReader.UI.Shared Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_69lwdf_nexusreader_ui_shared_csproj("NexusReader.UI.Shared")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,205 @@
|
||||
# Login
|
||||
|
||||
- File ID: file:csf9l7:login-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Account/Login.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI page for user login: renders email/password and Google auth UI, validates input, calls identity service to authenticate, and triggers a hidden form JS submission for cookie-based sign-in.
|
||||
|
||||
## Key Details
|
||||
|
||||
Uses an EditForm with DataAnnotations validation; on successful credentials-based login it invokes a JS helper to POST a hidden form for cookie-based sign-in; supports Google external login via forced navigation; maps query-supplied error codes to localized user messages.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Login: Razor UI page for user login: renders email/password and Google auth UI, validates input, calls identity service to authenticate, and triggers a hidden form JS submission for cookie-based sign-in.
|
||||
- OnInitialized(): Initializes component state by mapping an incoming query error code to a user-friendly error message.
|
||||
- HandleLogin(): Handles form submission: calls IdentityService.LoginAsync, sets submission state, handles success by invoking a JS helper to submit a hidden form (cookie sign-in), and surfaces errors.
|
||||
- HandleGoogleLogin(): Initiates external Google/OAuth login by navigating to the identity external-login route with forceLoad.
|
||||
- TogglePassword(): Toggles password visibility state used by the input field.
|
||||
- LoginModel: Holds credentials and remember-me flag submitted by the login form.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IIdentityService (injected)
|
||||
- dependency-target: Microsoft.AspNetCore.Components.NavigationManager (injected)
|
||||
- dependency-target: Microsoft.JSInterop.IJSRuntime (injected)
|
||||
- dependency-target: NexusReader.UI.Shared.Components.Atoms.NexusIcon (used in markup)
|
||||
- call-target: unknown
|
||||
- interaction-target: _errorMessage = result.Errors.FirstOrDefault()?.Message ?? "Nieprawidłowy e-mail lub hasło.";
|
||||
- interaction-target: Calls injected IIdentityService.LoginAsync to authenticate user; external project service (result examined afterwards).
|
||||
- interaction-target: Calls JS.InvokeVoidAsync('nexusAuth.submitLoginForm', 'nexusLoginForm', email, password, remember) to perform cookie-based sign-in (framework JS runtime call).
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 8
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 11 nodes, 12 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleLogin: 27 nodes, 29 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleGoogleLogin: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- TogglePassword: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Login Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1qurvhs_login("Login")
|
||||
file_csf9l7_login_razor("Login")
|
||||
method_1v0viho_oninitialized[["OnInitialized()"]]
|
||||
method_5hqhux_togglepassword[["TogglePassword()"]]
|
||||
method_ulfoov_handlegooglelogin[["HandleGoogleLogin()"]]
|
||||
method_uwsk5z_handlelogin[["HandleLogin()"]]
|
||||
type_gqgg0k_loginmodel[/"LoginModel"/]
|
||||
```
|
||||
|
||||
### Login Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1qurvhs_login("Login")
|
||||
method_1v0viho_oninitialized[["OnInitialized()"]]
|
||||
method_5hqhux_togglepassword[["TogglePassword()"]]
|
||||
method_ulfoov_handlegooglelogin[["HandleGoogleLogin()"]]
|
||||
method_uwsk5z_handlelogin[["HandleLogin()"]]
|
||||
unresolved_unresolved_112phtm_interaction_target{"Unresolved: Calls JS.InvokeVoidAsync('nexusAuth.submitLoginForm', 'nexusLoginForm', email, password, remember) to perform cookie-based sign-in (framework JS runtime call)."}
|
||||
unresolved_unresolved_181g12z_interaction_target{"Unresolved: Calls injected IIdentityService.LoginAsync to authenticate user; external project service (result examined afterwards)."}
|
||||
unresolved_unresolved_1b7ud7n_call_target{"Unresolved: LoginAsync"}
|
||||
unresolved_unresolved_nialgy_interaction_target{"Unresolved: _errorMessage = result.Errors.FirstOrDefault()?.Message ?? \\"Nieprawidłowy e-mail lub hasło.\\";"}
|
||||
class_1qurvhs_login -->|contains| method_1v0viho_oninitialized
|
||||
class_1qurvhs_login -->|contains| method_5hqhux_togglepassword
|
||||
class_1qurvhs_login -->|contains| method_ulfoov_handlegooglelogin
|
||||
class_1qurvhs_login -->|contains| method_uwsk5z_handlelogin
|
||||
class_1qurvhs_login -->|unresolved interaction| unresolved_unresolved_112phtm_interaction_target
|
||||
class_1qurvhs_login -->|unresolved interaction| unresolved_unresolved_181g12z_interaction_target
|
||||
class_1qurvhs_login -->|unresolved interaction| unresolved_unresolved_nialgy_interaction_target
|
||||
method_uwsk5z_handlelogin -->|unresolved call| unresolved_unresolved_1b7ud7n_call_target
|
||||
```
|
||||
|
||||
### OnInitialized() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__condition{"if (!string.IsNullOrEmpty(ErrorCode))"}
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__false("no-op")
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__merge("merge")
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__true("map error to message")
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__condition{"!string.IsNullOrEmpty(ErrorCode)"}
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__false("false")
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__merge("merge")
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__true("true")
|
||||
method_1v0viho_oninitialized__action_114_branch_switch_114__linear("Map ErrorCode to localized message")
|
||||
method_1v0viho_oninitialized__entry(["OnInitialized entry"])
|
||||
method_1v0viho_oninitialized__implicit_return(["return"])
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__condition -->|no-op| method_1v0viho_oninitialized__action_112_guard_clause_112__false
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__condition -->|map error to message| method_1v0viho_oninitialized__action_112_guard_clause_112__true
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__false -->|next| method_1v0viho_oninitialized__action_112_guard_clause_112__merge
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__merge -->|next| method_1v0viho_oninitialized__action_114_branch_switch_114__linear
|
||||
method_1v0viho_oninitialized__action_112_guard_clause_112__true -->|next| method_1v0viho_oninitialized__action_112_guard_clause_112__merge
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__condition -->|false| method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__false
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__condition -->|true| method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__true
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__false -->|next| method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__merge
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__merge -->|next| method_1v0viho_oninitialized__action_112_guard_clause_112__condition
|
||||
method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__true -->|next| method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__merge
|
||||
method_1v0viho_oninitialized__action_114_branch_switch_114__linear -->|return| method_1v0viho_oninitialized__implicit_return
|
||||
method_1v0viho_oninitialized__entry -->|next| method_1v0viho_oninitialized__action_112_oninitialized_branch_112_0__condition
|
||||
```
|
||||
|
||||
### HandleLogin() Control Flow
|
||||
|
||||
_Warnings: diagram method_uwsk5z_handlelogin__fragment_diagram exceeds preferred complexity thresholds (27 nodes, 29 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_uwsk5z_handlelogin__call_133_LoginAsync[["LoginAsync"]]
|
||||
method_uwsk5z_handlelogin__action_128_state_mutation_128__linear("Set submitting state")
|
||||
method_uwsk5z_handlelogin__action_131_handlelogin_try_131_0__try("Begins protected execution")
|
||||
method_uwsk5z_handlelogin__action_131_try_catch_finally_131__linear("Wrap remote login call")
|
||||
method_uwsk5z_handlelogin__action_133_handlelogin_await_133_1__await[["Waits for async work"]]
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__condition{"if (result.IsSuccess) ... else ..."}
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__false("failure -> set _errorMessage from result.Errors")
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__merge("merge")
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__true("success -> invoke JS to submit hidden form")
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__condition{"result.IsSuccess"}
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__false("false")
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__merge("merge")
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__true("true")
|
||||
method_uwsk5z_handlelogin__action_137_handlelogin_await_137_3__await[["Waits for async work"]]
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__condition{"Falls back to alternate path"}
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__false("otherwise")
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__merge("merge")
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__true("fallback")
|
||||
method_uwsk5z_handlelogin__action_144_error_handling_144__linear("Catch exceptions from login process")
|
||||
method_uwsk5z_handlelogin__action_144_handlelogin_catch_144_6__catch("catch Exception ex")
|
||||
method_uwsk5z_handlelogin__action_148_handlelogin_finally_148_7__finally("Runs cleanup or finalization")
|
||||
method_uwsk5z_handlelogin__action_150_state_mutation_150__linear("Clear submitting state")
|
||||
method_uwsk5z_handlelogin__entry(["HandleLogin entry"])
|
||||
method_uwsk5z_handlelogin__action_133_external_call_133__linear("Call identity service")
|
||||
method_uwsk5z_handlelogin__action_137_external_call_137__linear("Invoke JS helper for hidden form submission")
|
||||
method_uwsk5z_handlelogin__action_141_handlelogin_repository_read_141_5__linear[("Reads repository or persistence state")]
|
||||
method_uwsk5z_handlelogin__implicit_return(["return"])
|
||||
method_uwsk5z_handlelogin__action_128_state_mutation_128__linear -->|next| method_uwsk5z_handlelogin__action_131_try_catch_finally_131__linear
|
||||
method_uwsk5z_handlelogin__action_131_handlelogin_try_131_0__try -->|next| method_uwsk5z_handlelogin__action_133_handlelogin_await_133_1__await
|
||||
method_uwsk5z_handlelogin__action_131_try_catch_finally_131__linear -->|next| method_uwsk5z_handlelogin__action_131_handlelogin_try_131_0__try
|
||||
method_uwsk5z_handlelogin__action_133_external_call_133__linear -->|calls| method_uwsk5z_handlelogin__call_133_LoginAsync
|
||||
method_uwsk5z_handlelogin__action_133_handlelogin_await_133_1__await -->|next| method_uwsk5z_handlelogin__action_133_external_call_133__linear
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__condition -->|failure -> set _errorMessage from result.Errors| method_uwsk5z_handlelogin__action_134_branch_134__false
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__condition -->|success -> invoke JS to submit hidden form| method_uwsk5z_handlelogin__action_134_branch_134__true
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__false -->|next| method_uwsk5z_handlelogin__action_134_branch_134__merge
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__merge -->|next| method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__condition
|
||||
method_uwsk5z_handlelogin__action_134_branch_134__true -->|next| method_uwsk5z_handlelogin__action_134_branch_134__merge
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__condition -->|false| method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__false
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__condition -->|true| method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__true
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__false -->|next| method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__merge
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__merge -->|next| method_uwsk5z_handlelogin__action_137_handlelogin_await_137_3__await
|
||||
method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__true -->|next| method_uwsk5z_handlelogin__action_134_handlelogin_branch_134_2__merge
|
||||
method_uwsk5z_handlelogin__action_137_external_call_137__linear -->|fallback| method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__condition
|
||||
method_uwsk5z_handlelogin__action_137_handlelogin_await_137_3__await -->|next| method_uwsk5z_handlelogin__action_137_external_call_137__linear
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__condition -->|otherwise| method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__false
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__condition -->|fallback| method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__true
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__false -->|next| method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__merge
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__merge -->|next| method_uwsk5z_handlelogin__action_141_handlelogin_repository_read_141_5__linear
|
||||
method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__true -->|next| method_uwsk5z_handlelogin__action_139_handlelogin_fallback_139_4__merge
|
||||
method_uwsk5z_handlelogin__action_141_handlelogin_repository_read_141_5__linear -->|exception| method_uwsk5z_handlelogin__action_144_handlelogin_catch_144_6__catch
|
||||
method_uwsk5z_handlelogin__action_144_error_handling_144__linear -->|next| method_uwsk5z_handlelogin__action_148_handlelogin_finally_148_7__finally
|
||||
method_uwsk5z_handlelogin__action_144_handlelogin_catch_144_6__catch -->|next| method_uwsk5z_handlelogin__action_144_error_handling_144__linear
|
||||
method_uwsk5z_handlelogin__action_148_handlelogin_finally_148_7__finally -->|next| method_uwsk5z_handlelogin__action_150_state_mutation_150__linear
|
||||
method_uwsk5z_handlelogin__action_150_state_mutation_150__linear -->|return| method_uwsk5z_handlelogin__implicit_return
|
||||
method_uwsk5z_handlelogin__call_133_LoginAsync -->|next| method_uwsk5z_handlelogin__action_134_branch_134__condition
|
||||
method_uwsk5z_handlelogin__entry -->|next| method_uwsk5z_handlelogin__action_128_state_mutation_128__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_uwsk5z_handlelogin__fragment_diagram exceeds preferred complexity thresholds (27 nodes, 29 edges).
|
||||
@@ -0,0 +1,264 @@
|
||||
# Profile
|
||||
|
||||
- File ID: file:11crtur:profile-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Account/Profile.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI page that displays the authenticated user's profile, AI usage, metrics and account actions (upgrade/logout); fetches profile on init and renders conditional UI based on profile state.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component fetches profile on init, renders loading vs profile UI, computes AI token usage percent, supports logout via IdentityService and client-side navigation; upgrade action is a TODO placeholder.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Render (markup): Renders the profile UI, shows loading state when _profile is null, binds profile fields into the UI, and wires button click handlers.
|
||||
- OnInitializedAsync(): Lifecycle init method: asynchronously requests the current user's profile from IdentityService and updates component state.
|
||||
- CalculateProgress(): Calculates percentage of AI tokens used and clamps it to a maximum of 100.
|
||||
- HandleUpgrade(): Placeholder click handler intended to redirect user to billing/upgrade flow (not yet implemented).
|
||||
- HandleLogout(): Performs logout by calling IdentityService.LogoutAsync and then navigates to the logout form route.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- dependency-target: UserProfileDto (referenced model)
|
||||
- call-target: self
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- interaction-target: await IdentityService.GetProfileAsync()
|
||||
- interaction-target: await IdentityService.LogoutAsync()
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 12
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 7
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (markup): 23 nodes, 25 edges, 6 jumps, 0 unsupported constructs
|
||||
- OnInitializedAsync: 14 nodes, 15 edges, 1 jumps, 0 unsupported constructs
|
||||
- CalculateProgress: 11 nodes, 12 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleUpgrade: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleLogout: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Profile Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_11crtur_profile_razor("Profile")
|
||||
method_12nkjhc_handleupgrade[["HandleUpgrade()"]]
|
||||
method_1jxczws_handlelogout[["HandleLogout()"]]
|
||||
method_hkgxib_render_markup[["Render (markup)"]]
|
||||
method_k7fbfq_calculateprogress[["CalculateProgress()"]]
|
||||
method_z1n8tn_oninitializedasync[["OnInitializedAsync()"]]
|
||||
file_q8opk3_nexusicon_razor[/"NexusIcon"/]
|
||||
file_11crtur_profile_razor -->|NexusIcon| file_q8opk3_nexusicon_razor
|
||||
```
|
||||
|
||||
### Profile Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_11crtur_profile_razor("Profile")
|
||||
method_12nkjhc_handleupgrade[["HandleUpgrade()"]]
|
||||
method_1jxczws_handlelogout[["HandleLogout()"]]
|
||||
method_hkgxib_render_markup[["Render (markup)"]]
|
||||
method_k7fbfq_calculateprogress[["CalculateProgress()"]]
|
||||
method_z1n8tn_oninitializedasync[["OnInitializedAsync()"]]
|
||||
unresolved_unresolved_1ctw7yr_call_target{"Unresolved: CalculateProgress"}
|
||||
unresolved_unresolved_1gsymmw_interaction_target{"Unresolved: await IdentityService.GetProfileAsync()"}
|
||||
unresolved_unresolved_1il3ph9_interaction_target{"Unresolved: await IdentityService.LogoutAsync()"}
|
||||
unresolved_unresolved_1o2g49e_call_target{"Unresolved: NexusIcon"}
|
||||
unresolved_unresolved_m82hyv_call_target{"Unresolved: LogoutAsync"}
|
||||
unresolved_unresolved_sd5ygw_call_target{"Unresolved: GetProfileAsync"}
|
||||
file_11crtur_profile_razor -->|contains| method_12nkjhc_handleupgrade
|
||||
file_11crtur_profile_razor -->|contains| method_1jxczws_handlelogout
|
||||
file_11crtur_profile_razor -->|contains| method_hkgxib_render_markup
|
||||
file_11crtur_profile_razor -->|contains| method_k7fbfq_calculateprogress
|
||||
file_11crtur_profile_razor -->|contains| method_z1n8tn_oninitializedasync
|
||||
file_11crtur_profile_razor -->|unresolved interaction| unresolved_unresolved_1gsymmw_interaction_target
|
||||
file_11crtur_profile_razor -->|unresolved interaction| unresolved_unresolved_1il3ph9_interaction_target
|
||||
method_1jxczws_handlelogout -->|unresolved call| unresolved_unresolved_m82hyv_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1ctw7yr_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1o2g49e_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1o2g49e_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1o2g49e_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1o2g49e_call_target
|
||||
method_hkgxib_render_markup -->|unresolved call| unresolved_unresolved_1o2g49e_call_target
|
||||
method_z1n8tn_oninitializedasync -->|unresolved call| unresolved_unresolved_sd5ygw_call_target
|
||||
```
|
||||
|
||||
### Render (markup)() Control Flow
|
||||
|
||||
_Warnings: diagram method_hkgxib_render_markup__fragment_diagram exceeds preferred complexity thresholds (23 nodes, 25 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_hkgxib_render_markup__call_44_NexusIcon[["NexusIcon"]]
|
||||
method_hkgxib_render_markup__call_55_CalculateProgress[["CalculateProgress"]]
|
||||
method_hkgxib_render_markup__call_65_NexusIcon[["NexusIcon"]]
|
||||
method_hkgxib_render_markup__call_74_NexusIcon[["NexusIcon"]]
|
||||
method_hkgxib_render_markup__call_83_NexusIcon[["NexusIcon"]]
|
||||
method_hkgxib_render_markup__call_94_NexusIcon[["NexusIcon"]]
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__condition{"_profile == null"}
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__false("render-profile")
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__merge("merge")
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__true("render-loading")
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__condition{"_profile == null"}
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__false("false")
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__merge("merge")
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__true("true")
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__condition{"Falls back to alternate path"}
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__false("otherwise")
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__merge("merge")
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__true("fallback")
|
||||
method_hkgxib_render_markup__action_29_data_binding_29__linear("Bind profile fields into UI")
|
||||
method_hkgxib_render_markup__action_44_component_usage_44__linear("Uses NexusIcon components to render icons")
|
||||
method_hkgxib_render_markup__action_92_event_handler_attachment_92__linear("Hook UI buttons to component handlers")
|
||||
method_hkgxib_render_markup__entry(["Render (markup) entry"])
|
||||
method_hkgxib_render_markup__implicit_return(["return"])
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__condition -->|render-profile| method_hkgxib_render_markup__action_14_guard_clause_14__false
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__condition -->|render-loading| method_hkgxib_render_markup__action_14_guard_clause_14__true
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__false -->|next| method_hkgxib_render_markup__action_14_guard_clause_14__merge
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__merge -->|fallback| method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__condition
|
||||
method_hkgxib_render_markup__action_14_guard_clause_14__true -->|next| method_hkgxib_render_markup__action_14_guard_clause_14__merge
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__condition -->|false| method_hkgxib_render_markup__action_14_render_markup_branch_14_0__false
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__condition -->|true| method_hkgxib_render_markup__action_14_render_markup_branch_14_0__true
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__false -->|next| method_hkgxib_render_markup__action_14_render_markup_branch_14_0__merge
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__merge -->|next| method_hkgxib_render_markup__action_14_guard_clause_14__condition
|
||||
method_hkgxib_render_markup__action_14_render_markup_branch_14_0__true -->|next| method_hkgxib_render_markup__action_14_render_markup_branch_14_0__merge
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__condition -->|otherwise| method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__false
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__condition -->|fallback| method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__true
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__false -->|next| method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__merge
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__merge -->|next| method_hkgxib_render_markup__action_29_data_binding_29__linear
|
||||
method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__true -->|next| method_hkgxib_render_markup__action_21_render_markup_fallback_21_1__merge
|
||||
method_hkgxib_render_markup__action_29_data_binding_29__linear -->|next| method_hkgxib_render_markup__action_44_component_usage_44__linear
|
||||
method_hkgxib_render_markup__action_44_component_usage_44__linear -->|Name= robot , Size=24, Color=var --nexus-neon| method_hkgxib_render_markup__call_44_NexusIcon
|
||||
method_hkgxib_render_markup__action_92_event_handler_attachment_92__linear -->|Name= log-out , Size=18| method_hkgxib_render_markup__call_94_NexusIcon
|
||||
method_hkgxib_render_markup__call_44_NexusIcon -->|none| method_hkgxib_render_markup__call_55_CalculateProgress
|
||||
method_hkgxib_render_markup__call_55_CalculateProgress -->|Name= activity , Size=24, Color=var --nexus-neon| method_hkgxib_render_markup__call_65_NexusIcon
|
||||
method_hkgxib_render_markup__call_65_NexusIcon -->|Name= book-open , Size=14| method_hkgxib_render_markup__call_74_NexusIcon
|
||||
method_hkgxib_render_markup__call_74_NexusIcon -->|Name= shield , Size=24, Color=var --nexus-neon| method_hkgxib_render_markup__call_83_NexusIcon
|
||||
method_hkgxib_render_markup__call_83_NexusIcon -->|next| method_hkgxib_render_markup__action_92_event_handler_attachment_92__linear
|
||||
method_hkgxib_render_markup__call_94_NexusIcon -->|return| method_hkgxib_render_markup__implicit_return
|
||||
method_hkgxib_render_markup__entry -->|next| method_hkgxib_render_markup__action_14_render_markup_branch_14_0__condition
|
||||
```
|
||||
|
||||
### OnInitializedAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_z1n8tn_oninitializedasync__call_113_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_z1n8tn_oninitializedasync__action_113_oninitializedasync_await_113_0__await[["Waits for async work"]]
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__condition{"result.IsSuccess"}
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__false("no-op")
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__merge("merge")
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__true("assign-_profile")
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__condition{"result.IsSuccess"}
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__false("false")
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__merge("merge")
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__true("true")
|
||||
method_z1n8tn_oninitializedasync__action_118_state_change_118__linear("Trigger UI refresh")
|
||||
method_z1n8tn_oninitializedasync__entry(["OnInitializedAsync entry"])
|
||||
method_z1n8tn_oninitializedasync__action_113_external_call_113__linear("Fetch profile from identity service")
|
||||
method_z1n8tn_oninitializedasync__implicit_return(["return"])
|
||||
method_z1n8tn_oninitializedasync__action_113_external_call_113__linear -->|none| method_z1n8tn_oninitializedasync__call_113_GetProfileAsync
|
||||
method_z1n8tn_oninitializedasync__action_113_oninitializedasync_await_113_0__await -->|next| method_z1n8tn_oninitializedasync__action_113_external_call_113__linear
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__condition -->|no-op| method_z1n8tn_oninitializedasync__action_114_guard_clause_114__false
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__condition -->|assign-_profile| method_z1n8tn_oninitializedasync__action_114_guard_clause_114__true
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__false -->|next| method_z1n8tn_oninitializedasync__action_114_guard_clause_114__merge
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__merge -->|next| method_z1n8tn_oninitializedasync__action_118_state_change_118__linear
|
||||
method_z1n8tn_oninitializedasync__action_114_guard_clause_114__true -->|next| method_z1n8tn_oninitializedasync__action_114_guard_clause_114__merge
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__condition -->|false| method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__false
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__condition -->|true| method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__true
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__false -->|next| method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__merge
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__merge -->|next| method_z1n8tn_oninitializedasync__action_114_guard_clause_114__condition
|
||||
method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__true -->|next| method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__merge
|
||||
method_z1n8tn_oninitializedasync__action_118_state_change_118__linear -->|return| method_z1n8tn_oninitializedasync__implicit_return
|
||||
method_z1n8tn_oninitializedasync__call_113_GetProfileAsync -->|next| method_z1n8tn_oninitializedasync__action_114_oninitializedasync_branch_114_1__condition
|
||||
method_z1n8tn_oninitializedasync__entry -->|next| method_z1n8tn_oninitializedasync__action_113_oninitializedasync_await_113_0__await
|
||||
```
|
||||
|
||||
### CalculateProgress() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__condition{"_profile == null || _profile.AITokenLimit == 0"}
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__false("continue")
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__merge("merge")
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__true("exit")
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__condition{"_profile == null || _profile.AITokenLimit == 0"}
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__false("compute-percent")
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__merge("merge")
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__true("return-0")
|
||||
method_k7fbfq_calculateprogress__action_124_calculation_124__linear("Compute percentage and cap")
|
||||
method_k7fbfq_calculateprogress__entry(["CalculateProgress entry"])
|
||||
method_k7fbfq_calculateprogress__action_125_calculateprogress_return_125_1__return(["Returns result"])
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__condition -->|continue| method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__false
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__condition -->|exit| method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__true
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__false -->|next| method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__merge
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__merge -->|next| method_k7fbfq_calculateprogress__action_123_guard_clause_123__condition
|
||||
method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__true -->|next| method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__merge
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__condition -->|compute-percent| method_k7fbfq_calculateprogress__action_123_guard_clause_123__false
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__condition -->|return-0| method_k7fbfq_calculateprogress__action_123_guard_clause_123__true
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__false -->|next| method_k7fbfq_calculateprogress__action_123_guard_clause_123__merge
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__merge -->|next| method_k7fbfq_calculateprogress__action_124_calculation_124__linear
|
||||
method_k7fbfq_calculateprogress__action_123_guard_clause_123__true -->|next| method_k7fbfq_calculateprogress__action_123_guard_clause_123__merge
|
||||
method_k7fbfq_calculateprogress__action_124_calculation_124__linear -->|return| method_k7fbfq_calculateprogress__action_125_calculateprogress_return_125_1__return
|
||||
method_k7fbfq_calculateprogress__entry -->|next| method_k7fbfq_calculateprogress__action_123_calculateprogress_guard_clause_123_0__condition
|
||||
```
|
||||
|
||||
### HandleLogout() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1jxczws_handlelogout__call_135_LogoutAsync[["LogoutAsync"]]
|
||||
method_1jxczws_handlelogout__action_135_handlelogout_await_135_0__await[["Waits for async work"]]
|
||||
method_1jxczws_handlelogout__action_136_navigation_136__linear("Redirect to logout route")
|
||||
method_1jxczws_handlelogout__entry(["HandleLogout entry"])
|
||||
method_1jxczws_handlelogout__action_135_external_call_135__linear("Invoke logout on identity service")
|
||||
method_1jxczws_handlelogout__implicit_return(["return"])
|
||||
method_1jxczws_handlelogout__action_135_external_call_135__linear -->|none| method_1jxczws_handlelogout__call_135_LogoutAsync
|
||||
method_1jxczws_handlelogout__action_135_handlelogout_await_135_0__await -->|next| method_1jxczws_handlelogout__action_135_external_call_135__linear
|
||||
method_1jxczws_handlelogout__action_136_navigation_136__linear -->|return| method_1jxczws_handlelogout__implicit_return
|
||||
method_1jxczws_handlelogout__call_135_LogoutAsync -->|next| method_1jxczws_handlelogout__action_136_navigation_136__linear
|
||||
method_1jxczws_handlelogout__entry -->|next| method_1jxczws_handlelogout__action_135_handlelogout_await_135_0__await
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 7 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_hkgxib_render_markup__fragment_diagram exceeds preferred complexity thresholds (23 nodes, 25 edges).
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
# Register
|
||||
|
||||
- File ID: file:1hn70tz:register-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Account/Register.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor Razor page that renders a registration form, handles client-side validation and orchestrates user registration and immediate sign-in via injected identity service and a JS helper to complete cookie-based sign-in.
|
||||
|
||||
## Key Details
|
||||
|
||||
Uses an injected identity service for register/login and a JS helper to submit a hidden POST form to perform cookie-based sign-in; shows validation and error messages, and guards concurrent submissions with _isSubmitting.
|
||||
|
||||
## Symbols
|
||||
|
||||
- HandleRegister(): Handles the registration form submission: calls identity service to register, attempts immediate login, triggers a hidden form submission via JS to establish cookie-based auth, and surfaces errors to the UI.
|
||||
- RegisterModel: Model bound to the registration form with validation attributes for email and password fields.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- interaction-target: _errorMessage = regResult.Errors.FirstOrDefault()?.Message ?? "Rejestracja nie powiodła się.";
|
||||
- interaction-target: await IdentityService.RegisterAsync(email, password)
|
||||
- interaction-target: await IdentityService.LoginAsync(email, password)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 6
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 2
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- HandleRegister: 45 nodes, 50 edges, 2 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Register Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1hn70tz_register_razor("Register")
|
||||
method_mj67eu_handleregister[["HandleRegister()"]]
|
||||
file_q8opk3_nexusicon_razor[/"NexusIcon"/]
|
||||
type_gonkkw_registermodel[/"RegisterModel"/]
|
||||
file_1hn70tz_register_razor -->|NexusIcon| file_q8opk3_nexusicon_razor
|
||||
```
|
||||
|
||||
### Register Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_1hn70tz_register_razor("Register")
|
||||
method_mj67eu_handleregister[["HandleRegister()"]]
|
||||
unresolved_unresolved_1cgrf4i_interaction_target{"Unresolved: _errorMessage = regResult.Errors.FirstOrDefault()?.Message ?? \\"Rejestracja nie powiodła się.\\";"}
|
||||
unresolved_unresolved_1r49zo3_call_target{"Unresolved: LoginAsync"}
|
||||
unresolved_unresolved_1rtaa2f_call_target{"Unresolved: RegisterAsync"}
|
||||
unresolved_unresolved_1tsa04x_interaction_target{"Unresolved: await IdentityService.RegisterAsync(email, password)"}
|
||||
unresolved_unresolved_nopu59_interaction_target{"Unresolved: await IdentityService.LoginAsync(email, password)"}
|
||||
file_1hn70tz_register_razor -->|contains| method_mj67eu_handleregister
|
||||
file_1hn70tz_register_razor -->|unresolved interaction| unresolved_unresolved_1cgrf4i_interaction_target
|
||||
file_1hn70tz_register_razor -->|unresolved interaction| unresolved_unresolved_1tsa04x_interaction_target
|
||||
file_1hn70tz_register_razor -->|unresolved interaction| unresolved_unresolved_nopu59_interaction_target
|
||||
method_mj67eu_handleregister -->|unresolved call| unresolved_unresolved_1r49zo3_call_target
|
||||
method_mj67eu_handleregister -->|unresolved call| unresolved_unresolved_1rtaa2f_call_target
|
||||
```
|
||||
|
||||
### HandleRegister() Control Flow
|
||||
|
||||
_Warnings: diagram method_mj67eu_handleregister__fragment_diagram exceeds preferred complexity thresholds (45 nodes, 50 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_mj67eu_handleregister__call_91_RegisterAsync[["RegisterAsync"]]
|
||||
method_mj67eu_handleregister__call_94_LoginAsync[["LoginAsync"]]
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__condition{"Falls back to alternate path"}
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__false("otherwise")
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__merge("merge")
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__true("fallback")
|
||||
method_mj67eu_handleregister__action_102_navigation_102__linear("fallback navigate to login page")
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__condition{"Falls back to alternate path"}
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__false("otherwise")
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__merge("merge")
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__true("fallback")
|
||||
method_mj67eu_handleregister__action_107_set_error_107__linear("set registration error from service")
|
||||
method_mj67eu_handleregister__action_110_handleregister_catch_110_9__catch("catch Exception")
|
||||
method_mj67eu_handleregister__action_111_exception_handle_111__linear("generic error on exception")
|
||||
method_mj67eu_handleregister__action_114_handleregister_finally_114_10__finally("Runs cleanup or finalization")
|
||||
method_mj67eu_handleregister__action_116_state_change_116__linear("clear submitting flag")
|
||||
method_mj67eu_handleregister__action_86_state_change_86__linear("mark submitting")
|
||||
method_mj67eu_handleregister__action_87_state_change_87__linear("clear error")
|
||||
method_mj67eu_handleregister__action_89_handleregister_try_89_0__try("Begins protected execution")
|
||||
method_mj67eu_handleregister__action_89_try_catch_finally_89__linear("wraps registration and login")
|
||||
method_mj67eu_handleregister__action_91_handleregister_await_91_1__await[["Waits for async work"]]
|
||||
method_mj67eu_handleregister__action_92_branch_92__condition{"regResult.IsSuccess"}
|
||||
method_mj67eu_handleregister__action_92_branch_92__false("failure -> show error")
|
||||
method_mj67eu_handleregister__action_92_branch_92__merge("merge")
|
||||
method_mj67eu_handleregister__action_92_branch_92__true("success -> attempt login")
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__condition{"regResult.IsSuccess"}
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__false("false")
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__merge("merge")
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__true("true")
|
||||
method_mj67eu_handleregister__action_94_handleregister_await_94_3__await[["Waits for async work"]]
|
||||
method_mj67eu_handleregister__action_95_branch_95__condition{"loginResult.IsSuccess"}
|
||||
method_mj67eu_handleregister__action_95_branch_95__false("failure -> navigate to login page")
|
||||
method_mj67eu_handleregister__action_95_branch_95__merge("merge")
|
||||
method_mj67eu_handleregister__action_95_branch_95__true("success -> submit hidden form via JS")
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__condition{"loginResult.IsSuccess"}
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__false("false")
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__merge("merge")
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__true("true")
|
||||
method_mj67eu_handleregister__action_98_external_js_98__linear("submit hidden login form for cookie sign-in")
|
||||
method_mj67eu_handleregister__action_98_handleregister_await_98_5__await[["Waits for async work"]]
|
||||
method_mj67eu_handleregister__entry(["HandleRegister entry"])
|
||||
method_mj67eu_handleregister__action_107_handleregister_repository_read_107_8__linear[("Reads repository or persistence state")]
|
||||
method_mj67eu_handleregister__action_91_external_call_91__linear("register user")
|
||||
method_mj67eu_handleregister__action_94_external_call_94__linear("login user (programmatic)")
|
||||
method_mj67eu_handleregister__implicit_return(["return"])
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__condition -->|otherwise| method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__false
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__condition -->|fallback| method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__true
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__false -->|next| method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__merge
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__merge -->|next| method_mj67eu_handleregister__action_102_navigation_102__linear
|
||||
method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__true -->|next| method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__merge
|
||||
method_mj67eu_handleregister__action_102_navigation_102__linear -->|fallback| method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__condition
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__condition -->|otherwise| method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__false
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__condition -->|fallback| method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__true
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__false -->|next| method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__merge
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__merge -->|next| method_mj67eu_handleregister__action_107_set_error_107__linear
|
||||
method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__true -->|next| method_mj67eu_handleregister__action_105_handleregister_fallback_105_7__merge
|
||||
method_mj67eu_handleregister__action_107_handleregister_repository_read_107_8__linear -->|exception| method_mj67eu_handleregister__action_110_handleregister_catch_110_9__catch
|
||||
method_mj67eu_handleregister__action_107_set_error_107__linear -->|next| method_mj67eu_handleregister__action_107_handleregister_repository_read_107_8__linear
|
||||
method_mj67eu_handleregister__action_110_handleregister_catch_110_9__catch -->|next| method_mj67eu_handleregister__action_111_exception_handle_111__linear
|
||||
method_mj67eu_handleregister__action_111_exception_handle_111__linear -->|next| method_mj67eu_handleregister__action_114_handleregister_finally_114_10__finally
|
||||
method_mj67eu_handleregister__action_114_handleregister_finally_114_10__finally -->|next| method_mj67eu_handleregister__action_116_state_change_116__linear
|
||||
method_mj67eu_handleregister__action_116_state_change_116__linear -->|return| method_mj67eu_handleregister__implicit_return
|
||||
method_mj67eu_handleregister__action_86_state_change_86__linear -->|next| method_mj67eu_handleregister__action_87_state_change_87__linear
|
||||
method_mj67eu_handleregister__action_87_state_change_87__linear -->|next| method_mj67eu_handleregister__action_89_try_catch_finally_89__linear
|
||||
method_mj67eu_handleregister__action_89_handleregister_try_89_0__try -->|next| method_mj67eu_handleregister__action_91_handleregister_await_91_1__await
|
||||
method_mj67eu_handleregister__action_89_try_catch_finally_89__linear -->|next| method_mj67eu_handleregister__action_89_handleregister_try_89_0__try
|
||||
method_mj67eu_handleregister__action_91_external_call_91__linear -->|calls| method_mj67eu_handleregister__call_91_RegisterAsync
|
||||
method_mj67eu_handleregister__action_91_handleregister_await_91_1__await -->|next| method_mj67eu_handleregister__action_91_external_call_91__linear
|
||||
method_mj67eu_handleregister__action_92_branch_92__condition -->|failure -> show error| method_mj67eu_handleregister__action_92_branch_92__false
|
||||
method_mj67eu_handleregister__action_92_branch_92__condition -->|success -> attempt login| method_mj67eu_handleregister__action_92_branch_92__true
|
||||
method_mj67eu_handleregister__action_92_branch_92__false -->|next| method_mj67eu_handleregister__action_92_branch_92__merge
|
||||
method_mj67eu_handleregister__action_92_branch_92__merge -->|next| method_mj67eu_handleregister__action_92_handleregister_branch_92_2__condition
|
||||
method_mj67eu_handleregister__action_92_branch_92__true -->|next| method_mj67eu_handleregister__action_92_branch_92__merge
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__condition -->|false| method_mj67eu_handleregister__action_92_handleregister_branch_92_2__false
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__condition -->|true| method_mj67eu_handleregister__action_92_handleregister_branch_92_2__true
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__false -->|next| method_mj67eu_handleregister__action_92_handleregister_branch_92_2__merge
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__merge -->|next| method_mj67eu_handleregister__action_94_handleregister_await_94_3__await
|
||||
method_mj67eu_handleregister__action_92_handleregister_branch_92_2__true -->|next| method_mj67eu_handleregister__action_92_handleregister_branch_92_2__merge
|
||||
method_mj67eu_handleregister__action_94_external_call_94__linear -->|calls| method_mj67eu_handleregister__call_94_LoginAsync
|
||||
method_mj67eu_handleregister__action_94_handleregister_await_94_3__await -->|next| method_mj67eu_handleregister__action_94_external_call_94__linear
|
||||
method_mj67eu_handleregister__action_95_branch_95__condition -->|failure -> navigate to login page| method_mj67eu_handleregister__action_95_branch_95__false
|
||||
method_mj67eu_handleregister__action_95_branch_95__condition -->|success -> submit hidden form via JS| method_mj67eu_handleregister__action_95_branch_95__true
|
||||
method_mj67eu_handleregister__action_95_branch_95__false -->|next| method_mj67eu_handleregister__action_95_branch_95__merge
|
||||
method_mj67eu_handleregister__action_95_branch_95__merge -->|next| method_mj67eu_handleregister__action_95_handleregister_branch_95_4__condition
|
||||
method_mj67eu_handleregister__action_95_branch_95__true -->|next| method_mj67eu_handleregister__action_95_branch_95__merge
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__condition -->|false| method_mj67eu_handleregister__action_95_handleregister_branch_95_4__false
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__condition -->|true| method_mj67eu_handleregister__action_95_handleregister_branch_95_4__true
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__false -->|next| method_mj67eu_handleregister__action_95_handleregister_branch_95_4__merge
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__merge -->|next| method_mj67eu_handleregister__action_98_handleregister_await_98_5__await
|
||||
method_mj67eu_handleregister__action_95_handleregister_branch_95_4__true -->|next| method_mj67eu_handleregister__action_95_handleregister_branch_95_4__merge
|
||||
method_mj67eu_handleregister__action_98_external_js_98__linear -->|fallback| method_mj67eu_handleregister__action_100_handleregister_fallback_100_6__condition
|
||||
method_mj67eu_handleregister__action_98_handleregister_await_98_5__await -->|next| method_mj67eu_handleregister__action_98_external_js_98__linear
|
||||
method_mj67eu_handleregister__call_91_RegisterAsync -->|next| method_mj67eu_handleregister__action_92_branch_92__condition
|
||||
method_mj67eu_handleregister__call_94_LoginAsync -->|next| method_mj67eu_handleregister__action_95_branch_95__condition
|
||||
method_mj67eu_handleregister__entry -->|next| method_mj67eu_handleregister__action_86_state_change_86__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 2 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_mj67eu_handleregister__fragment_diagram exceeds preferred complexity thresholds (45 nodes, 50 edges).
|
||||
@@ -0,0 +1,120 @@
|
||||
# Dashboard
|
||||
|
||||
- File ID: file:1b5rrku:dashboard-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Dashboard.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI page component that renders the user dashboard and, on initialization, loads the current user's profile from an injected identity service.
|
||||
|
||||
## Key Details
|
||||
|
||||
Razor page at route '/' (line 1) marked [Authorize] (line 8); injects IIdentityService (line 6) and NavigationManager (line 7). Primary runtime behavior is OnInitializedAsync fetching and assigning _profile (lines 90-97). UI composes CurrentReadingWidget and NexusIcon components.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Dashboard: Razor UI page component that renders the user dashboard and, on initialization, loads the current user's profile from an injected identity service.
|
||||
- OnInitializedAsync(): Component lifecycle method: asynchronously fetches the current user's profile when the dashboard initializes and stores it in component state.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Components/Organisms/CurrentReadingWidget.razor
|
||||
- imports NexusReader.UI.Shared/Components/Atoms/NexusIcon.razor
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- call-target: unknown
|
||||
- interaction-target: await IdentityService.GetProfileAsync()
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 4
|
||||
- Unresolved references: 3
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitializedAsync: 14 nodes, 15 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Dashboard Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_140cn9s_dashboard("Dashboard")
|
||||
file_1b5rrku_dashboard_razor("Dashboard")
|
||||
method_lqrlha_oninitializedasync[["OnInitializedAsync()"]]
|
||||
file_1uvdam9_currentreadingwidget_razor[/"CurrentReadingWidget"/]
|
||||
file_q8opk3_nexusicon_razor[/"NexusIcon"/]
|
||||
file_1b5rrku_dashboard_razor -->|CurrentReadingWidget| file_1uvdam9_currentreadingwidget_razor
|
||||
file_1b5rrku_dashboard_razor -->|NexusIcon| file_q8opk3_nexusicon_razor
|
||||
```
|
||||
|
||||
### Dashboard Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_140cn9s_dashboard("Dashboard")
|
||||
method_lqrlha_oninitializedasync[["OnInitializedAsync()"]]
|
||||
unresolved_unresolved_1m34u60_call_target{"Unresolved: GetProfileAsync"}
|
||||
unresolved_unresolved_1w4tpao_interaction_target{"Unresolved: await IdentityService.GetProfileAsync()"}
|
||||
class_140cn9s_dashboard -->|contains| method_lqrlha_oninitializedasync
|
||||
class_140cn9s_dashboard -->|unresolved interaction| unresolved_unresolved_1w4tpao_interaction_target
|
||||
method_lqrlha_oninitializedasync -->|unresolved call| unresolved_unresolved_1m34u60_call_target
|
||||
```
|
||||
|
||||
### OnInitializedAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_lqrlha_oninitializedasync__call_92_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_lqrlha_oninitializedasync__action_92_oninitializedasync_await_92_0__await[["Waits for async work"]]
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__condition{"result.IsSuccess"}
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__false("no-op on failure")
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__merge("merge")
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__true("set _profile")
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__condition{"result.IsSuccess"}
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__false("false")
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__merge("merge")
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__true("true")
|
||||
method_lqrlha_oninitializedasync__action_95_state_mutation_95__linear("Store profile in local state")
|
||||
method_lqrlha_oninitializedasync__entry(["OnInitializedAsync entry"])
|
||||
method_lqrlha_oninitializedasync__action_92_external_call_92__linear("Fetch user profile")
|
||||
method_lqrlha_oninitializedasync__implicit_return(["return"])
|
||||
method_lqrlha_oninitializedasync__action_92_external_call_92__linear -->|no parameters awaited call to retrieve user profile result| method_lqrlha_oninitializedasync__call_92_GetProfileAsync
|
||||
method_lqrlha_oninitializedasync__action_92_oninitializedasync_await_92_0__await -->|next| method_lqrlha_oninitializedasync__action_92_external_call_92__linear
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__condition -->|no-op on failure| method_lqrlha_oninitializedasync__action_93_guard_clause_93__false
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__condition -->|set _profile| method_lqrlha_oninitializedasync__action_93_guard_clause_93__true
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__false -->|next| method_lqrlha_oninitializedasync__action_93_guard_clause_93__merge
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__merge -->|next| method_lqrlha_oninitializedasync__action_95_state_mutation_95__linear
|
||||
method_lqrlha_oninitializedasync__action_93_guard_clause_93__true -->|next| method_lqrlha_oninitializedasync__action_93_guard_clause_93__merge
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__condition -->|false| method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__false
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__condition -->|true| method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__true
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__false -->|next| method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__merge
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__merge -->|next| method_lqrlha_oninitializedasync__action_93_guard_clause_93__condition
|
||||
method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__true -->|next| method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__merge
|
||||
method_lqrlha_oninitializedasync__action_95_state_mutation_95__linear -->|return| method_lqrlha_oninitializedasync__implicit_return
|
||||
method_lqrlha_oninitializedasync__call_92_GetProfileAsync -->|next| method_lqrlha_oninitializedasync__action_93_oninitializedasync_branch_93_1__condition
|
||||
method_lqrlha_oninitializedasync__entry -->|next| method_lqrlha_oninitializedasync__action_92_oninitializedasync_await_92_0__await
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
@@ -0,0 +1,424 @@
|
||||
# Home
|
||||
|
||||
- File ID: file:h6mj95:home-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Home.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI page for the Nexus E-Reader reader experience: mounts the ReaderCanvas, handles navigation/book selection from route/query or user profile, wires UI events (quiz, focus mode), initializes JS focus interop, and cleans up resources on disposal.
|
||||
|
||||
## Key Details
|
||||
|
||||
Wires UI-level services and events to coordinate which book/chapter is active (route or profile fallback), initializes focus-mode and optional JS keyboard listener on first render, and ensures proper event unsubscription and JS interop disposal in DisposeAsync to avoid leaks.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Home: Razor UI page for the Nexus E-Reader reader experience: mounts the ReaderCanvas, handles navigation/book selection from route/query or user profile, wires UI events (quiz, focus mode), initializes JS focus interop, and cleans up resources on disposal.
|
||||
- OnInitialized(): Subscribe to UI-level events for quiz requests and focus-mode changes when the component is initialized.
|
||||
- OnParametersSetAsync(): React to route/query changes: parse chapter query, determine BookId from route or fallback to last-read book from profile, and instruct navigation service to load the correct book/chapter.
|
||||
- OnAfterRenderAsync(): On first render initialize focus-mode service and attempt to attach a JS keyboard listener, updating state afterwards.
|
||||
- OnFocusKeypressed(): JS-invokable handler called when the focus-mode key is pressed: toggles focus mode and refreshes UI.
|
||||
- HandleNodeSelected(): Scroll the embedded ReaderCanvas to a particular node when a node selection event occurs.
|
||||
- HandleQuizRequestedAsync(): Receive quiz request events, set active quiz block id and request UI update.
|
||||
- HandleUpdate(): Request a UI update from other subscribers (used as an event handler).
|
||||
- DisposeAsync(): Unsubscribe event handlers, detach JS keyboard listener if present, dispose JS interop objects and DotNetObjectReference when the component is disposed.
|
||||
- BookId: Component Parameter holding optional route BookId (Guid?).
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Services/IQuizStateService.cs
|
||||
- imports NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- imports NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
|
||||
## Calls
|
||||
|
||||
- calls NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- calls NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- calls NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- calls NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- dependency-target: NexusReader.UI.Shared/Components/ReaderCanvas.razor
|
||||
- call-target: NexusReader.UI.Shared/Services/IIdentityService.cs
|
||||
- call-target: NexusReader.UI.Shared/Components/ReaderCanvas.razor
|
||||
- call-target: NexusReader.UI.Shared/Services/IQuizStateService.cs
|
||||
- call-target: NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- call-target: NexusReader.UI.Shared/Components/ReaderCanvas.razor
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 10
|
||||
- Executable symbols: 8
|
||||
- Executable symbols with control flow: 8
|
||||
- Grounded edges: 17
|
||||
- Unresolved references: 7
|
||||
- Control-flow fragments: 8
|
||||
- Unresolved jumps: 5
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 8
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitialized: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnParametersSetAsync: 39 nodes, 46 edges, 3 jumps, 0 unsupported constructs
|
||||
- OnAfterRenderAsync: 18 nodes, 19 edges, 1 jumps, 0 unsupported constructs
|
||||
- OnFocusKeypressed: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleNodeSelected: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleQuizRequestedAsync: 5 nodes, 4 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleUpdate: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- DisposeAsync: 21 nodes, 22 edges, 3 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Home Neighborhood
|
||||
|
||||
_Warnings: diagram file_h6mj95_home_razor_neighborhood_view exceeds preferred complexity thresholds (17 nodes, 7 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_jfh85m_home("Home")
|
||||
file_h6mj95_home_razor("Home")
|
||||
method_1ib6h4r_handlequizrequestedasync[["HandleQuizRequestedAsync()"]]
|
||||
method_1l4808t_handleupdate[["HandleUpdate()"]]
|
||||
method_1r63qu7_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1yypduz_oninitialized[["OnInitialized()"]]
|
||||
method_6vyv4w_handlenodeselected[["HandleNodeSelected()"]]
|
||||
method_99k8q7_disposeasync[["DisposeAsync()"]]
|
||||
method_p5ejmn_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_whfss9_onfocuskeypressed[["OnFocusKeypressed()"]]
|
||||
file_savadk_iquizstateservice_cs[/"IQuizStateService"/]
|
||||
file_wgkae9_ireadernavigationservice_cs[/"IReaderNavigationService"/]
|
||||
file_xs3ks1_ifocusmodeservice_cs[/"IFocusModeService"/]
|
||||
method_17j6y8x_toggleasync[/"IFocusModeService"/]
|
||||
method_4o7htd_setbook[/"IReaderNavigationService"/]
|
||||
method_fpl7t6_initializeasync[/"IFocusModeService"/]
|
||||
type_1t001js_bookid[/"BookId"/]
|
||||
file_h6mj95_home_razor -->|IQuizStateService| file_savadk_iquizstateservice_cs
|
||||
file_h6mj95_home_razor -->|IReaderNavigationService| file_wgkae9_ireadernavigationservice_cs
|
||||
file_h6mj95_home_razor -->|IFocusModeService| file_xs3ks1_ifocusmodeservice_cs
|
||||
method_1r63qu7_onafterrenderasync -->|IFocusModeService| method_fpl7t6_initializeasync
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_whfss9_onfocuskeypressed -->|IFocusModeService| method_17j6y8x_toggleasync
|
||||
```
|
||||
|
||||
### Home Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_jfh85m_home("Home")
|
||||
method_1ib6h4r_handlequizrequestedasync[["HandleQuizRequestedAsync()"]]
|
||||
method_1l4808t_handleupdate[["HandleUpdate()"]]
|
||||
method_1r63qu7_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1yypduz_oninitialized[["OnInitialized()"]]
|
||||
method_6vyv4w_handlenodeselected[["HandleNodeSelected()"]]
|
||||
method_99k8q7_disposeasync[["DisposeAsync()"]]
|
||||
method_p5ejmn_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_whfss9_onfocuskeypressed[["OnFocusKeypressed()"]]
|
||||
method_17j6y8x_toggleasync[/"IFocusModeService"/]
|
||||
method_4o7htd_setbook[/"IReaderNavigationService"/]
|
||||
method_fpl7t6_initializeasync[/"IFocusModeService"/]
|
||||
unresolved_unresolved_116y6m9_call_target{"Unresolved: ScrollToNodeAsync"}
|
||||
unresolved_unresolved_40zgiz_call_target{"Unresolved: Dispose/interop cleanup (via JS module)"}
|
||||
unresolved_unresolved_dhtaal_call_target{"Unresolved: OnFocusModeChanged - event unsubscription"}
|
||||
unresolved_unresolved_ftsewk_call_target{"Unresolved: GetProfileAsync"}
|
||||
unresolved_unresolved_ld2maq_call_target{"Unresolved: OnQuizRequested - event unsubscription"}
|
||||
class_jfh85m_home -->|contains| method_1ib6h4r_handlequizrequestedasync
|
||||
class_jfh85m_home -->|contains| method_1l4808t_handleupdate
|
||||
class_jfh85m_home -->|contains| method_1r63qu7_onafterrenderasync
|
||||
class_jfh85m_home -->|contains| method_1yypduz_oninitialized
|
||||
class_jfh85m_home -->|contains| method_6vyv4w_handlenodeselected
|
||||
class_jfh85m_home -->|contains| method_99k8q7_disposeasync
|
||||
class_jfh85m_home -->|contains| method_p5ejmn_onparameterssetasync
|
||||
class_jfh85m_home -->|contains| method_whfss9_onfocuskeypressed
|
||||
method_1r63qu7_onafterrenderasync -->|IFocusModeService| method_fpl7t6_initializeasync
|
||||
method_6vyv4w_handlenodeselected -->|unresolved call| unresolved_unresolved_116y6m9_call_target
|
||||
method_99k8q7_disposeasync -->|unresolved call| unresolved_unresolved_40zgiz_call_target
|
||||
method_99k8q7_disposeasync -->|unresolved call| unresolved_unresolved_dhtaal_call_target
|
||||
method_99k8q7_disposeasync -->|unresolved call| unresolved_unresolved_ld2maq_call_target
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_p5ejmn_onparameterssetasync -->|unresolved call| unresolved_unresolved_ftsewk_call_target
|
||||
method_whfss9_onfocuskeypressed -->|IFocusModeService| method_17j6y8x_toggleasync
|
||||
```
|
||||
|
||||
### Home Method Interactions
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
method_1ib6h4r_handlequizrequestedasync[["HandleQuizRequestedAsync()"]]
|
||||
method_1l4808t_handleupdate[["HandleUpdate()"]]
|
||||
method_1r63qu7_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
method_1yypduz_oninitialized[["OnInitialized()"]]
|
||||
method_6vyv4w_handlenodeselected[["HandleNodeSelected()"]]
|
||||
method_99k8q7_disposeasync[["DisposeAsync()"]]
|
||||
method_p5ejmn_onparameterssetasync[["OnParametersSetAsync()"]]
|
||||
method_whfss9_onfocuskeypressed[["OnFocusKeypressed()"]]
|
||||
method_17j6y8x_toggleasync("IFocusModeService")
|
||||
method_4o7htd_setbook("IReaderNavigationService")
|
||||
method_fpl7t6_initializeasync("IFocusModeService")
|
||||
method_1r63qu7_onafterrenderasync -->|IFocusModeService| method_fpl7t6_initializeasync
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_whfss9_onfocuskeypressed -->|IFocusModeService| method_17j6y8x_toggleasync
|
||||
```
|
||||
|
||||
### Home Application Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1r63qu7_onafterrenderasync(["OnAfterRenderAsync()"])
|
||||
method_p5ejmn_onparameterssetasync(["OnParametersSetAsync()"])
|
||||
method_4o7htd_setbook("setbook")
|
||||
method_fpl7t6_initializeasync("initializeasync")
|
||||
method_1r63qu7_onafterrenderasync -->|IFocusModeService| method_fpl7t6_initializeasync
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
method_p5ejmn_onparameterssetasync -->|IReaderNavigationService| method_4o7htd_setbook
|
||||
```
|
||||
|
||||
### OnParametersSetAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_p5ejmn_onparameterssetasync__fragment_diagram exceeds preferred complexity thresholds (39 nodes, 46 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_p5ejmn_onparameterssetasync__call_49_SetBook[["SetBook"]]
|
||||
method_p5ejmn_onparameterssetasync__call_55_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_p5ejmn_onparameterssetasync__call_58_SetBook[["SetBook"]]
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__condition{"Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue(\\"chapter\\", out var chapterValue)"}
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__false("false")
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__true("true")
|
||||
method_p5ejmn_onparameterssetasync__action_40_parse_40__linear("Query parsing")
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__condition{"BookId.HasValue && BookId != Guid.Empty"}
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__false("skip")
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__true("maybe SetBook")
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__condition{"BookId.HasValue && BookId.Value != Guid.Empty"}
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__false("false")
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__true("true")
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__condition{"NavService.CurrentEbookId != BookId.Value || NavService.CurrentChapterIndex != chapterIndex"}
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__false("false")
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__true("true")
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__condition{"NavService.CurrentEbookId == Guid.Empty and no BookId in URL"}
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__false("do nothing")
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__true("load last read")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__condition{"NavService.CurrentEbookId == Guid.Empty"}
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__false("false")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__true("true")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__condition{"Falls back to alternate path"}
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__false("otherwise")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__true("fallback")
|
||||
method_p5ejmn_onparameterssetasync__action_55_onparameterssetasync_await_55_5__await[["Waits for async work"]]
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__condition{"profileResult.IsSuccess && profileResult.Value.LastReadBook != null"}
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__false("false")
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__merge("merge")
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__true("true")
|
||||
method_p5ejmn_onparameterssetasync__entry(["OnParametersSetAsync entry"])
|
||||
method_p5ejmn_onparameterssetasync__implicit_return(["return"])
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__condition -->|false| method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__false
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__condition -->|true| method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__true
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__false -->|next| method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__merge
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__merge -->|next| method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__condition
|
||||
method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__true -->|next| method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__merge
|
||||
method_p5ejmn_onparameterssetasync__action_40_parse_40__linear -->|next| method_p5ejmn_onparameterssetasync__action_40_onparameterssetasync_branch_40_0__condition
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__condition -->|skip| method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__false
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__condition -->|maybe SetBook| method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__true
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__false -->|next| method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__merge
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__merge -->|next| method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__condition
|
||||
method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__true -->|next| method_p5ejmn_onparameterssetasync__action_45_guard_clause_45__merge
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__condition -->|false| method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__false
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__condition -->|true| method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__true
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__false -->|next| method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__merge
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__merge -->|next| method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__condition
|
||||
method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__true -->|next| method_p5ejmn_onparameterssetasync__action_45_onparameterssetasync_branch_45_1__merge
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__condition -->|false| method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__false
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__condition -->|true| method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__true
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__false -->|next| method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__merge
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__merge -->|BookId.Value, chapterIndex from query| method_p5ejmn_onparameterssetasync__call_49_SetBook
|
||||
method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__true -->|next| method_p5ejmn_onparameterssetasync__action_47_onparameterssetasync_branch_47_2__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__condition -->|do nothing| method_p5ejmn_onparameterssetasync__action_52_branch_52__false
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__condition -->|load last read| method_p5ejmn_onparameterssetasync__action_52_branch_52__true
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__false -->|next| method_p5ejmn_onparameterssetasync__action_52_branch_52__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__merge -->|next| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__condition
|
||||
method_p5ejmn_onparameterssetasync__action_52_branch_52__true -->|next| method_p5ejmn_onparameterssetasync__action_52_branch_52__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__condition -->|false| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__false
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__condition -->|true| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__true
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__false -->|next| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__merge -->|next| method_p5ejmn_onparameterssetasync__action_55_onparameterssetasync_await_55_5__await
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__true -->|next| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_branch_52_3__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__condition -->|otherwise| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__false
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__condition -->|fallback| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__true
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__false -->|next| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__merge
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__merge -->|next| method_p5ejmn_onparameterssetasync__action_52_branch_52__condition
|
||||
method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__true -->|next| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__merge
|
||||
method_p5ejmn_onparameterssetasync__action_55_onparameterssetasync_await_55_5__await -->|none| method_p5ejmn_onparameterssetasync__call_55_GetProfileAsync
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__condition -->|false| method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__false
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__condition -->|true| method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__true
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__false -->|next| method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__merge
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__merge -->|profileResult.Value.LastReadBook.Id and computed chapter index| method_p5ejmn_onparameterssetasync__call_58_SetBook
|
||||
method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__true -->|next| method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__merge
|
||||
method_p5ejmn_onparameterssetasync__call_49_SetBook -->|fallback| method_p5ejmn_onparameterssetasync__action_52_onparameterssetasync_fallback_52_4__condition
|
||||
method_p5ejmn_onparameterssetasync__call_55_GetProfileAsync -->|next| method_p5ejmn_onparameterssetasync__action_56_onparameterssetasync_branch_56_6__condition
|
||||
method_p5ejmn_onparameterssetasync__call_58_SetBook -->|return| method_p5ejmn_onparameterssetasync__implicit_return
|
||||
method_p5ejmn_onparameterssetasync__entry -->|next| method_p5ejmn_onparameterssetasync__action_40_parse_40__linear
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1r63qu7_onafterrenderasync__call_67_InitializeAsync[["InitializeAsync"]]
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__condition{"firstRender == true"}
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__false("skip")
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__merge("merge")
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__true("initialize")
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__condition{"firstRender"}
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__false("false")
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__merge("merge")
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__true("true")
|
||||
method_1r63qu7_onafterrenderasync__action_67_onafterrenderasync_await_67_1__await[["Waits for async work"]]
|
||||
method_1r63qu7_onafterrenderasync__action_68_onafterrenderasync_try_68_2__try("Begins protected execution")
|
||||
method_1r63qu7_onafterrenderasync__action_68_try_catch_68__linear("Dynamic JS interop load")
|
||||
method_1r63qu7_onafterrenderasync__action_69_onafterrenderasync_await_69_3__await[["Waits for async work"]]
|
||||
method_1r63qu7_onafterrenderasync__action_71_onafterrenderasync_await_71_4__await[["Waits for async work"]]
|
||||
method_1r63qu7_onafterrenderasync__action_72_onafterrenderasync_catch_72_5__catch("Handles exception path")
|
||||
method_1r63qu7_onafterrenderasync__action_73_state_change_73__linear("Force UI refresh")
|
||||
method_1r63qu7_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_1r63qu7_onafterrenderasync__implicit_return(["return"])
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__condition -->|skip| method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__false
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__condition -->|initialize| method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__true
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__false -->|next| method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__merge
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__merge -->|next| method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__condition
|
||||
method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__true -->|next| method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__merge
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__condition -->|false| method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__false
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__condition -->|true| method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__true
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__false -->|next| method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__merge
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__merge -->|next| method_1r63qu7_onafterrenderasync__action_67_onafterrenderasync_await_67_1__await
|
||||
method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__true -->|next| method_1r63qu7_onafterrenderasync__action_65_onafterrenderasync_branch_65_0__merge
|
||||
method_1r63qu7_onafterrenderasync__action_67_onafterrenderasync_await_67_1__await -->|none| method_1r63qu7_onafterrenderasync__call_67_InitializeAsync
|
||||
method_1r63qu7_onafterrenderasync__action_68_onafterrenderasync_try_68_2__try -->|next| method_1r63qu7_onafterrenderasync__action_69_onafterrenderasync_await_69_3__await
|
||||
method_1r63qu7_onafterrenderasync__action_68_try_catch_68__linear -->|next| method_1r63qu7_onafterrenderasync__action_68_onafterrenderasync_try_68_2__try
|
||||
method_1r63qu7_onafterrenderasync__action_69_onafterrenderasync_await_69_3__await -->|next| method_1r63qu7_onafterrenderasync__action_71_onafterrenderasync_await_71_4__await
|
||||
method_1r63qu7_onafterrenderasync__action_71_onafterrenderasync_await_71_4__await -->|exception| method_1r63qu7_onafterrenderasync__action_72_onafterrenderasync_catch_72_5__catch
|
||||
method_1r63qu7_onafterrenderasync__action_72_onafterrenderasync_catch_72_5__catch -->|next| method_1r63qu7_onafterrenderasync__action_73_state_change_73__linear
|
||||
method_1r63qu7_onafterrenderasync__action_73_state_change_73__linear -->|return| method_1r63qu7_onafterrenderasync__implicit_return
|
||||
method_1r63qu7_onafterrenderasync__call_67_InitializeAsync -->|next| method_1r63qu7_onafterrenderasync__action_68_try_catch_68__linear
|
||||
method_1r63qu7_onafterrenderasync__entry -->|next| method_1r63qu7_onafterrenderasync__action_65_guard_clause_65__condition
|
||||
```
|
||||
|
||||
### HandleNodeSelected() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_6vyv4w_handlenodeselected__call_88_ScrollToNodeAsync[["ScrollToNodeAsync"]]
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__condition{"readerCanvas != null"}
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__false("no-op")
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__merge("merge")
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__true("scroll")
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__condition{"readerCanvas != null"}
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__false("false")
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__merge("merge")
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__true("true")
|
||||
method_6vyv4w_handlenodeselected__action_88_handlenodeselected_await_88_1__await[["Waits for async work"]]
|
||||
method_6vyv4w_handlenodeselected__entry(["HandleNodeSelected entry"])
|
||||
method_6vyv4w_handlenodeselected__implicit_return(["return"])
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__condition -->|no-op| method_6vyv4w_handlenodeselected__action_86_guard_clause_86__false
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__condition -->|scroll| method_6vyv4w_handlenodeselected__action_86_guard_clause_86__true
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__false -->|next| method_6vyv4w_handlenodeselected__action_86_guard_clause_86__merge
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__merge -->|next| method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__condition
|
||||
method_6vyv4w_handlenodeselected__action_86_guard_clause_86__true -->|next| method_6vyv4w_handlenodeselected__action_86_guard_clause_86__merge
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__condition -->|false| method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__false
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__condition -->|true| method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__true
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__false -->|next| method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__merge
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__merge -->|next| method_6vyv4w_handlenodeselected__action_88_handlenodeselected_await_88_1__await
|
||||
method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__true -->|next| method_6vyv4w_handlenodeselected__action_86_handlenodeselected_branch_86_0__merge
|
||||
method_6vyv4w_handlenodeselected__action_88_handlenodeselected_await_88_1__await -->|nodeId| method_6vyv4w_handlenodeselected__call_88_ScrollToNodeAsync
|
||||
method_6vyv4w_handlenodeselected__call_88_ScrollToNodeAsync -->|return| method_6vyv4w_handlenodeselected__implicit_return
|
||||
method_6vyv4w_handlenodeselected__entry -->|next| method_6vyv4w_handlenodeselected__action_86_guard_clause_86__condition
|
||||
```
|
||||
|
||||
### DisposeAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_99k8q7_disposeasync__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 22 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_99k8q7_disposeasync__call_102_OnQuizRequested_event_unsubscription[["OnQuizRequested - event unsubscription"]]
|
||||
method_99k8q7_disposeasync__call_103_OnFocusModeChanged_event_unsubscription[["OnFocusModeChanged - event unsubscription"]]
|
||||
method_99k8q7_disposeasync__call_108_Dispose_interop_cleanup_via_JS_module_[["Dispose/interop cleanup (via JS module)"]]
|
||||
method_99k8q7_disposeasync__action_102_event_unsubscribe_102__linear("Unsubscribe QuizState.OnQuizRequested")
|
||||
method_99k8q7_disposeasync__action_103_event_unsubscribe_103__linear("Unsubscribe FocusMode.OnFocusModeChanged")
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__condition{"_interopModule != null && _keydownHandler != null"}
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__false("false")
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__merge("merge")
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__true("true")
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__condition{"_interopModule != null && _keydownHandler != null"}
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__false("skip")
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__merge("merge")
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__true("try detach and dispose")
|
||||
method_99k8q7_disposeasync__action_107_disposeasync_try_107_1__try("Begins protected execution")
|
||||
method_99k8q7_disposeasync__action_108_disposeasync_await_108_2__await[["Waits for async work"]]
|
||||
method_99k8q7_disposeasync__action_109_disposeasync_await_109_3__await[["Waits for async work"]]
|
||||
method_99k8q7_disposeasync__action_110_disposeasync_await_110_4__await[["Waits for async work"]]
|
||||
method_99k8q7_disposeasync__action_111_disposeasync_catch_111_5__catch("Handles exception path")
|
||||
method_99k8q7_disposeasync__action_114_dispose_114__linear("Dispose DotNetObjectReference")
|
||||
method_99k8q7_disposeasync__entry(["DisposeAsync entry"])
|
||||
method_99k8q7_disposeasync__implicit_return(["return"])
|
||||
method_99k8q7_disposeasync__action_102_event_unsubscribe_102__linear -->|HandleQuizRequestedAsync| method_99k8q7_disposeasync__call_102_OnQuizRequested_event_unsubscription
|
||||
method_99k8q7_disposeasync__action_103_event_unsubscribe_103__linear -->|HandleUpdate| method_99k8q7_disposeasync__call_103_OnFocusModeChanged_event_unsubscription
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__condition -->|false| method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__false
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__condition -->|true| method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__true
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__false -->|next| method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__merge
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__merge -->|next| method_99k8q7_disposeasync__action_105_guard_clause_105__condition
|
||||
method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__true -->|next| method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__merge
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__condition -->|skip| method_99k8q7_disposeasync__action_105_guard_clause_105__false
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__condition -->|try detach and dispose| method_99k8q7_disposeasync__action_105_guard_clause_105__true
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__false -->|next| method_99k8q7_disposeasync__action_105_guard_clause_105__merge
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__merge -->|next| method_99k8q7_disposeasync__action_107_disposeasync_try_107_1__try
|
||||
method_99k8q7_disposeasync__action_105_guard_clause_105__true -->|next| method_99k8q7_disposeasync__action_105_guard_clause_105__merge
|
||||
method_99k8q7_disposeasync__action_107_disposeasync_try_107_1__try -->|next| method_99k8q7_disposeasync__action_108_disposeasync_await_108_2__await
|
||||
method_99k8q7_disposeasync__action_108_disposeasync_await_108_2__await -->|detachKeyboardListener then dispose interop references| method_99k8q7_disposeasync__call_108_Dispose_interop_cleanup_via_JS_module_
|
||||
method_99k8q7_disposeasync__action_109_disposeasync_await_109_3__await -->|next| method_99k8q7_disposeasync__action_110_disposeasync_await_110_4__await
|
||||
method_99k8q7_disposeasync__action_110_disposeasync_await_110_4__await -->|exception| method_99k8q7_disposeasync__action_111_disposeasync_catch_111_5__catch
|
||||
method_99k8q7_disposeasync__action_111_disposeasync_catch_111_5__catch -->|next| method_99k8q7_disposeasync__action_114_dispose_114__linear
|
||||
method_99k8q7_disposeasync__action_114_dispose_114__linear -->|return| method_99k8q7_disposeasync__implicit_return
|
||||
method_99k8q7_disposeasync__call_102_OnQuizRequested_event_unsubscription -->|next| method_99k8q7_disposeasync__action_103_event_unsubscribe_103__linear
|
||||
method_99k8q7_disposeasync__call_103_OnFocusModeChanged_event_unsubscription -->|next| method_99k8q7_disposeasync__action_105_disposeasync_branch_105_0__condition
|
||||
method_99k8q7_disposeasync__call_108_Dispose_interop_cleanup_via_JS_module_ -->|next| method_99k8q7_disposeasync__action_109_disposeasync_await_109_3__await
|
||||
method_99k8q7_disposeasync__entry -->|next| method_99k8q7_disposeasync__action_102_event_unsubscribe_102__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 5 unresolved jumps.
|
||||
- Warning: neighborhood-view: diagram file_h6mj95_home_razor_neighborhood_view exceeds preferred complexity thresholds (17 nodes, 7 edges).
|
||||
- Warning: control-flow: diagram method_p5ejmn_onparameterssetasync__fragment_diagram exceeds preferred complexity thresholds (39 nodes, 46 edges).
|
||||
- Warning: control-flow: diagram method_99k8q7_disposeasync__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 22 edges).
|
||||
@@ -0,0 +1,250 @@
|
||||
# Intelligence
|
||||
|
||||
- File ID: file:1kjntt:intelligence-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Intelligence.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Razor UI page providing a client-side interface for asking AI questions against the user's library (Global AI Q&A); binds input, loads book scope, calls the knowledge service, and renders answers with grounded citations.
|
||||
|
||||
## Key Details
|
||||
|
||||
UI binds _question and _selectedBookId; loads books on init; AskQuestionAsync enforces single concurrent request, parses optional book Guid, calls IKnowledgeService.AskQuestionAsync, and renders answer + grounded citations with explicit error fallbacks.
|
||||
|
||||
## Symbols
|
||||
|
||||
- OnInitializedAsync(): Initializes the component by loading recent books for the scope selector from the API.
|
||||
- HandleKeyUp(): Handles key up events on the input; triggers AskQuestionAsync when Enter is pressed and input is non-empty and not loading.
|
||||
- AskQuestionAsync(): Orchestrates asking the knowledge service a question: validates input, sets loading state, optionally scopes by book, calls IKnowledgeService, handles success/error responses and exceptions, and clears loading state.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions/Services/IKnowledgeService.cs
|
||||
- dependency-target: NexusReader.Application.DTOs.AI/GroundedResponseDto.cs
|
||||
- dependency-target: NexusReader.Application.DTOs.AI/CitationDto.cs
|
||||
- dependency-target: NexusReader.Application.DTOs.User/LastReadBookDto.cs
|
||||
- call-target: self
|
||||
- call-target: NexusReader.Application.Abstractions/Services/IKnowledgeService.cs
|
||||
- interaction-target: Answer = $"Error: {result.Errors.FirstOrDefault()?.Message ?? "An error occurred."}",
|
||||
- interaction-target: await Http.GetFromJsonAsync<List<LastReadBookDto>>("api/library/books") assigns to _books
|
||||
- interaction-target: await KnowledgeService.AskQuestionAsync(_question, "tenantId", ebookId)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 3
|
||||
- Executable symbols with control flow: 3
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 9
|
||||
- Control-flow fragments: 3
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 5
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnInitializedAsync: 7 nodes, 6 edges, 0 jumps, 0 unsupported constructs
|
||||
- HandleKeyUp: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- AskQuestionAsync: 40 nodes, 46 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Intelligence Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1kjntt_intelligence_razor("Intelligence")
|
||||
method_1f4bu99_oninitializedasync[["OnInitializedAsync()"]]
|
||||
method_91tjy5_handlekeyup[["HandleKeyUp()"]]
|
||||
method_c84ulg_askquestionasync[["AskQuestionAsync()"]]
|
||||
```
|
||||
|
||||
### Intelligence Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
file_1kjntt_intelligence_razor("Intelligence")
|
||||
method_1f4bu99_oninitializedasync[["OnInitializedAsync()"]]
|
||||
method_91tjy5_handlekeyup[["HandleKeyUp()"]]
|
||||
method_c84ulg_askquestionasync[["AskQuestionAsync()"]]
|
||||
unresolved_unresolved_11npc0r_interaction_target{"Unresolved: Answer = $\\"Error: {result.Errors.FirstOrDefault()?.Message ?? \\"An error occurred.\\"}\\","}
|
||||
unresolved_unresolved_17572gj_call_target{"Unresolved: AskQuestionAsync"}
|
||||
unresolved_unresolved_1to7exj_interaction_target{"Unresolved: await KnowledgeService.AskQuestionAsync(_question, \\"tenantId\\", ebookId)"}
|
||||
unresolved_unresolved_1wagwxf_interaction_target{"Unresolved: await Http.GetFromJsonAsync<List<LastReadBookDto>>(\\"api/library/books\\") assigns to _books"}
|
||||
unresolved_unresolved_k85jvs_call_target{"Unresolved: AskQuestionAsync"}
|
||||
file_1kjntt_intelligence_razor -->|contains| method_1f4bu99_oninitializedasync
|
||||
file_1kjntt_intelligence_razor -->|contains| method_91tjy5_handlekeyup
|
||||
file_1kjntt_intelligence_razor -->|contains| method_c84ulg_askquestionasync
|
||||
file_1kjntt_intelligence_razor -->|unresolved interaction| unresolved_unresolved_11npc0r_interaction_target
|
||||
file_1kjntt_intelligence_razor -->|unresolved interaction| unresolved_unresolved_1to7exj_interaction_target
|
||||
file_1kjntt_intelligence_razor -->|unresolved interaction| unresolved_unresolved_1wagwxf_interaction_target
|
||||
method_91tjy5_handlekeyup -->|unresolved call| unresolved_unresolved_17572gj_call_target
|
||||
method_c84ulg_askquestionasync -->|unresolved call| unresolved_unresolved_k85jvs_call_target
|
||||
```
|
||||
|
||||
### OnInitializedAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1f4bu99_oninitializedasync__action_390_oninitializedasync_try_390_0__try("Begins protected execution")
|
||||
method_1f4bu99_oninitializedasync__action_390_try_catch_390__linear("Swallow errors loading books")
|
||||
method_1f4bu99_oninitializedasync__action_392_oninitializedasync_await_392_1__await[["Waits for async work"]]
|
||||
method_1f4bu99_oninitializedasync__action_394_oninitializedasync_catch_394_2__catch("catch Exception ex")
|
||||
method_1f4bu99_oninitializedasync__entry(["OnInitializedAsync entry"])
|
||||
method_1f4bu99_oninitializedasync__action_392_external_call_392__linear("Load books for scope selector")
|
||||
method_1f4bu99_oninitializedasync__implicit_return(["return"])
|
||||
method_1f4bu99_oninitializedasync__action_390_oninitializedasync_try_390_0__try -->|next| method_1f4bu99_oninitializedasync__action_392_oninitializedasync_await_392_1__await
|
||||
method_1f4bu99_oninitializedasync__action_390_try_catch_390__linear -->|next| method_1f4bu99_oninitializedasync__action_390_oninitializedasync_try_390_0__try
|
||||
method_1f4bu99_oninitializedasync__action_392_external_call_392__linear -->|exception| method_1f4bu99_oninitializedasync__action_394_oninitializedasync_catch_394_2__catch
|
||||
method_1f4bu99_oninitializedasync__action_392_oninitializedasync_await_392_1__await -->|next| method_1f4bu99_oninitializedasync__action_392_external_call_392__linear
|
||||
method_1f4bu99_oninitializedasync__action_394_oninitializedasync_catch_394_2__catch -->|return| method_1f4bu99_oninitializedasync__implicit_return
|
||||
method_1f4bu99_oninitializedasync__entry -->|next| method_1f4bu99_oninitializedasync__action_390_try_catch_390__linear
|
||||
```
|
||||
|
||||
### HandleKeyUp() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_91tjy5_handlekeyup__call_404_AskQuestionAsync[["AskQuestionAsync"]]
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__condition{"e.Key == \\"Enter\\" && !string.IsNullOrWhiteSpace(_question) && !_isLoading"}
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__false("no-op")
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__merge("merge")
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__true("call-AskQuestionAsync")
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__condition{"e.Key == \\"Enter\\" && !string.IsNullOrWhiteSpace(_question) && !_isLoading"}
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__false("false")
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__merge("merge")
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__true("true")
|
||||
method_91tjy5_handlekeyup__action_404_handlekeyup_await_404_1__await[["Waits for async work"]]
|
||||
method_91tjy5_handlekeyup__entry(["HandleKeyUp entry"])
|
||||
method_91tjy5_handlekeyup__implicit_return(["return"])
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__condition -->|no-op| method_91tjy5_handlekeyup__action_402_guard_clause_402__false
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__condition -->|call-AskQuestionAsync| method_91tjy5_handlekeyup__action_402_guard_clause_402__true
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__false -->|next| method_91tjy5_handlekeyup__action_402_guard_clause_402__merge
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__merge -->|next| method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__condition
|
||||
method_91tjy5_handlekeyup__action_402_guard_clause_402__true -->|next| method_91tjy5_handlekeyup__action_402_guard_clause_402__merge
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__condition -->|false| method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__false
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__condition -->|true| method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__true
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__false -->|next| method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__merge
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__merge -->|next| method_91tjy5_handlekeyup__action_404_handlekeyup_await_404_1__await
|
||||
method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__true -->|next| method_91tjy5_handlekeyup__action_402_handlekeyup_branch_402_0__merge
|
||||
method_91tjy5_handlekeyup__action_404_handlekeyup_await_404_1__await -->|none| method_91tjy5_handlekeyup__call_404_AskQuestionAsync
|
||||
method_91tjy5_handlekeyup__call_404_AskQuestionAsync -->|return| method_91tjy5_handlekeyup__implicit_return
|
||||
method_91tjy5_handlekeyup__entry -->|next| method_91tjy5_handlekeyup__action_402_guard_clause_402__condition
|
||||
```
|
||||
|
||||
### AskQuestionAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_c84ulg_askquestionasync__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 46 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_c84ulg_askquestionasync__call_425_AskQuestionAsync[["AskQuestionAsync"]]
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__condition{"string.IsNullOrWhiteSpace(_question) || _isLoading"}
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__false("continue")
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__true("exit")
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__condition{"string.IsNullOrWhiteSpace(_question) || _isLoading"}
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__false("continue")
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__true("return")
|
||||
method_c84ulg_askquestionasync__action_412_state_change_412__linear("Enter search state")
|
||||
method_c84ulg_askquestionasync__action_417_askquestionasync_try_417_1__try("Begins protected execution")
|
||||
method_c84ulg_askquestionasync__action_417_try_catch_417__linear("Catch network/API exceptions")
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__condition{"!string.IsNullOrEmpty(_selectedBookId) && Guid.TryParse(_selectedBookId, out parsedId)"}
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__false("ebookId null")
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__true("ebookId set")
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__condition{"!string.IsNullOrEmpty(_selectedBookId) && Guid.TryParse(_selectedBookId, out var parsedId)"}
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__false("false")
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__true("true")
|
||||
method_c84ulg_askquestionasync__action_425_askquestionasync_await_425_3__await[["Waits for async work"]]
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__condition{"result.IsSuccess"}
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__false("false")
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__true("true")
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__condition{"result.IsSuccess"}
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__false("construct error GroundedResponseDto with first error message")
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__true("assign response from result.Value")
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__condition{"Falls back to alternate path"}
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__false("otherwise")
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__merge("merge")
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__true("fallback")
|
||||
method_c84ulg_askquestionasync__action_439_askquestionasync_catch_439_7__catch("catch Exception ex")
|
||||
method_c84ulg_askquestionasync__action_447_askquestionasync_finally_447_8__finally("Runs cleanup or finalization")
|
||||
method_c84ulg_askquestionasync__action_447_finally_447__finally("Exit loading state and refresh UI")
|
||||
method_c84ulg_askquestionasync__entry(["AskQuestionAsync entry"])
|
||||
method_c84ulg_askquestionasync__action_425_external_call_425__linear("Ask knowledge service")
|
||||
method_c84ulg_askquestionasync__action_434_askquestionasync_repository_read_434_6__linear[("Reads repository or persistence state")]
|
||||
method_c84ulg_askquestionasync__implicit_return(["return"])
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__condition -->|continue| method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__false
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__condition -->|exit| method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__true
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__false -->|next| method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__merge
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__merge -->|next| method_c84ulg_askquestionasync__action_412_state_change_412__linear
|
||||
method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__true -->|next| method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__merge
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__condition -->|continue| method_c84ulg_askquestionasync__action_410_guard_clause_410__false
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__condition -->|return| method_c84ulg_askquestionasync__action_410_guard_clause_410__true
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__false -->|next| method_c84ulg_askquestionasync__action_410_guard_clause_410__merge
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__merge -->|next| method_c84ulg_askquestionasync__action_410_askquestionasync_guard_clause_410_0__condition
|
||||
method_c84ulg_askquestionasync__action_410_guard_clause_410__true -->|next| method_c84ulg_askquestionasync__action_410_guard_clause_410__merge
|
||||
method_c84ulg_askquestionasync__action_412_state_change_412__linear -->|next| method_c84ulg_askquestionasync__action_417_try_catch_417__linear
|
||||
method_c84ulg_askquestionasync__action_417_askquestionasync_try_417_1__try -->|next| method_c84ulg_askquestionasync__action_419_branch_419__condition
|
||||
method_c84ulg_askquestionasync__action_417_try_catch_417__linear -->|next| method_c84ulg_askquestionasync__action_417_askquestionasync_try_417_1__try
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__condition -->|ebookId null| method_c84ulg_askquestionasync__action_419_branch_419__false
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__condition -->|ebookId set| method_c84ulg_askquestionasync__action_419_branch_419__true
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__false -->|next| method_c84ulg_askquestionasync__action_419_branch_419__merge
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__merge -->|next| method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__condition
|
||||
method_c84ulg_askquestionasync__action_419_branch_419__true -->|next| method_c84ulg_askquestionasync__action_419_branch_419__merge
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__condition -->|false| method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__false
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__condition -->|true| method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__true
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__false -->|next| method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__merge
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__merge -->|next| method_c84ulg_askquestionasync__action_425_askquestionasync_await_425_3__await
|
||||
method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__true -->|next| method_c84ulg_askquestionasync__action_420_askquestionasync_branch_420_2__merge
|
||||
method_c84ulg_askquestionasync__action_425_askquestionasync_await_425_3__await -->|next| method_c84ulg_askquestionasync__action_425_external_call_425__linear
|
||||
method_c84ulg_askquestionasync__action_425_external_call_425__linear -->|calls| method_c84ulg_askquestionasync__call_425_AskQuestionAsync
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__condition -->|false| method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__false
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__condition -->|true| method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__true
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__false -->|next| method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__merge
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__merge -->|fallback| method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__condition
|
||||
method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__true -->|next| method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__merge
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__condition -->|construct error GroundedResponseDto with first error message| method_c84ulg_askquestionasync__action_426_branch_426__false
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__condition -->|assign response from result.Value| method_c84ulg_askquestionasync__action_426_branch_426__true
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__false -->|next| method_c84ulg_askquestionasync__action_426_branch_426__merge
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__merge -->|next| method_c84ulg_askquestionasync__action_426_askquestionasync_branch_426_4__condition
|
||||
method_c84ulg_askquestionasync__action_426_branch_426__true -->|next| method_c84ulg_askquestionasync__action_426_branch_426__merge
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__condition -->|otherwise| method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__false
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__condition -->|fallback| method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__true
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__false -->|next| method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__merge
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__merge -->|next| method_c84ulg_askquestionasync__action_434_askquestionasync_repository_read_434_6__linear
|
||||
method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__true -->|next| method_c84ulg_askquestionasync__action_430_askquestionasync_fallback_430_5__merge
|
||||
method_c84ulg_askquestionasync__action_434_askquestionasync_repository_read_434_6__linear -->|exception| method_c84ulg_askquestionasync__action_439_askquestionasync_catch_439_7__catch
|
||||
method_c84ulg_askquestionasync__action_439_askquestionasync_catch_439_7__catch -->|next| method_c84ulg_askquestionasync__action_447_askquestionasync_finally_447_8__finally
|
||||
method_c84ulg_askquestionasync__action_447_askquestionasync_finally_447_8__finally -->|next| method_c84ulg_askquestionasync__action_447_finally_447__finally
|
||||
method_c84ulg_askquestionasync__action_447_finally_447__finally -->|return| method_c84ulg_askquestionasync__implicit_return
|
||||
method_c84ulg_askquestionasync__call_425_AskQuestionAsync -->|next| method_c84ulg_askquestionasync__action_426_branch_426__condition
|
||||
method_c84ulg_askquestionasync__entry -->|next| method_c84ulg_askquestionasync__action_410_guard_clause_410__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_c84ulg_askquestionasync__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 46 edges).
|
||||
@@ -0,0 +1,184 @@
|
||||
# Library
|
||||
|
||||
- File ID: file:1uhcs2l:library-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Library.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor UI page that displays the user's library of e-books, loads last-read book summaries from the API, and provides UI to ingest new books or open a selected book.
|
||||
|
||||
## Key Details
|
||||
|
||||
Component loads /api/library/books (line 526), shows loading/empty/collection UI with loops and conditionals in markup, binds a modal to refresh the list (line 23), and navigates to a book via IReaderNavigationService (line 551).
|
||||
|
||||
## Symbols
|
||||
|
||||
- Library: Blazor UI page that displays the user's library of e-books, loads last-read book summaries from the API, and provides UI to ingest new books or open a selected book.
|
||||
- OnAfterRenderAsync(): Lifecycle override that triggers initial load of books on first render.
|
||||
- LoadBooksAsync(): Loads the list of last-read books from the backend API and updates component state with loading/success/failure handling.
|
||||
- RefreshLibrary(): Public refresh helper invoked after the ingestion modal closes to reload the library.
|
||||
- OpenBook(): Navigate to the reader view for the selected book using the injected navigation service.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.DTOs.User (LastReadBookDto)
|
||||
- dependency-target: NexusReader.UI.Shared/Services/IReaderNavigationService
|
||||
- dependency-target: BookIngestionModal component (markup bind at line 23)
|
||||
- dependency-target: NexusButton component (uses OnClick at line 17)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: NexusReader.UI.Shared/Services/IReaderNavigationService
|
||||
- interaction-target: await Http.GetFromJsonAsync<List<LastReadBookDto>>("api/library/books");
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 8
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 5
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnAfterRenderAsync: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- LoadBooksAsync: 15 nodes, 15 edges, 0 jumps, 0 unsupported constructs
|
||||
- RefreshLibrary: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- OpenBook: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Library Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_g9nkgg_library("Library")
|
||||
file_1uhcs2l_library_razor("Library")
|
||||
method_1ffpsuv_refreshlibrary[["RefreshLibrary()"]]
|
||||
method_676x78_loadbooksasync[["LoadBooksAsync()"]]
|
||||
method_8gksn2_openbook[["OpenBook()"]]
|
||||
method_bktx49_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
```
|
||||
|
||||
### Library Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_g9nkgg_library("Library")
|
||||
method_1ffpsuv_refreshlibrary[["RefreshLibrary()"]]
|
||||
method_676x78_loadbooksasync[["LoadBooksAsync()"]]
|
||||
method_8gksn2_openbook[["OpenBook()"]]
|
||||
method_bktx49_onafterrenderasync[["OnAfterRenderAsync()"]]
|
||||
unresolved_unresolved_14z0mrx_call_target{"Unresolved: LoadBooksAsync"}
|
||||
unresolved_unresolved_1n18eoi_interaction_target{"Unresolved: await Http.GetFromJsonAsync<List<LastReadBookDto>>(\\"api/library/books\\");"}
|
||||
unresolved_unresolved_fkkw23_call_target{"Unresolved: LoadBooksAsync"}
|
||||
unresolved_unresolved_iaaoqf_call_target{"Unresolved: NavigateToBook"}
|
||||
class_g9nkgg_library -->|contains| method_1ffpsuv_refreshlibrary
|
||||
class_g9nkgg_library -->|contains| method_676x78_loadbooksasync
|
||||
class_g9nkgg_library -->|contains| method_8gksn2_openbook
|
||||
class_g9nkgg_library -->|contains| method_bktx49_onafterrenderasync
|
||||
class_g9nkgg_library -->|unresolved interaction| unresolved_unresolved_1n18eoi_interaction_target
|
||||
method_1ffpsuv_refreshlibrary -->|unresolved call| unresolved_unresolved_14z0mrx_call_target
|
||||
method_8gksn2_openbook -->|unresolved call| unresolved_unresolved_iaaoqf_call_target
|
||||
method_bktx49_onafterrenderasync -->|unresolved call| unresolved_unresolved_fkkw23_call_target
|
||||
```
|
||||
|
||||
### OnAfterRenderAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_bktx49_onafterrenderasync__call_515_LoadBooksAsync[["LoadBooksAsync"]]
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__condition{"firstRender == true"}
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__false("no-op")
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__merge("merge")
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__true("load invoked")
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__condition{"firstRender"}
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__false("false")
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__merge("merge")
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__true("true")
|
||||
method_bktx49_onafterrenderasync__action_515_onafterrenderasync_await_515_1__await[["Waits for async work"]]
|
||||
method_bktx49_onafterrenderasync__entry(["OnAfterRenderAsync entry"])
|
||||
method_bktx49_onafterrenderasync__implicit_return(["return"])
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__condition -->|no-op| method_bktx49_onafterrenderasync__action_513_guard_clause_513__false
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__condition -->|load invoked| method_bktx49_onafterrenderasync__action_513_guard_clause_513__true
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__false -->|next| method_bktx49_onafterrenderasync__action_513_guard_clause_513__merge
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__merge -->|next| method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__condition
|
||||
method_bktx49_onafterrenderasync__action_513_guard_clause_513__true -->|next| method_bktx49_onafterrenderasync__action_513_guard_clause_513__merge
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__condition -->|false| method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__false
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__condition -->|true| method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__true
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__false -->|next| method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__merge
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__merge -->|next| method_bktx49_onafterrenderasync__action_515_onafterrenderasync_await_515_1__await
|
||||
method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__true -->|next| method_bktx49_onafterrenderasync__action_513_onafterrenderasync_branch_513_0__merge
|
||||
method_bktx49_onafterrenderasync__action_515_onafterrenderasync_await_515_1__await -->|none| method_bktx49_onafterrenderasync__call_515_LoadBooksAsync
|
||||
method_bktx49_onafterrenderasync__call_515_LoadBooksAsync -->|return| method_bktx49_onafterrenderasync__implicit_return
|
||||
method_bktx49_onafterrenderasync__entry -->|next| method_bktx49_onafterrenderasync__action_513_guard_clause_513__condition
|
||||
```
|
||||
|
||||
### LoadBooksAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_676x78_loadbooksasync__action_521_state_change_521__linear("Set loading indicator true")
|
||||
method_676x78_loadbooksasync__action_524_loadbooksasync_try_524_0__try("Begins protected execution")
|
||||
method_676x78_loadbooksasync__action_524_try_catch_finally_524__linear("Exception handling and fallback for browser environment")
|
||||
method_676x78_loadbooksasync__action_526_loadbooksasync_await_526_1__await[["Waits for async work"]]
|
||||
method_676x78_loadbooksasync__action_527_state_change_527__linear("Store loaded books and clear loading flag")
|
||||
method_676x78_loadbooksasync__action_529_loadbooksasync_catch_529_2__catch("catch Exception ex")
|
||||
method_676x78_loadbooksasync__action_531_log_531__linear("Log load failure to console")
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__condition{"OperatingSystem.IsBrowser()"}
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__false("false")
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__merge("merge")
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__true("true")
|
||||
method_676x78_loadbooksasync__action_537_loadbooksasync_finally_537_4__finally("Runs cleanup or finalization")
|
||||
method_676x78_loadbooksasync__entry(["LoadBooksAsync entry"])
|
||||
method_676x78_loadbooksasync__action_526_external_call_526__linear("Fetch books from API endpoint")
|
||||
method_676x78_loadbooksasync__implicit_return(["return"])
|
||||
method_676x78_loadbooksasync__action_521_state_change_521__linear -->|next| method_676x78_loadbooksasync__action_524_try_catch_finally_524__linear
|
||||
method_676x78_loadbooksasync__action_524_loadbooksasync_try_524_0__try -->|next| method_676x78_loadbooksasync__action_526_loadbooksasync_await_526_1__await
|
||||
method_676x78_loadbooksasync__action_524_try_catch_finally_524__linear -->|next| method_676x78_loadbooksasync__action_524_loadbooksasync_try_524_0__try
|
||||
method_676x78_loadbooksasync__action_526_external_call_526__linear -->|next| method_676x78_loadbooksasync__action_527_state_change_527__linear
|
||||
method_676x78_loadbooksasync__action_526_loadbooksasync_await_526_1__await -->|next| method_676x78_loadbooksasync__action_526_external_call_526__linear
|
||||
method_676x78_loadbooksasync__action_527_state_change_527__linear -->|exception| method_676x78_loadbooksasync__action_529_loadbooksasync_catch_529_2__catch
|
||||
method_676x78_loadbooksasync__action_529_loadbooksasync_catch_529_2__catch -->|next| method_676x78_loadbooksasync__action_531_log_531__linear
|
||||
method_676x78_loadbooksasync__action_531_log_531__linear -->|next| method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__condition
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__condition -->|false| method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__false
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__condition -->|true| method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__true
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__false -->|next| method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__merge
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__merge -->|next| method_676x78_loadbooksasync__action_537_loadbooksasync_finally_537_4__finally
|
||||
method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__true -->|next| method_676x78_loadbooksasync__action_532_loadbooksasync_branch_532_3__merge
|
||||
method_676x78_loadbooksasync__action_537_loadbooksasync_finally_537_4__finally -->|return| method_676x78_loadbooksasync__implicit_return
|
||||
method_676x78_loadbooksasync__entry -->|next| method_676x78_loadbooksasync__action_521_state_change_521__linear
|
||||
```
|
||||
|
||||
### OpenBook() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_8gksn2_openbook__call_551_NavigateToBook[["NavigateToBook"]]
|
||||
method_8gksn2_openbook__action_77_invoked_from_markup_77__linear("Invoked by book card click")
|
||||
method_8gksn2_openbook__entry(["OpenBook entry"])
|
||||
method_8gksn2_openbook__implicit_return(["return"])
|
||||
method_8gksn2_openbook__action_77_invoked_from_markup_77__linear -->|bookId Guid| method_8gksn2_openbook__call_551_NavigateToBook
|
||||
method_8gksn2_openbook__call_551_NavigateToBook -->|return| method_8gksn2_openbook__implicit_return
|
||||
method_8gksn2_openbook__entry -->|next| method_8gksn2_openbook__action_77_invoked_from_markup_77__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
@@ -0,0 +1,59 @@
|
||||
# NotFound
|
||||
|
||||
- File ID: file:13jb3vh:notfound-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/NotFound.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A Blazor UI page that renders a Not Found / synchronization placeholder using shared UI components and applies the MainHubLayout.
|
||||
|
||||
## Key Details
|
||||
|
||||
Razor page at route '/not-found' that shows a preloader with a robot icon and a Polish message 'Synchronizowanie przestrzeni Nexus...'; no code-behind or runtime methods present.
|
||||
|
||||
## Symbols
|
||||
|
||||
- No extracted symbols.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: Components/NexusIcon.razor
|
||||
- dependency-target: Components/NexusTypography.razor
|
||||
- dependency-target: Layouts/MainHubLayout.razor
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 0
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 0
|
||||
- Unresolved references: 3
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NotFound Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_13jb3vh_notfound_razor("NotFound")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,53 @@
|
||||
# Settings
|
||||
|
||||
- File ID: file:1mpguez:settings-razor
|
||||
- Path: NexusReader.UI.Shared/Pages/Settings.razor
|
||||
- Role: ui-page
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A Blazor UI page that exposes a protected "Settings" view with static markup and local styles for account and reading preferences.
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple static Razor page at route /settings; no code-behind, no event handlers, and protected by authorization. Styling is included inline in the component.
|
||||
|
||||
## Symbols
|
||||
|
||||
- No extracted symbols.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 0
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 0
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Settings Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1mpguez_settings_razor("Settings")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,163 @@
|
||||
# Routes
|
||||
|
||||
- File ID: file:1sm6kjd:routes-razor
|
||||
- Path: NexusReader.UI.Shared/Routes.razor
|
||||
- Role: ui-component
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Blazor routing and global error boundary component that wires application-level navigation, authorization gating, NotFound fallback and a UI error screen with a retry (recover) action.
|
||||
|
||||
## Key Details
|
||||
|
||||
Provides application-level routing and a global UI error boundary with a manual recover control; uses AuthorizeRouteView to redirect unauthorized users to a login helper and renders a NotFound page for unmatched routes.
|
||||
|
||||
## Symbols
|
||||
|
||||
- Routes: Blazor routing and global error boundary component that wires application-level navigation, authorization gating, NotFound fallback and a UI error screen with a retry (recover) action.
|
||||
- Render (component markup): Renders the app Router, wraps route rendering in an authorization view and an error boundary; shows NotFound and an error UI with a retry action.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- imports NexusReader.UI.Shared/Pages/NotFound.razor
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.UI.Shared/RedirectToLogin.razor
|
||||
- dependency-target: NexusReader.UI.Shared/Layouts/MainHubLayout.razor
|
||||
- dependency-target: NexusReader.UI.Shared/Components/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/RedirectToLogin.razor
|
||||
- call-target: NexusReader.UI.Shared/Layouts/MainHubLayout.razor
|
||||
- call-target: NexusReader.UI.Shared/Pages/NotFound.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/NexusIcon.razor
|
||||
- call-target: NexusReader.UI.Shared/Components/NexusIcon.razor
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 8
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 5
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Render (component markup): 27 nodes, 30 edges, 5 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### Routes Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_19wn0m3_routes("Routes")
|
||||
file_1sm6kjd_routes_razor("Routes")
|
||||
method_1bnazn2_render_component_markup[["Render (component markup)"]]
|
||||
file_13jb3vh_notfound_razor[/"NotFound"/]
|
||||
file_1sm6kjd_routes_razor -->|NotFound| file_13jb3vh_notfound_razor
|
||||
```
|
||||
|
||||
### Routes Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_19wn0m3_routes("Routes")
|
||||
method_1bnazn2_render_component_markup[["Render (component markup)"]]
|
||||
unresolved_unresolved_1f2vk8v_call_target{"Unresolved: RedirectToLogin"}
|
||||
unresolved_unresolved_1r4ovr6_call_target{"Unresolved: NotFound"}
|
||||
unresolved_unresolved_oz0xm_call_target{"Unresolved: NexusIcon"}
|
||||
unresolved_unresolved_tq0ur7_call_target{"Unresolved: MainHubLayout"}
|
||||
class_19wn0m3_routes -->|contains| method_1bnazn2_render_component_markup
|
||||
method_1bnazn2_render_component_markup -->|unresolved call| unresolved_unresolved_1f2vk8v_call_target
|
||||
method_1bnazn2_render_component_markup -->|unresolved call| unresolved_unresolved_1r4ovr6_call_target
|
||||
method_1bnazn2_render_component_markup -->|unresolved call| unresolved_unresolved_oz0xm_call_target
|
||||
method_1bnazn2_render_component_markup -->|unresolved call| unresolved_unresolved_oz0xm_call_target
|
||||
method_1bnazn2_render_component_markup -->|unresolved call| unresolved_unresolved_tq0ur7_call_target
|
||||
```
|
||||
|
||||
### Render (component markup)() Control Flow
|
||||
|
||||
_Warnings: diagram method_1bnazn2_render_component_markup__fragment_diagram exceeds preferred complexity thresholds (27 nodes, 30 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1bnazn2_render_component_markup__call_13_NotFound[["NotFound"]]
|
||||
method_1bnazn2_render_component_markup__call_21_NexusIcon[["NexusIcon"]]
|
||||
method_1bnazn2_render_component_markup__call_31_NexusIcon[["NexusIcon"]]
|
||||
method_1bnazn2_render_component_markup__call_5_MainHubLayout[["MainHubLayout"]]
|
||||
method_1bnazn2_render_component_markup__call_7_RedirectToLogin[["RedirectToLogin"]]
|
||||
method_1bnazn2_render_component_markup__action_1_error_boundary_1__linear("Global error handling UI")
|
||||
method_1bnazn2_render_component_markup__action_10_focus_navigation_10__linear("FocusOnNavigate usage")
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__condition{"NotFound fallback"}
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__false("false")
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__merge("merge")
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__true("true")
|
||||
method_1bnazn2_render_component_markup__action_27_display_27__linear("Surface exception message")
|
||||
method_1bnazn2_render_component_markup__action_3_orchestration_3__linear("Routing orchestration")
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__condition{"_errorBoundary != null"}
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__false("no-op")
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__merge("merge")
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__true("calls Recover()")
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_body[["Button onclick triggers lambda that calls _errorBoundary?.Recover() to attempt UI recovery"]]
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_entry("Retry/recover action")
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_exit("exit loop")
|
||||
method_1bnazn2_render_component_markup__action_5_authorization_gate_5__linear("AuthorizeRouteView enforces authorization for routed pages")
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__condition{"NotAuthorized fallback"}
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__false("false")
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__merge("merge")
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__true("true")
|
||||
method_1bnazn2_render_component_markup__entry(["Render (component markup) entry"])
|
||||
method_1bnazn2_render_component_markup__implicit_return(["return"])
|
||||
method_1bnazn2_render_component_markup__action_1_error_boundary_1__linear -->|next| method_1bnazn2_render_component_markup__action_3_orchestration_3__linear
|
||||
method_1bnazn2_render_component_markup__action_10_focus_navigation_10__linear -->|fallback| method_1bnazn2_render_component_markup__action_12_fallback_12__condition
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__condition -->|false| method_1bnazn2_render_component_markup__action_12_fallback_12__false
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__condition -->|true| method_1bnazn2_render_component_markup__action_12_fallback_12__true
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__false -->|next| method_1bnazn2_render_component_markup__action_12_fallback_12__merge
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__merge -->|renders NotFound page for unmatched routes| method_1bnazn2_render_component_markup__call_13_NotFound
|
||||
method_1bnazn2_render_component_markup__action_12_fallback_12__true -->|next| method_1bnazn2_render_component_markup__action_12_fallback_12__merge
|
||||
method_1bnazn2_render_component_markup__action_27_display_27__linear -->|next| method_1bnazn2_render_component_markup__action_30_retry_30__loop_entry
|
||||
method_1bnazn2_render_component_markup__action_3_orchestration_3__linear -->|next| method_1bnazn2_render_component_markup__action_5_authorization_gate_5__linear
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__condition -->|no-op| method_1bnazn2_render_component_markup__action_30_guard_clause_30__false
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__condition -->|calls Recover| method_1bnazn2_render_component_markup__action_30_guard_clause_30__true
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__false -->|next| method_1bnazn2_render_component_markup__action_30_guard_clause_30__merge
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__merge -->|calls| method_1bnazn2_render_component_markup__call_31_NexusIcon
|
||||
method_1bnazn2_render_component_markup__action_30_guard_clause_30__true -->|next| method_1bnazn2_render_component_markup__action_30_guard_clause_30__merge
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_body -->|retry| method_1bnazn2_render_component_markup__action_30_retry_30__loop_entry
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_entry -->|iterate| method_1bnazn2_render_component_markup__action_30_retry_30__loop_body
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_entry -->|exit| method_1bnazn2_render_component_markup__action_30_retry_30__loop_exit
|
||||
method_1bnazn2_render_component_markup__action_30_retry_30__loop_exit -->|next| method_1bnazn2_render_component_markup__action_30_guard_clause_30__condition
|
||||
method_1bnazn2_render_component_markup__action_5_authorization_gate_5__linear -->|used as DefaultLayout for AuthorizeRouteView| method_1bnazn2_render_component_markup__call_5_MainHubLayout
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__condition -->|false| method_1bnazn2_render_component_markup__action_6_fallback_6__false
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__condition -->|true| method_1bnazn2_render_component_markup__action_6_fallback_6__true
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__false -->|next| method_1bnazn2_render_component_markup__action_6_fallback_6__merge
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__merge -->|none renders redirect-to-login component in NotAuthorized slot| method_1bnazn2_render_component_markup__call_7_RedirectToLogin
|
||||
method_1bnazn2_render_component_markup__action_6_fallback_6__true -->|next| method_1bnazn2_render_component_markup__action_6_fallback_6__merge
|
||||
method_1bnazn2_render_component_markup__call_13_NotFound -->|calls| method_1bnazn2_render_component_markup__call_21_NexusIcon
|
||||
method_1bnazn2_render_component_markup__call_21_NexusIcon -->|next| method_1bnazn2_render_component_markup__action_27_display_27__linear
|
||||
method_1bnazn2_render_component_markup__call_31_NexusIcon -->|return| method_1bnazn2_render_component_markup__implicit_return
|
||||
method_1bnazn2_render_component_markup__call_5_MainHubLayout -->|fallback| method_1bnazn2_render_component_markup__action_6_fallback_6__condition
|
||||
method_1bnazn2_render_component_markup__call_7_RedirectToLogin -->|next| method_1bnazn2_render_component_markup__action_10_focus_navigation_10__linear
|
||||
method_1bnazn2_render_component_markup__entry -->|next| method_1bnazn2_render_component_markup__action_1_error_boundary_1__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 5 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_1bnazn2_render_component_markup__fragment_diagram exceeds preferred complexity thresholds (27 nodes, 30 edges).
|
||||
+195
@@ -0,0 +1,195 @@
|
||||
# FocusModeService
|
||||
|
||||
- File ID: file:1953stk:focusmodeservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/FocusModeService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Provides a UI-scoped service that tracks and persists a 'focus mode' flag using IJSRuntime (localStorage) and notifies subscribers when the mode changes.
|
||||
|
||||
## Key Details
|
||||
|
||||
Reads/writes browser localStorage via IJSRuntime with try/catch to tolerate SSR/pre-render; exposes an event to notify UI components when mode changes.
|
||||
|
||||
## Symbols
|
||||
|
||||
- FocusModeService: Provides a UI-scoped service that tracks and persists a 'focus mode' flag using IJSRuntime (localStorage) and notifies subscribers when the mode changes.
|
||||
- FocusModeService(): Constructs the service and captures an IJSRuntime instance for JS interop.
|
||||
- InitializeAsync(): Reads persisted focus-mode flag from localStorage and activates focus mode if stored as true, notifying subscribers; ignores JS errors (e.g., during pre-render).
|
||||
- ToggleAsync(): Toggles the in-memory focus-mode flag, notifies subscribers, and persists the new value to localStorage; ignores JS write errors.
|
||||
- FocusModeService: Service to manage a user-selectable 'focus mode' state, persistence, and notifications.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: Microsoft.JSInterop (IJSRuntime)
|
||||
- dependency-target: IFocusModeService (consumer interface)
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 3
|
||||
- Executable symbols with control flow: 3
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 6
|
||||
- Control-flow fragments: 3
|
||||
- Unresolved jumps: 4
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- FocusModeService: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- InitializeAsync: 22 nodes, 24 edges, 2 jumps, 0 unsupported constructs
|
||||
- ToggleAsync: 15 nodes, 15 edges, 2 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### FocusModeService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_oyj9xs_focusmodeservice("FocusModeService")
|
||||
file_1953stk_focusmodeservice_cs("FocusModeService")
|
||||
method_1094u9_initializeasync[["InitializeAsync()"]]
|
||||
method_439s8m_toggleasync[["ToggleAsync()"]]
|
||||
method_wn38ys_focusmodeservice[["FocusModeService()"]]
|
||||
type_1af3t0x_focusmodeservice[/"FocusModeService"/]
|
||||
```
|
||||
|
||||
### FocusModeService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_oyj9xs_focusmodeservice("FocusModeService")
|
||||
method_1094u9_initializeasync[["InitializeAsync()"]]
|
||||
method_439s8m_toggleasync[["ToggleAsync()"]]
|
||||
method_wn38ys_focusmodeservice[["FocusModeService()"]]
|
||||
unresolved_unresolved_12ho2u8_call_target{"Unresolved: IJSRuntime.InvokeAsync"}
|
||||
unresolved_unresolved_147cark_call_target{"Unresolved: OnFocusModeChanged"}
|
||||
unresolved_unresolved_1i0mp08_call_target{"Unresolved: IJSRuntime.InvokeVoidAsync"}
|
||||
unresolved_unresolved_1yx28bi_call_target{"Unresolved: OnFocusModeChanged"}
|
||||
class_oyj9xs_focusmodeservice -->|contains| method_1094u9_initializeasync
|
||||
class_oyj9xs_focusmodeservice -->|contains| method_439s8m_toggleasync
|
||||
class_oyj9xs_focusmodeservice -->|contains| method_wn38ys_focusmodeservice
|
||||
method_1094u9_initializeasync -->|unresolved call| unresolved_unresolved_12ho2u8_call_target
|
||||
method_1094u9_initializeasync -->|unresolved call| unresolved_unresolved_1yx28bi_call_target
|
||||
method_439s8m_toggleasync -->|unresolved call| unresolved_unresolved_147cark_call_target
|
||||
method_439s8m_toggleasync -->|unresolved call| unresolved_unresolved_1i0mp08_call_target
|
||||
```
|
||||
|
||||
### InitializeAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1094u9_initializeasync__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 24 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1094u9_initializeasync__call_20_IJSRuntime_InvokeAsync[["IJSRuntime.InvokeAsync"]]
|
||||
method_1094u9_initializeasync__call_24_OnFocusModeChanged[["OnFocusModeChanged"]]
|
||||
method_1094u9_initializeasync__action_18_initializeasync_try_18_0__try("Begins protected execution")
|
||||
method_1094u9_initializeasync__action_18_try_catch_18__linear("Wrap JS interop in try/catch")
|
||||
method_1094u9_initializeasync__action_20_initializeasync_await_20_1__await[["Waits for async work"]]
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__condition{"value == \\"true\\" && !IsFocusModeActive"}
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__false("no-op")
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__merge("merge")
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__true("set active & notify")
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__condition{"value == \\"true\\" && !IsFocusModeActive"}
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__false("false")
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__merge("merge")
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__true("true")
|
||||
method_1094u9_initializeasync__action_24_event_invocation_24__linear("Notify subscribers of mode change")
|
||||
method_1094u9_initializeasync__action_24_initializeasync_await_24_4__await[["Waits for async work"]]
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__condition{"OnFocusModeChanged != null) await OnFocusModeChanged("}
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__false("false")
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__merge("merge")
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__true("true")
|
||||
method_1094u9_initializeasync__action_27_initializeasync_catch_27_5__catch("Handles exception path")
|
||||
method_1094u9_initializeasync__entry(["InitializeAsync entry"])
|
||||
method_1094u9_initializeasync__implicit_return(["return"])
|
||||
method_1094u9_initializeasync__action_18_initializeasync_try_18_0__try -->|next| method_1094u9_initializeasync__action_20_initializeasync_await_20_1__await
|
||||
method_1094u9_initializeasync__action_18_try_catch_18__linear -->|next| method_1094u9_initializeasync__action_18_initializeasync_try_18_0__try
|
||||
method_1094u9_initializeasync__action_20_initializeasync_await_20_1__await -->|calls| method_1094u9_initializeasync__call_20_IJSRuntime_InvokeAsync
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__condition -->|no-op| method_1094u9_initializeasync__action_21_guard_clause_21__false
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__condition -->|transforms input| method_1094u9_initializeasync__action_21_guard_clause_21__true
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__false -->|next| method_1094u9_initializeasync__action_21_guard_clause_21__merge
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__merge -->|next| method_1094u9_initializeasync__action_24_initializeasync_await_24_4__await
|
||||
method_1094u9_initializeasync__action_21_guard_clause_21__true -->|next| method_1094u9_initializeasync__action_21_guard_clause_21__merge
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__condition -->|false| method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__false
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__condition -->|true| method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__true
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__false -->|next| method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__merge
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__merge -->|next| method_1094u9_initializeasync__action_21_guard_clause_21__condition
|
||||
method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__true -->|next| method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__merge
|
||||
method_1094u9_initializeasync__action_24_event_invocation_24__linear -->|next| method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__condition
|
||||
method_1094u9_initializeasync__action_24_initializeasync_await_24_4__await -->|next| method_1094u9_initializeasync__action_24_event_invocation_24__linear
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__condition -->|false| method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__false
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__condition -->|true| method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__true
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__false -->|next| method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__merge
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__merge -->|no args, invokes subscribers asynchronously| method_1094u9_initializeasync__call_24_OnFocusModeChanged
|
||||
method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__true -->|next| method_1094u9_initializeasync__action_24_initializeasync_branch_24_3__merge
|
||||
method_1094u9_initializeasync__action_27_initializeasync_catch_27_5__catch -->|return| method_1094u9_initializeasync__implicit_return
|
||||
method_1094u9_initializeasync__call_20_IJSRuntime_InvokeAsync -->|next| method_1094u9_initializeasync__action_21_initializeasync_branch_21_2__condition
|
||||
method_1094u9_initializeasync__call_24_OnFocusModeChanged -->|exception| method_1094u9_initializeasync__action_27_initializeasync_catch_27_5__catch
|
||||
method_1094u9_initializeasync__entry -->|next| method_1094u9_initializeasync__action_18_try_catch_18__linear
|
||||
```
|
||||
|
||||
### ToggleAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_439s8m_toggleasync__call_36_OnFocusModeChanged[["OnFocusModeChanged"]]
|
||||
method_439s8m_toggleasync__call_40_IJSRuntime_InvokeVoidAsync[["IJSRuntime.InvokeVoidAsync"]]
|
||||
method_439s8m_toggleasync__action_35_state_change_35__linear("Toggle in-memory flag")
|
||||
method_439s8m_toggleasync__action_36_event_invocation_36__linear("Notify subscribers after toggle")
|
||||
method_439s8m_toggleasync__action_36_toggleasync_await_36_1__await[["Waits for async work"]]
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__condition{"OnFocusModeChanged != null) await OnFocusModeChanged("}
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__false("false")
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__merge("merge")
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__true("true")
|
||||
method_439s8m_toggleasync__action_38_toggleasync_try_38_2__try("Begins protected execution")
|
||||
method_439s8m_toggleasync__action_38_try_catch_38__linear("Persist new value to localStorage, ignore errors")
|
||||
method_439s8m_toggleasync__action_40_toggleasync_await_40_3__await[["Waits for async work"]]
|
||||
method_439s8m_toggleasync__action_42_toggleasync_catch_42_4__catch("Handles exception path")
|
||||
method_439s8m_toggleasync__entry(["ToggleAsync entry"])
|
||||
method_439s8m_toggleasync__implicit_return(["return"])
|
||||
method_439s8m_toggleasync__action_35_state_change_35__linear -->|next| method_439s8m_toggleasync__action_36_toggleasync_await_36_1__await
|
||||
method_439s8m_toggleasync__action_36_event_invocation_36__linear -->|next| method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__condition
|
||||
method_439s8m_toggleasync__action_36_toggleasync_await_36_1__await -->|next| method_439s8m_toggleasync__action_36_event_invocation_36__linear
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__condition -->|false| method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__false
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__condition -->|true| method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__true
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__false -->|next| method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__merge
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__merge -->|no args, invokes subscribers asynchronously| method_439s8m_toggleasync__call_36_OnFocusModeChanged
|
||||
method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__true -->|next| method_439s8m_toggleasync__action_36_toggleasync_branch_36_0__merge
|
||||
method_439s8m_toggleasync__action_38_toggleasync_try_38_2__try -->|next| method_439s8m_toggleasync__action_40_toggleasync_await_40_3__await
|
||||
method_439s8m_toggleasync__action_38_try_catch_38__linear -->|next| method_439s8m_toggleasync__action_38_toggleasync_try_38_2__try
|
||||
method_439s8m_toggleasync__action_40_toggleasync_await_40_3__await -->|calls| method_439s8m_toggleasync__call_40_IJSRuntime_InvokeVoidAsync
|
||||
method_439s8m_toggleasync__action_42_toggleasync_catch_42_4__catch -->|return| method_439s8m_toggleasync__implicit_return
|
||||
method_439s8m_toggleasync__call_36_OnFocusModeChanged -->|next| method_439s8m_toggleasync__action_38_try_catch_38__linear
|
||||
method_439s8m_toggleasync__call_40_IJSRuntime_InvokeVoidAsync -->|exception| method_439s8m_toggleasync__action_42_toggleasync_catch_42_4__catch
|
||||
method_439s8m_toggleasync__entry -->|next| method_439s8m_toggleasync__action_35_state_change_35__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 4 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_1094u9_initializeasync__fragment_diagram exceeds preferred complexity thresholds (22 nodes, 24 edges).
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# IFocusModeService
|
||||
|
||||
- File ID: file:xs3ks1:ifocusmodeservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IFocusModeService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines the IFocusModeService interface for UI focus mode control (querying state, initialization, toggling, and change notifications).
|
||||
|
||||
## Key Details
|
||||
|
||||
Interface is declaration-only; concrete implementations are expected to handle persistence, event invocation, and startup initialization behavior.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IFocusModeService: Defines the IFocusModeService interface for UI focus mode control (querying state, initialization, toggling, and change notifications).
|
||||
- IsFocusModeActive(): Property getter that indicates whether focus mode is currently active.
|
||||
- OnFocusModeChanged(): Event raised when focus mode changes, subscribers receive an asynchronous notification.
|
||||
- InitializeAsync(): Asynchronously initializes the focus mode service (e.g., load persisted state or perform startup tasks).
|
||||
- ToggleAsync(): Asynchronously toggles the focus mode state and typically notifies subscribers.
|
||||
- IFocusModeService: Contract for a UI-level service that manages focus mode state, initialization, toggling, and change notifications.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- IsFocusModeActive: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnFocusModeChanged: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- InitializeAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- ToggleAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IFocusModeService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_18bavme_ifocusmodeservice("IFocusModeService")
|
||||
file_xs3ks1_ifocusmodeservice_cs("IFocusModeService")
|
||||
method_17j6y8x_toggleasync[["ToggleAsync()"]]
|
||||
method_aocpxz_isfocusmodeactive[["IsFocusModeActive()"]]
|
||||
method_dzihxd_onfocusmodechanged[["OnFocusModeChanged()"]]
|
||||
method_fpl7t6_initializeasync[["InitializeAsync()"]]
|
||||
type_16mxgid_ifocusmodeservice[/"IFocusModeService"/]
|
||||
```
|
||||
|
||||
### IFocusModeService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_18bavme_ifocusmodeservice("IFocusModeService")
|
||||
method_17j6y8x_toggleasync[["ToggleAsync()"]]
|
||||
method_aocpxz_isfocusmodeactive[["IsFocusModeActive()"]]
|
||||
method_dzihxd_onfocusmodechanged[["OnFocusModeChanged()"]]
|
||||
method_fpl7t6_initializeasync[["InitializeAsync()"]]
|
||||
class_18bavme_ifocusmodeservice -->|contains| method_17j6y8x_toggleasync
|
||||
class_18bavme_ifocusmodeservice -->|contains| method_aocpxz_isfocusmodeactive
|
||||
class_18bavme_ifocusmodeservice -->|contains| method_dzihxd_onfocusmodechanged
|
||||
class_18bavme_ifocusmodeservice -->|contains| method_fpl7t6_initializeasync
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
# IKnowledgeGraphService
|
||||
|
||||
- File ID: file:1x9xhbs:iknowledgegraphservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IKnowledgeGraphService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines the UI-shared contract for a knowledge-graph state service: read-only state properties, events for change notifications, and async commands to update/clear state.
|
||||
|
||||
## Key Details
|
||||
|
||||
Interface is a UI-shared async service contract used to centralize knowledge-graph state and notify UI consumers via events; GraphDataDto is referenced from Application.Queries.Graph.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IKnowledgeGraphService: Defines the UI-shared contract for a knowledge-graph state service: read-only state properties, events for change notifications, and async commands to update/clear state.
|
||||
- CurrentGraphData(): Read-only property exposing the current graph data held by the service.
|
||||
- ActiveNodeId(): Read-only property exposing the currently active/selected node id.
|
||||
- IsLoading(): Read-only flag indicating whether the graph is currently loading.
|
||||
- OnGraphUpdated(): Event raised when the graph data has been updated.
|
||||
- OnActiveNodeChanged(): Event raised when the active node changes, providing the new node id.
|
||||
- OnLoadingChanged(): Event raised when the loading state changes, providing the new boolean state.
|
||||
- UpdateGraph(): Asynchronously replace or update the current graph data with newData and notify listeners.
|
||||
- SetActiveNode(): Asynchronously set the active node by id and notify subscribers of the change.
|
||||
- SetLoading(): Asynchronously set the loading flag and notify listeners.
|
||||
- Clear(): Asynchronously clear the current graph state (reset data, active node, loading) and notify subscribers.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries.Graph (GraphDataDto referenced)
|
||||
- interaction-target: Implementation should trigger OnGraphUpdated after updating state.
|
||||
- interaction-target: Implementation should trigger OnActiveNodeChanged with nodeId after change.
|
||||
- interaction-target: Implementation should trigger OnLoadingChanged with the new boolean value.
|
||||
- interaction-target: Implementation should raise OnGraphUpdated/OnActiveNodeChanged/OnLoadingChanged as appropriate after clearing.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 11
|
||||
- Executable symbols: 10
|
||||
- Executable symbols with control flow: 10
|
||||
- Grounded edges: 11
|
||||
- Unresolved references: 5
|
||||
- Control-flow fragments: 10
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- CurrentGraphData: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- ActiveNodeId: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- IsLoading: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnGraphUpdated: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnActiveNodeChanged: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnLoadingChanged: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- UpdateGraph: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetActiveNode: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetLoading: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- Clear: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IKnowledgeGraphService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1y1hevk_iknowledgegraphservice("IKnowledgeGraphService")
|
||||
file_1x9xhbs_iknowledgegraphservice_cs("IKnowledgeGraphService")
|
||||
method_10q1pr_isloading[["IsLoading()"]]
|
||||
method_1d2tbk0_onactivenodechanged[["OnActiveNodeChanged()"]]
|
||||
method_1gtjcaz_updategraph[["UpdateGraph()"]]
|
||||
method_1qc1jbv_onloadingchanged[["OnLoadingChanged()"]]
|
||||
method_1uy10ke_clear[["Clear()"]]
|
||||
method_88y0cc_ongraphupdated[["OnGraphUpdated()"]]
|
||||
method_cho50r_activenodeid[["ActiveNodeId()"]]
|
||||
method_n5kc06_currentgraphdata[["CurrentGraphData()"]]
|
||||
method_p6r8md_setactivenode[["SetActiveNode()"]]
|
||||
method_x4s1g_setloading[["SetLoading()"]]
|
||||
```
|
||||
|
||||
### IKnowledgeGraphService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1y1hevk_iknowledgegraphservice("IKnowledgeGraphService")
|
||||
method_10q1pr_isloading[["IsLoading()"]]
|
||||
method_1d2tbk0_onactivenodechanged[["OnActiveNodeChanged()"]]
|
||||
method_1gtjcaz_updategraph[["UpdateGraph()"]]
|
||||
method_1qc1jbv_onloadingchanged[["OnLoadingChanged()"]]
|
||||
method_1uy10ke_clear[["Clear()"]]
|
||||
method_88y0cc_ongraphupdated[["OnGraphUpdated()"]]
|
||||
method_cho50r_activenodeid[["ActiveNodeId()"]]
|
||||
method_n5kc06_currentgraphdata[["CurrentGraphData()"]]
|
||||
method_p6r8md_setactivenode[["SetActiveNode()"]]
|
||||
method_x4s1g_setloading[["SetLoading()"]]
|
||||
unresolved_unresolved_1un8r5w_interaction_target{"Unresolved: Implementation should trigger OnLoadingChanged with the new boolean value."}
|
||||
unresolved_unresolved_769k9d_interaction_target{"Unresolved: Implementation should raise OnGraphUpdated/OnActiveNodeChanged/OnLoadingChanged as appropriate after clearing."}
|
||||
unresolved_unresolved_awm461_interaction_target{"Unresolved: Implementation should trigger OnActiveNodeChanged with nodeId after change."}
|
||||
unresolved_unresolved_dl3x0o_interaction_target{"Unresolved: Implementation should trigger OnGraphUpdated after updating state."}
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_10q1pr_isloading
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_1d2tbk0_onactivenodechanged
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_1gtjcaz_updategraph
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_1qc1jbv_onloadingchanged
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_1uy10ke_clear
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_88y0cc_ongraphupdated
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_cho50r_activenodeid
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_n5kc06_currentgraphdata
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_p6r8md_setactivenode
|
||||
class_1y1hevk_iknowledgegraphservice -->|contains| method_x4s1g_setloading
|
||||
class_1y1hevk_iknowledgegraphservice -->|unresolved interaction| unresolved_unresolved_1un8r5w_interaction_target
|
||||
class_1y1hevk_iknowledgegraphservice -->|unresolved interaction| unresolved_unresolved_769k9d_interaction_target
|
||||
class_1y1hevk_iknowledgegraphservice -->|unresolved interaction| unresolved_unresolved_awm461_interaction_target
|
||||
class_1y1hevk_iknowledgegraphservice -->|unresolved interaction| unresolved_unresolved_dl3x0o_interaction_target
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
# IQuizStateService
|
||||
|
||||
- File ID: file:savadk:iquizstateservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IQuizStateService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines the UI-shared contract for a quiz state service used by frontend components to read quiz state, request quizzes, and signal updates.
|
||||
|
||||
## Key Details
|
||||
|
||||
Interface defines UI-facing quiz state contract with async methods and events; no implementation details here.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IQuizStateService: Defines the UI-shared contract for a quiz state service used by frontend components to read quiz state, request quizzes, and signal updates.
|
||||
- CurrentQuizBlockId(): Read-only property exposing the current quiz block identifier.
|
||||
- CurrentQuiz(): Read-only property exposing the current Quiz DTO.
|
||||
- IsHydrating(): Read-only property indicating whether the service is currently hydrating state.
|
||||
- HasNewQuiz(): Read-only property indicating whether there is a new/unseen quiz.
|
||||
- OnQuizRequested(): Event raised when a quiz is requested (carries blockId), consumers can subscribe to handle requests.
|
||||
- OnQuizUpdated(): Event raised when the quiz state is updated, consumers can subscribe to react to updates.
|
||||
- RequestQuiz(): Async contract to request loading or activation of a quiz by block id.
|
||||
- SetQuiz(): Async contract to set or clear the current quiz and associated block id.
|
||||
- SetHydrating(): Async contract to set the hydrating flag (state loading indicator).
|
||||
- MarkQuizAsSeen(): Async contract to mark the current quiz as seen/read by the user.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries (QuizDto)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 11
|
||||
- Executable symbols: 10
|
||||
- Executable symbols with control flow: 10
|
||||
- Grounded edges: 11
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 10
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- CurrentQuizBlockId: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- CurrentQuiz: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- IsHydrating: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- HasNewQuiz: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnQuizRequested: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnQuizUpdated: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- RequestQuiz: 7 nodes, 7 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetQuiz: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetHydrating: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- MarkQuizAsSeen: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IQuizStateService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_36xxdc_iquizstateservice("IQuizStateService")
|
||||
file_savadk_iquizstateservice_cs("IQuizStateService")
|
||||
method_1iqnx8z_ishydrating[["IsHydrating()"]]
|
||||
method_1pa87x9_onquizupdated[["OnQuizUpdated()"]]
|
||||
method_1pu32eo_hasnewquiz[["HasNewQuiz()"]]
|
||||
method_1s6rrbj_onquizrequested[["OnQuizRequested()"]]
|
||||
method_2bqrkc_markquizasseen[["MarkQuizAsSeen()"]]
|
||||
method_5hhpkw_setquiz[["SetQuiz()"]]
|
||||
method_dz8xj4_currentquiz[["CurrentQuiz()"]]
|
||||
method_pd4yo_sethydrating[["SetHydrating()"]]
|
||||
method_tuoc3y_requestquiz[["RequestQuiz()"]]
|
||||
method_vdmrat_currentquizblockid[["CurrentQuizBlockId()"]]
|
||||
```
|
||||
|
||||
### IQuizStateService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_36xxdc_iquizstateservice("IQuizStateService")
|
||||
method_1iqnx8z_ishydrating[["IsHydrating()"]]
|
||||
method_1pa87x9_onquizupdated[["OnQuizUpdated()"]]
|
||||
method_1pu32eo_hasnewquiz[["HasNewQuiz()"]]
|
||||
method_1s6rrbj_onquizrequested[["OnQuizRequested()"]]
|
||||
method_2bqrkc_markquizasseen[["MarkQuizAsSeen()"]]
|
||||
method_5hhpkw_setquiz[["SetQuiz()"]]
|
||||
method_dz8xj4_currentquiz[["CurrentQuiz()"]]
|
||||
method_pd4yo_sethydrating[["SetHydrating()"]]
|
||||
method_tuoc3y_requestquiz[["RequestQuiz()"]]
|
||||
method_vdmrat_currentquizblockid[["CurrentQuizBlockId()"]]
|
||||
class_36xxdc_iquizstateservice -->|contains| method_1iqnx8z_ishydrating
|
||||
class_36xxdc_iquizstateservice -->|contains| method_1pa87x9_onquizupdated
|
||||
class_36xxdc_iquizstateservice -->|contains| method_1pu32eo_hasnewquiz
|
||||
class_36xxdc_iquizstateservice -->|contains| method_1s6rrbj_onquizrequested
|
||||
class_36xxdc_iquizstateservice -->|contains| method_2bqrkc_markquizasseen
|
||||
class_36xxdc_iquizstateservice -->|contains| method_5hhpkw_setquiz
|
||||
class_36xxdc_iquizstateservice -->|contains| method_dz8xj4_currentquiz
|
||||
class_36xxdc_iquizstateservice -->|contains| method_pd4yo_sethydrating
|
||||
class_36xxdc_iquizstateservice -->|contains| method_tuoc3y_requestquiz
|
||||
class_36xxdc_iquizstateservice -->|contains| method_vdmrat_currentquizblockid
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
# IReaderInteractionService
|
||||
|
||||
- File ID: file:1szg1zb:ireaderinteractionservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IReaderInteractionService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines an interface for UI-level reader interactions (node/block selection, scrolling, highlighting, and text selection) and a small DTO for selection coordinates used across UI clients.
|
||||
|
||||
## Key Details
|
||||
|
||||
This file is an interface used by UI components to publish and consume reader-related events; implementations will orchestrate raising events and forwarding requests between UI parts.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IReaderInteractionService: Defines an interface for UI-level reader interactions (node/block selection, scrolling, highlighting, and text selection) and a small DTO for selection coordinates used across UI clients.
|
||||
- OnNodeSelected(): Event fired when a node is selected; subscribers receive the selected nodeId.
|
||||
- OnScrollToBlockRequested(): Event fired to request scrolling to a specific blockId.
|
||||
- OnHighlightBlockRequested(): Event fired to request highlighting of a specific blockId.
|
||||
- OnTextSelected(): Event fired when text is selected; subscribers receive the text, blockId, and coordinates.
|
||||
- NotifyNodeSelected(): Declares an async method to notify that a node was selected (intended to trigger or forward OnNodeSelected).
|
||||
- RequestScrollToBlock(): Declares an async request to scroll the UI to a block (intended to trigger OnScrollToBlockRequested).
|
||||
- RequestHighlightBlock(): Declares an async request to highlight a block (intended to trigger OnHighlightBlockRequested).
|
||||
- NotifyTextSelected(): Declares an async method to notify that text was selected, providing text, block context, and coordinates.
|
||||
- SelectionCoordinates: Represents the coordinates (top, left) and width of a text selection in UI units.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 10
|
||||
- Executable symbols: 8
|
||||
- Executable symbols with control flow: 8
|
||||
- Grounded edges: 10
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 8
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- OnNodeSelected: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnScrollToBlockRequested: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnHighlightBlockRequested: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnTextSelected: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- NotifyNodeSelected: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- RequestScrollToBlock: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- RequestHighlightBlock: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- NotifyTextSelected: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IReaderInteractionService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_w9vxji_ireaderinteractionservice("IReaderInteractionService")
|
||||
file_1szg1zb_ireaderinteractionservice_cs("IReaderInteractionService")
|
||||
method_15b21oe_onhighlightblockrequested[["OnHighlightBlockRequested()"]]
|
||||
method_18zc3my_ontextselected[["OnTextSelected()"]]
|
||||
method_1lb2q26_requesthighlightblock[["RequestHighlightBlock()"]]
|
||||
method_1r1tcl2_notifynodeselected[["NotifyNodeSelected()"]]
|
||||
method_ecn87d_onscrolltoblockrequested[["OnScrollToBlockRequested()"]]
|
||||
method_iyd7fv_requestscrolltoblock[["RequestScrollToBlock()"]]
|
||||
method_mhcg2e_onnodeselected[["OnNodeSelected()"]]
|
||||
method_p2mw02_notifytextselected[["NotifyTextSelected()"]]
|
||||
type_14glqwn_selectioncoordinates[/"SelectionCoordinates"/]
|
||||
```
|
||||
|
||||
### IReaderInteractionService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_w9vxji_ireaderinteractionservice("IReaderInteractionService")
|
||||
method_15b21oe_onhighlightblockrequested[["OnHighlightBlockRequested()"]]
|
||||
method_18zc3my_ontextselected[["OnTextSelected()"]]
|
||||
method_1lb2q26_requesthighlightblock[["RequestHighlightBlock()"]]
|
||||
method_1r1tcl2_notifynodeselected[["NotifyNodeSelected()"]]
|
||||
method_ecn87d_onscrolltoblockrequested[["OnScrollToBlockRequested()"]]
|
||||
method_iyd7fv_requestscrolltoblock[["RequestScrollToBlock()"]]
|
||||
method_mhcg2e_onnodeselected[["OnNodeSelected()"]]
|
||||
method_p2mw02_notifytextselected[["NotifyTextSelected()"]]
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_15b21oe_onhighlightblockrequested
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_18zc3my_ontextselected
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_1lb2q26_requesthighlightblock
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_1r1tcl2_notifynodeselected
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_ecn87d_onscrolltoblockrequested
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_iyd7fv_requestscrolltoblock
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_mhcg2e_onnodeselected
|
||||
class_w9vxji_ireaderinteractionservice -->|contains| method_p2mw02_notifytextselected
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
# IReaderNavigationService
|
||||
|
||||
- File ID: file:wgkae9:ireadernavigationservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IReaderNavigationService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines the shared UI navigation contract for an ebook reader (state, navigation commands, metadata updates and an event to notify consumers).
|
||||
|
||||
## Key Details
|
||||
|
||||
Interface-only file: no implementations or external calls. Defines navigation contract and an async event used by UI components across clients.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IReaderNavigationService: Defines the shared UI navigation contract for an ebook reader (state, navigation commands, metadata updates and an event to notify consumers).
|
||||
- CurrentEbookId(): Exposes the current ebook identifier.
|
||||
- CurrentChapterIndex(): Exposes the current chapter index within the active ebook.
|
||||
- TotalChapters(): Exposes the total number of chapters for the active ebook.
|
||||
- ChapterTitle(): Exposes the title of the current chapter.
|
||||
- OnNavigationChanged(): Event invoked when navigation state changes to notify subscribers (async).
|
||||
- GoToChapter(): Navigate to a specific chapter index and notify interested subscribers.
|
||||
- GoToNextChapter(): Advance navigation to the next chapter and notify subscribers.
|
||||
- GoToPreviousChapter(): Move navigation to the previous chapter and notify subscribers.
|
||||
- UpdateMetadataAsync(): Update chapter-related metadata (current index, total chapters, title) asynchronously.
|
||||
- NavigateToBook(): Navigate to the reader UI for a specific book and record its ebook ID (triggers routing).
|
||||
- SetBook(): Set the active book context (ID and optional chapter) without performing browser routing.
|
||||
- IReaderNavigationService: Contract for reader navigation state and operations shared across UI clients.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 13
|
||||
- Executable symbols: 11
|
||||
- Executable symbols with control flow: 11
|
||||
- Grounded edges: 13
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 11
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- CurrentEbookId: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- CurrentChapterIndex: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- TotalChapters: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- ChapterTitle: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnNavigationChanged: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- GoToChapter: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- GoToNextChapter: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- GoToPreviousChapter: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- UpdateMetadataAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- NavigateToBook: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetBook: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IReaderNavigationService Neighborhood
|
||||
|
||||
_Warnings: diagram file_wgkae9_ireadernavigationservice_cs_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_9gxpik_ireadernavigationservice("IReaderNavigationService")
|
||||
file_wgkae9_ireadernavigationservice_cs("IReaderNavigationService")
|
||||
method_12odud7_gotopreviouschapter[["GoToPreviousChapter()"]]
|
||||
method_1d0xirt_onnavigationchanged[["OnNavigationChanged()"]]
|
||||
method_1dvbk1u_gotonextchapter[["GoToNextChapter()"]]
|
||||
method_1la3caq_navigatetobook[["NavigateToBook()"]]
|
||||
method_4hij31_updatemetadataasync[["UpdateMetadataAsync()"]]
|
||||
method_4o7htd_setbook[["SetBook()"]]
|
||||
method_l33fvs_totalchapters[["TotalChapters()"]]
|
||||
method_orf66k_gotochapter[["GoToChapter()"]]
|
||||
method_vlhvyc_currentebookid[["CurrentEbookId()"]]
|
||||
method_wxhxya_chaptertitle[["ChapterTitle()"]]
|
||||
method_xv5ikh_currentchapterindex[["CurrentChapterIndex()"]]
|
||||
type_xd8rr7_ireadernavigationservice[/"IReaderNavigationService"/]
|
||||
```
|
||||
|
||||
### IReaderNavigationService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_9gxpik_ireadernavigationservice("IReaderNavigationService")
|
||||
method_12odud7_gotopreviouschapter[["GoToPreviousChapter()"]]
|
||||
method_1d0xirt_onnavigationchanged[["OnNavigationChanged()"]]
|
||||
method_1dvbk1u_gotonextchapter[["GoToNextChapter()"]]
|
||||
method_1la3caq_navigatetobook[["NavigateToBook()"]]
|
||||
method_4hij31_updatemetadataasync[["UpdateMetadataAsync()"]]
|
||||
method_4o7htd_setbook[["SetBook()"]]
|
||||
method_l33fvs_totalchapters[["TotalChapters()"]]
|
||||
method_orf66k_gotochapter[["GoToChapter()"]]
|
||||
method_vlhvyc_currentebookid[["CurrentEbookId()"]]
|
||||
method_wxhxya_chaptertitle[["ChapterTitle()"]]
|
||||
method_xv5ikh_currentchapterindex[["CurrentChapterIndex()"]]
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_12odud7_gotopreviouschapter
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_1d0xirt_onnavigationchanged
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_1dvbk1u_gotonextchapter
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_1la3caq_navigatetobook
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_4hij31_updatemetadataasync
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_4o7htd_setbook
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_l33fvs_totalchapters
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_orf66k_gotochapter
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_vlhvyc_currentebookid
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_wxhxya_chaptertitle
|
||||
class_9gxpik_ireadernavigationservice -->|contains| method_xv5ikh_currentchapterindex
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: neighborhood-view: diagram file_wgkae9_ireadernavigationservice_cs_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges).
|
||||
@@ -0,0 +1,86 @@
|
||||
# ISyncService
|
||||
|
||||
- File ID: file:l3weg3:isyncservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/ISyncService.cs
|
||||
- Role: service
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a shared synchronization service contract for reporting and receiving ebook reading progress within UI layers.
|
||||
|
||||
## Key Details
|
||||
|
||||
A lightweight interface in the shared UI layer defining async lifecycle (initialize/dispose), progress reporting via UpdateProgressAsync, and an OnProgressReceived event; uses FluentResults.Result for result semantics.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ISyncService: Defines a shared synchronization service contract for reporting and receiving ebook reading progress within UI layers.
|
||||
- InitializeAsync(): Initializes the sync service (e.g., prepare connections or state) and returns success/failure as a FluentResults.Result.
|
||||
- UpdateProgressAsync(): Reports progress/state for a given ebook and page, returning a Result indicating success or failure.
|
||||
- OnProgressReceived(): Event invoked when progress is received; subscribers are called with a page id and timestamp.
|
||||
- DisposeAsync(): Asynchronously disposes or tears down the sync service resources.
|
||||
- ISyncService: Contract for a synchronization service that initializes, reports progress, exposes progress events, and can be disposed asynchronously.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- InitializeAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- UpdateProgressAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnProgressReceived: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- DisposeAsync: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ISyncService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1xcfdo4_isyncservice("ISyncService")
|
||||
file_l3weg3_isyncservice_cs("ISyncService")
|
||||
method_10p42fw_initializeasync[["InitializeAsync()"]]
|
||||
method_163m6av_disposeasync[["DisposeAsync()"]]
|
||||
method_1op2ws5_updateprogressasync[["UpdateProgressAsync()"]]
|
||||
method_pqi00v_onprogressreceived[["OnProgressReceived()"]]
|
||||
type_yxmwa5_isyncservice[/"ISyncService"/]
|
||||
```
|
||||
|
||||
### ISyncService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1xcfdo4_isyncservice("ISyncService")
|
||||
method_10p42fw_initializeasync[["InitializeAsync()"]]
|
||||
method_163m6av_disposeasync[["DisposeAsync()"]]
|
||||
method_1op2ws5_updateprogressasync[["UpdateProgressAsync()"]]
|
||||
method_pqi00v_onprogressreceived[["OnProgressReceived()"]]
|
||||
class_1xcfdo4_isyncservice -->|contains| method_10p42fw_initializeasync
|
||||
class_1xcfdo4_isyncservice -->|contains| method_163m6av_disposeasync
|
||||
class_1xcfdo4_isyncservice -->|contains| method_1op2ws5_updateprogressasync
|
||||
class_1xcfdo4_isyncservice -->|contains| method_pqi00v_onprogressreceived
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
@@ -0,0 +1,81 @@
|
||||
# IThemeService
|
||||
|
||||
- File ID: file:vbuljf:ithemeservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IThemeService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines an abstraction for a UI theme service that exposes current theme mode, an event for theme changes, and a toggle operation for switching themes.
|
||||
|
||||
## Key Details
|
||||
|
||||
Interface-only file; no implementation or external calls present. It defines a small UI-facing contract for toggling and observing theme state.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IThemeService: Defines an abstraction for a UI theme service that exposes current theme mode, an event for theme changes, and a toggle operation for switching themes.
|
||||
- IsLightMode(): Exposes whether the UI is currently in light mode.
|
||||
- OnThemeChanged(): Event invoked when the theme changes to notify subscribers.
|
||||
- ToggleTheme(): Toggles the current theme between light and dark modes (declaration only).
|
||||
- IThemeService: Abstraction for UI theme management exposing current mode, a change event, and a toggle operation.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 3
|
||||
- Executable symbols with control flow: 3
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 3
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 2
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- IsLightMode: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- OnThemeChanged: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- ToggleTheme: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IThemeService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1a23wve_ithemeservice("IThemeService")
|
||||
file_vbuljf_ithemeservice_cs("IThemeService")
|
||||
method_1fw96o1_onthemechanged[["OnThemeChanged()"]]
|
||||
method_1xxkfgr_islightmode[["IsLightMode()"]]
|
||||
method_dw3sqb_toggletheme[["ToggleTheme()"]]
|
||||
type_5dm37d_ithemeservice[/"IThemeService"/]
|
||||
```
|
||||
|
||||
### IThemeService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1a23wve_ithemeservice("IThemeService")
|
||||
method_1fw96o1_onthemechanged[["OnThemeChanged()"]]
|
||||
method_1xxkfgr_islightmode[["IsLightMode()"]]
|
||||
method_dw3sqb_toggletheme[["ToggleTheme()"]]
|
||||
class_1a23wve_ithemeservice -->|contains| method_1fw96o1_onthemechanged
|
||||
class_1a23wve_ithemeservice -->|contains| method_1xxkfgr_islightmode
|
||||
class_1a23wve_ithemeservice -->|contains| method_dw3sqb_toggletheme
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+829
@@ -0,0 +1,829 @@
|
||||
# IdentityService
|
||||
|
||||
- File ID: file:b8uv8h:identityservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/IdentityService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Client-side identity helper used by UI layers to register, login, logout, refresh tokens and fetch/cached user profile information; bridges HttpClient, native secure storage and the app authentication state provider.
|
||||
|
||||
## Key Details
|
||||
|
||||
Implements client auth flows with local secure storage, rate-limited profile fetching, single-flight deduplication for profile requests and ties into a NexusAuthenticationStateProvider via casts to notify/clear state. Non-browser environments skip profile fetching.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IdentityService: Client-side identity helper used by UI layers to register, login, logout, refresh tokens and fetch/cached user profile information; bridges HttpClient, native secure storage and the app authentication state provider.
|
||||
- IdentityService(): Constructs the identity service wiring HttpClient, native storage and optional auth state provider.
|
||||
- RegisterAsync(): Sends registration request to the backend and returns success/failure result.
|
||||
- LoginAsync(): Performs login against backend, stores tokens, invalidates auth state, fetches profile and persists profile metadata; returns success/failure.
|
||||
- LogoutAsync(): Clears cached profile and, on browser, erases stored tokens/profile metadata; notifies auth provider and triggers state invalidation.
|
||||
- GetProfileAsync(): Public cached-profile accessor: returns cached profile, reuses an in-flight profile task if present, otherwise triggers background fetch and returns its result wrapped in Result.
|
||||
- GetProfileInternalAsync(): Performs the actual HTTP profile fetch with basic rate-limiting, updates cache/storage and notifies auth provider; handles unauthorized by logging out.
|
||||
- RefreshTokenAsync(): Attempts to refresh access token using stored refresh token, persists new tokens, invalidates auth state and refreshes profile information.
|
||||
- LoginResponse: Local DTO used to deserialize login/refresh responses (token, expiry, refresh token).
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (IIdentityService) -> unknown file
|
||||
- dependency-target: NexusReader.Application.DTOs.User (UserProfileDto) -> unknown file
|
||||
- dependency-target: NexusReader.Application.Constants (StorageKeys) -> unknown file
|
||||
- dependency-target: INativeStorageService -> unknown file
|
||||
- dependency-target: NexusAuthenticationStateProvider -> unknown file
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: Calls HttpClient.PostAsJsonAsync to 'identity/register' (framework call omitted from calls list)
|
||||
- interaction-target: HttpClient.GetAsync('identity/profile') (framework call omitted from calls list)
|
||||
- interaction-target: Calls HttpClient.PostAsJsonAsync to 'identity/refresh' (framework call omitted from calls list)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 9
|
||||
- Executable symbols: 7
|
||||
- Executable symbols with control flow: 7
|
||||
- Grounded edges: 9
|
||||
- Unresolved references: 41
|
||||
- Control-flow fragments: 7
|
||||
- Unresolved jumps: 29
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 8
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- IdentityService: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- RegisterAsync: 12 nodes, 12 edges, 0 jumps, 0 unsupported constructs
|
||||
- LoginAsync: 66 nodes, 73 edges, 9 jumps, 0 unsupported constructs
|
||||
- LogoutAsync: 32 nodes, 33 edges, 8 jumps, 0 unsupported constructs
|
||||
- GetProfileAsync: 24 nodes, 27 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetProfileInternalAsync: 60 nodes, 67 edges, 5 jumps, 0 unsupported constructs
|
||||
- RefreshTokenAsync: 64 nodes, 71 edges, 10 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IdentityService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_vgua1e_identityservice("IdentityService")
|
||||
file_b8uv8h_identityservice_cs("IdentityService")
|
||||
method_1i33wis_logoutasync[["LogoutAsync()"]]
|
||||
method_1u6514u_getprofileasync[["GetProfileAsync()"]]
|
||||
method_8ggznb_identityservice[["IdentityService()"]]
|
||||
method_b6asoe_loginasync[["LoginAsync()"]]
|
||||
method_kf6qfg_registerasync[["RegisterAsync()"]]
|
||||
method_nb75z9_refreshtokenasync[["RefreshTokenAsync()"]]
|
||||
method_nyrl9z_getprofileinternalasync[["GetProfileInternalAsync()"]]
|
||||
type_14gvkuy_loginresponse[/"LoginResponse"/]
|
||||
```
|
||||
|
||||
### IdentityService Execution Overview
|
||||
|
||||
_Warnings: diagram file_b8uv8h_identityservice_cs_execution_view exceeds preferred complexity thresholds (30 nodes, 43 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
class_vgua1e_identityservice("IdentityService")
|
||||
method_1i33wis_logoutasync[["LogoutAsync()"]]
|
||||
method_1u6514u_getprofileasync[["GetProfileAsync()"]]
|
||||
method_8ggznb_identityservice[["IdentityService()"]]
|
||||
method_b6asoe_loginasync[["LoginAsync()"]]
|
||||
method_kf6qfg_registerasync[["RegisterAsync()"]]
|
||||
method_nb75z9_refreshtokenasync[["RefreshTokenAsync()"]]
|
||||
method_nyrl9z_getprofileinternalasync[["GetProfileInternalAsync()"]]
|
||||
unresolved_unresolved_10fc8rp_call_target{"Unresolved: INativeStorageService.GetSecureString"}
|
||||
unresolved_unresolved_159kzo2_interaction_target{"Unresolved: Calls HttpClient.PostAsJsonAsync to 'identity/register' (framework call omitted from calls list)"}
|
||||
unresolved_unresolved_19pszpm_call_target{"Unresolved: INativeStorageService.SaveSecureString"}
|
||||
unresolved_unresolved_1atdq4u_call_target{"Unresolved: OnStateInvalidated.Invoke"}
|
||||
unresolved_unresolved_1e40o4e_call_target{"Unresolved: NexusAuthenticationStateProvider.NotifyUserAuthentication"}
|
||||
unresolved_unresolved_1gkugkk_call_target{"Unresolved: OnStateInvalidated.Invoke"}
|
||||
unresolved_unresolved_1gvn8f0_call_target{"Unresolved: NexusAuthenticationStateProvider.NotifyUserAuthentication"}
|
||||
unresolved_unresolved_1h591k0_call_target{"Unresolved: NexusAuthenticationStateProvider.NotifyUserLogout"}
|
||||
unresolved_unresolved_1qta35c_interaction_target{"Unresolved: Calls HttpClient.PostAsJsonAsync to 'identity/refresh' (framework call omitted from calls list)"}
|
||||
unresolved_unresolved_1u6whi4_call_target{"Unresolved: INativeStorageService.SaveSecureString"}
|
||||
unresolved_unresolved_1v3p4g4_call_target{"Unresolved: GetProfileAsync"}
|
||||
unresolved_unresolved_1wraerh_call_target{"Unresolved: NexusAuthenticationStateProvider.NotifyUserAuthentication"}
|
||||
unresolved_unresolved_7bj2q1_call_target{"Unresolved: NexusAuthenticationStateProvider.ClearCache"}
|
||||
unresolved_unresolved_7cdvii_call_target{"Unresolved: OnStateInvalidated.Invoke"}
|
||||
unresolved_unresolved_iwmd6s_call_target{"Unresolved: GetProfileInternalAsync"}
|
||||
unresolved_unresolved_kf4wfl_call_target{"Unresolved: INativeStorageService.SaveSecureString"}
|
||||
unresolved_unresolved_qhvr5q_call_target{"Unresolved: GetProfileAsync"}
|
||||
unresolved_unresolved_r45bnc_call_target{"Unresolved: INativeStorageService.SaveSecureString"}
|
||||
unresolved_unresolved_sdsrv_interaction_target{"Unresolved: HttpClient.GetAsync('identity/profile') (framework call omitted from calls list)"}
|
||||
unresolved_unresolved_wkcuys_call_target{"Unresolved: LogoutAsync"}
|
||||
unresolved_unresolved_wlkdyl_call_target{"Unresolved: NexusAuthenticationStateProvider.ClearCache"}
|
||||
unresolved_unresolved_y9kokj_call_target{"Unresolved: NexusAuthenticationStateProvider.ClearCache"}
|
||||
class_vgua1e_identityservice -->|contains| method_1i33wis_logoutasync
|
||||
class_vgua1e_identityservice -->|contains| method_1u6514u_getprofileasync
|
||||
class_vgua1e_identityservice -->|contains| method_8ggznb_identityservice
|
||||
class_vgua1e_identityservice -->|contains| method_b6asoe_loginasync
|
||||
class_vgua1e_identityservice -->|contains| method_kf6qfg_registerasync
|
||||
class_vgua1e_identityservice -->|contains| method_nb75z9_refreshtokenasync
|
||||
class_vgua1e_identityservice -->|contains| method_nyrl9z_getprofileinternalasync
|
||||
class_vgua1e_identityservice -->|unresolved interaction| unresolved_unresolved_159kzo2_interaction_target
|
||||
class_vgua1e_identityservice -->|unresolved interaction| unresolved_unresolved_1qta35c_interaction_target
|
||||
class_vgua1e_identityservice -->|unresolved interaction| unresolved_unresolved_sdsrv_interaction_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_1h591k0_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_7cdvii_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_r45bnc_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_r45bnc_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_r45bnc_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_r45bnc_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_r45bnc_call_target
|
||||
method_1i33wis_logoutasync -->|unresolved call| unresolved_unresolved_wlkdyl_call_target
|
||||
method_1u6514u_getprofileasync -->|unresolved call| unresolved_unresolved_iwmd6s_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1atdq4u_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1e40o4e_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1u6whi4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1u6whi4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1u6whi4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1u6whi4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1u6whi4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_1v3p4g4_call_target
|
||||
method_b6asoe_loginasync -->|unresolved call| unresolved_unresolved_7bj2q1_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_10fc8rp_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_19pszpm_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_19pszpm_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_19pszpm_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_19pszpm_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_19pszpm_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_1gkugkk_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_1gvn8f0_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_qhvr5q_call_target
|
||||
method_nb75z9_refreshtokenasync -->|unresolved call| unresolved_unresolved_y9kokj_call_target
|
||||
method_nyrl9z_getprofileinternalasync -->|unresolved call| unresolved_unresolved_1wraerh_call_target
|
||||
method_nyrl9z_getprofileinternalasync -->|unresolved call| unresolved_unresolved_kf4wfl_call_target
|
||||
method_nyrl9z_getprofileinternalasync -->|unresolved call| unresolved_unresolved_kf4wfl_call_target
|
||||
method_nyrl9z_getprofileinternalasync -->|unresolved call| unresolved_unresolved_kf4wfl_call_target
|
||||
method_nyrl9z_getprofileinternalasync -->|unresolved call| unresolved_unresolved_wkcuys_call_target
|
||||
```
|
||||
|
||||
### RegisterAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_kf6qfg_registerasync__action_35_registerasync_try_35_0__try("Begins protected execution")
|
||||
method_kf6qfg_registerasync__action_35_try_catch_35__linear("Network exception handling")
|
||||
method_kf6qfg_registerasync__action_37_registerasync_await_37_1__await[["Waits for async work"]]
|
||||
method_kf6qfg_registerasync__action_38_branch_38__condition{"response.IsSuccessStatusCode"}
|
||||
method_kf6qfg_registerasync__action_38_branch_38__false("fail")
|
||||
method_kf6qfg_registerasync__action_38_branch_38__merge("merge")
|
||||
method_kf6qfg_registerasync__action_38_branch_38__true("ok")
|
||||
method_kf6qfg_registerasync__action_40_registerasync_catch_40_3__catch("catch Exception ex")
|
||||
method_kf6qfg_registerasync__entry(["RegisterAsync entry"])
|
||||
method_kf6qfg_registerasync__action_37_external_call_37__linear("POST register")
|
||||
method_kf6qfg_registerasync__action_38_registerasync_return_38_2__return(["Returns result"])
|
||||
method_kf6qfg_registerasync__action_42_registerasync_return_42_4__return(["Returns result"])
|
||||
method_kf6qfg_registerasync__action_35_registerasync_try_35_0__try -->|next| method_kf6qfg_registerasync__action_37_registerasync_await_37_1__await
|
||||
method_kf6qfg_registerasync__action_35_try_catch_35__linear -->|next| method_kf6qfg_registerasync__action_35_registerasync_try_35_0__try
|
||||
method_kf6qfg_registerasync__action_37_external_call_37__linear -->|return| method_kf6qfg_registerasync__action_38_registerasync_return_38_2__return
|
||||
method_kf6qfg_registerasync__action_37_registerasync_await_37_1__await -->|next| method_kf6qfg_registerasync__action_37_external_call_37__linear
|
||||
method_kf6qfg_registerasync__action_38_branch_38__condition -->|fail| method_kf6qfg_registerasync__action_38_branch_38__false
|
||||
method_kf6qfg_registerasync__action_38_branch_38__condition -->|ok| method_kf6qfg_registerasync__action_38_branch_38__true
|
||||
method_kf6qfg_registerasync__action_38_branch_38__false -->|next| method_kf6qfg_registerasync__action_38_branch_38__merge
|
||||
method_kf6qfg_registerasync__action_38_branch_38__merge -->|exception| method_kf6qfg_registerasync__action_40_registerasync_catch_40_3__catch
|
||||
method_kf6qfg_registerasync__action_38_branch_38__true -->|next| method_kf6qfg_registerasync__action_38_branch_38__merge
|
||||
method_kf6qfg_registerasync__action_38_registerasync_return_38_2__return -->|next| method_kf6qfg_registerasync__action_38_branch_38__condition
|
||||
method_kf6qfg_registerasync__action_40_registerasync_catch_40_3__catch -->|return| method_kf6qfg_registerasync__action_42_registerasync_return_42_4__return
|
||||
method_kf6qfg_registerasync__entry -->|next| method_kf6qfg_registerasync__action_35_try_catch_35__linear
|
||||
```
|
||||
|
||||
### LoginAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_b6asoe_loginasync__fragment_diagram exceeds preferred complexity thresholds (66 nodes, 73 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_b6asoe_loginasync__call_67_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_b6asoe_loginasync__call_70_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_b6asoe_loginasync__call_74_NexusAuthenticationStateProvider_ClearCache[["NexusAuthenticationStateProvider.ClearCache"]]
|
||||
method_b6asoe_loginasync__call_75_OnStateInvalidated_Invoke[["OnStateInvalidated.Invoke"]]
|
||||
method_b6asoe_loginasync__call_77_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_b6asoe_loginasync__call_81_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_b6asoe_loginasync__call_82_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_b6asoe_loginasync__call_85_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_b6asoe_loginasync__call_87_NexusAuthenticationStateProvider_NotifyUserAuthentication[["NexusAuthenticationStateProvider.NotifyUserAuthentication"]]
|
||||
method_b6asoe_loginasync__action_48_loginasync_try_48_0__try("Begins protected execution")
|
||||
method_b6asoe_loginasync__action_48_try_catch_48__linear("Entire login flow guarded")
|
||||
method_b6asoe_loginasync__action_50_loginasync_await_50_1__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_52_branch_52__condition{"response.IsSuccessStatusCode"}
|
||||
method_b6asoe_loginasync__action_52_branch_52__false("return invalid credentials")
|
||||
method_b6asoe_loginasync__action_52_branch_52__merge("merge")
|
||||
method_b6asoe_loginasync__action_52_branch_52__true("process tokens and profile")
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__condition{"response.IsSuccessStatusCode"}
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__false("false")
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__merge("merge")
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__true("true")
|
||||
method_b6asoe_loginasync__action_56_loginasync_try_56_3__try("Begins protected execution")
|
||||
method_b6asoe_loginasync__action_56_try_catch_56__linear("Parse JSON response")
|
||||
method_b6asoe_loginasync__action_58_loginasync_await_58_4__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_60_loginasync_catch_60_5__catch("catch System.Text.Json.JsonException ex")
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__condition{"result != null && !string.IsNullOrEmpty(result.AccessToken)"}
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__false("skip token persistence")
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__merge("merge")
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__true("save tokens")
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__condition{"result != null && !string.IsNullOrEmpty(result.AccessToken)"}
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__false("false")
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__merge("merge")
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__true("true")
|
||||
method_b6asoe_loginasync__action_67_loginasync_await_67_8__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__condition{"!string.IsNullOrEmpty(result.RefreshToken)"}
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__false("false")
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__merge("merge")
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__true("true")
|
||||
method_b6asoe_loginasync__action_70_loginasync_await_70_10__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_74_state_change_74__linear("Invalidate auth state and notify listeners")
|
||||
method_b6asoe_loginasync__action_75_loginasync_await_75_12__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__condition{"OnStateInvalidated != null) await OnStateInvalidated.Invoke("}
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__false("false")
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__merge("merge")
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__true("true")
|
||||
method_b6asoe_loginasync__action_77_loginasync_await_77_13__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_77_orchestration_77__linear("Fetch and persist profile after login")
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__condition{"profileResult.IsSuccess"}
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__false("false")
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__merge("merge")
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__true("true")
|
||||
method_b6asoe_loginasync__action_81_loginasync_await_81_15__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_82_loginasync_await_82_16__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_85_loginasync_await_85_17__await[["Waits for async work"]]
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__condition{"Falls back to alternate path"}
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__false("otherwise")
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__merge("merge")
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__true("fallback")
|
||||
method_b6asoe_loginasync__action_98_loginasync_catch_98_23__catch("catch Exception ex")
|
||||
method_b6asoe_loginasync__entry(["LoginAsync entry"])
|
||||
method_b6asoe_loginasync__action_87_loginasync_notification_87_18__linear[/"Sends notification"/]
|
||||
method_b6asoe_loginasync__action_91_loginasync_notification_91_20__linear[/"Sends notification"/]
|
||||
method_b6asoe_loginasync__action_100_loginasync_return_100_24__return(["Returns result"])
|
||||
method_b6asoe_loginasync__action_62_loginasync_return_62_6__return(["Returns result"])
|
||||
method_b6asoe_loginasync__action_94_loginasync_return_94_21__return(["Returns result"])
|
||||
method_b6asoe_loginasync__action_94_return_94__return(["Return success/failure"])
|
||||
method_b6asoe_loginasync__action_96_loginasync_return_96_22__return(["Returns result"])
|
||||
method_b6asoe_loginasync__action_48_loginasync_try_48_0__try -->|next| method_b6asoe_loginasync__action_50_loginasync_await_50_1__await
|
||||
method_b6asoe_loginasync__action_48_try_catch_48__linear -->|next| method_b6asoe_loginasync__action_48_loginasync_try_48_0__try
|
||||
method_b6asoe_loginasync__action_50_loginasync_await_50_1__await -->|next| method_b6asoe_loginasync__action_52_loginasync_branch_52_2__condition
|
||||
method_b6asoe_loginasync__action_52_branch_52__condition -->|return invalid credentials| method_b6asoe_loginasync__action_52_branch_52__false
|
||||
method_b6asoe_loginasync__action_52_branch_52__condition -->|process tokens and profile| method_b6asoe_loginasync__action_52_branch_52__true
|
||||
method_b6asoe_loginasync__action_52_branch_52__false -->|next| method_b6asoe_loginasync__action_52_branch_52__merge
|
||||
method_b6asoe_loginasync__action_52_branch_52__merge -->|next| method_b6asoe_loginasync__action_56_try_catch_56__linear
|
||||
method_b6asoe_loginasync__action_52_branch_52__true -->|next| method_b6asoe_loginasync__action_52_branch_52__merge
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__condition -->|false| method_b6asoe_loginasync__action_52_loginasync_branch_52_2__false
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__condition -->|true| method_b6asoe_loginasync__action_52_loginasync_branch_52_2__true
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__false -->|next| method_b6asoe_loginasync__action_52_loginasync_branch_52_2__merge
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__merge -->|next| method_b6asoe_loginasync__action_52_branch_52__condition
|
||||
method_b6asoe_loginasync__action_52_loginasync_branch_52_2__true -->|next| method_b6asoe_loginasync__action_52_loginasync_branch_52_2__merge
|
||||
method_b6asoe_loginasync__action_56_loginasync_try_56_3__try -->|next| method_b6asoe_loginasync__action_58_loginasync_await_58_4__await
|
||||
method_b6asoe_loginasync__action_56_try_catch_56__linear -->|next| method_b6asoe_loginasync__action_56_loginasync_try_56_3__try
|
||||
method_b6asoe_loginasync__action_58_loginasync_await_58_4__await -->|exception| method_b6asoe_loginasync__action_60_loginasync_catch_60_5__catch
|
||||
method_b6asoe_loginasync__action_60_loginasync_catch_60_5__catch -->|return| method_b6asoe_loginasync__action_62_loginasync_return_62_6__return
|
||||
method_b6asoe_loginasync__action_62_loginasync_return_62_6__return -->|next| method_b6asoe_loginasync__action_65_guard_clause_65__condition
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__condition -->|skip token persistence| method_b6asoe_loginasync__action_65_guard_clause_65__false
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__condition -->|save tokens| method_b6asoe_loginasync__action_65_guard_clause_65__true
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__false -->|next| method_b6asoe_loginasync__action_65_guard_clause_65__merge
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__merge -->|next| method_b6asoe_loginasync__action_65_loginasync_branch_65_7__condition
|
||||
method_b6asoe_loginasync__action_65_guard_clause_65__true -->|next| method_b6asoe_loginasync__action_65_guard_clause_65__merge
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__condition -->|false| method_b6asoe_loginasync__action_65_loginasync_branch_65_7__false
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__condition -->|true| method_b6asoe_loginasync__action_65_loginasync_branch_65_7__true
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__false -->|next| method_b6asoe_loginasync__action_65_loginasync_branch_65_7__merge
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__merge -->|next| method_b6asoe_loginasync__action_67_loginasync_await_67_8__await
|
||||
method_b6asoe_loginasync__action_65_loginasync_branch_65_7__true -->|next| method_b6asoe_loginasync__action_65_loginasync_branch_65_7__merge
|
||||
method_b6asoe_loginasync__action_67_loginasync_await_67_8__await -->|TokenKey, result.AccessToken| method_b6asoe_loginasync__call_67_INativeStorageService_SaveSecureString
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__condition -->|false| method_b6asoe_loginasync__action_68_loginasync_branch_68_9__false
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__condition -->|true| method_b6asoe_loginasync__action_68_loginasync_branch_68_9__true
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__false -->|next| method_b6asoe_loginasync__action_68_loginasync_branch_68_9__merge
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__merge -->|next| method_b6asoe_loginasync__action_70_loginasync_await_70_10__await
|
||||
method_b6asoe_loginasync__action_68_loginasync_branch_68_9__true -->|next| method_b6asoe_loginasync__action_68_loginasync_branch_68_9__merge
|
||||
method_b6asoe_loginasync__action_70_loginasync_await_70_10__await -->|RefreshTokenKey, result.RefreshToken| method_b6asoe_loginasync__call_70_INativeStorageService_SaveSecureString
|
||||
method_b6asoe_loginasync__action_74_state_change_74__linear -->|cast _authStateProvider and call ClearCache| method_b6asoe_loginasync__call_74_NexusAuthenticationStateProvider_ClearCache
|
||||
method_b6asoe_loginasync__action_75_loginasync_await_75_12__await -->|next| method_b6asoe_loginasync__action_75_loginasync_branch_75_11__condition
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__condition -->|false| method_b6asoe_loginasync__action_75_loginasync_branch_75_11__false
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__condition -->|true| method_b6asoe_loginasync__action_75_loginasync_branch_75_11__true
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__false -->|next| method_b6asoe_loginasync__action_75_loginasync_branch_75_11__merge
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__merge -->|invoke event if not null| method_b6asoe_loginasync__call_75_OnStateInvalidated_Invoke
|
||||
method_b6asoe_loginasync__action_75_loginasync_branch_75_11__true -->|next| method_b6asoe_loginasync__action_75_loginasync_branch_75_11__merge
|
||||
method_b6asoe_loginasync__action_77_loginasync_await_77_13__await -->|next| method_b6asoe_loginasync__action_77_orchestration_77__linear
|
||||
method_b6asoe_loginasync__action_77_orchestration_77__linear -->|no parameters| method_b6asoe_loginasync__call_77_GetProfileAsync
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__condition -->|false| method_b6asoe_loginasync__action_78_loginasync_branch_78_14__false
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__condition -->|true| method_b6asoe_loginasync__action_78_loginasync_branch_78_14__true
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__false -->|next| method_b6asoe_loginasync__action_78_loginasync_branch_78_14__merge
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__merge -->|next| method_b6asoe_loginasync__action_81_loginasync_await_81_15__await
|
||||
method_b6asoe_loginasync__action_78_loginasync_branch_78_14__true -->|next| method_b6asoe_loginasync__action_78_loginasync_branch_78_14__merge
|
||||
method_b6asoe_loginasync__action_81_loginasync_await_81_15__await -->|StorageKeys.UserEmail, profile.Email| method_b6asoe_loginasync__call_81_INativeStorageService_SaveSecureString
|
||||
method_b6asoe_loginasync__action_82_loginasync_await_82_16__await -->|StorageKeys.UserTenant, profile.TenantId.ToString| method_b6asoe_loginasync__call_82_INativeStorageService_SaveSecureString
|
||||
method_b6asoe_loginasync__action_85_loginasync_await_85_17__await -->|StorageKeys.UserRoles, rolesStr| method_b6asoe_loginasync__call_85_INativeStorageService_SaveSecureString
|
||||
method_b6asoe_loginasync__action_87_loginasync_notification_87_18__linear -->|profile.Email, profile.TenantId.ToString , rolesStr or fallback email / unknown| method_b6asoe_loginasync__call_87_NexusAuthenticationStateProvider_NotifyUserAuthentication
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__condition -->|otherwise| method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__false
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__condition -->|fallback| method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__true
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__false -->|next| method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__merge
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__merge -->|next| method_b6asoe_loginasync__action_91_loginasync_notification_91_20__linear
|
||||
method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__true -->|next| method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__merge
|
||||
method_b6asoe_loginasync__action_91_loginasync_notification_91_20__linear -->|return| method_b6asoe_loginasync__action_94_loginasync_return_94_21__return
|
||||
method_b6asoe_loginasync__action_94_loginasync_return_94_21__return -->|return| method_b6asoe_loginasync__action_94_return_94__return
|
||||
method_b6asoe_loginasync__action_94_return_94__return -->|return| method_b6asoe_loginasync__action_96_loginasync_return_96_22__return
|
||||
method_b6asoe_loginasync__action_96_loginasync_return_96_22__return -->|exception| method_b6asoe_loginasync__action_98_loginasync_catch_98_23__catch
|
||||
method_b6asoe_loginasync__action_98_loginasync_catch_98_23__catch -->|return| method_b6asoe_loginasync__action_100_loginasync_return_100_24__return
|
||||
method_b6asoe_loginasync__call_67_INativeStorageService_SaveSecureString -->|next| method_b6asoe_loginasync__action_68_loginasync_branch_68_9__condition
|
||||
method_b6asoe_loginasync__call_70_INativeStorageService_SaveSecureString -->|next| method_b6asoe_loginasync__action_74_state_change_74__linear
|
||||
method_b6asoe_loginasync__call_74_NexusAuthenticationStateProvider_ClearCache -->|next| method_b6asoe_loginasync__action_75_loginasync_await_75_12__await
|
||||
method_b6asoe_loginasync__call_75_OnStateInvalidated_Invoke -->|next| method_b6asoe_loginasync__action_77_loginasync_await_77_13__await
|
||||
method_b6asoe_loginasync__call_77_GetProfileAsync -->|next| method_b6asoe_loginasync__action_78_loginasync_branch_78_14__condition
|
||||
method_b6asoe_loginasync__call_81_INativeStorageService_SaveSecureString -->|next| method_b6asoe_loginasync__action_82_loginasync_await_82_16__await
|
||||
method_b6asoe_loginasync__call_82_INativeStorageService_SaveSecureString -->|next| method_b6asoe_loginasync__action_85_loginasync_await_85_17__await
|
||||
method_b6asoe_loginasync__call_85_INativeStorageService_SaveSecureString -->|next| method_b6asoe_loginasync__action_87_loginasync_notification_87_18__linear
|
||||
method_b6asoe_loginasync__call_87_NexusAuthenticationStateProvider_NotifyUserAuthentication -->|fallback| method_b6asoe_loginasync__action_89_loginasync_fallback_89_19__condition
|
||||
method_b6asoe_loginasync__entry -->|next| method_b6asoe_loginasync__action_48_try_catch_48__linear
|
||||
```
|
||||
|
||||
### LogoutAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1i33wis_logoutasync__fragment_diagram exceeds preferred complexity thresholds (32 nodes, 33 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1i33wis_logoutasync__call_111_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_1i33wis_logoutasync__call_112_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_1i33wis_logoutasync__call_113_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_1i33wis_logoutasync__call_114_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_1i33wis_logoutasync__call_115_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_1i33wis_logoutasync__call_118_OnStateInvalidated_Invoke[["OnStateInvalidated.Invoke"]]
|
||||
method_1i33wis_logoutasync__call_119_NexusAuthenticationStateProvider_ClearCache[["NexusAuthenticationStateProvider.ClearCache"]]
|
||||
method_1i33wis_logoutasync__call_120_NexusAuthenticationStateProvider_NotifyUserLogout[["NexusAuthenticationStateProvider.NotifyUserLogout"]]
|
||||
method_1i33wis_logoutasync__action_106_logoutasync_try_106_0__try("Begins protected execution")
|
||||
method_1i33wis_logoutasync__action_106_try_catch_106__linear("Logout guarded")
|
||||
method_1i33wis_logoutasync__action_108_state_change_108__linear("Clear cached profile and storage keys")
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__condition{"System.OperatingSystem.IsBrowser()"}
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__false("false")
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__merge("merge")
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__true("true")
|
||||
method_1i33wis_logoutasync__action_111_logoutasync_await_111_2__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_112_logoutasync_await_112_3__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_113_logoutasync_await_113_4__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_114_logoutasync_await_114_5__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_115_logoutasync_await_115_6__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_await_118_8__await[["Waits for async work"]]
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__condition{"OnStateInvalidated != null) await OnStateInvalidated.Invoke("}
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__false("false")
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__merge("merge")
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__true("true")
|
||||
method_1i33wis_logoutasync__action_118_notify_118__linear("Notify auth provider and listeners")
|
||||
method_1i33wis_logoutasync__action_124_logoutasync_catch_124_11__catch("catch Exception ex")
|
||||
method_1i33wis_logoutasync__entry(["LogoutAsync entry"])
|
||||
method_1i33wis_logoutasync__action_120_logoutasync_notification_120_9__linear[/"Sends notification"/]
|
||||
method_1i33wis_logoutasync__action_122_logoutasync_return_122_10__return(["Returns result"])
|
||||
method_1i33wis_logoutasync__action_122_return_122__return(["Return success"])
|
||||
method_1i33wis_logoutasync__action_126_logoutasync_return_126_12__return(["Returns result"])
|
||||
method_1i33wis_logoutasync__action_106_logoutasync_try_106_0__try -->|next| method_1i33wis_logoutasync__action_108_state_change_108__linear
|
||||
method_1i33wis_logoutasync__action_106_try_catch_106__linear -->|next| method_1i33wis_logoutasync__action_106_logoutasync_try_106_0__try
|
||||
method_1i33wis_logoutasync__action_108_state_change_108__linear -->|next| method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__condition
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__condition -->|false| method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__false
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__condition -->|true| method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__true
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__false -->|next| method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__merge
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__merge -->|next| method_1i33wis_logoutasync__action_111_logoutasync_await_111_2__await
|
||||
method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__true -->|next| method_1i33wis_logoutasync__action_109_logoutasync_branch_109_1__merge
|
||||
method_1i33wis_logoutasync__action_111_logoutasync_await_111_2__await -->|TokenKey, empty string| method_1i33wis_logoutasync__call_111_INativeStorageService_SaveSecureString
|
||||
method_1i33wis_logoutasync__action_112_logoutasync_await_112_3__await -->|RefreshTokenKey, empty string| method_1i33wis_logoutasync__call_112_INativeStorageService_SaveSecureString
|
||||
method_1i33wis_logoutasync__action_113_logoutasync_await_113_4__await -->|StorageKeys.UserEmail, empty string| method_1i33wis_logoutasync__call_113_INativeStorageService_SaveSecureString
|
||||
method_1i33wis_logoutasync__action_114_logoutasync_await_114_5__await -->|StorageKeys.UserTenant, empty string| method_1i33wis_logoutasync__call_114_INativeStorageService_SaveSecureString
|
||||
method_1i33wis_logoutasync__action_115_logoutasync_await_115_6__await -->|StorageKeys.UserRoles, empty string| method_1i33wis_logoutasync__call_115_INativeStorageService_SaveSecureString
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_await_118_8__await -->|next| method_1i33wis_logoutasync__action_118_notify_118__linear
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__condition -->|false| method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__false
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__condition -->|true| method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__true
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__false -->|next| method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__merge
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__merge -->|invoke event if not null| method_1i33wis_logoutasync__call_118_OnStateInvalidated_Invoke
|
||||
method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__true -->|next| method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__merge
|
||||
method_1i33wis_logoutasync__action_118_notify_118__linear -->|next| method_1i33wis_logoutasync__action_118_logoutasync_branch_118_7__condition
|
||||
method_1i33wis_logoutasync__action_120_logoutasync_notification_120_9__linear -->|cast _authStateProvider and call NotifyUserLogout| method_1i33wis_logoutasync__call_120_NexusAuthenticationStateProvider_NotifyUserLogout
|
||||
method_1i33wis_logoutasync__action_122_logoutasync_return_122_10__return -->|return| method_1i33wis_logoutasync__action_122_return_122__return
|
||||
method_1i33wis_logoutasync__action_122_return_122__return -->|exception| method_1i33wis_logoutasync__action_124_logoutasync_catch_124_11__catch
|
||||
method_1i33wis_logoutasync__action_124_logoutasync_catch_124_11__catch -->|return| method_1i33wis_logoutasync__action_126_logoutasync_return_126_12__return
|
||||
method_1i33wis_logoutasync__call_111_INativeStorageService_SaveSecureString -->|next| method_1i33wis_logoutasync__action_112_logoutasync_await_112_3__await
|
||||
method_1i33wis_logoutasync__call_112_INativeStorageService_SaveSecureString -->|next| method_1i33wis_logoutasync__action_113_logoutasync_await_113_4__await
|
||||
method_1i33wis_logoutasync__call_113_INativeStorageService_SaveSecureString -->|next| method_1i33wis_logoutasync__action_114_logoutasync_await_114_5__await
|
||||
method_1i33wis_logoutasync__call_114_INativeStorageService_SaveSecureString -->|next| method_1i33wis_logoutasync__action_115_logoutasync_await_115_6__await
|
||||
method_1i33wis_logoutasync__call_115_INativeStorageService_SaveSecureString -->|next| method_1i33wis_logoutasync__action_118_logoutasync_await_118_8__await
|
||||
method_1i33wis_logoutasync__call_118_OnStateInvalidated_Invoke -->|cast _authStateProvider and call ClearCache| method_1i33wis_logoutasync__call_119_NexusAuthenticationStateProvider_ClearCache
|
||||
method_1i33wis_logoutasync__call_119_NexusAuthenticationStateProvider_ClearCache -->|next| method_1i33wis_logoutasync__action_120_logoutasync_notification_120_9__linear
|
||||
method_1i33wis_logoutasync__call_120_NexusAuthenticationStateProvider_NotifyUserLogout -->|return| method_1i33wis_logoutasync__action_122_logoutasync_return_122_10__return
|
||||
method_1i33wis_logoutasync__entry -->|next| method_1i33wis_logoutasync__action_106_try_catch_106__linear
|
||||
```
|
||||
|
||||
### GetProfileAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1u6514u_getprofileasync__fragment_diagram exceeds preferred complexity thresholds (24 nodes, 27 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1u6514u_getprofileasync__call_143_GetProfileInternalAsync[["GetProfileInternalAsync"]]
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__condition{"_cachedProfile != null"}
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__false("false")
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__merge("merge")
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__true("true")
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__condition{"_cachedProfile != null"}
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__false("continue")
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__merge("merge")
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__true("return cached")
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__condition{"_profileTask != null"}
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__false("false")
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__merge("merge")
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__true("true")
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__condition{"_profileTask != null"}
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__false("start new fetch")
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__merge("merge")
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__true("await existing task")
|
||||
method_1u6514u_getprofileasync__action_139_getprofileasync_await_139_3__await[["Waits for async work"]]
|
||||
method_1u6514u_getprofileasync__action_143_orchestration_143__linear("Start internal profile fetch")
|
||||
method_1u6514u_getprofileasync__action_144_getprofileasync_await_144_5__await[["Waits for async work"]]
|
||||
method_1u6514u_getprofileasync__entry(["GetProfileAsync entry"])
|
||||
method_1u6514u_getprofileasync__action_134_getprofileasync_return_134_1__return(["Returns result"])
|
||||
method_1u6514u_getprofileasync__action_140_getprofileasync_return_140_4__return(["Returns result"])
|
||||
method_1u6514u_getprofileasync__action_145_getprofileasync_return_145_6__return(["Returns result"])
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__condition -->|false| method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__false
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__condition -->|true| method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__true
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__false -->|next| method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__merge
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__merge -->|return| method_1u6514u_getprofileasync__action_134_getprofileasync_return_134_1__return
|
||||
method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__true -->|next| method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__merge
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__condition -->|continue| method_1u6514u_getprofileasync__action_132_guard_clause_132__false
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__condition -->|return cached| method_1u6514u_getprofileasync__action_132_guard_clause_132__true
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__false -->|next| method_1u6514u_getprofileasync__action_132_guard_clause_132__merge
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__merge -->|next| method_1u6514u_getprofileasync__action_132_getprofileasync_branch_132_0__condition
|
||||
method_1u6514u_getprofileasync__action_132_guard_clause_132__true -->|next| method_1u6514u_getprofileasync__action_132_guard_clause_132__merge
|
||||
method_1u6514u_getprofileasync__action_134_getprofileasync_return_134_1__return -->|next| method_1u6514u_getprofileasync__action_137_guard_clause_137__condition
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__condition -->|false| method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__false
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__condition -->|true| method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__true
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__false -->|next| method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__merge
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__merge -->|next| method_1u6514u_getprofileasync__action_139_getprofileasync_await_139_3__await
|
||||
method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__true -->|next| method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__merge
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__condition -->|start new fetch| method_1u6514u_getprofileasync__action_137_guard_clause_137__false
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__condition -->|await existing task| method_1u6514u_getprofileasync__action_137_guard_clause_137__true
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__false -->|next| method_1u6514u_getprofileasync__action_137_guard_clause_137__merge
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__merge -->|next| method_1u6514u_getprofileasync__action_137_getprofileasync_branch_137_2__condition
|
||||
method_1u6514u_getprofileasync__action_137_guard_clause_137__true -->|next| method_1u6514u_getprofileasync__action_137_guard_clause_137__merge
|
||||
method_1u6514u_getprofileasync__action_139_getprofileasync_await_139_3__await -->|return| method_1u6514u_getprofileasync__action_140_getprofileasync_return_140_4__return
|
||||
method_1u6514u_getprofileasync__action_140_getprofileasync_return_140_4__return -->|next| method_1u6514u_getprofileasync__action_143_orchestration_143__linear
|
||||
method_1u6514u_getprofileasync__action_143_orchestration_143__linear -->|no parameters starts internal fetch task| method_1u6514u_getprofileasync__call_143_GetProfileInternalAsync
|
||||
method_1u6514u_getprofileasync__action_144_getprofileasync_await_144_5__await -->|return| method_1u6514u_getprofileasync__action_145_getprofileasync_return_145_6__return
|
||||
method_1u6514u_getprofileasync__call_143_GetProfileInternalAsync -->|next| method_1u6514u_getprofileasync__action_144_getprofileasync_await_144_5__await
|
||||
method_1u6514u_getprofileasync__entry -->|next| method_1u6514u_getprofileasync__action_132_guard_clause_132__condition
|
||||
```
|
||||
|
||||
### GetProfileInternalAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_nyrl9z_getprofileinternalasync__fragment_diagram exceeds preferred complexity thresholds (60 nodes, 67 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_nyrl9z_getprofileinternalasync__call_169_LogoutAsync[["LogoutAsync"]]
|
||||
method_nyrl9z_getprofileinternalasync__call_179_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nyrl9z_getprofileinternalasync__call_180_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nyrl9z_getprofileinternalasync__call_183_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nyrl9z_getprofileinternalasync__call_185_NexusAuthenticationStateProvider_NotifyUserAuthentication[["NexusAuthenticationStateProvider.NotifyUserAuthentication"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__condition{"!System.OperatingSystem.IsBrowser()"}
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__condition{"System.OperatingSystem.IsBrowser()"}
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__false("continue")
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__true("return null")
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__condition{"DateTime.UtcNow - _lastFetchAttempt < TimeSpan.FromSeconds(5)"}
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_157_rate_limit_157__linear("Throttle repeated fetches")
|
||||
method_nyrl9z_getprofileinternalasync__action_162_state_change_162__linear("Update last fetch timestamp")
|
||||
method_nyrl9z_getprofileinternalasync__action_163_getprofileinternalasync_try_163_4__try("Begins protected execution")
|
||||
method_nyrl9z_getprofileinternalasync__action_165_getprofileinternalasync_await_165_5__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__condition{"response.StatusCode == Unauthorized"}
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__false("continue")
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__true("logout and return null")
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__condition{"response.StatusCode == System.Net.HttpStatusCode.Unauthorized"}
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_169_getprofileinternalasync_await_169_7__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__condition{"response.IsSuccessStatusCode"}
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__condition{"response.IsSuccessStatusCode"}
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_175_getprofileinternalasync_await_175_10__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__condition{"profile != null"}
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__false("false")
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__merge("merge")
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__true("true")
|
||||
method_nyrl9z_getprofileinternalasync__action_179_getprofileinternalasync_await_179_12__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_180_getprofileinternalasync_await_180_13__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_183_getprofileinternalasync_await_183_14__await[["Waits for async work"]]
|
||||
method_nyrl9z_getprofileinternalasync__action_192_getprofileinternalasync_catch_192_18__catch("Handles exception path")
|
||||
method_nyrl9z_getprofileinternalasync__action_192_try_catch_192__linear("Swallow fetch/parsing errors")
|
||||
method_nyrl9z_getprofileinternalasync__action_196_getprofileinternalasync_finally_196_20__finally("Runs cleanup or finalization")
|
||||
method_nyrl9z_getprofileinternalasync__action_198_finally_198__finally("Reset in-flight task marker")
|
||||
method_nyrl9z_getprofileinternalasync__entry(["GetProfileInternalAsync entry"])
|
||||
method_nyrl9z_getprofileinternalasync__action_165_external_call_165__linear("GET profile")
|
||||
method_nyrl9z_getprofileinternalasync__action_185_getprofileinternalasync_notification_185_15__linear[/"Sends notification"/]
|
||||
method_nyrl9z_getprofileinternalasync__action_154_getprofileinternalasync_return_154_1__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__action_159_getprofileinternalasync_return_159_3__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__action_170_getprofileinternalasync_return_170_8__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__action_187_getprofileinternalasync_return_187_16__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__action_190_getprofileinternalasync_return_190_17__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__action_194_getprofileinternalasync_return_194_19__return(["Returns result"])
|
||||
method_nyrl9z_getprofileinternalasync__implicit_return(["return"])
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__condition -->|false| method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__false
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__condition -->|true| method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__true
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__false -->|next| method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__merge -->|return| method_nyrl9z_getprofileinternalasync__action_154_getprofileinternalasync_return_154_1__return
|
||||
method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__true -->|next| method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__condition -->|continue| method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__false
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__condition -->|return null| method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__true
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__false -->|next| method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__merge -->|next| method_nyrl9z_getprofileinternalasync__action_152_getprofileinternalasync_branch_152_0__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__true -->|next| method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_154_getprofileinternalasync_return_154_1__return -->|next| method_nyrl9z_getprofileinternalasync__action_157_rate_limit_157__linear
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__condition -->|false| method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__false
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__condition -->|true| method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__true
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__false -->|next| method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__merge -->|return| method_nyrl9z_getprofileinternalasync__action_159_getprofileinternalasync_return_159_3__return
|
||||
method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__true -->|next| method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_157_rate_limit_157__linear -->|next| method_nyrl9z_getprofileinternalasync__action_157_getprofileinternalasync_branch_157_2__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_159_getprofileinternalasync_return_159_3__return -->|next| method_nyrl9z_getprofileinternalasync__action_162_state_change_162__linear
|
||||
method_nyrl9z_getprofileinternalasync__action_162_state_change_162__linear -->|next| method_nyrl9z_getprofileinternalasync__action_163_getprofileinternalasync_try_163_4__try
|
||||
method_nyrl9z_getprofileinternalasync__action_163_getprofileinternalasync_try_163_4__try -->|next| method_nyrl9z_getprofileinternalasync__action_165_getprofileinternalasync_await_165_5__await
|
||||
method_nyrl9z_getprofileinternalasync__action_165_external_call_165__linear -->|next| method_nyrl9z_getprofileinternalasync__action_167_branch_167__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_165_getprofileinternalasync_await_165_5__await -->|next| method_nyrl9z_getprofileinternalasync__action_165_external_call_165__linear
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__condition -->|continue| method_nyrl9z_getprofileinternalasync__action_167_branch_167__false
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__condition -->|logout and return null| method_nyrl9z_getprofileinternalasync__action_167_branch_167__true
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__false -->|next| method_nyrl9z_getprofileinternalasync__action_167_branch_167__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__merge -->|next| method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_167_branch_167__true -->|next| method_nyrl9z_getprofileinternalasync__action_167_branch_167__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__condition -->|false| method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__false
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__condition -->|true| method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__true
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__false -->|next| method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__merge -->|next| method_nyrl9z_getprofileinternalasync__action_169_getprofileinternalasync_await_169_7__await
|
||||
method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__true -->|next| method_nyrl9z_getprofileinternalasync__action_167_getprofileinternalasync_branch_167_6__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_169_getprofileinternalasync_await_169_7__await -->|no parameters called on 401| method_nyrl9z_getprofileinternalasync__call_169_LogoutAsync
|
||||
method_nyrl9z_getprofileinternalasync__action_170_getprofileinternalasync_return_170_8__return -->|next| method_nyrl9z_getprofileinternalasync__action_173_branch_173__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__condition -->|false| method_nyrl9z_getprofileinternalasync__action_173_branch_173__false
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__condition -->|true| method_nyrl9z_getprofileinternalasync__action_173_branch_173__true
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__false -->|next| method_nyrl9z_getprofileinternalasync__action_173_branch_173__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__merge -->|next| method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_173_branch_173__true -->|next| method_nyrl9z_getprofileinternalasync__action_173_branch_173__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__condition -->|false| method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__false
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__condition -->|true| method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__true
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__false -->|next| method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__merge -->|next| method_nyrl9z_getprofileinternalasync__action_175_getprofileinternalasync_await_175_10__await
|
||||
method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__true -->|next| method_nyrl9z_getprofileinternalasync__action_173_getprofileinternalasync_branch_173_9__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_175_getprofileinternalasync_await_175_10__await -->|next| method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__condition
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__condition -->|false| method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__false
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__condition -->|true| method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__true
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__false -->|next| method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__merge -->|next| method_nyrl9z_getprofileinternalasync__action_179_getprofileinternalasync_await_179_12__await
|
||||
method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__true -->|next| method_nyrl9z_getprofileinternalasync__action_176_getprofileinternalasync_branch_176_11__merge
|
||||
method_nyrl9z_getprofileinternalasync__action_179_getprofileinternalasync_await_179_12__await -->|StorageKeys.UserEmail, profile.Email| method_nyrl9z_getprofileinternalasync__call_179_INativeStorageService_SaveSecureString
|
||||
method_nyrl9z_getprofileinternalasync__action_180_getprofileinternalasync_await_180_13__await -->|StorageKeys.UserTenant, profile.TenantId.ToString| method_nyrl9z_getprofileinternalasync__call_180_INativeStorageService_SaveSecureString
|
||||
method_nyrl9z_getprofileinternalasync__action_183_getprofileinternalasync_await_183_14__await -->|StorageKeys.UserRoles, rolesStr| method_nyrl9z_getprofileinternalasync__call_183_INativeStorageService_SaveSecureString
|
||||
method_nyrl9z_getprofileinternalasync__action_185_getprofileinternalasync_notification_185_15__linear -->|profile.Email, profile.TenantId.ToString , rolesStr| method_nyrl9z_getprofileinternalasync__call_185_NexusAuthenticationStateProvider_NotifyUserAuthentication
|
||||
method_nyrl9z_getprofileinternalasync__action_187_getprofileinternalasync_return_187_16__return -->|return| method_nyrl9z_getprofileinternalasync__action_190_getprofileinternalasync_return_190_17__return
|
||||
method_nyrl9z_getprofileinternalasync__action_190_getprofileinternalasync_return_190_17__return -->|next| method_nyrl9z_getprofileinternalasync__action_192_try_catch_192__linear
|
||||
method_nyrl9z_getprofileinternalasync__action_192_getprofileinternalasync_catch_192_18__catch -->|return| method_nyrl9z_getprofileinternalasync__action_194_getprofileinternalasync_return_194_19__return
|
||||
method_nyrl9z_getprofileinternalasync__action_192_try_catch_192__linear -->|exception| method_nyrl9z_getprofileinternalasync__action_192_getprofileinternalasync_catch_192_18__catch
|
||||
method_nyrl9z_getprofileinternalasync__action_194_getprofileinternalasync_return_194_19__return -->|next| method_nyrl9z_getprofileinternalasync__action_196_getprofileinternalasync_finally_196_20__finally
|
||||
method_nyrl9z_getprofileinternalasync__action_196_getprofileinternalasync_finally_196_20__finally -->|next| method_nyrl9z_getprofileinternalasync__action_198_finally_198__finally
|
||||
method_nyrl9z_getprofileinternalasync__action_198_finally_198__finally -->|return| method_nyrl9z_getprofileinternalasync__implicit_return
|
||||
method_nyrl9z_getprofileinternalasync__call_169_LogoutAsync -->|return| method_nyrl9z_getprofileinternalasync__action_170_getprofileinternalasync_return_170_8__return
|
||||
method_nyrl9z_getprofileinternalasync__call_179_INativeStorageService_SaveSecureString -->|next| method_nyrl9z_getprofileinternalasync__action_180_getprofileinternalasync_await_180_13__await
|
||||
method_nyrl9z_getprofileinternalasync__call_180_INativeStorageService_SaveSecureString -->|next| method_nyrl9z_getprofileinternalasync__action_183_getprofileinternalasync_await_183_14__await
|
||||
method_nyrl9z_getprofileinternalasync__call_183_INativeStorageService_SaveSecureString -->|next| method_nyrl9z_getprofileinternalasync__action_185_getprofileinternalasync_notification_185_15__linear
|
||||
method_nyrl9z_getprofileinternalasync__call_185_NexusAuthenticationStateProvider_NotifyUserAuthentication -->|return| method_nyrl9z_getprofileinternalasync__action_187_getprofileinternalasync_return_187_16__return
|
||||
method_nyrl9z_getprofileinternalasync__entry -->|next| method_nyrl9z_getprofileinternalasync__action_152_guard_clause_152__condition
|
||||
```
|
||||
|
||||
### RefreshTokenAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_nb75z9_refreshtokenasync__fragment_diagram exceeds preferred complexity thresholds (64 nodes, 71 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_nb75z9_refreshtokenasync__call_206_INativeStorageService_GetSecureString[["INativeStorageService.GetSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_218_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_221_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_225_NexusAuthenticationStateProvider_ClearCache[["NexusAuthenticationStateProvider.ClearCache"]]
|
||||
method_nb75z9_refreshtokenasync__call_226_OnStateInvalidated_Invoke[["OnStateInvalidated.Invoke"]]
|
||||
method_nb75z9_refreshtokenasync__call_228_GetProfileAsync[["GetProfileAsync"]]
|
||||
method_nb75z9_refreshtokenasync__call_232_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_233_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_236_INativeStorageService_SaveSecureString[["INativeStorageService.SaveSecureString"]]
|
||||
method_nb75z9_refreshtokenasync__call_238_NexusAuthenticationStateProvider_NotifyUserAuthentication[["NexusAuthenticationStateProvider.NotifyUserAuthentication"]]
|
||||
method_nb75z9_refreshtokenasync__action_204_refreshtokenasync_try_204_0__try("Begins protected execution")
|
||||
method_nb75z9_refreshtokenasync__action_204_try_catch_204__linear("Refresh guarded")
|
||||
method_nb75z9_refreshtokenasync__action_206_refreshtokenasync_await_206_1__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__condition{"string.IsNullOrEmpty(refreshToken)"}
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__false("continue")
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__true("fail")
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__condition{"string.IsNullOrEmpty(refreshToken)) return Result.Fail(\\"Brak tokena odświeżania.\\""}
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__false("continue")
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__true("exit")
|
||||
method_nb75z9_refreshtokenasync__action_211_refreshtokenasync_await_211_3__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__condition{"response.IsSuccessStatusCode and loginResult.AccessToken present"}
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__false("return session expired")
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__true("persist tokens and refresh profile")
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__condition{"response.IsSuccessStatusCode"}
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__false("false")
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__true("true")
|
||||
method_nb75z9_refreshtokenasync__action_215_refreshtokenasync_await_215_5__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__condition{"loginResult != null && !string.IsNullOrEmpty(loginResult.AccessToken)"}
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__false("false")
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__true("true")
|
||||
method_nb75z9_refreshtokenasync__action_218_refreshtokenasync_await_218_7__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_218_state_change_218__linear("Persist new tokens and invalidate state")
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__condition{"!string.IsNullOrEmpty(loginResult.RefreshToken)"}
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__false("false")
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__true("true")
|
||||
method_nb75z9_refreshtokenasync__action_221_refreshtokenasync_await_221_9__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_await_226_11__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__condition{"OnStateInvalidated != null) await OnStateInvalidated.Invoke("}
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__false("false")
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__true("true")
|
||||
method_nb75z9_refreshtokenasync__action_228_orchestration_228__linear("Refresh profile after token renewal")
|
||||
method_nb75z9_refreshtokenasync__action_228_refreshtokenasync_await_228_12__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__condition{"profileResult.IsSuccess"}
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__false("false")
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__merge("merge")
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__true("true")
|
||||
method_nb75z9_refreshtokenasync__action_232_refreshtokenasync_await_232_14__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_233_refreshtokenasync_await_233_15__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_236_refreshtokenasync_await_236_16__await[["Waits for async work"]]
|
||||
method_nb75z9_refreshtokenasync__action_246_refreshtokenasync_catch_246_20__catch("catch Exception ex")
|
||||
method_nb75z9_refreshtokenasync__entry(["RefreshTokenAsync entry"])
|
||||
method_nb75z9_refreshtokenasync__action_211_external_call_211__linear("POST refresh")
|
||||
method_nb75z9_refreshtokenasync__action_238_refreshtokenasync_notification_238_17__linear[/"Sends notification"/]
|
||||
method_nb75z9_refreshtokenasync__action_241_refreshtokenasync_return_241_18__return(["Returns result"])
|
||||
method_nb75z9_refreshtokenasync__action_241_return_241__return(["Return final result"])
|
||||
method_nb75z9_refreshtokenasync__action_244_refreshtokenasync_return_244_19__return(["Returns result"])
|
||||
method_nb75z9_refreshtokenasync__action_248_refreshtokenasync_return_248_21__return(["Returns result"])
|
||||
method_nb75z9_refreshtokenasync__action_204_refreshtokenasync_try_204_0__try -->|next| method_nb75z9_refreshtokenasync__action_206_refreshtokenasync_await_206_1__await
|
||||
method_nb75z9_refreshtokenasync__action_204_try_catch_204__linear -->|next| method_nb75z9_refreshtokenasync__action_204_refreshtokenasync_try_204_0__try
|
||||
method_nb75z9_refreshtokenasync__action_206_refreshtokenasync_await_206_1__await -->|RefreshTokenKey| method_nb75z9_refreshtokenasync__call_206_INativeStorageService_GetSecureString
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__condition -->|continue| method_nb75z9_refreshtokenasync__action_209_guard_clause_209__false
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__condition -->|fail| method_nb75z9_refreshtokenasync__action_209_guard_clause_209__true
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__false -->|next| method_nb75z9_refreshtokenasync__action_209_guard_clause_209__merge
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__merge -->|next| method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__condition
|
||||
method_nb75z9_refreshtokenasync__action_209_guard_clause_209__true -->|next| method_nb75z9_refreshtokenasync__action_209_guard_clause_209__merge
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__condition -->|continue| method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__false
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__condition -->|exit| method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__true
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__false -->|next| method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__merge
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__merge -->|next| method_nb75z9_refreshtokenasync__action_211_refreshtokenasync_await_211_3__await
|
||||
method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__true -->|next| method_nb75z9_refreshtokenasync__action_209_refreshtokenasync_guard_clause_209_2__merge
|
||||
method_nb75z9_refreshtokenasync__action_211_external_call_211__linear -->|next| method_nb75z9_refreshtokenasync__action_213_branch_213__condition
|
||||
method_nb75z9_refreshtokenasync__action_211_refreshtokenasync_await_211_3__await -->|next| method_nb75z9_refreshtokenasync__action_211_external_call_211__linear
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__condition -->|return session expired| method_nb75z9_refreshtokenasync__action_213_branch_213__false
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__condition -->|persist tokens and refresh profile| method_nb75z9_refreshtokenasync__action_213_branch_213__true
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__false -->|next| method_nb75z9_refreshtokenasync__action_213_branch_213__merge
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__merge -->|next| method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__condition
|
||||
method_nb75z9_refreshtokenasync__action_213_branch_213__true -->|next| method_nb75z9_refreshtokenasync__action_213_branch_213__merge
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__condition -->|false| method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__false
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__condition -->|true| method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__true
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__false -->|next| method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__merge
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__merge -->|next| method_nb75z9_refreshtokenasync__action_215_refreshtokenasync_await_215_5__await
|
||||
method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__true -->|next| method_nb75z9_refreshtokenasync__action_213_refreshtokenasync_branch_213_4__merge
|
||||
method_nb75z9_refreshtokenasync__action_215_refreshtokenasync_await_215_5__await -->|next| method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__condition
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__condition -->|false| method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__false
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__condition -->|true| method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__true
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__false -->|next| method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__merge
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__merge -->|next| method_nb75z9_refreshtokenasync__action_218_refreshtokenasync_await_218_7__await
|
||||
method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__true -->|next| method_nb75z9_refreshtokenasync__action_216_refreshtokenasync_branch_216_6__merge
|
||||
method_nb75z9_refreshtokenasync__action_218_refreshtokenasync_await_218_7__await -->|next| method_nb75z9_refreshtokenasync__action_218_state_change_218__linear
|
||||
method_nb75z9_refreshtokenasync__action_218_state_change_218__linear -->|TokenKey, loginResult.AccessToken| method_nb75z9_refreshtokenasync__call_218_INativeStorageService_SaveSecureString
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__condition -->|false| method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__false
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__condition -->|true| method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__true
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__false -->|next| method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__merge
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__merge -->|next| method_nb75z9_refreshtokenasync__action_221_refreshtokenasync_await_221_9__await
|
||||
method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__true -->|next| method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__merge
|
||||
method_nb75z9_refreshtokenasync__action_221_refreshtokenasync_await_221_9__await -->|RefreshTokenKey, loginResult.RefreshToken| method_nb75z9_refreshtokenasync__call_221_INativeStorageService_SaveSecureString
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_await_226_11__await -->|next| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__condition
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__condition -->|false| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__false
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__condition -->|true| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__true
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__false -->|next| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__merge
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__merge -->|invoke event if not null| method_nb75z9_refreshtokenasync__call_226_OnStateInvalidated_Invoke
|
||||
method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__true -->|next| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_branch_226_10__merge
|
||||
method_nb75z9_refreshtokenasync__action_228_orchestration_228__linear -->|no parameters| method_nb75z9_refreshtokenasync__call_228_GetProfileAsync
|
||||
method_nb75z9_refreshtokenasync__action_228_refreshtokenasync_await_228_12__await -->|next| method_nb75z9_refreshtokenasync__action_228_orchestration_228__linear
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__condition -->|false| method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__false
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__condition -->|true| method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__true
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__false -->|next| method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__merge
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__merge -->|next| method_nb75z9_refreshtokenasync__action_232_refreshtokenasync_await_232_14__await
|
||||
method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__true -->|next| method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__merge
|
||||
method_nb75z9_refreshtokenasync__action_232_refreshtokenasync_await_232_14__await -->|StorageKeys.UserEmail, profile.Email| method_nb75z9_refreshtokenasync__call_232_INativeStorageService_SaveSecureString
|
||||
method_nb75z9_refreshtokenasync__action_233_refreshtokenasync_await_233_15__await -->|StorageKeys.UserTenant, profile.TenantId.ToString| method_nb75z9_refreshtokenasync__call_233_INativeStorageService_SaveSecureString
|
||||
method_nb75z9_refreshtokenasync__action_236_refreshtokenasync_await_236_16__await -->|StorageKeys.UserRoles, rolesStr| method_nb75z9_refreshtokenasync__call_236_INativeStorageService_SaveSecureString
|
||||
method_nb75z9_refreshtokenasync__action_238_refreshtokenasync_notification_238_17__linear -->|profile.Email, profile.TenantId.ToString , rolesStr| method_nb75z9_refreshtokenasync__call_238_NexusAuthenticationStateProvider_NotifyUserAuthentication
|
||||
method_nb75z9_refreshtokenasync__action_241_refreshtokenasync_return_241_18__return -->|return| method_nb75z9_refreshtokenasync__action_241_return_241__return
|
||||
method_nb75z9_refreshtokenasync__action_241_return_241__return -->|return| method_nb75z9_refreshtokenasync__action_244_refreshtokenasync_return_244_19__return
|
||||
method_nb75z9_refreshtokenasync__action_244_refreshtokenasync_return_244_19__return -->|exception| method_nb75z9_refreshtokenasync__action_246_refreshtokenasync_catch_246_20__catch
|
||||
method_nb75z9_refreshtokenasync__action_246_refreshtokenasync_catch_246_20__catch -->|return| method_nb75z9_refreshtokenasync__action_248_refreshtokenasync_return_248_21__return
|
||||
method_nb75z9_refreshtokenasync__call_206_INativeStorageService_GetSecureString -->|next| method_nb75z9_refreshtokenasync__action_209_guard_clause_209__condition
|
||||
method_nb75z9_refreshtokenasync__call_218_INativeStorageService_SaveSecureString -->|next| method_nb75z9_refreshtokenasync__action_219_refreshtokenasync_branch_219_8__condition
|
||||
method_nb75z9_refreshtokenasync__call_221_INativeStorageService_SaveSecureString -->|cast _authStateProvider and call ClearCache| method_nb75z9_refreshtokenasync__call_225_NexusAuthenticationStateProvider_ClearCache
|
||||
method_nb75z9_refreshtokenasync__call_225_NexusAuthenticationStateProvider_ClearCache -->|next| method_nb75z9_refreshtokenasync__action_226_refreshtokenasync_await_226_11__await
|
||||
method_nb75z9_refreshtokenasync__call_226_OnStateInvalidated_Invoke -->|next| method_nb75z9_refreshtokenasync__action_228_refreshtokenasync_await_228_12__await
|
||||
method_nb75z9_refreshtokenasync__call_228_GetProfileAsync -->|next| method_nb75z9_refreshtokenasync__action_229_refreshtokenasync_branch_229_13__condition
|
||||
method_nb75z9_refreshtokenasync__call_232_INativeStorageService_SaveSecureString -->|next| method_nb75z9_refreshtokenasync__action_233_refreshtokenasync_await_233_15__await
|
||||
method_nb75z9_refreshtokenasync__call_233_INativeStorageService_SaveSecureString -->|next| method_nb75z9_refreshtokenasync__action_236_refreshtokenasync_await_236_16__await
|
||||
method_nb75z9_refreshtokenasync__call_236_INativeStorageService_SaveSecureString -->|next| method_nb75z9_refreshtokenasync__action_238_refreshtokenasync_notification_238_17__linear
|
||||
method_nb75z9_refreshtokenasync__call_238_NexusAuthenticationStateProvider_NotifyUserAuthentication -->|return| method_nb75z9_refreshtokenasync__action_241_refreshtokenasync_return_241_18__return
|
||||
method_nb75z9_refreshtokenasync__entry -->|next| method_nb75z9_refreshtokenasync__action_204_try_catch_204__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 29 unresolved jumps.
|
||||
- Warning: execution-overview: diagram file_b8uv8h_identityservice_cs_execution_view exceeds preferred complexity thresholds (30 nodes, 43 edges).
|
||||
- Warning: control-flow: diagram method_b6asoe_loginasync__fragment_diagram exceeds preferred complexity thresholds (66 nodes, 73 edges).
|
||||
- Warning: control-flow: diagram method_1i33wis_logoutasync__fragment_diagram exceeds preferred complexity thresholds (32 nodes, 33 edges).
|
||||
- Warning: control-flow: diagram method_1u6514u_getprofileasync__fragment_diagram exceeds preferred complexity thresholds (24 nodes, 27 edges).
|
||||
- Warning: control-flow: diagram method_nyrl9z_getprofileinternalasync__fragment_diagram exceeds preferred complexity thresholds (60 nodes, 67 edges).
|
||||
- Warning: control-flow: diagram method_nb75z9_refreshtokenasync__fragment_diagram exceeds preferred complexity thresholds (64 nodes, 71 edges).
|
||||
+608
@@ -0,0 +1,608 @@
|
||||
# KnowledgeCoordinator
|
||||
|
||||
- File ID: file:uvydt4:knowledgecoordinator-cs
|
||||
- Path: NexusReader.UI.Shared/Services/KnowledgeCoordinator.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Coordinates knowledge-graph and quiz generation in the UI layer: subscribes to UI interactions, orchestrates calls to knowledge/graph/quiz/platform services, updates graph state, and exposes an event when graph data is available.
|
||||
|
||||
## Key Details
|
||||
|
||||
Exposes OnGraphUpdated event; subscribes to interaction service OnNodeSelected; major orchestration points: ProcessFullPageAsync (graph generation flow) and RequestSummaryAndQuizAsync (summary+quiz flow). Uses source-generated logger partial methods and ensures UI-state updates (graphService, quizService) and platform vibration on success.
|
||||
|
||||
## Symbols
|
||||
|
||||
- KnowledgeCoordinator: Coordinates knowledge-graph and quiz generation in the UI layer: subscribes to UI interactions, orchestrates calls to knowledge/graph/quiz/platform services, updates graph state, and exposes an event when graph data is available.
|
||||
- KnowledgeCoordinator(): Constructs the coordinator, stores injected services and subscribes to node-selection events from the interaction service.
|
||||
- HandleNodeSelected(): Handles a node selection event from UI: resolves a target block id (preferring connected 'current' block), then requests scrolling and highlighting of that block.
|
||||
- ProcessFullPageAsync(): Given full page content, clears and sets graph loading, requests graph data from knowledge service, updates the graph, invokes OnGraphUpdated event, and triggers success vibration; errors are logged.
|
||||
- OnBlockReachedAsync(): Updates the graph service active node when a content block is reached (UI navigation), intentionally does not trigger highlight.
|
||||
- RequestSummaryAndQuizAsync(): Orchestrates requesting a summary and quiz from the knowledge service, maps remote quiz DTOs into local QuizDto/QuizQuestionDto, sets quiz state, triggers vibration on success, and handles errors with logging and Result.Fail.
|
||||
- ClearAsync(): Clears the graph service state and clears the quiz state.
|
||||
- Dispose(): Unsubscribes the node-selected handler from the interaction service to avoid leaks.
|
||||
- LogGeneratingGraph(): Source-generated logger stub for informational message when generating a graph.
|
||||
- LogGraphError(): Source-generated logger stub for graph generation errors.
|
||||
- LogRequestingSummary(): Source-generated logger stub for requesting summary and quiz.
|
||||
- LogSummaryWarning(): Source-generated logger stub for warnings when summary/quiz retrieval fails.
|
||||
- LogSummaryError(): Source-generated logger stub for errors during summary/quiz retrieval.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (IKnowledgeService, IKnowledgeGraphService, IQuizStateService, IPlatformService)
|
||||
- dependency-target: NexusReader.UI.Shared.Services (IReaderInteractionService)
|
||||
- dependency-target: NexusReader.Application.DTOs.AI (GraphDataDto, KnowledgePacket, QuizDto, QuizQuestionDto)
|
||||
- dependency-target: Microsoft.Extensions.Logging
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- interaction-target: var selectedNode = graph.Nodes.FirstOrDefault(n => n.Id == nodeId);
|
||||
- interaction-target: var connectedLinks = graph.Links.Where(l => l.Source == nodeId || l.Target == nodeId).ToList();
|
||||
- interaction-target: var otherNode = graph.Nodes.FirstOrDefault(n => n.Id == otherId);
|
||||
- interaction-target: calls interaction service to scroll and highlight target block
|
||||
- interaction-target: await knowledgeService.GetGraphDataAsync(fullContent, tenantId)
|
||||
- interaction-target: await knowledgeService.GetSummaryAndQuizAsync
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 13
|
||||
- Executable symbols: 12
|
||||
- Executable symbols with control flow: 12
|
||||
- Grounded edges: 13
|
||||
- Unresolved references: 35
|
||||
- Control-flow fragments: 12
|
||||
- Unresolved jumps: 20
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 9
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- KnowledgeCoordinator: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- HandleNodeSelected: 42 nodes, 49 edges, 4 jumps, 0 unsupported constructs
|
||||
- ProcessFullPageAsync: 47 nodes, 52 edges, 8 jumps, 0 unsupported constructs
|
||||
- OnBlockReachedAsync: 6 nodes, 5 edges, 1 jumps, 0 unsupported constructs
|
||||
- RequestSummaryAndQuizAsync: 35 nodes, 36 edges, 8 jumps, 0 unsupported constructs
|
||||
- ClearAsync: 7 nodes, 6 edges, 2 jumps, 0 unsupported constructs
|
||||
- Dispose: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
- LogGeneratingGraph: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- LogGraphError: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- LogRequestingSummary: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- LogSummaryWarning: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- LogSummaryError: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### KnowledgeCoordinator Neighborhood
|
||||
|
||||
_Warnings: diagram file_uvydt4_knowledgecoordinator_cs_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart LR
|
||||
class_1cca8vk_knowledgecoordinator("KnowledgeCoordinator")
|
||||
file_uvydt4_knowledgecoordinator_cs("KnowledgeCoordinator")
|
||||
method_1b2nffa_knowledgecoordinator[["KnowledgeCoordinator()"]]
|
||||
method_1ip44st_loggeneratinggraph[["LogGeneratingGraph()"]]
|
||||
method_1nzct8x_loggrapherror[["LogGraphError()"]]
|
||||
method_1pdmx9l_onblockreachedasync[["OnBlockReachedAsync()"]]
|
||||
method_1sfi79b_logrequestingsummary[["LogRequestingSummary()"]]
|
||||
method_1wlwqp0_dispose[["Dispose()"]]
|
||||
method_1x9gjeq_processfullpageasync[["ProcessFullPageAsync()"]]
|
||||
method_1z06px6_logsummaryerror[["LogSummaryError()"]]
|
||||
method_2y4xzb_requestsummaryandquizasync[["RequestSummaryAndQuizAsync()"]]
|
||||
method_arton1_logsummarywarning[["LogSummaryWarning()"]]
|
||||
method_b6ndo3_clearasync[["ClearAsync()"]]
|
||||
method_t1zuul_handlenodeselected[["HandleNodeSelected()"]]
|
||||
```
|
||||
|
||||
### KnowledgeCoordinator Execution Overview
|
||||
|
||||
_Warnings: diagram file_uvydt4_knowledgecoordinator_cs_execution_view exceeds preferred complexity thresholds (44 nodes, 43 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
class_1cca8vk_knowledgecoordinator("KnowledgeCoordinator")
|
||||
method_1b2nffa_knowledgecoordinator[["KnowledgeCoordinator()"]]
|
||||
method_1ip44st_loggeneratinggraph[["LogGeneratingGraph()"]]
|
||||
method_1nzct8x_loggrapherror[["LogGraphError()"]]
|
||||
method_1pdmx9l_onblockreachedasync[["OnBlockReachedAsync()"]]
|
||||
method_1sfi79b_logrequestingsummary[["LogRequestingSummary()"]]
|
||||
method_1wlwqp0_dispose[["Dispose()"]]
|
||||
method_1x9gjeq_processfullpageasync[["ProcessFullPageAsync()"]]
|
||||
method_1z06px6_logsummaryerror[["LogSummaryError()"]]
|
||||
method_2y4xzb_requestsummaryandquizasync[["RequestSummaryAndQuizAsync()"]]
|
||||
method_arton1_logsummarywarning[["LogSummaryWarning()"]]
|
||||
method_b6ndo3_clearasync[["ClearAsync()"]]
|
||||
method_t1zuul_handlenodeselected[["HandleNodeSelected()"]]
|
||||
unresolved_unresolved_10k0xq2_call_target{"Unresolved: LogSummaryError"}
|
||||
unresolved_unresolved_138ieal_call_target{"Unresolved: IPlatformService.VibrateSuccessAsync"}
|
||||
unresolved_unresolved_14hsy43_interaction_target{"Unresolved: var selectedNode = graph.Nodes.FirstOrDefault(n => n.Id == nodeId);"}
|
||||
unresolved_unresolved_195fh9x_interaction_target{"Unresolved: await knowledgeService.GetGraphDataAsync(fullContent, tenantId)"}
|
||||
unresolved_unresolved_19qfwar_call_target{"Unresolved: IKnowledgeGraphService.Clear"}
|
||||
unresolved_unresolved_1gdw0l4_interaction_target{"Unresolved: var otherNode = graph.Nodes.FirstOrDefault(n => n.Id == otherId);"}
|
||||
unresolved_unresolved_1jeqq7f_call_target{"Unresolved: IKnowledgeGraphService.CurrentGraphData"}
|
||||
unresolved_unresolved_1jethnu_call_target{"Unresolved: LogGraphError"}
|
||||
unresolved_unresolved_1l2fji5_call_target{"Unresolved: LogRequestingSummary"}
|
||||
unresolved_unresolved_1mb4whl_call_target{"Unresolved: IPlatformService.VibrateSuccessAsync"}
|
||||
unresolved_unresolved_1tot29h_interaction_target{"Unresolved: calls interaction service to scroll and highlight target block"}
|
||||
unresolved_unresolved_1uj8fas_call_target{"Unresolved: LogGeneratingGraph"}
|
||||
unresolved_unresolved_1wzgphe_call_target{"Unresolved: IKnowledgeGraphService.Clear"}
|
||||
unresolved_unresolved_1x8q8gu_call_target{"Unresolved: IQuizStateService.SetHydrating"}
|
||||
unresolved_unresolved_1xmjhl6_call_target{"Unresolved: QuizQuestionDto..ctor"}
|
||||
unresolved_unresolved_50r37w_call_target{"Unresolved: IKnowledgeService.GetSummaryAndQuizAsync"}
|
||||
unresolved_unresolved_6y3yrp_call_target{"Unresolved: HandleNodeSelected (internal loop logic)"}
|
||||
unresolved_unresolved_9p5jul_interaction_target{"Unresolved: var connectedLinks = graph.Links.Where(l => l.Source == nodeId || l.Target == nodeId).ToList();"}
|
||||
unresolved_unresolved_aq6gt7_call_target{"Unresolved: IQuizStateService.SetQuiz"}
|
||||
unresolved_unresolved_aqqz88_call_target{"Unresolved: IQuizStateService.SetQuiz"}
|
||||
unresolved_unresolved_d4g5ep_call_target{"Unresolved: IKnowledgeGraphService.UpdateGraph"}
|
||||
unresolved_unresolved_e4ysnj_call_target{"Unresolved: IReaderInteractionService.OnNodeSelected -= HandleNodeSelected"}
|
||||
unresolved_unresolved_e519rx_call_target{"Unresolved: IKnowledgeGraphService.SetActiveNode"}
|
||||
unresolved_unresolved_gv42wu_call_target{"Unresolved: OnGraphUpdated.Invoke"}
|
||||
unresolved_unresolved_jn8a9a_call_target{"Unresolved: IReaderInteractionService.OnNodeSelected += HandleNodeSelected"}
|
||||
unresolved_unresolved_jzoxi8_call_target{"Unresolved: LogSummaryWarning"}
|
||||
unresolved_unresolved_lfjasv_interaction_target{"Unresolved: await knowledgeService.GetSummaryAndQuizAsync"}
|
||||
unresolved_unresolved_o570ld_call_target{"Unresolved: IReaderInteractionService.RequestHighlightBlock"}
|
||||
unresolved_unresolved_oerwvi_call_target{"Unresolved: IKnowledgeGraphService.SetLoading"}
|
||||
unresolved_unresolved_rs65i9_call_target{"Unresolved: IReaderInteractionService.RequestScrollToBlock"}
|
||||
unresolved_unresolved_u4oqdw_call_target{"Unresolved: IKnowledgeService.GetGraphDataAsync"}
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1b2nffa_knowledgecoordinator
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1ip44st_loggeneratinggraph
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1nzct8x_loggrapherror
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1pdmx9l_onblockreachedasync
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1sfi79b_logrequestingsummary
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1wlwqp0_dispose
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1x9gjeq_processfullpageasync
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_1z06px6_logsummaryerror
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_2y4xzb_requestsummaryandquizasync
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_arton1_logsummarywarning
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_b6ndo3_clearasync
|
||||
class_1cca8vk_knowledgecoordinator -->|contains| method_t1zuul_handlenodeselected
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_14hsy43_interaction_target
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_195fh9x_interaction_target
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_1gdw0l4_interaction_target
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_1tot29h_interaction_target
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_9p5jul_interaction_target
|
||||
class_1cca8vk_knowledgecoordinator -->|unresolved interaction| unresolved_unresolved_lfjasv_interaction_target
|
||||
method_1b2nffa_knowledgecoordinator -->|unresolved call| unresolved_unresolved_jn8a9a_call_target
|
||||
method_1pdmx9l_onblockreachedasync -->|unresolved call| unresolved_unresolved_e519rx_call_target
|
||||
method_1wlwqp0_dispose -->|unresolved call| unresolved_unresolved_e4ysnj_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_19qfwar_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_1jethnu_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_1mb4whl_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_1uj8fas_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_d4g5ep_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_gv42wu_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_oerwvi_call_target
|
||||
method_1x9gjeq_processfullpageasync -->|unresolved call| unresolved_unresolved_u4oqdw_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_10k0xq2_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_138ieal_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_1l2fji5_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_1x8q8gu_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_1xmjhl6_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_50r37w_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_aq6gt7_call_target
|
||||
method_2y4xzb_requestsummaryandquizasync -->|unresolved call| unresolved_unresolved_jzoxi8_call_target
|
||||
method_b6ndo3_clearasync -->|unresolved call| unresolved_unresolved_1wzgphe_call_target
|
||||
method_b6ndo3_clearasync -->|unresolved call| unresolved_unresolved_aqqz88_call_target
|
||||
method_t1zuul_handlenodeselected -->|unresolved call| unresolved_unresolved_1jeqq7f_call_target
|
||||
method_t1zuul_handlenodeselected -->|unresolved call| unresolved_unresolved_6y3yrp_call_target
|
||||
method_t1zuul_handlenodeselected -->|unresolved call| unresolved_unresolved_o570ld_call_target
|
||||
method_t1zuul_handlenodeselected -->|unresolved call| unresolved_unresolved_rs65i9_call_target
|
||||
```
|
||||
|
||||
### KnowledgeCoordinator() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1b2nffa_knowledgecoordinator__call_41_IReaderInteractionService_OnNodeSelected_HandleNodeSelected[["IReaderInteractionService.OnNodeSelected += HandleNodeSelected"]]
|
||||
method_1b2nffa_knowledgecoordinator__action_34_assignment_34__linear("Store injected services")
|
||||
method_1b2nffa_knowledgecoordinator__action_41_event_subscribe_41__linear("Subscribe to node selection")
|
||||
method_1b2nffa_knowledgecoordinator__entry(["KnowledgeCoordinator entry"])
|
||||
method_1b2nffa_knowledgecoordinator__implicit_return(["return"])
|
||||
method_1b2nffa_knowledgecoordinator__action_34_assignment_34__linear -->|next| method_1b2nffa_knowledgecoordinator__action_41_event_subscribe_41__linear
|
||||
method_1b2nffa_knowledgecoordinator__action_41_event_subscribe_41__linear -->|event handler HandleNodeSelected| method_1b2nffa_knowledgecoordinator__call_41_IReaderInteractionService_OnNodeSelected_HandleNodeSelected
|
||||
method_1b2nffa_knowledgecoordinator__call_41_IReaderInteractionService_OnNodeSelected_HandleNodeSelected -->|return| method_1b2nffa_knowledgecoordinator__implicit_return
|
||||
method_1b2nffa_knowledgecoordinator__entry -->|next| method_1b2nffa_knowledgecoordinator__action_34_assignment_34__linear
|
||||
```
|
||||
|
||||
### HandleNodeSelected() Control Flow
|
||||
|
||||
_Warnings: diagram method_t1zuul_handlenodeselected__fragment_diagram exceeds preferred complexity thresholds (42 nodes, 49 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_t1zuul_handlenodeselected__call_48_IKnowledgeGraphService_CurrentGraphData[["IKnowledgeGraphService.CurrentGraphData"]]
|
||||
method_t1zuul_handlenodeselected__call_55_HandleNodeSelected_internal_loop_logic_[["HandleNodeSelected (internal loop logic)"]]
|
||||
method_t1zuul_handlenodeselected__call_71_IReaderInteractionService_RequestScrollToBlock[["IReaderInteractionService.RequestScrollToBlock"]]
|
||||
method_t1zuul_handlenodeselected__call_72_IReaderInteractionService_RequestHighlightBlock[["IReaderInteractionService.RequestHighlightBlock"]]
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__condition{"graph != null"}
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__false("resolve connected block")
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__true("skip resolution")
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__condition{"graph != null"}
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__false("false")
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__true("true")
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__condition{"selectedNode.Group == \\"concept\\""}
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__false("use nodeId as block")
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__true("search connected links")
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__condition{"selectedNode != null && selectedNode.Group == \\"concept\\""}
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__false("false")
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__true("true")
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_body[["foreach (var link in connectedLinks)"]]
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_entry("var link in connectedLinks")
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_exit("Leaves the loop when the condition no longer holds.")
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_body[["foreach link in connectedLinks inspect other node"]]
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_entry("Iterate links")
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_exit("exit loop")
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__condition{"otherNode != null && otherNode.Group == \\"current\\""}
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__false("false")
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__true("true")
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__condition{"!string.IsNullOrEmpty(targetBlockId)"}
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__false("false")
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__merge("merge")
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__true("true")
|
||||
method_t1zuul_handlenodeselected__action_71_handlenodeselected_await_71_8__await[["Waits for async work"]]
|
||||
method_t1zuul_handlenodeselected__action_72_handlenodeselected_await_72_9__await[["Waits for async work"]]
|
||||
method_t1zuul_handlenodeselected__entry(["HandleNodeSelected entry"])
|
||||
method_t1zuul_handlenodeselected__action_51_handlenodeselected_repository_read_51_1__linear[("Reads repository or persistence state")]
|
||||
method_t1zuul_handlenodeselected__action_55_handlenodeselected_repository_read_55_3__linear[("Reads repository or persistence state")]
|
||||
method_t1zuul_handlenodeselected__action_59_handlenodeselected_repository_read_59_5__linear[("Reads repository or persistence state")]
|
||||
method_t1zuul_handlenodeselected__action_71_external_call_71__linear("Scroll and highlight")
|
||||
method_t1zuul_handlenodeselected__implicit_return(["return"])
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__condition -->|resolve connected block| method_t1zuul_handlenodeselected__action_49_guard_clause_49__false
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__condition -->|skip resolution| method_t1zuul_handlenodeselected__action_49_guard_clause_49__true
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__false -->|next| method_t1zuul_handlenodeselected__action_49_guard_clause_49__merge
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__merge -->|next| method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__condition
|
||||
method_t1zuul_handlenodeselected__action_49_guard_clause_49__true -->|next| method_t1zuul_handlenodeselected__action_49_guard_clause_49__merge
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__condition -->|false| method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__false
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__condition -->|true| method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__true
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__false -->|next| method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__merge
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__merge -->|next| method_t1zuul_handlenodeselected__action_51_handlenodeselected_repository_read_51_1__linear
|
||||
method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__true -->|next| method_t1zuul_handlenodeselected__action_49_handlenodeselected_branch_49_0__merge
|
||||
method_t1zuul_handlenodeselected__action_51_handlenodeselected_repository_read_51_1__linear -->|next| method_t1zuul_handlenodeselected__action_52_branch_52__condition
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__condition -->|use nodeId as block| method_t1zuul_handlenodeselected__action_52_branch_52__false
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__condition -->|search connected links| method_t1zuul_handlenodeselected__action_52_branch_52__true
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__false -->|next| method_t1zuul_handlenodeselected__action_52_branch_52__merge
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__merge -->|next| method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__condition
|
||||
method_t1zuul_handlenodeselected__action_52_branch_52__true -->|next| method_t1zuul_handlenodeselected__action_52_branch_52__merge
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__condition -->|false| method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__false
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__condition -->|true| method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__true
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__false -->|next| method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__merge
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__merge -->|next| method_t1zuul_handlenodeselected__action_55_handlenodeselected_repository_read_55_3__linear
|
||||
method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__true -->|next| method_t1zuul_handlenodeselected__action_52_handlenodeselected_branch_52_2__merge
|
||||
method_t1zuul_handlenodeselected__action_55_handlenodeselected_repository_read_55_3__linear -->|calls| method_t1zuul_handlenodeselected__call_55_HandleNodeSelected_internal_loop_logic_
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_body -->|continue| method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_entry
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_entry -->|var link in connectedLinks| method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_body
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_entry -->|Leaves the loop when the condition no longer holds.| method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_exit
|
||||
method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_exit -->|next| method_t1zuul_handlenodeselected__action_56_loop_56__loop_entry
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_body -->|continue| method_t1zuul_handlenodeselected__action_56_loop_56__loop_entry
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_entry -->|iterate| method_t1zuul_handlenodeselected__action_56_loop_56__loop_body
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_entry -->|exit| method_t1zuul_handlenodeselected__action_56_loop_56__loop_exit
|
||||
method_t1zuul_handlenodeselected__action_56_loop_56__loop_exit -->|next| method_t1zuul_handlenodeselected__action_59_handlenodeselected_repository_read_59_5__linear
|
||||
method_t1zuul_handlenodeselected__action_59_handlenodeselected_repository_read_59_5__linear -->|next| method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__condition
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__condition -->|false| method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__false
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__condition -->|true| method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__true
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__false -->|next| method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__merge
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__merge -->|next| method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__condition
|
||||
method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__true -->|next| method_t1zuul_handlenodeselected__action_60_handlenodeselected_branch_60_6__merge
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__condition -->|false| method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__false
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__condition -->|true| method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__true
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__false -->|next| method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__merge
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__merge -->|next| method_t1zuul_handlenodeselected__action_71_handlenodeselected_await_71_8__await
|
||||
method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__true -->|next| method_t1zuul_handlenodeselected__action_69_handlenodeselected_branch_69_7__merge
|
||||
method_t1zuul_handlenodeselected__action_71_external_call_71__linear -->|targetBlockId| method_t1zuul_handlenodeselected__call_71_IReaderInteractionService_RequestScrollToBlock
|
||||
method_t1zuul_handlenodeselected__action_71_handlenodeselected_await_71_8__await -->|next| method_t1zuul_handlenodeselected__action_71_external_call_71__linear
|
||||
method_t1zuul_handlenodeselected__action_72_handlenodeselected_await_72_9__await -->|targetBlockId| method_t1zuul_handlenodeselected__call_72_IReaderInteractionService_RequestHighlightBlock
|
||||
method_t1zuul_handlenodeselected__call_48_IKnowledgeGraphService_CurrentGraphData -->|next| method_t1zuul_handlenodeselected__action_49_guard_clause_49__condition
|
||||
method_t1zuul_handlenodeselected__call_55_HandleNodeSelected_internal_loop_logic_ -->|next| method_t1zuul_handlenodeselected__action_56_handlenodeselected_loop_56_4__loop_entry
|
||||
method_t1zuul_handlenodeselected__call_71_IReaderInteractionService_RequestScrollToBlock -->|next| method_t1zuul_handlenodeselected__action_72_handlenodeselected_await_72_9__await
|
||||
method_t1zuul_handlenodeselected__call_72_IReaderInteractionService_RequestHighlightBlock -->|return| method_t1zuul_handlenodeselected__implicit_return
|
||||
method_t1zuul_handlenodeselected__entry -->|none property read| method_t1zuul_handlenodeselected__call_48_IKnowledgeGraphService_CurrentGraphData
|
||||
```
|
||||
|
||||
### ProcessFullPageAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1x9gjeq_processfullpageasync__fragment_diagram exceeds preferred complexity thresholds (47 nodes, 52 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1x9gjeq_processfullpageasync__call_102_LogGraphError[["LogGraphError"]]
|
||||
method_1x9gjeq_processfullpageasync__call_80_LogGeneratingGraph[["LogGeneratingGraph"]]
|
||||
method_1x9gjeq_processfullpageasync__call_82_IKnowledgeGraphService_Clear[["IKnowledgeGraphService.Clear"]]
|
||||
method_1x9gjeq_processfullpageasync__call_83_IKnowledgeGraphService_SetLoading[["IKnowledgeGraphService.SetLoading"]]
|
||||
method_1x9gjeq_processfullpageasync__call_87_IKnowledgeService_GetGraphDataAsync[["IKnowledgeService.GetGraphDataAsync"]]
|
||||
method_1x9gjeq_processfullpageasync__call_93_IKnowledgeGraphService_UpdateGraph[["IKnowledgeGraphService.UpdateGraph"]]
|
||||
method_1x9gjeq_processfullpageasync__call_95_OnGraphUpdated_Invoke[["OnGraphUpdated.Invoke"]]
|
||||
method_1x9gjeq_processfullpageasync__call_96_IPlatformService_VibrateSuccessAsync[["IPlatformService.VibrateSuccessAsync"]]
|
||||
method_1x9gjeq_processfullpageasync__action_100_processfullpageasync_catch_100_11__catch("catch Exception ex")
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__condition{"string.IsNullOrWhiteSpace(fullContent)"}
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__false("continue")
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__true("return")
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__condition{"string.IsNullOrWhiteSpace(fullContent)"}
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__false("continue")
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__true("exit")
|
||||
method_1x9gjeq_processfullpageasync__action_80_log_80__linear("Start generating graph")
|
||||
method_1x9gjeq_processfullpageasync__action_82_processfullpageasync_await_82_1__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__action_82_state_change_82__linear("Graph service reset & loading")
|
||||
method_1x9gjeq_processfullpageasync__action_83_processfullpageasync_await_83_2__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__action_85_processfullpageasync_try_85_3__try("Begins protected execution")
|
||||
method_1x9gjeq_processfullpageasync__action_85_try_catch_85__linear("Exception handling")
|
||||
method_1x9gjeq_processfullpageasync__action_87_processfullpageasync_await_87_4__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__condition{"result.IsSuccess && packet.Graph != null"}
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__false("no-op")
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__true("update graph & notify")
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__condition{"result.IsSuccess"}
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__false("false")
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__true("true")
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__condition{"packet.Graph != null"}
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__false("false")
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__true("true")
|
||||
method_1x9gjeq_processfullpageasync__action_93_processfullpageasync_await_93_7__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__action_94_event_invoke_94__linear("Raise OnGraphUpdated")
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__condition{"OnGraphUpdated != null"}
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__false("false")
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__merge("merge")
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__true("true")
|
||||
method_1x9gjeq_processfullpageasync__action_95_processfullpageasync_await_95_9__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__action_96_processfullpageasync_await_96_10__await[["Waits for async work"]]
|
||||
method_1x9gjeq_processfullpageasync__entry(["ProcessFullPageAsync entry"])
|
||||
method_1x9gjeq_processfullpageasync__action_87_external_call_87__linear("Request graph data")
|
||||
method_1x9gjeq_processfullpageasync__implicit_return(["return"])
|
||||
method_1x9gjeq_processfullpageasync__action_100_processfullpageasync_catch_100_11__catch -->|ex, tenantId| method_1x9gjeq_processfullpageasync__call_102_LogGraphError
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__condition -->|continue| method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__false
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__condition -->|return| method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__true
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__false -->|next| method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__merge
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__merge -->|next| method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__condition
|
||||
method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__true -->|next| method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__merge
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__condition -->|continue| method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__false
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__condition -->|exit| method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__true
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__false -->|next| method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__merge
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__merge -->|next| method_1x9gjeq_processfullpageasync__action_80_log_80__linear
|
||||
method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__true -->|next| method_1x9gjeq_processfullpageasync__action_78_processfullpageasync_guard_clause_78_0__merge
|
||||
method_1x9gjeq_processfullpageasync__action_80_log_80__linear -->|tenantId| method_1x9gjeq_processfullpageasync__call_80_LogGeneratingGraph
|
||||
method_1x9gjeq_processfullpageasync__action_82_processfullpageasync_await_82_1__await -->|next| method_1x9gjeq_processfullpageasync__action_82_state_change_82__linear
|
||||
method_1x9gjeq_processfullpageasync__action_82_state_change_82__linear -->|none| method_1x9gjeq_processfullpageasync__call_82_IKnowledgeGraphService_Clear
|
||||
method_1x9gjeq_processfullpageasync__action_83_processfullpageasync_await_83_2__await -->|true| method_1x9gjeq_processfullpageasync__call_83_IKnowledgeGraphService_SetLoading
|
||||
method_1x9gjeq_processfullpageasync__action_85_processfullpageasync_try_85_3__try -->|next| method_1x9gjeq_processfullpageasync__action_87_processfullpageasync_await_87_4__await
|
||||
method_1x9gjeq_processfullpageasync__action_85_try_catch_85__linear -->|next| method_1x9gjeq_processfullpageasync__action_85_processfullpageasync_try_85_3__try
|
||||
method_1x9gjeq_processfullpageasync__action_87_external_call_87__linear -->|fullContent, tenantId| method_1x9gjeq_processfullpageasync__call_87_IKnowledgeService_GetGraphDataAsync
|
||||
method_1x9gjeq_processfullpageasync__action_87_processfullpageasync_await_87_4__await -->|next| method_1x9gjeq_processfullpageasync__action_87_external_call_87__linear
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__condition -->|no-op| method_1x9gjeq_processfullpageasync__action_88_branch_88__false
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__condition -->|transforms input| method_1x9gjeq_processfullpageasync__action_88_branch_88__true
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__false -->|next| method_1x9gjeq_processfullpageasync__action_88_branch_88__merge
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__merge -->|next| method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__condition
|
||||
method_1x9gjeq_processfullpageasync__action_88_branch_88__true -->|next| method_1x9gjeq_processfullpageasync__action_88_branch_88__merge
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__condition -->|false| method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__false
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__condition -->|true| method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__true
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__false -->|next| method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__merge
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__merge -->|next| method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__condition
|
||||
method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__true -->|next| method_1x9gjeq_processfullpageasync__action_88_processfullpageasync_branch_88_5__merge
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__condition -->|false| method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__false
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__condition -->|true| method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__true
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__false -->|next| method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__merge
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__merge -->|next| method_1x9gjeq_processfullpageasync__action_93_processfullpageasync_await_93_7__await
|
||||
method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__true -->|next| method_1x9gjeq_processfullpageasync__action_91_processfullpageasync_branch_91_6__merge
|
||||
method_1x9gjeq_processfullpageasync__action_93_processfullpageasync_await_93_7__await -->|packet.Graph| method_1x9gjeq_processfullpageasync__call_93_IKnowledgeGraphService_UpdateGraph
|
||||
method_1x9gjeq_processfullpageasync__action_94_event_invoke_94__linear -->|next| method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__condition
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__condition -->|false| method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__false
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__condition -->|true| method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__true
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__false -->|next| method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__merge
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__merge -->|next| method_1x9gjeq_processfullpageasync__action_95_processfullpageasync_await_95_9__await
|
||||
method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__true -->|next| method_1x9gjeq_processfullpageasync__action_94_processfullpageasync_branch_94_8__merge
|
||||
method_1x9gjeq_processfullpageasync__action_95_processfullpageasync_await_95_9__await -->|packet.Graph| method_1x9gjeq_processfullpageasync__call_95_OnGraphUpdated_Invoke
|
||||
method_1x9gjeq_processfullpageasync__action_96_processfullpageasync_await_96_10__await -->|none| method_1x9gjeq_processfullpageasync__call_96_IPlatformService_VibrateSuccessAsync
|
||||
method_1x9gjeq_processfullpageasync__call_102_LogGraphError -->|return| method_1x9gjeq_processfullpageasync__implicit_return
|
||||
method_1x9gjeq_processfullpageasync__call_80_LogGeneratingGraph -->|next| method_1x9gjeq_processfullpageasync__action_82_processfullpageasync_await_82_1__await
|
||||
method_1x9gjeq_processfullpageasync__call_82_IKnowledgeGraphService_Clear -->|next| method_1x9gjeq_processfullpageasync__action_83_processfullpageasync_await_83_2__await
|
||||
method_1x9gjeq_processfullpageasync__call_83_IKnowledgeGraphService_SetLoading -->|next| method_1x9gjeq_processfullpageasync__action_85_try_catch_85__linear
|
||||
method_1x9gjeq_processfullpageasync__call_87_IKnowledgeService_GetGraphDataAsync -->|next| method_1x9gjeq_processfullpageasync__action_88_branch_88__condition
|
||||
method_1x9gjeq_processfullpageasync__call_93_IKnowledgeGraphService_UpdateGraph -->|next| method_1x9gjeq_processfullpageasync__action_94_event_invoke_94__linear
|
||||
method_1x9gjeq_processfullpageasync__call_95_OnGraphUpdated_Invoke -->|next| method_1x9gjeq_processfullpageasync__action_96_processfullpageasync_await_96_10__await
|
||||
method_1x9gjeq_processfullpageasync__call_96_IPlatformService_VibrateSuccessAsync -->|exception| method_1x9gjeq_processfullpageasync__action_100_processfullpageasync_catch_100_11__catch
|
||||
method_1x9gjeq_processfullpageasync__entry -->|next| method_1x9gjeq_processfullpageasync__action_78_guard_clause_78__condition
|
||||
```
|
||||
|
||||
### OnBlockReachedAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1pdmx9l_onblockreachedasync__call_109_IKnowledgeGraphService_SetActiveNode[["IKnowledgeGraphService.SetActiveNode"]]
|
||||
method_1pdmx9l_onblockreachedasync__action_108_comment_108__linear("Do not highlight here")
|
||||
method_1pdmx9l_onblockreachedasync__action_109_onblockreachedasync_await_109_0__await[["Waits for async work"]]
|
||||
method_1pdmx9l_onblockreachedasync__action_109_state_change_109__linear("Set active node")
|
||||
method_1pdmx9l_onblockreachedasync__entry(["OnBlockReachedAsync entry"])
|
||||
method_1pdmx9l_onblockreachedasync__implicit_return(["return"])
|
||||
method_1pdmx9l_onblockreachedasync__action_108_comment_108__linear -->|next| method_1pdmx9l_onblockreachedasync__action_109_onblockreachedasync_await_109_0__await
|
||||
method_1pdmx9l_onblockreachedasync__action_109_onblockreachedasync_await_109_0__await -->|next| method_1pdmx9l_onblockreachedasync__action_109_state_change_109__linear
|
||||
method_1pdmx9l_onblockreachedasync__action_109_state_change_109__linear -->|blockId| method_1pdmx9l_onblockreachedasync__call_109_IKnowledgeGraphService_SetActiveNode
|
||||
method_1pdmx9l_onblockreachedasync__call_109_IKnowledgeGraphService_SetActiveNode -->|return| method_1pdmx9l_onblockreachedasync__implicit_return
|
||||
method_1pdmx9l_onblockreachedasync__entry -->|next| method_1pdmx9l_onblockreachedasync__action_108_comment_108__linear
|
||||
```
|
||||
|
||||
### RequestSummaryAndQuizAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_2y4xzb_requestsummaryandquizasync__fragment_diagram exceeds preferred complexity thresholds (35 nodes, 36 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_2y4xzb_requestsummaryandquizasync__call_114_IQuizStateService_SetHydrating[["IQuizStateService.SetHydrating"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_115_LogRequestingSummary[["LogRequestingSummary"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_118_IKnowledgeService_GetSummaryAndQuizAsync[["IKnowledgeService.GetSummaryAndQuizAsync"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_123_QuizQuestionDto_ctor[["QuizQuestionDto..ctor"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_126_IQuizStateService_SetQuiz[["IQuizStateService.SetQuiz"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_127_IPlatformService_VibrateSuccessAsync[["IPlatformService.VibrateSuccessAsync"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_131_LogSummaryWarning[["LogSummaryWarning"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__call_136_LogSummaryError[["LogSummaryError"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__action_114_requestsummaryandquizasync_await_114_0__await[["Waits for async work"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__action_114_state_change_114__linear("Mark quiz hydrating")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_115_log_115__linear("Requesting summary & quiz")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_116_requestsummaryandquizasync_try_116_1__try("Begins protected execution")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_116_try_catch_finally_116__linear("Error handling and cleanup")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_118_requestsummaryandquizasync_await_118_2__await[["Waits for async work"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__condition{"result.IsSuccess"}
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__false("log warning & fail")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__merge("merge")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__true("map & set quiz")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__condition{"result.IsSuccess"}
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__false("false")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__merge("merge")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__true("true")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_122_mapping_122__linear("Map remote quizzes to UI DTOs")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_123_requestsummaryandquizasync_mapping_123_4__linear("Maps data or transforms shape")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_126_requestsummaryandquizasync_await_126_5__await[["Waits for async work"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__action_127_requestsummaryandquizasync_await_127_6__await[["Waits for async work"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__action_134_requestsummaryandquizasync_catch_134_9__catch("catch Exception ex")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_139_requestsummaryandquizasync_finally_139_11__finally("Runs cleanup or finalization")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_141_requestsummaryandquizasync_await_141_12__await[["Waits for async work"]]
|
||||
method_2y4xzb_requestsummaryandquizasync__entry(["RequestSummaryAndQuizAsync entry"])
|
||||
method_2y4xzb_requestsummaryandquizasync__action_118_external_call_118__linear("Request summary+quiz")
|
||||
method_2y4xzb_requestsummaryandquizasync__action_128_requestsummaryandquizasync_return_128_7__return(["Returns result"])
|
||||
method_2y4xzb_requestsummaryandquizasync__action_132_requestsummaryandquizasync_return_132_8__return(["Returns result"])
|
||||
method_2y4xzb_requestsummaryandquizasync__action_137_requestsummaryandquizasync_return_137_10__return(["Returns result"])
|
||||
method_2y4xzb_requestsummaryandquizasync__implicit_return(["return"])
|
||||
method_2y4xzb_requestsummaryandquizasync__action_114_requestsummaryandquizasync_await_114_0__await -->|next| method_2y4xzb_requestsummaryandquizasync__action_114_state_change_114__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__action_114_state_change_114__linear -->|true / false| method_2y4xzb_requestsummaryandquizasync__call_114_IQuizStateService_SetHydrating
|
||||
method_2y4xzb_requestsummaryandquizasync__action_115_log_115__linear -->|tenantId| method_2y4xzb_requestsummaryandquizasync__call_115_LogRequestingSummary
|
||||
method_2y4xzb_requestsummaryandquizasync__action_116_requestsummaryandquizasync_try_116_1__try -->|next| method_2y4xzb_requestsummaryandquizasync__action_118_requestsummaryandquizasync_await_118_2__await
|
||||
method_2y4xzb_requestsummaryandquizasync__action_116_try_catch_finally_116__linear -->|next| method_2y4xzb_requestsummaryandquizasync__action_116_requestsummaryandquizasync_try_116_1__try
|
||||
method_2y4xzb_requestsummaryandquizasync__action_118_external_call_118__linear -->|content, tenantId| method_2y4xzb_requestsummaryandquizasync__call_118_IKnowledgeService_GetSummaryAndQuizAsync
|
||||
method_2y4xzb_requestsummaryandquizasync__action_118_requestsummaryandquizasync_await_118_2__await -->|next| method_2y4xzb_requestsummaryandquizasync__action_118_external_call_118__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__condition -->|transforms input| method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__false
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__condition -->|transforms input| method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__true
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__false -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__merge
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__merge -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__condition
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__true -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__merge
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__condition -->|false| method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__false
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__condition -->|true| method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__true
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__false -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__merge
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__merge -->|next| method_2y4xzb_requestsummaryandquizasync__action_122_mapping_122__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__true -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_requestsummaryandquizasync_branch_119_3__merge
|
||||
method_2y4xzb_requestsummaryandquizasync__action_122_mapping_122__linear -->|next| method_2y4xzb_requestsummaryandquizasync__action_123_requestsummaryandquizasync_mapping_123_4__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__action_123_requestsummaryandquizasync_mapping_123_4__linear -->|q.Question, q.Options, q.CorrectIndex| method_2y4xzb_requestsummaryandquizasync__call_123_QuizQuestionDto_ctor
|
||||
method_2y4xzb_requestsummaryandquizasync__action_126_requestsummaryandquizasync_await_126_5__await -->|null, new QuizDto quizQuestions| method_2y4xzb_requestsummaryandquizasync__call_126_IQuizStateService_SetQuiz
|
||||
method_2y4xzb_requestsummaryandquizasync__action_127_requestsummaryandquizasync_await_127_6__await -->|none| method_2y4xzb_requestsummaryandquizasync__call_127_IPlatformService_VibrateSuccessAsync
|
||||
method_2y4xzb_requestsummaryandquizasync__action_128_requestsummaryandquizasync_return_128_7__return -->|tenantId| method_2y4xzb_requestsummaryandquizasync__call_131_LogSummaryWarning
|
||||
method_2y4xzb_requestsummaryandquizasync__action_132_requestsummaryandquizasync_return_132_8__return -->|exception| method_2y4xzb_requestsummaryandquizasync__action_134_requestsummaryandquizasync_catch_134_9__catch
|
||||
method_2y4xzb_requestsummaryandquizasync__action_134_requestsummaryandquizasync_catch_134_9__catch -->|ex, tenantId| method_2y4xzb_requestsummaryandquizasync__call_136_LogSummaryError
|
||||
method_2y4xzb_requestsummaryandquizasync__action_137_requestsummaryandquizasync_return_137_10__return -->|next| method_2y4xzb_requestsummaryandquizasync__action_139_requestsummaryandquizasync_finally_139_11__finally
|
||||
method_2y4xzb_requestsummaryandquizasync__action_139_requestsummaryandquizasync_finally_139_11__finally -->|next| method_2y4xzb_requestsummaryandquizasync__action_141_requestsummaryandquizasync_await_141_12__await
|
||||
method_2y4xzb_requestsummaryandquizasync__action_141_requestsummaryandquizasync_await_141_12__await -->|return| method_2y4xzb_requestsummaryandquizasync__implicit_return
|
||||
method_2y4xzb_requestsummaryandquizasync__call_114_IQuizStateService_SetHydrating -->|next| method_2y4xzb_requestsummaryandquizasync__action_115_log_115__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__call_115_LogRequestingSummary -->|next| method_2y4xzb_requestsummaryandquizasync__action_116_try_catch_finally_116__linear
|
||||
method_2y4xzb_requestsummaryandquizasync__call_118_IKnowledgeService_GetSummaryAndQuizAsync -->|next| method_2y4xzb_requestsummaryandquizasync__action_119_branch_119__condition
|
||||
method_2y4xzb_requestsummaryandquizasync__call_123_QuizQuestionDto_ctor -->|next| method_2y4xzb_requestsummaryandquizasync__action_126_requestsummaryandquizasync_await_126_5__await
|
||||
method_2y4xzb_requestsummaryandquizasync__call_126_IQuizStateService_SetQuiz -->|next| method_2y4xzb_requestsummaryandquizasync__action_127_requestsummaryandquizasync_await_127_6__await
|
||||
method_2y4xzb_requestsummaryandquizasync__call_127_IPlatformService_VibrateSuccessAsync -->|return| method_2y4xzb_requestsummaryandquizasync__action_128_requestsummaryandquizasync_return_128_7__return
|
||||
method_2y4xzb_requestsummaryandquizasync__call_131_LogSummaryWarning -->|return| method_2y4xzb_requestsummaryandquizasync__action_132_requestsummaryandquizasync_return_132_8__return
|
||||
method_2y4xzb_requestsummaryandquizasync__call_136_LogSummaryError -->|return| method_2y4xzb_requestsummaryandquizasync__action_137_requestsummaryandquizasync_return_137_10__return
|
||||
method_2y4xzb_requestsummaryandquizasync__entry -->|next| method_2y4xzb_requestsummaryandquizasync__action_114_requestsummaryandquizasync_await_114_0__await
|
||||
```
|
||||
|
||||
### ClearAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_b6ndo3_clearasync__call_147_IKnowledgeGraphService_Clear[["IKnowledgeGraphService.Clear"]]
|
||||
method_b6ndo3_clearasync__call_148_IQuizStateService_SetQuiz[["IQuizStateService.SetQuiz"]]
|
||||
method_b6ndo3_clearasync__action_147_clearasync_await_147_0__await[["Waits for async work"]]
|
||||
method_b6ndo3_clearasync__action_147_state_change_147__linear("Clear graph and quiz")
|
||||
method_b6ndo3_clearasync__action_148_clearasync_await_148_1__await[["Waits for async work"]]
|
||||
method_b6ndo3_clearasync__entry(["ClearAsync entry"])
|
||||
method_b6ndo3_clearasync__implicit_return(["return"])
|
||||
method_b6ndo3_clearasync__action_147_clearasync_await_147_0__await -->|next| method_b6ndo3_clearasync__action_147_state_change_147__linear
|
||||
method_b6ndo3_clearasync__action_147_state_change_147__linear -->|none| method_b6ndo3_clearasync__call_147_IKnowledgeGraphService_Clear
|
||||
method_b6ndo3_clearasync__action_148_clearasync_await_148_1__await -->|null, null| method_b6ndo3_clearasync__call_148_IQuizStateService_SetQuiz
|
||||
method_b6ndo3_clearasync__call_147_IKnowledgeGraphService_Clear -->|next| method_b6ndo3_clearasync__action_148_clearasync_await_148_1__await
|
||||
method_b6ndo3_clearasync__call_148_IQuizStateService_SetQuiz -->|return| method_b6ndo3_clearasync__implicit_return
|
||||
method_b6ndo3_clearasync__entry -->|next| method_b6ndo3_clearasync__action_147_clearasync_await_147_0__await
|
||||
```
|
||||
|
||||
### Dispose() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1wlwqp0_dispose__call_153_IReaderInteractionService_OnNodeSelected_HandleNodeSelected[["IReaderInteractionService.OnNodeSelected -= HandleNodeSelected"]]
|
||||
method_1wlwqp0_dispose__action_153_event_unsubscribe_153__linear("Unsubscribe node selection handler")
|
||||
method_1wlwqp0_dispose__entry(["Dispose entry"])
|
||||
method_1wlwqp0_dispose__implicit_return(["return"])
|
||||
method_1wlwqp0_dispose__action_153_event_unsubscribe_153__linear -->|event handler HandleNodeSelected| method_1wlwqp0_dispose__call_153_IReaderInteractionService_OnNodeSelected_HandleNodeSelected
|
||||
method_1wlwqp0_dispose__call_153_IReaderInteractionService_OnNodeSelected_HandleNodeSelected -->|return| method_1wlwqp0_dispose__implicit_return
|
||||
method_1wlwqp0_dispose__entry -->|next| method_1wlwqp0_dispose__action_153_event_unsubscribe_153__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 20 unresolved jumps.
|
||||
- Warning: neighborhood-view: diagram file_uvydt4_knowledgecoordinator_cs_neighborhood_view exceeds preferred complexity thresholds (14 nodes, 0 edges).
|
||||
- Warning: execution-overview: diagram file_uvydt4_knowledgecoordinator_cs_execution_view exceeds preferred complexity thresholds (44 nodes, 43 edges).
|
||||
- Warning: control-flow: diagram method_t1zuul_handlenodeselected__fragment_diagram exceeds preferred complexity thresholds (42 nodes, 49 edges).
|
||||
- Warning: control-flow: diagram method_1x9gjeq_processfullpageasync__fragment_diagram exceeds preferred complexity thresholds (47 nodes, 52 edges).
|
||||
- Warning: control-flow: diagram method_2y4xzb_requestsummaryandquizasync__fragment_diagram exceeds preferred complexity thresholds (35 nodes, 36 edges).
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
# KnowledgeGraphService
|
||||
|
||||
- File ID: file:q6pxzf:knowledgegraphservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/KnowledgeGraphService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
In-memory UI/shared service that holds the current knowledge graph state (GraphDataDto), active node id, loading flag, and publishes change notifications via events for UI consumers.
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple UI/shared state service that centralizes graph state and notifies subscribers; methods are small, synchronous state mutations with conditional async event invocation; SetActiveNode contains a guard no-op to avoid redundant notifications.
|
||||
|
||||
## Symbols
|
||||
|
||||
- KnowledgeGraphService: In-memory UI/shared service that holds the current knowledge graph state (GraphDataDto), active node id, loading flag, and publishes change notifications via events for UI consumers.
|
||||
- UpdateGraph(): Replace CurrentGraphData with new graph data, clear loading flag, and notify subscribers that loading changed and graph updated.
|
||||
- SetActiveNode(): Set the active node id (no-op if unchanged) and notify subscribers of the change.
|
||||
- SetLoading(): Update the IsLoading flag and notify subscribers about loading state changes.
|
||||
- Clear(): Clear the stored graph data, active node, reset loading flag, and notify graph-updated subscribers.
|
||||
- KnowledgeGraphService: Service model that holds current graph state, active node id, loading flag and event publishers for UI consumers.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries.Graph (GraphDataDto)
|
||||
- dependency-target: IKnowledgeGraphService (interface - not in this file)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 7
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 5
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- UpdateGraph: 18 nodes, 19 edges, 2 jumps, 0 unsupported constructs
|
||||
- SetActiveNode: 18 nodes, 20 edges, 1 jumps, 0 unsupported constructs
|
||||
- SetLoading: 10 nodes, 10 edges, 1 jumps, 0 unsupported constructs
|
||||
- Clear: 12 nodes, 12 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### KnowledgeGraphService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_zdhkb2_knowledgegraphservice("KnowledgeGraphService")
|
||||
file_q6pxzf_knowledgegraphservice_cs("KnowledgeGraphService")
|
||||
method_1ii06co_setactivenode[["SetActiveNode()"]]
|
||||
method_90e1ug_setloading[["SetLoading()"]]
|
||||
method_b27zpe_updategraph[["UpdateGraph()"]]
|
||||
method_ekp9ov_clear[["Clear()"]]
|
||||
type_pp4157_knowledgegraphservice[/"KnowledgeGraphService"/]
|
||||
```
|
||||
|
||||
### KnowledgeGraphService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_zdhkb2_knowledgegraphservice("KnowledgeGraphService")
|
||||
method_1ii06co_setactivenode[["SetActiveNode()"]]
|
||||
method_90e1ug_setloading[["SetLoading()"]]
|
||||
method_b27zpe_updategraph[["UpdateGraph()"]]
|
||||
method_ekp9ov_clear[["Clear()"]]
|
||||
unresolved_unresolved_120p162_call_target{"Unresolved: OnLoadingChanged"}
|
||||
unresolved_unresolved_1d66hoy_call_target{"Unresolved: OnLoadingChanged"}
|
||||
unresolved_unresolved_1m63l2b_call_target{"Unresolved: OnGraphUpdated"}
|
||||
unresolved_unresolved_6929sq_call_target{"Unresolved: OnActiveNodeChanged"}
|
||||
unresolved_unresolved_nqd2ct_call_target{"Unresolved: OnGraphUpdated"}
|
||||
class_zdhkb2_knowledgegraphservice -->|contains| method_1ii06co_setactivenode
|
||||
class_zdhkb2_knowledgegraphservice -->|contains| method_90e1ug_setloading
|
||||
class_zdhkb2_knowledgegraphservice -->|contains| method_b27zpe_updategraph
|
||||
class_zdhkb2_knowledgegraphservice -->|contains| method_ekp9ov_clear
|
||||
method_1ii06co_setactivenode -->|unresolved call| unresolved_unresolved_6929sq_call_target
|
||||
method_90e1ug_setloading -->|unresolved call| unresolved_unresolved_1d66hoy_call_target
|
||||
method_b27zpe_updategraph -->|unresolved call| unresolved_unresolved_120p162_call_target
|
||||
method_b27zpe_updategraph -->|unresolved call| unresolved_unresolved_nqd2ct_call_target
|
||||
method_ekp9ov_clear -->|unresolved call| unresolved_unresolved_1m63l2b_call_target
|
||||
```
|
||||
|
||||
### UpdateGraph() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_b27zpe_updategraph__call_19_OnLoadingChanged[["OnLoadingChanged"]]
|
||||
method_b27zpe_updategraph__call_20_OnGraphUpdated[["OnGraphUpdated"]]
|
||||
method_b27zpe_updategraph__action_17_state_change_17__linear("Set CurrentGraphData")
|
||||
method_b27zpe_updategraph__action_18_state_change_18__linear("Clear IsLoading")
|
||||
method_b27zpe_updategraph__action_19_event_19__linear("Notify loading changed")
|
||||
method_b27zpe_updategraph__action_19_updategraph_await_19_1__await[["Waits for async work"]]
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__condition{"OnLoadingChanged != null) await OnLoadingChanged(false"}
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__false("false")
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__merge("merge")
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__true("true")
|
||||
method_b27zpe_updategraph__action_20_event_20__linear("Notify graph updated")
|
||||
method_b27zpe_updategraph__action_20_updategraph_await_20_3__await[["Waits for async work"]]
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__condition{"OnGraphUpdated != null) await OnGraphUpdated("}
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__false("false")
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__merge("merge")
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__true("true")
|
||||
method_b27zpe_updategraph__entry(["UpdateGraph entry"])
|
||||
method_b27zpe_updategraph__implicit_return(["return"])
|
||||
method_b27zpe_updategraph__action_17_state_change_17__linear -->|next| method_b27zpe_updategraph__action_18_state_change_18__linear
|
||||
method_b27zpe_updategraph__action_18_state_change_18__linear -->|next| method_b27zpe_updategraph__action_19_updategraph_await_19_1__await
|
||||
method_b27zpe_updategraph__action_19_event_19__linear -->|next| method_b27zpe_updategraph__action_19_updategraph_branch_19_0__condition
|
||||
method_b27zpe_updategraph__action_19_updategraph_await_19_1__await -->|next| method_b27zpe_updategraph__action_19_event_19__linear
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__condition -->|false| method_b27zpe_updategraph__action_19_updategraph_branch_19_0__false
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__condition -->|true| method_b27zpe_updategraph__action_19_updategraph_branch_19_0__true
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__false -->|next| method_b27zpe_updategraph__action_19_updategraph_branch_19_0__merge
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__merge -->|false signals loading finished| method_b27zpe_updategraph__call_19_OnLoadingChanged
|
||||
method_b27zpe_updategraph__action_19_updategraph_branch_19_0__true -->|next| method_b27zpe_updategraph__action_19_updategraph_branch_19_0__merge
|
||||
method_b27zpe_updategraph__action_20_event_20__linear -->|next| method_b27zpe_updategraph__action_20_updategraph_branch_20_2__condition
|
||||
method_b27zpe_updategraph__action_20_updategraph_await_20_3__await -->|next| method_b27zpe_updategraph__action_20_event_20__linear
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__condition -->|false| method_b27zpe_updategraph__action_20_updategraph_branch_20_2__false
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__condition -->|true| method_b27zpe_updategraph__action_20_updategraph_branch_20_2__true
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__false -->|next| method_b27zpe_updategraph__action_20_updategraph_branch_20_2__merge
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__merge -->|no args signals graph updated| method_b27zpe_updategraph__call_20_OnGraphUpdated
|
||||
method_b27zpe_updategraph__action_20_updategraph_branch_20_2__true -->|next| method_b27zpe_updategraph__action_20_updategraph_branch_20_2__merge
|
||||
method_b27zpe_updategraph__call_19_OnLoadingChanged -->|next| method_b27zpe_updategraph__action_20_updategraph_await_20_3__await
|
||||
method_b27zpe_updategraph__call_20_OnGraphUpdated -->|return| method_b27zpe_updategraph__implicit_return
|
||||
method_b27zpe_updategraph__entry -->|next| method_b27zpe_updategraph__action_17_state_change_17__linear
|
||||
```
|
||||
|
||||
### SetActiveNode() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1ii06co_setactivenode__call_27_OnActiveNodeChanged[["OnActiveNodeChanged"]]
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__condition{"ActiveNodeId == nodeId"}
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__false("continue")
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__merge("merge")
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__true("return (no change)")
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__condition{"ActiveNodeId == nodeId"}
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__false("continue")
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__merge("merge")
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__true("exit")
|
||||
method_1ii06co_setactivenode__action_26_state_change_26__linear("Set ActiveNodeId")
|
||||
method_1ii06co_setactivenode__action_27_event_27__linear("Notify active node changed")
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_await_27_2__await[["Waits for async work"]]
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__condition{"OnActiveNodeChanged != null) await OnActiveNodeChanged(nodeId"}
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__false("false")
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__merge("merge")
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__true("true")
|
||||
method_1ii06co_setactivenode__entry(["SetActiveNode entry"])
|
||||
method_1ii06co_setactivenode__implicit_return(["return"])
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__condition -->|continue| method_1ii06co_setactivenode__action_25_guard_clause_25__false
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__condition -->|return no change| method_1ii06co_setactivenode__action_25_guard_clause_25__true
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__false -->|next| method_1ii06co_setactivenode__action_25_guard_clause_25__merge
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__merge -->|next| method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__condition
|
||||
method_1ii06co_setactivenode__action_25_guard_clause_25__true -->|next| method_1ii06co_setactivenode__action_25_guard_clause_25__merge
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__condition -->|continue| method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__false
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__condition -->|exit| method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__true
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__false -->|next| method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__merge
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__merge -->|next| method_1ii06co_setactivenode__action_26_state_change_26__linear
|
||||
method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__true -->|next| method_1ii06co_setactivenode__action_25_setactivenode_guard_clause_25_0__merge
|
||||
method_1ii06co_setactivenode__action_26_state_change_26__linear -->|next| method_1ii06co_setactivenode__action_27_setactivenode_await_27_2__await
|
||||
method_1ii06co_setactivenode__action_27_event_27__linear -->|next| method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__condition
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_await_27_2__await -->|next| method_1ii06co_setactivenode__action_27_event_27__linear
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__condition -->|false| method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__false
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__condition -->|true| method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__true
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__false -->|next| method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__merge
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__merge -->|nodeId string| method_1ii06co_setactivenode__call_27_OnActiveNodeChanged
|
||||
method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__true -->|next| method_1ii06co_setactivenode__action_27_setactivenode_branch_27_1__merge
|
||||
method_1ii06co_setactivenode__call_27_OnActiveNodeChanged -->|return| method_1ii06co_setactivenode__implicit_return
|
||||
method_1ii06co_setactivenode__entry -->|next| method_1ii06co_setactivenode__action_25_guard_clause_25__condition
|
||||
```
|
||||
|
||||
### SetLoading() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_90e1ug_setloading__call_33_OnLoadingChanged[["OnLoadingChanged"]]
|
||||
method_90e1ug_setloading__action_32_state_change_32__linear("Set IsLoading")
|
||||
method_90e1ug_setloading__action_33_event_33__linear("Notify loading changed")
|
||||
method_90e1ug_setloading__action_33_setloading_await_33_1__await[["Waits for async work"]]
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__condition{"OnLoadingChanged != null) await OnLoadingChanged(isLoading"}
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__false("false")
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__merge("merge")
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__true("true")
|
||||
method_90e1ug_setloading__entry(["SetLoading entry"])
|
||||
method_90e1ug_setloading__implicit_return(["return"])
|
||||
method_90e1ug_setloading__action_32_state_change_32__linear -->|next| method_90e1ug_setloading__action_33_setloading_await_33_1__await
|
||||
method_90e1ug_setloading__action_33_event_33__linear -->|next| method_90e1ug_setloading__action_33_setloading_branch_33_0__condition
|
||||
method_90e1ug_setloading__action_33_setloading_await_33_1__await -->|next| method_90e1ug_setloading__action_33_event_33__linear
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__condition -->|false| method_90e1ug_setloading__action_33_setloading_branch_33_0__false
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__condition -->|true| method_90e1ug_setloading__action_33_setloading_branch_33_0__true
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__false -->|next| method_90e1ug_setloading__action_33_setloading_branch_33_0__merge
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__merge -->|isLoading bool| method_90e1ug_setloading__call_33_OnLoadingChanged
|
||||
method_90e1ug_setloading__action_33_setloading_branch_33_0__true -->|next| method_90e1ug_setloading__action_33_setloading_branch_33_0__merge
|
||||
method_90e1ug_setloading__call_33_OnLoadingChanged -->|return| method_90e1ug_setloading__implicit_return
|
||||
method_90e1ug_setloading__entry -->|next| method_90e1ug_setloading__action_32_state_change_32__linear
|
||||
```
|
||||
|
||||
### Clear() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_ekp9ov_clear__call_41_OnGraphUpdated[["OnGraphUpdated"]]
|
||||
method_ekp9ov_clear__action_38_state_change_38__linear("Clear CurrentGraphData")
|
||||
method_ekp9ov_clear__action_39_state_change_39__linear("Clear ActiveNodeId")
|
||||
method_ekp9ov_clear__action_40_state_change_40__linear("Clear IsLoading")
|
||||
method_ekp9ov_clear__action_41_clear_await_41_1__await[["Waits for async work"]]
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__condition{"OnGraphUpdated != null) await OnGraphUpdated("}
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__false("false")
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__merge("merge")
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__true("true")
|
||||
method_ekp9ov_clear__action_41_event_41__linear("Notify graph updated (cleared)")
|
||||
method_ekp9ov_clear__entry(["Clear entry"])
|
||||
method_ekp9ov_clear__implicit_return(["return"])
|
||||
method_ekp9ov_clear__action_38_state_change_38__linear -->|next| method_ekp9ov_clear__action_39_state_change_39__linear
|
||||
method_ekp9ov_clear__action_39_state_change_39__linear -->|next| method_ekp9ov_clear__action_40_state_change_40__linear
|
||||
method_ekp9ov_clear__action_40_state_change_40__linear -->|next| method_ekp9ov_clear__action_41_clear_await_41_1__await
|
||||
method_ekp9ov_clear__action_41_clear_await_41_1__await -->|next| method_ekp9ov_clear__action_41_event_41__linear
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__condition -->|false| method_ekp9ov_clear__action_41_clear_branch_41_0__false
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__condition -->|true| method_ekp9ov_clear__action_41_clear_branch_41_0__true
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__false -->|next| method_ekp9ov_clear__action_41_clear_branch_41_0__merge
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__merge -->|no args signals graph cleared / updated| method_ekp9ov_clear__call_41_OnGraphUpdated
|
||||
method_ekp9ov_clear__action_41_clear_branch_41_0__true -->|next| method_ekp9ov_clear__action_41_clear_branch_41_0__merge
|
||||
method_ekp9ov_clear__action_41_event_41__linear -->|next| method_ekp9ov_clear__action_41_clear_branch_41_0__condition
|
||||
method_ekp9ov_clear__call_41_OnGraphUpdated -->|return| method_ekp9ov_clear__implicit_return
|
||||
method_ekp9ov_clear__entry -->|next| method_ekp9ov_clear__action_38_state_change_38__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 5 unresolved jumps.
|
||||
+340
@@ -0,0 +1,340 @@
|
||||
# NexusAuthenticationStateProvider
|
||||
|
||||
- File ID: file:i7as8l:nexusauthenticationstateprovider-cs
|
||||
- Path: NexusReader.UI.Shared/Services/NexusAuthenticationStateProvider.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Provides Blazor AuthenticationStateProvider implementation that reads persisted user authentication info (token, email, tenant, roles) from a native secure storage service, caches the computed AuthenticationState, and notifies consumers about authentication changes.
|
||||
|
||||
## Key Details
|
||||
|
||||
Caches computed AuthenticationState in-memory; reads token/email/tenant/roles from INativeStorageService; three main paths in GetAuthenticationStateAsync: token-based, cookie-indicator-based, anonymous fallback; includes security note about storing roles in local storage (line 13-15).
|
||||
|
||||
## Symbols
|
||||
|
||||
- NexusAuthenticationStateProvider: Provides Blazor AuthenticationStateProvider implementation that reads persisted user authentication info (token, email, tenant, roles) from a native secure storage service, caches the computed AuthenticationState, and notifies consumers about authentication changes.
|
||||
- NexusAuthenticationStateProvider(): Constructor that captures the native secure storage service dependency.
|
||||
- ClearCache(): Clears any cached AuthenticationState and triggers Notification of authentication state change.
|
||||
- GetAuthenticationStateAsync(): Asynchronously obtains the current AuthenticationState by reading persisted token/email/tenant/roles from secure storage, with caching, multi-path branching (token, cookie, fallback), and exception-safe anonymous fallback.
|
||||
- CreateState(): Builds an AuthenticationState from provided email, tenantId, authType and a comma-separated roles string.
|
||||
- NotifyUserAuthentication(): Updates cached AuthenticationState to an authenticated state and notifies consumers (used after successful login).
|
||||
- NotifyUserLogout(): Clears cached authentication and notifies consumers that the user is logged out (returns anonymous principal).
|
||||
- NexusAuthenticationStateProvider: Authentication state provider that derives authentication information from secure native storage and exposes state changes to Blazor components.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- dependency-target: NexusReader.Application.Constants/StorageKeys.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: self
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/INativeStorageService.cs
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- interaction-target: await _storageService.GetSecureString(TokenKey)
|
||||
- interaction-target: await _storageService.GetSecureString for UserEmail, UserTenant, UserRoles
|
||||
- interaction-target: await _storageService.GetSecureString for UserEmail, UserTenant, UserRoles
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 8
|
||||
- Executable symbols: 6
|
||||
- Executable symbols with control flow: 6
|
||||
- Grounded edges: 8
|
||||
- Unresolved references: 15
|
||||
- Control-flow fragments: 6
|
||||
- Unresolved jumps: 7
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- NexusAuthenticationStateProvider: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- ClearCache: 5 nodes, 4 edges, 0 jumps, 0 unsupported constructs
|
||||
- GetAuthenticationStateAsync: 65 nodes, 73 edges, 9 jumps, 0 unsupported constructs
|
||||
- CreateState: 19 nodes, 22 edges, 0 jumps, 0 unsupported constructs
|
||||
- NotifyUserAuthentication: 7 nodes, 6 edges, 1 jumps, 0 unsupported constructs
|
||||
- NotifyUserLogout: 7 nodes, 6 edges, 0 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### NexusAuthenticationStateProvider Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1yjf0sw_nexusauthenticationstateprovider("NexusAuthenticationStateProvider")
|
||||
file_i7as8l_nexusauthenticationstateprovider_cs("NexusAuthenticationStateProvider")
|
||||
method_13yeu7e_getauthenticationstateasync[["GetAuthenticationStateAsync()"]]
|
||||
method_15b2jq7_nexusauthenticationstateprovider[["NexusAuthenticationStateProvider()"]]
|
||||
method_16ct380_createstate[["CreateState()"]]
|
||||
method_1csperg_notifyuserauthentication[["NotifyUserAuthentication()"]]
|
||||
method_1r8a5jx_clearcache[["ClearCache()"]]
|
||||
method_ppivt7_notifyuserlogout[["NotifyUserLogout()"]]
|
||||
type_1rcw5yd_nexusauthenticationstateprovider[/"NexusAuthenticationStateProvider"/]
|
||||
```
|
||||
|
||||
### NexusAuthenticationStateProvider Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1yjf0sw_nexusauthenticationstateprovider("NexusAuthenticationStateProvider")
|
||||
method_13yeu7e_getauthenticationstateasync[["GetAuthenticationStateAsync()"]]
|
||||
method_15b2jq7_nexusauthenticationstateprovider[["NexusAuthenticationStateProvider()"]]
|
||||
method_16ct380_createstate[["CreateState()"]]
|
||||
method_1csperg_notifyuserauthentication[["NotifyUserAuthentication()"]]
|
||||
method_1r8a5jx_clearcache[["ClearCache()"]]
|
||||
method_ppivt7_notifyuserlogout[["NotifyUserLogout()"]]
|
||||
unresolved_unresolved_7781p2_call_target{"Unresolved: GetSecureString"}
|
||||
unresolved_unresolved_ec7s11_call_target{"Unresolved: CreateState"}
|
||||
unresolved_unresolved_ivbye2_interaction_target{"Unresolved: await _storageService.GetSecureString(TokenKey)"}
|
||||
unresolved_unresolved_k68nw4_call_target{"Unresolved: CreateState"}
|
||||
unresolved_unresolved_nkii1s_interaction_target{"Unresolved: await _storageService.GetSecureString for UserEmail, UserTenant, UserRoles"}
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_13yeu7e_getauthenticationstateasync
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_15b2jq7_nexusauthenticationstateprovider
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_16ct380_createstate
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_1csperg_notifyuserauthentication
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_1r8a5jx_clearcache
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|contains| method_ppivt7_notifyuserlogout
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|unresolved interaction| unresolved_unresolved_ivbye2_interaction_target
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|unresolved interaction| unresolved_unresolved_nkii1s_interaction_target
|
||||
class_1yjf0sw_nexusauthenticationstateprovider -->|unresolved interaction| unresolved_unresolved_nkii1s_interaction_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_7781p2_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_ec7s11_call_target
|
||||
method_13yeu7e_getauthenticationstateasync -->|unresolved call| unresolved_unresolved_ec7s11_call_target
|
||||
method_1csperg_notifyuserauthentication -->|unresolved call| unresolved_unresolved_k68nw4_call_target
|
||||
```
|
||||
|
||||
### GetAuthenticationStateAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_13yeu7e_getauthenticationstateasync__fragment_diagram exceeds preferred complexity thresholds (65 nodes, 73 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_13yeu7e_getauthenticationstateasync__call_37_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_43_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_44_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_45_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_49_CreateState[["CreateState"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_59_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_62_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_63_GetSecureString[["GetSecureString"]]
|
||||
method_13yeu7e_getauthenticationstateasync__call_64_CreateState[["CreateState"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_33_getauthenticationstateasync_try_33_0__try("Begins protected execution")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__condition{"_cachedState != null"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__false("continue")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__true("exit")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__condition{"_cachedState != null"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__false("continue to storage reads")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__true("return cached AuthenticationState")
|
||||
method_13yeu7e_getauthenticationstateasync__action_37_getauthenticationstateasync_await_37_2__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__condition{"token is not null/whitespace"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__false("skip token-based")
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__true("try token-based: read email, tenant, roles")
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__condition{"!string.IsNullOrWhiteSpace(token)"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__false("false")
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__true("true")
|
||||
method_13yeu7e_getauthenticationstateasync__action_43_getauthenticationstateasync_await_43_4__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_44_getauthenticationstateasync_await_44_5__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_45_getauthenticationstateasync_await_45_6__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__condition{"emailResult.IsSuccess && !string.IsNullOrEmpty(emailResult.Value)"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__false("false")
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__true("true")
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__condition{"emailResult.IsSuccess && !string.IsNullOrEmpty(emailResult.Value)"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__false("fall through")
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__true("create cached state and return")
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__condition{"storedEmailResult.IsSuccess && storedEmailResult.Value not empty"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__false("fall through to fallback")
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__true("create cached state from cookie-style indicators and return")
|
||||
method_13yeu7e_getauthenticationstateasync__action_59_getauthenticationstateasync_await_59_9__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__condition{"storedEmailResult.IsSuccess && !string.IsNullOrEmpty(storedEmailResult.Value)"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__false("false")
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__true("true")
|
||||
method_13yeu7e_getauthenticationstateasync__action_62_getauthenticationstateasync_await_62_11__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_63_getauthenticationstateasync_await_63_12__await[["Waits for async work"]]
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__condition{"Anonymous fallback"}
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__false("false")
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__merge("merge")
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__true("true")
|
||||
method_13yeu7e_getauthenticationstateasync__action_78_exception_handler_78__linear("Catch-all exception and return anonymous")
|
||||
method_13yeu7e_getauthenticationstateasync__action_78_getauthenticationstateasync_catch_78_15__catch("catch Exception")
|
||||
method_13yeu7e_getauthenticationstateasync__entry(["GetAuthenticationStateAsync entry"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_37_external_call_37__linear("Read persisted auth token")
|
||||
method_13yeu7e_getauthenticationstateasync__action_43_external_call_43__linear("Read email/tenant/roles for token path")
|
||||
method_13yeu7e_getauthenticationstateasync__action_59_external_call_59__linear("Read email/tenant/roles for cookie path")
|
||||
method_13yeu7e_getauthenticationstateasync__action_54_getauthenticationstateasync_return_54_8__return(["Returns result"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_54_return_54__return(["Return AuthenticationState built from token data"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_69_getauthenticationstateasync_return_69_13__return(["Returns result"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_69_return_69__return(["Return AuthenticationState built from cookie indicators"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_getauthenticationstateasync_return_76_14__return(["Returns result"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_80_getauthenticationstateasync_return_80_16__return(["Returns result"])
|
||||
method_13yeu7e_getauthenticationstateasync__action_33_getauthenticationstateasync_try_33_0__try -->|next| method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__condition -->|continue| method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__condition -->|exit| method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__false -->|next| method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_37_getauthenticationstateasync_await_37_2__await
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__true -->|next| method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__condition -->|continue to storage reads| method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__condition -->|return cached AuthenticationState| method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__false -->|next| method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_35_getauthenticationstateasync_guard_clause_35_1__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__true -->|next| method_13yeu7e_getauthenticationstateasync__action_35_guard_clause_35__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_37_external_call_37__linear -->|TokenKey StorageKeys.AuthToken| method_13yeu7e_getauthenticationstateasync__call_37_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_37_getauthenticationstateasync_await_37_2__await -->|next| method_13yeu7e_getauthenticationstateasync__action_37_external_call_37__linear
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__condition -->|skip token-based| method_13yeu7e_getauthenticationstateasync__action_40_branch_40__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__condition -->|try token-based: read email, tenant, roles| method_13yeu7e_getauthenticationstateasync__action_40_branch_40__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__false -->|next| method_13yeu7e_getauthenticationstateasync__action_40_branch_40__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_40_branch_40__true -->|next| method_13yeu7e_getauthenticationstateasync__action_40_branch_40__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__condition -->|false| method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__condition -->|true| method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__false -->|next| method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_43_getauthenticationstateasync_await_43_4__await
|
||||
method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__true -->|next| method_13yeu7e_getauthenticationstateasync__action_41_getauthenticationstateasync_branch_41_3__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_43_external_call_43__linear -->|StorageKeys.UserEmail| method_13yeu7e_getauthenticationstateasync__call_43_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_43_getauthenticationstateasync_await_43_4__await -->|next| method_13yeu7e_getauthenticationstateasync__action_43_external_call_43__linear
|
||||
method_13yeu7e_getauthenticationstateasync__action_44_getauthenticationstateasync_await_44_5__await -->|StorageKeys.UserTenant| method_13yeu7e_getauthenticationstateasync__call_44_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_45_getauthenticationstateasync_await_45_6__await -->|StorageKeys.UserRoles| method_13yeu7e_getauthenticationstateasync__call_45_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__condition -->|false| method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__condition -->|true| method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__false -->|next| method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__merge -->|calls| method_13yeu7e_getauthenticationstateasync__call_49_CreateState
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__true -->|next| method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__condition -->|fall through| method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__condition -->|create cached state and return| method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__false -->|next| method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_47_getauthenticationstateasync_branch_47_7__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__true -->|next| method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_54_getauthenticationstateasync_return_54_8__return -->|return| method_13yeu7e_getauthenticationstateasync__action_54_return_54__return
|
||||
method_13yeu7e_getauthenticationstateasync__action_54_return_54__return -->|next| method_13yeu7e_getauthenticationstateasync__action_58_branch_58__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__condition -->|fall through to fallback| method_13yeu7e_getauthenticationstateasync__action_58_branch_58__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__condition -->|create cached state from cookie-style indicators and return| method_13yeu7e_getauthenticationstateasync__action_58_branch_58__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__false -->|next| method_13yeu7e_getauthenticationstateasync__action_58_branch_58__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_59_getauthenticationstateasync_await_59_9__await
|
||||
method_13yeu7e_getauthenticationstateasync__action_58_branch_58__true -->|next| method_13yeu7e_getauthenticationstateasync__action_58_branch_58__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_59_external_call_59__linear -->|StorageKeys.UserEmail cookie fallback| method_13yeu7e_getauthenticationstateasync__call_59_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_59_getauthenticationstateasync_await_59_9__await -->|next| method_13yeu7e_getauthenticationstateasync__action_59_external_call_59__linear
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__condition -->|false| method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__condition -->|true| method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__false -->|next| method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__merge -->|next| method_13yeu7e_getauthenticationstateasync__action_62_getauthenticationstateasync_await_62_11__await
|
||||
method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__true -->|next| method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_62_getauthenticationstateasync_await_62_11__await -->|StorageKeys.UserTenant cookie fallback| method_13yeu7e_getauthenticationstateasync__call_62_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_63_getauthenticationstateasync_await_63_12__await -->|StorageKeys.UserRoles cookie fallback| method_13yeu7e_getauthenticationstateasync__call_63_GetSecureString
|
||||
method_13yeu7e_getauthenticationstateasync__action_69_getauthenticationstateasync_return_69_13__return -->|return| method_13yeu7e_getauthenticationstateasync__action_69_return_69__return
|
||||
method_13yeu7e_getauthenticationstateasync__action_69_return_69__return -->|return| method_13yeu7e_getauthenticationstateasync__action_76_getauthenticationstateasync_return_76_14__return
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__condition -->|false| method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__false
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__condition -->|true| method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__true
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__false -->|next| method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__merge -->|exception| method_13yeu7e_getauthenticationstateasync__action_78_getauthenticationstateasync_catch_78_15__catch
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__true -->|next| method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__merge
|
||||
method_13yeu7e_getauthenticationstateasync__action_76_getauthenticationstateasync_return_76_14__return -->|fallback| method_13yeu7e_getauthenticationstateasync__action_76_fallback_76__condition
|
||||
method_13yeu7e_getauthenticationstateasync__action_78_exception_handler_78__linear -->|return| method_13yeu7e_getauthenticationstateasync__action_80_getauthenticationstateasync_return_80_16__return
|
||||
method_13yeu7e_getauthenticationstateasync__action_78_getauthenticationstateasync_catch_78_15__catch -->|next| method_13yeu7e_getauthenticationstateasync__action_78_exception_handler_78__linear
|
||||
method_13yeu7e_getauthenticationstateasync__call_37_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_40_branch_40__condition
|
||||
method_13yeu7e_getauthenticationstateasync__call_43_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_44_getauthenticationstateasync_await_44_5__await
|
||||
method_13yeu7e_getauthenticationstateasync__call_44_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_45_getauthenticationstateasync_await_45_6__await
|
||||
method_13yeu7e_getauthenticationstateasync__call_45_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_47_guard_clause_47__condition
|
||||
method_13yeu7e_getauthenticationstateasync__call_49_CreateState -->|return| method_13yeu7e_getauthenticationstateasync__action_54_getauthenticationstateasync_return_54_8__return
|
||||
method_13yeu7e_getauthenticationstateasync__call_59_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_60_getauthenticationstateasync_branch_60_10__condition
|
||||
method_13yeu7e_getauthenticationstateasync__call_62_GetSecureString -->|next| method_13yeu7e_getauthenticationstateasync__action_63_getauthenticationstateasync_await_63_12__await
|
||||
method_13yeu7e_getauthenticationstateasync__call_63_GetSecureString -->|calls| method_13yeu7e_getauthenticationstateasync__call_64_CreateState
|
||||
method_13yeu7e_getauthenticationstateasync__call_64_CreateState -->|return| method_13yeu7e_getauthenticationstateasync__action_69_getauthenticationstateasync_return_69_13__return
|
||||
method_13yeu7e_getauthenticationstateasync__entry -->|next| method_13yeu7e_getauthenticationstateasync__action_33_getauthenticationstateasync_try_33_0__try
|
||||
```
|
||||
|
||||
### CreateState() Control Flow
|
||||
|
||||
_Warnings: diagram method_16ct380_createstate__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 22 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_16ct380_createstate__action_102_creation_102__linear("Create ClaimsIdentity and AuthenticationState")
|
||||
method_16ct380_createstate__action_86_mapping_86__linear("Create base claims (Name, Email, TenantId)")
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__condition{"!string.IsNullOrEmpty(rolesStr)"}
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__false("false")
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__merge("merge")
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__true("true")
|
||||
method_16ct380_createstate__action_93_guard_clause_93__condition{"!string.IsNullOrEmpty(rolesStr)"}
|
||||
method_16ct380_createstate__action_93_guard_clause_93__false("skip roles")
|
||||
method_16ct380_createstate__action_93_guard_clause_93__merge("merge")
|
||||
method_16ct380_createstate__action_93_guard_clause_93__true("add Claims for each role")
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_body[["foreach (var role in roles)"]]
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_entry("var role in roles")
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_exit("Leaves the loop when the condition no longer holds.")
|
||||
method_16ct380_createstate__action_96_loop_96__loop_body[["foreach (var role in roles) { claims.Add(new Claim(ClaimTypes.Role, role.Trim())); }"]]
|
||||
method_16ct380_createstate__action_96_loop_96__loop_entry("Iterate roles and add claims")
|
||||
method_16ct380_createstate__action_96_loop_96__loop_exit("exit loop")
|
||||
method_16ct380_createstate__entry(["CreateState entry"])
|
||||
method_16ct380_createstate__action_103_createstate_return_103_2__return(["Returns result"])
|
||||
method_16ct380_createstate__action_103_return_103__return(["Return built AuthenticationState"])
|
||||
method_16ct380_createstate__action_102_creation_102__linear -->|return| method_16ct380_createstate__action_103_createstate_return_103_2__return
|
||||
method_16ct380_createstate__action_103_createstate_return_103_2__return -->|return| method_16ct380_createstate__action_103_return_103__return
|
||||
method_16ct380_createstate__action_86_mapping_86__linear -->|next| method_16ct380_createstate__action_93_guard_clause_93__condition
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__condition -->|false| method_16ct380_createstate__action_93_createstate_branch_93_0__false
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__condition -->|true| method_16ct380_createstate__action_93_createstate_branch_93_0__true
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__false -->|next| method_16ct380_createstate__action_93_createstate_branch_93_0__merge
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__merge -->|next| method_16ct380_createstate__action_96_createstate_loop_96_1__loop_entry
|
||||
method_16ct380_createstate__action_93_createstate_branch_93_0__true -->|next| method_16ct380_createstate__action_93_createstate_branch_93_0__merge
|
||||
method_16ct380_createstate__action_93_guard_clause_93__condition -->|skip roles| method_16ct380_createstate__action_93_guard_clause_93__false
|
||||
method_16ct380_createstate__action_93_guard_clause_93__condition -->|add Claims for each role| method_16ct380_createstate__action_93_guard_clause_93__true
|
||||
method_16ct380_createstate__action_93_guard_clause_93__false -->|next| method_16ct380_createstate__action_93_guard_clause_93__merge
|
||||
method_16ct380_createstate__action_93_guard_clause_93__merge -->|next| method_16ct380_createstate__action_93_createstate_branch_93_0__condition
|
||||
method_16ct380_createstate__action_93_guard_clause_93__true -->|next| method_16ct380_createstate__action_93_guard_clause_93__merge
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_body -->|continue| method_16ct380_createstate__action_96_createstate_loop_96_1__loop_entry
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_entry -->|var role in roles| method_16ct380_createstate__action_96_createstate_loop_96_1__loop_body
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_entry -->|Leaves the loop when the condition no longer holds.| method_16ct380_createstate__action_96_createstate_loop_96_1__loop_exit
|
||||
method_16ct380_createstate__action_96_createstate_loop_96_1__loop_exit -->|next| method_16ct380_createstate__action_96_loop_96__loop_entry
|
||||
method_16ct380_createstate__action_96_loop_96__loop_body -->|continue| method_16ct380_createstate__action_96_loop_96__loop_entry
|
||||
method_16ct380_createstate__action_96_loop_96__loop_entry -->|iterate| method_16ct380_createstate__action_96_loop_96__loop_body
|
||||
method_16ct380_createstate__action_96_loop_96__loop_entry -->|exit| method_16ct380_createstate__action_96_loop_96__loop_exit
|
||||
method_16ct380_createstate__action_96_loop_96__loop_exit -->|next| method_16ct380_createstate__action_102_creation_102__linear
|
||||
method_16ct380_createstate__entry -->|next| method_16ct380_createstate__action_86_mapping_86__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 7 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_13yeu7e_getauthenticationstateasync__fragment_diagram exceeds preferred complexity thresholds (65 nodes, 73 edges).
|
||||
- Warning: control-flow: diagram method_16ct380_createstate__fragment_diagram exceeds preferred complexity thresholds (19 nodes, 22 edges).
|
||||
+268
@@ -0,0 +1,268 @@
|
||||
# QuizStateService
|
||||
|
||||
- File ID: file:3xx07l:quizstateservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/QuizStateService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
In-memory UI/shared service that holds quiz-related state (current quiz, block id, hydration and new-quiz flag) and notifies subscribers via events when the quiz is requested or updated.
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple in-memory UI service: mutates properties and raises OnQuizRequested/OnQuizUpdated events; no persistence or external I/O in this file.
|
||||
|
||||
## Symbols
|
||||
|
||||
- QuizStateService: In-memory UI/shared service that holds quiz-related state (current quiz, block id, hydration and new-quiz flag) and notifies subscribers via events when the quiz is requested or updated.
|
||||
- RequestQuiz(): Sets the current quiz block id and notifies subscribers that a quiz was requested.
|
||||
- SetQuiz(): Updates the current quiz and related flags, stops hydrating state, and notifies subscribers of the update.
|
||||
- SetHydrating(): Sets the IsHydrating flag and notifies subscribers of the update.
|
||||
- MarkQuizAsSeen(): If there is a new quiz flag, clears it and notifies subscribers.
|
||||
- QuizStateService: Holds quiz-related UI state and exposes events to notify UI consumers when state changes.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Queries.Quiz (provides QuizDto)
|
||||
- dependency-target: IQuizStateService (interface implemented, file not in scope)
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
- call-target: unknown
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 6
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 6
|
||||
- Unresolved references: 6
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 4
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- RequestQuiz: 13 nodes, 14 edges, 1 jumps, 0 unsupported constructs
|
||||
- SetQuiz: 16 nodes, 17 edges, 1 jumps, 0 unsupported constructs
|
||||
- SetHydrating: 13 nodes, 14 edges, 1 jumps, 0 unsupported constructs
|
||||
- MarkQuizAsSeen: 21 nodes, 24 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### QuizStateService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1t69b7g_quizstateservice("QuizStateService")
|
||||
file_3xx07l_quizstateservice_cs("QuizStateService")
|
||||
method_13pj2z1_markquizasseen[["MarkQuizAsSeen()"]]
|
||||
method_8psub5_requestquiz[["RequestQuiz()"]]
|
||||
method_gisz9i_sethydrating[["SetHydrating()"]]
|
||||
method_o6n51_setquiz[["SetQuiz()"]]
|
||||
type_n36vet_quizstateservice[/"QuizStateService"/]
|
||||
```
|
||||
|
||||
### QuizStateService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1t69b7g_quizstateservice("QuizStateService")
|
||||
method_13pj2z1_markquizasseen[["MarkQuizAsSeen()"]]
|
||||
method_8psub5_requestquiz[["RequestQuiz()"]]
|
||||
method_gisz9i_sethydrating[["SetHydrating()"]]
|
||||
method_o6n51_setquiz[["SetQuiz()"]]
|
||||
unresolved_unresolved_1cm0tw4_call_target{"Unresolved: OnQuizUpdated (invoke)"}
|
||||
unresolved_unresolved_1egtwca_call_target{"Unresolved: OnQuizUpdated (invoke)"}
|
||||
unresolved_unresolved_1hcmv1v_call_target{"Unresolved: OnQuizUpdated (invoke)"}
|
||||
unresolved_unresolved_sgvk0u_call_target{"Unresolved: OnQuizRequested (invoke)"}
|
||||
class_1t69b7g_quizstateservice -->|contains| method_13pj2z1_markquizasseen
|
||||
class_1t69b7g_quizstateservice -->|contains| method_8psub5_requestquiz
|
||||
class_1t69b7g_quizstateservice -->|contains| method_gisz9i_sethydrating
|
||||
class_1t69b7g_quizstateservice -->|contains| method_o6n51_setquiz
|
||||
method_13pj2z1_markquizasseen -->|unresolved call| unresolved_unresolved_1cm0tw4_call_target
|
||||
method_8psub5_requestquiz -->|unresolved call| unresolved_unresolved_sgvk0u_call_target
|
||||
method_gisz9i_sethydrating -->|unresolved call| unresolved_unresolved_1hcmv1v_call_target
|
||||
method_o6n51_setquiz -->|unresolved call| unresolved_unresolved_1egtwca_call_target
|
||||
```
|
||||
|
||||
### RequestQuiz() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_8psub5_requestquiz__call_18_OnQuizRequested_invoke_[["OnQuizRequested (invoke)"]]
|
||||
method_8psub5_requestquiz__action_17_assignment_17__linear("Set CurrentQuizBlockId")
|
||||
method_8psub5_requestquiz__action_18_branch_18__condition{"OnQuizRequested != null"}
|
||||
method_8psub5_requestquiz__action_18_branch_18__false("skip")
|
||||
method_8psub5_requestquiz__action_18_branch_18__merge("merge")
|
||||
method_8psub5_requestquiz__action_18_branch_18__true("invoke")
|
||||
method_8psub5_requestquiz__action_18_requestquiz_await_18_1__await[["Waits for async work"]]
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__condition{"OnQuizRequested != null) await OnQuizRequested(blockId"}
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__false("false")
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__merge("merge")
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__true("true")
|
||||
method_8psub5_requestquiz__entry(["RequestQuiz entry"])
|
||||
method_8psub5_requestquiz__implicit_return(["return"])
|
||||
method_8psub5_requestquiz__action_17_assignment_17__linear -->|next| method_8psub5_requestquiz__action_18_requestquiz_await_18_1__await
|
||||
method_8psub5_requestquiz__action_18_branch_18__condition -->|skip| method_8psub5_requestquiz__action_18_branch_18__false
|
||||
method_8psub5_requestquiz__action_18_branch_18__condition -->|invoke| method_8psub5_requestquiz__action_18_branch_18__true
|
||||
method_8psub5_requestquiz__action_18_branch_18__false -->|next| method_8psub5_requestquiz__action_18_branch_18__merge
|
||||
method_8psub5_requestquiz__action_18_branch_18__merge -->|next| method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__condition
|
||||
method_8psub5_requestquiz__action_18_branch_18__true -->|next| method_8psub5_requestquiz__action_18_branch_18__merge
|
||||
method_8psub5_requestquiz__action_18_requestquiz_await_18_1__await -->|next| method_8psub5_requestquiz__action_18_branch_18__condition
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__condition -->|false| method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__false
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__condition -->|true| method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__true
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__false -->|next| method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__merge
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__merge -->|blockId string passed to subscribers| method_8psub5_requestquiz__call_18_OnQuizRequested_invoke_
|
||||
method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__true -->|next| method_8psub5_requestquiz__action_18_requestquiz_branch_18_0__merge
|
||||
method_8psub5_requestquiz__call_18_OnQuizRequested_invoke_ -->|return| method_8psub5_requestquiz__implicit_return
|
||||
method_8psub5_requestquiz__entry -->|next| method_8psub5_requestquiz__action_17_assignment_17__linear
|
||||
```
|
||||
|
||||
### SetQuiz() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_o6n51_setquiz__call_27_OnQuizUpdated_invoke_[["OnQuizUpdated (invoke)"]]
|
||||
method_o6n51_setquiz__action_23_assignment_23__linear("Set CurrentQuizBlockId")
|
||||
method_o6n51_setquiz__action_24_assignment_24__linear("Set CurrentQuiz")
|
||||
method_o6n51_setquiz__action_25_assignment_25__linear("Clear IsHydrating")
|
||||
method_o6n51_setquiz__action_26_assignment_26__linear("Set HasNewQuiz based on quiz presence")
|
||||
method_o6n51_setquiz__action_27_branch_27__condition{"OnQuizUpdated != null"}
|
||||
method_o6n51_setquiz__action_27_branch_27__false("skip")
|
||||
method_o6n51_setquiz__action_27_branch_27__merge("merge")
|
||||
method_o6n51_setquiz__action_27_branch_27__true("invoke")
|
||||
method_o6n51_setquiz__action_27_setquiz_await_27_1__await[["Waits for async work"]]
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__condition{"OnQuizUpdated != null) await OnQuizUpdated("}
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__false("false")
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__merge("merge")
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__true("true")
|
||||
method_o6n51_setquiz__entry(["SetQuiz entry"])
|
||||
method_o6n51_setquiz__implicit_return(["return"])
|
||||
method_o6n51_setquiz__action_23_assignment_23__linear -->|next| method_o6n51_setquiz__action_24_assignment_24__linear
|
||||
method_o6n51_setquiz__action_24_assignment_24__linear -->|next| method_o6n51_setquiz__action_25_assignment_25__linear
|
||||
method_o6n51_setquiz__action_25_assignment_25__linear -->|next| method_o6n51_setquiz__action_26_assignment_26__linear
|
||||
method_o6n51_setquiz__action_26_assignment_26__linear -->|next| method_o6n51_setquiz__action_27_setquiz_await_27_1__await
|
||||
method_o6n51_setquiz__action_27_branch_27__condition -->|skip| method_o6n51_setquiz__action_27_branch_27__false
|
||||
method_o6n51_setquiz__action_27_branch_27__condition -->|invoke| method_o6n51_setquiz__action_27_branch_27__true
|
||||
method_o6n51_setquiz__action_27_branch_27__false -->|next| method_o6n51_setquiz__action_27_branch_27__merge
|
||||
method_o6n51_setquiz__action_27_branch_27__merge -->|next| method_o6n51_setquiz__action_27_setquiz_branch_27_0__condition
|
||||
method_o6n51_setquiz__action_27_branch_27__true -->|next| method_o6n51_setquiz__action_27_branch_27__merge
|
||||
method_o6n51_setquiz__action_27_setquiz_await_27_1__await -->|next| method_o6n51_setquiz__action_27_branch_27__condition
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__condition -->|false| method_o6n51_setquiz__action_27_setquiz_branch_27_0__false
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__condition -->|true| method_o6n51_setquiz__action_27_setquiz_branch_27_0__true
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__false -->|next| method_o6n51_setquiz__action_27_setquiz_branch_27_0__merge
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__merge -->|no parameters notifies subscribers of state change| method_o6n51_setquiz__call_27_OnQuizUpdated_invoke_
|
||||
method_o6n51_setquiz__action_27_setquiz_branch_27_0__true -->|next| method_o6n51_setquiz__action_27_setquiz_branch_27_0__merge
|
||||
method_o6n51_setquiz__call_27_OnQuizUpdated_invoke_ -->|return| method_o6n51_setquiz__implicit_return
|
||||
method_o6n51_setquiz__entry -->|next| method_o6n51_setquiz__action_23_assignment_23__linear
|
||||
```
|
||||
|
||||
### SetHydrating() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_gisz9i_sethydrating__call_33_OnQuizUpdated_invoke_[["OnQuizUpdated (invoke)"]]
|
||||
method_gisz9i_sethydrating__action_32_assignment_32__linear("Set IsHydrating")
|
||||
method_gisz9i_sethydrating__action_33_branch_33__condition{"OnQuizUpdated != null"}
|
||||
method_gisz9i_sethydrating__action_33_branch_33__false("skip")
|
||||
method_gisz9i_sethydrating__action_33_branch_33__merge("merge")
|
||||
method_gisz9i_sethydrating__action_33_branch_33__true("invoke")
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_await_33_1__await[["Waits for async work"]]
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__condition{"OnQuizUpdated != null) await OnQuizUpdated("}
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__false("false")
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__merge("merge")
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__true("true")
|
||||
method_gisz9i_sethydrating__entry(["SetHydrating entry"])
|
||||
method_gisz9i_sethydrating__implicit_return(["return"])
|
||||
method_gisz9i_sethydrating__action_32_assignment_32__linear -->|next| method_gisz9i_sethydrating__action_33_sethydrating_await_33_1__await
|
||||
method_gisz9i_sethydrating__action_33_branch_33__condition -->|skip| method_gisz9i_sethydrating__action_33_branch_33__false
|
||||
method_gisz9i_sethydrating__action_33_branch_33__condition -->|invoke| method_gisz9i_sethydrating__action_33_branch_33__true
|
||||
method_gisz9i_sethydrating__action_33_branch_33__false -->|next| method_gisz9i_sethydrating__action_33_branch_33__merge
|
||||
method_gisz9i_sethydrating__action_33_branch_33__merge -->|next| method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__condition
|
||||
method_gisz9i_sethydrating__action_33_branch_33__true -->|next| method_gisz9i_sethydrating__action_33_branch_33__merge
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_await_33_1__await -->|next| method_gisz9i_sethydrating__action_33_branch_33__condition
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__condition -->|false| method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__false
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__condition -->|true| method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__true
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__false -->|next| method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__merge
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__merge -->|no parameters notifies subscribers that hydration state changed| method_gisz9i_sethydrating__call_33_OnQuizUpdated_invoke_
|
||||
method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__true -->|next| method_gisz9i_sethydrating__action_33_sethydrating_branch_33_0__merge
|
||||
method_gisz9i_sethydrating__call_33_OnQuizUpdated_invoke_ -->|return| method_gisz9i_sethydrating__implicit_return
|
||||
method_gisz9i_sethydrating__entry -->|next| method_gisz9i_sethydrating__action_32_assignment_32__linear
|
||||
```
|
||||
|
||||
### MarkQuizAsSeen() Control Flow
|
||||
|
||||
_Warnings: diagram method_13pj2z1_markquizasseen__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 24 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_13pj2z1_markquizasseen__call_40_OnQuizUpdated_invoke_[["OnQuizUpdated (invoke)"]]
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__condition{"!HasNewQuiz"}
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__false("continue")
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__merge("merge")
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__true("return")
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__condition{"!HasNewQuiz"}
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__false("continue")
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__merge("merge")
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__true("exit")
|
||||
method_13pj2z1_markquizasseen__action_39_assignment_39__linear("Clear HasNewQuiz")
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__condition{"OnQuizUpdated != null"}
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__false("skip")
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__merge("merge")
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__true("invoke")
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_await_40_2__await[["Waits for async work"]]
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__condition{"OnQuizUpdated != null) await OnQuizUpdated("}
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__false("false")
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__merge("merge")
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__true("true")
|
||||
method_13pj2z1_markquizasseen__entry(["MarkQuizAsSeen entry"])
|
||||
method_13pj2z1_markquizasseen__implicit_return(["return"])
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__condition -->|continue| method_13pj2z1_markquizasseen__action_38_guard_clause_38__false
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__condition -->|return| method_13pj2z1_markquizasseen__action_38_guard_clause_38__true
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__false -->|next| method_13pj2z1_markquizasseen__action_38_guard_clause_38__merge
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__merge -->|next| method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__condition
|
||||
method_13pj2z1_markquizasseen__action_38_guard_clause_38__true -->|next| method_13pj2z1_markquizasseen__action_38_guard_clause_38__merge
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__condition -->|continue| method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__false
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__condition -->|exit| method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__true
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__false -->|next| method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__merge
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__merge -->|next| method_13pj2z1_markquizasseen__action_39_assignment_39__linear
|
||||
method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__true -->|next| method_13pj2z1_markquizasseen__action_38_markquizasseen_guard_clause_38_0__merge
|
||||
method_13pj2z1_markquizasseen__action_39_assignment_39__linear -->|next| method_13pj2z1_markquizasseen__action_40_markquizasseen_await_40_2__await
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__condition -->|skip| method_13pj2z1_markquizasseen__action_40_branch_40__false
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__condition -->|invoke| method_13pj2z1_markquizasseen__action_40_branch_40__true
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__false -->|next| method_13pj2z1_markquizasseen__action_40_branch_40__merge
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__merge -->|next| method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__condition
|
||||
method_13pj2z1_markquizasseen__action_40_branch_40__true -->|next| method_13pj2z1_markquizasseen__action_40_branch_40__merge
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_await_40_2__await -->|next| method_13pj2z1_markquizasseen__action_40_branch_40__condition
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__condition -->|false| method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__false
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__condition -->|true| method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__true
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__false -->|next| method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__merge
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__merge -->|no parameters notifies subscribers that HasNewQuiz changed| method_13pj2z1_markquizasseen__call_40_OnQuizUpdated_invoke_
|
||||
method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__true -->|next| method_13pj2z1_markquizasseen__action_40_markquizasseen_branch_40_1__merge
|
||||
method_13pj2z1_markquizasseen__call_40_OnQuizUpdated_invoke_ -->|return| method_13pj2z1_markquizasseen__implicit_return
|
||||
method_13pj2z1_markquizasseen__entry -->|next| method_13pj2z1_markquizasseen__action_38_guard_clause_38__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 4 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_13pj2z1_markquizasseen__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 24 edges).
|
||||
+238
@@ -0,0 +1,238 @@
|
||||
# ReaderInteractionService
|
||||
|
||||
- File ID: file:1jnstne:readerinteractionservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/ReaderInteractionService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A small UI-shared interaction service that exposes events for UI components (node selection, scrolling, highlighting, text selection) and provides methods to raise those events for subscribers.
|
||||
|
||||
## Key Details
|
||||
|
||||
Thin event-forwarding service used by UI components to publish interaction events; methods are simple async guards that await subscriber delegates.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ReaderInteractionService: A small UI-shared interaction service that exposes events for UI components (node selection, scrolling, highlighting, text selection) and provides methods to raise those events for subscribers.
|
||||
- NotifyNodeSelected(): Raises the OnNodeSelected event if any subscriber is attached.
|
||||
- RequestScrollToBlock(): Requests scrolling to a block by raising the OnScrollToBlockRequested event when subscribers exist.
|
||||
- RequestHighlightBlock(): Requests highlight of a block by raising the OnHighlightBlockRequested event when subscribers exist.
|
||||
- NotifyTextSelected(): Raises the OnTextSelected event with the selected text, block id and selection coordinates when subscribers exist.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: IReaderInteractionService (interface, not defined in this file)
|
||||
- dependency-target: SelectionCoordinates (type, referenced but not declared here)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 5
|
||||
- Executable symbols: 4
|
||||
- Executable symbols with control flow: 4
|
||||
- Grounded edges: 5
|
||||
- Unresolved references: 6
|
||||
- Control-flow fragments: 4
|
||||
- Unresolved jumps: 4
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- NotifyNodeSelected: 14 nodes, 15 edges, 1 jumps, 0 unsupported constructs
|
||||
- RequestScrollToBlock: 13 nodes, 14 edges, 1 jumps, 0 unsupported constructs
|
||||
- RequestHighlightBlock: 13 nodes, 14 edges, 1 jumps, 0 unsupported constructs
|
||||
- NotifyTextSelected: 14 nodes, 15 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReaderInteractionService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_18r7noo_readerinteractionservice("ReaderInteractionService")
|
||||
file_1jnstne_readerinteractionservice_cs("ReaderInteractionService")
|
||||
method_15ros9m_notifytextselected[["NotifyTextSelected()"]]
|
||||
method_1om56u0_requesthighlightblock[["RequestHighlightBlock()"]]
|
||||
method_nvgthi_requestscrolltoblock[["RequestScrollToBlock()"]]
|
||||
method_qegcuf_notifynodeselected[["NotifyNodeSelected()"]]
|
||||
```
|
||||
|
||||
### ReaderInteractionService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_18r7noo_readerinteractionservice("ReaderInteractionService")
|
||||
method_15ros9m_notifytextselected[["NotifyTextSelected()"]]
|
||||
method_1om56u0_requesthighlightblock[["RequestHighlightBlock()"]]
|
||||
method_nvgthi_requestscrolltoblock[["RequestScrollToBlock()"]]
|
||||
method_qegcuf_notifynodeselected[["NotifyNodeSelected()"]]
|
||||
unresolved_unresolved_12jxtai_call_target{"Unresolved: OnScrollToBlockRequested"}
|
||||
unresolved_unresolved_1dmnpxy_call_target{"Unresolved: OnTextSelected"}
|
||||
unresolved_unresolved_33g61b_call_target{"Unresolved: OnNodeSelected"}
|
||||
unresolved_unresolved_zz75qd_call_target{"Unresolved: OnHighlightBlockRequested"}
|
||||
class_18r7noo_readerinteractionservice -->|contains| method_15ros9m_notifytextselected
|
||||
class_18r7noo_readerinteractionservice -->|contains| method_1om56u0_requesthighlightblock
|
||||
class_18r7noo_readerinteractionservice -->|contains| method_nvgthi_requestscrolltoblock
|
||||
class_18r7noo_readerinteractionservice -->|contains| method_qegcuf_notifynodeselected
|
||||
method_15ros9m_notifytextselected -->|unresolved call| unresolved_unresolved_1dmnpxy_call_target
|
||||
method_1om56u0_requesthighlightblock -->|unresolved call| unresolved_unresolved_zz75qd_call_target
|
||||
method_nvgthi_requestscrolltoblock -->|unresolved call| unresolved_unresolved_12jxtai_call_target
|
||||
method_qegcuf_notifynodeselected -->|unresolved call| unresolved_unresolved_33g61b_call_target
|
||||
```
|
||||
|
||||
### NotifyNodeSelected() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_qegcuf_notifynodeselected__call_12_OnNodeSelected[["OnNodeSelected"]]
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__condition{"OnNodeSelected != null"}
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__false("skip")
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__merge("merge")
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__true("invoke")
|
||||
method_qegcuf_notifynodeselected__action_12_invoke_event_12__linear("Invoke OnNodeSelected")
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_await_12_2__await[["Waits for async work"]]
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__condition{"OnNodeSelected != null) await OnNodeSelected(nodeId"}
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__false("false")
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__merge("merge")
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__true("true")
|
||||
method_qegcuf_notifynodeselected__entry(["NotifyNodeSelected entry"])
|
||||
method_qegcuf_notifynodeselected__action_10_notifynodeselected_notification_10_0__linear[/"Sends notification"/]
|
||||
method_qegcuf_notifynodeselected__implicit_return(["return"])
|
||||
method_qegcuf_notifynodeselected__action_10_notifynodeselected_notification_10_0__linear -->|next| method_qegcuf_notifynodeselected__action_12_notifynodeselected_await_12_2__await
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__condition -->|skip| method_qegcuf_notifynodeselected__action_12_guard_clause_12__false
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__condition -->|invoke| method_qegcuf_notifynodeselected__action_12_guard_clause_12__true
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__false -->|next| method_qegcuf_notifynodeselected__action_12_guard_clause_12__merge
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__merge -->|nodeId string| method_qegcuf_notifynodeselected__call_12_OnNodeSelected
|
||||
method_qegcuf_notifynodeselected__action_12_guard_clause_12__true -->|next| method_qegcuf_notifynodeselected__action_12_guard_clause_12__merge
|
||||
method_qegcuf_notifynodeselected__action_12_invoke_event_12__linear -->|next| method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__condition
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_await_12_2__await -->|next| method_qegcuf_notifynodeselected__action_12_invoke_event_12__linear
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__condition -->|false| method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__false
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__condition -->|true| method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__true
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__false -->|next| method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__merge
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__merge -->|next| method_qegcuf_notifynodeselected__action_12_guard_clause_12__condition
|
||||
method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__true -->|next| method_qegcuf_notifynodeselected__action_12_notifynodeselected_branch_12_1__merge
|
||||
method_qegcuf_notifynodeselected__call_12_OnNodeSelected -->|return| method_qegcuf_notifynodeselected__implicit_return
|
||||
method_qegcuf_notifynodeselected__entry -->|next| method_qegcuf_notifynodeselected__action_10_notifynodeselected_notification_10_0__linear
|
||||
```
|
||||
|
||||
### RequestScrollToBlock() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_nvgthi_requestscrolltoblock__call_17_OnScrollToBlockRequested[["OnScrollToBlockRequested"]]
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__condition{"OnScrollToBlockRequested != null"}
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__false("skip")
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__merge("merge")
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__true("invoke")
|
||||
method_nvgthi_requestscrolltoblock__action_17_invoke_event_17__linear("Invoke OnScrollToBlockRequested")
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_await_17_1__await[["Waits for async work"]]
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__condition{"OnScrollToBlockRequested != null) await OnScrollToBlockRequested(blockId"}
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__false("false")
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__merge("merge")
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__true("true")
|
||||
method_nvgthi_requestscrolltoblock__entry(["RequestScrollToBlock entry"])
|
||||
method_nvgthi_requestscrolltoblock__implicit_return(["return"])
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__condition -->|skip| method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__false
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__condition -->|invoke| method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__true
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__false -->|next| method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__merge
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__merge -->|blockId string| method_nvgthi_requestscrolltoblock__call_17_OnScrollToBlockRequested
|
||||
method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__true -->|next| method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__merge
|
||||
method_nvgthi_requestscrolltoblock__action_17_invoke_event_17__linear -->|next| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__condition
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_await_17_1__await -->|next| method_nvgthi_requestscrolltoblock__action_17_invoke_event_17__linear
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__condition -->|false| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__false
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__condition -->|true| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__true
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__false -->|next| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__merge
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__merge -->|next| method_nvgthi_requestscrolltoblock__action_17_guard_clause_17__condition
|
||||
method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__true -->|next| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_branch_17_0__merge
|
||||
method_nvgthi_requestscrolltoblock__call_17_OnScrollToBlockRequested -->|return| method_nvgthi_requestscrolltoblock__implicit_return
|
||||
method_nvgthi_requestscrolltoblock__entry -->|next| method_nvgthi_requestscrolltoblock__action_17_requestscrolltoblock_await_17_1__await
|
||||
```
|
||||
|
||||
### RequestHighlightBlock() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1om56u0_requesthighlightblock__call_22_OnHighlightBlockRequested[["OnHighlightBlockRequested"]]
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__condition{"OnHighlightBlockRequested != null"}
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__false("skip")
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__merge("merge")
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__true("invoke")
|
||||
method_1om56u0_requesthighlightblock__action_22_invoke_event_22__linear("Invoke OnHighlightBlockRequested")
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_await_22_1__await[["Waits for async work"]]
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__condition{"OnHighlightBlockRequested != null) await OnHighlightBlockRequested(blockId"}
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__false("false")
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__merge("merge")
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__true("true")
|
||||
method_1om56u0_requesthighlightblock__entry(["RequestHighlightBlock entry"])
|
||||
method_1om56u0_requesthighlightblock__implicit_return(["return"])
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__condition -->|skip| method_1om56u0_requesthighlightblock__action_22_guard_clause_22__false
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__condition -->|invoke| method_1om56u0_requesthighlightblock__action_22_guard_clause_22__true
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__false -->|next| method_1om56u0_requesthighlightblock__action_22_guard_clause_22__merge
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__merge -->|blockId string| method_1om56u0_requesthighlightblock__call_22_OnHighlightBlockRequested
|
||||
method_1om56u0_requesthighlightblock__action_22_guard_clause_22__true -->|next| method_1om56u0_requesthighlightblock__action_22_guard_clause_22__merge
|
||||
method_1om56u0_requesthighlightblock__action_22_invoke_event_22__linear -->|next| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__condition
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_await_22_1__await -->|next| method_1om56u0_requesthighlightblock__action_22_invoke_event_22__linear
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__condition -->|false| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__false
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__condition -->|true| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__true
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__false -->|next| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__merge
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__merge -->|next| method_1om56u0_requesthighlightblock__action_22_guard_clause_22__condition
|
||||
method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__true -->|next| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_branch_22_0__merge
|
||||
method_1om56u0_requesthighlightblock__call_22_OnHighlightBlockRequested -->|return| method_1om56u0_requesthighlightblock__implicit_return
|
||||
method_1om56u0_requesthighlightblock__entry -->|next| method_1om56u0_requesthighlightblock__action_22_requesthighlightblock_await_22_1__await
|
||||
```
|
||||
|
||||
### NotifyTextSelected() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_15ros9m_notifytextselected__call_27_OnTextSelected[["OnTextSelected"]]
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__condition{"OnTextSelected != null"}
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__false("skip")
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__merge("merge")
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__true("invoke")
|
||||
method_15ros9m_notifytextselected__action_27_invoke_event_27__linear("Invoke OnTextSelected")
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_await_27_2__await[["Waits for async work"]]
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__condition{"OnTextSelected != null) await OnTextSelected(text, blockId, coords"}
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__false("false")
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__merge("merge")
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__true("true")
|
||||
method_15ros9m_notifytextselected__entry(["NotifyTextSelected entry"])
|
||||
method_15ros9m_notifytextselected__action_25_notifytextselected_notification_25_0__linear[/"Sends notification"/]
|
||||
method_15ros9m_notifytextselected__implicit_return(["return"])
|
||||
method_15ros9m_notifytextselected__action_25_notifytextselected_notification_25_0__linear -->|next| method_15ros9m_notifytextselected__action_27_notifytextselected_await_27_2__await
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__condition -->|skip| method_15ros9m_notifytextselected__action_27_guard_clause_27__false
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__condition -->|invoke| method_15ros9m_notifytextselected__action_27_guard_clause_27__true
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__false -->|next| method_15ros9m_notifytextselected__action_27_guard_clause_27__merge
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__merge -->|text string , blockId string , coords SelectionCoordinates| method_15ros9m_notifytextselected__call_27_OnTextSelected
|
||||
method_15ros9m_notifytextselected__action_27_guard_clause_27__true -->|next| method_15ros9m_notifytextselected__action_27_guard_clause_27__merge
|
||||
method_15ros9m_notifytextselected__action_27_invoke_event_27__linear -->|next| method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__condition
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_await_27_2__await -->|next| method_15ros9m_notifytextselected__action_27_invoke_event_27__linear
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__condition -->|false| method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__false
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__condition -->|true| method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__true
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__false -->|next| method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__merge
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__merge -->|next| method_15ros9m_notifytextselected__action_27_guard_clause_27__condition
|
||||
method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__true -->|next| method_15ros9m_notifytextselected__action_27_notifytextselected_branch_27_1__merge
|
||||
method_15ros9m_notifytextselected__call_27_OnTextSelected -->|return| method_15ros9m_notifytextselected__implicit_return
|
||||
method_15ros9m_notifytextselected__entry -->|next| method_15ros9m_notifytextselected__action_25_notifytextselected_notification_25_0__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 4 unresolved jumps.
|
||||
+358
@@ -0,0 +1,358 @@
|
||||
# ReaderNavigationService
|
||||
|
||||
- File ID: file:1aunxq2:readernavigationservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/ReaderNavigationService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Provides navigation and in-memory reader state (current ebook, chapter index, total chapters, chapter title) and notifies subscribers when navigation changes; integrates with Blazor NavigationManager to navigate to a book view.
|
||||
|
||||
## Key Details
|
||||
|
||||
Holds reader navigation state in-memory for the UI and exposes an OnNavigationChanged event for subscribers; integrates with Blazor NavigationManager to navigate to a reader route. Methods include guard clauses to prevent invalid navigation and only notify subscribers when state actually changes.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ReaderNavigationService: Provides navigation and in-memory reader state (current ebook, chapter index, total chapters, chapter title) and notifies subscribers when navigation changes; integrates with Blazor NavigationManager to navigate to a book view.
|
||||
- ReaderNavigationService(): Constructor: captures NavigationManager dependency for performing route navigation.
|
||||
- GoToChapter(): Validates a target chapter index, updates CurrentChapterIndex and notifies subscribers if valid.
|
||||
- GoToNextChapter(): Advances to the next chapter when not at the last chapter (delegates to GoToChapter).
|
||||
- GoToPreviousChapter(): Moves to the previous chapter when not at the first chapter (delegates to GoToChapter).
|
||||
- UpdateMetadataAsync(): Updates in-memory metadata (index, total, title) only if values changed and notifies subscribers when a change occurred.
|
||||
- NavigateToBook(): Sets the current ebook id, resets chapter index to 0 and triggers a route navigation to the reader page for the book.
|
||||
- SetBook(): Sets the current ebook id and optionally the current chapter index without triggering navigation or notifications.
|
||||
- NotifyNavigationChangedAsync(): Invokes all registered OnNavigationChanged handlers sequentially (awaiting each), if any are subscribed.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: Microsoft.AspNetCore.Components (NavigationManager)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: unknown
|
||||
- interaction-target: _navigationManager.NavigateTo($"/reader/{bookId}") (framework call)
|
||||
- interaction-target: await handler() — invokes subscriber code (external to this service)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 9
|
||||
- Executable symbols: 8
|
||||
- Executable symbols with control flow: 8
|
||||
- Grounded edges: 9
|
||||
- Unresolved references: 8
|
||||
- Control-flow fragments: 8
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 7
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- ReaderNavigationService: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- GoToChapter: 15 nodes, 16 edges, 1 jumps, 0 unsupported constructs
|
||||
- GoToNextChapter: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- GoToPreviousChapter: 12 nodes, 13 edges, 1 jumps, 0 unsupported constructs
|
||||
- UpdateMetadataAsync: 26 nodes, 30 edges, 1 jumps, 0 unsupported constructs
|
||||
- NavigateToBook: 5 nodes, 4 edges, 0 jumps, 0 unsupported constructs
|
||||
- SetBook: 4 nodes, 3 edges, 0 jumps, 0 unsupported constructs
|
||||
- NotifyNavigationChangedAsync: 21 nodes, 24 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ReaderNavigationService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1baxnes_readernavigationservice("ReaderNavigationService")
|
||||
file_1aunxq2_readernavigationservice_cs("ReaderNavigationService")
|
||||
method_19botw9_readernavigationservice[["ReaderNavigationService()"]]
|
||||
method_1jsmnk6_gotonextchapter[["GoToNextChapter()"]]
|
||||
method_1lzew1d_gotopreviouschapter[["GoToPreviousChapter()"]]
|
||||
method_6z33me_navigatetobook[["NavigateToBook()"]]
|
||||
method_ecwzho_setbook[["SetBook()"]]
|
||||
method_l29i6z_gotochapter[["GoToChapter()"]]
|
||||
method_rb5d4b_notifynavigationchangedasync[["NotifyNavigationChangedAsync()"]]
|
||||
method_tx9z61_updatemetadataasync[["UpdateMetadataAsync()"]]
|
||||
```
|
||||
|
||||
### ReaderNavigationService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1baxnes_readernavigationservice("ReaderNavigationService")
|
||||
method_19botw9_readernavigationservice[["ReaderNavigationService()"]]
|
||||
method_1jsmnk6_gotonextchapter[["GoToNextChapter()"]]
|
||||
method_1lzew1d_gotopreviouschapter[["GoToPreviousChapter()"]]
|
||||
method_6z33me_navigatetobook[["NavigateToBook()"]]
|
||||
method_ecwzho_setbook[["SetBook()"]]
|
||||
method_l29i6z_gotochapter[["GoToChapter()"]]
|
||||
method_rb5d4b_notifynavigationchangedasync[["NotifyNavigationChangedAsync()"]]
|
||||
method_tx9z61_updatemetadataasync[["UpdateMetadataAsync()"]]
|
||||
unresolved_unresolved_10uas86_interaction_target{"Unresolved: await handler() — invokes subscriber code (external to this service)"}
|
||||
unresolved_unresolved_16fqicv_call_target{"Unresolved: NotifyNavigationChangedAsync"}
|
||||
unresolved_unresolved_18mqycz_call_target{"Unresolved: GoToChapter"}
|
||||
unresolved_unresolved_1no0soz_call_target{"Unresolved: handler()"}
|
||||
unresolved_unresolved_1xs8wx_call_target{"Unresolved: NotifyNavigationChangedAsync"}
|
||||
unresolved_unresolved_8k298x_call_target{"Unresolved: GoToChapter"}
|
||||
unresolved_unresolved_qpytye_interaction_target{"Unresolved: _navigationManager.NavigateTo($\\"/reader/{bookId}\\") (framework call)"}
|
||||
class_1baxnes_readernavigationservice -->|contains| method_19botw9_readernavigationservice
|
||||
class_1baxnes_readernavigationservice -->|contains| method_1jsmnk6_gotonextchapter
|
||||
class_1baxnes_readernavigationservice -->|contains| method_1lzew1d_gotopreviouschapter
|
||||
class_1baxnes_readernavigationservice -->|contains| method_6z33me_navigatetobook
|
||||
class_1baxnes_readernavigationservice -->|contains| method_ecwzho_setbook
|
||||
class_1baxnes_readernavigationservice -->|contains| method_l29i6z_gotochapter
|
||||
class_1baxnes_readernavigationservice -->|contains| method_rb5d4b_notifynavigationchangedasync
|
||||
class_1baxnes_readernavigationservice -->|contains| method_tx9z61_updatemetadataasync
|
||||
class_1baxnes_readernavigationservice -->|unresolved interaction| unresolved_unresolved_10uas86_interaction_target
|
||||
class_1baxnes_readernavigationservice -->|unresolved interaction| unresolved_unresolved_qpytye_interaction_target
|
||||
method_1jsmnk6_gotonextchapter -->|unresolved call| unresolved_unresolved_8k298x_call_target
|
||||
method_1lzew1d_gotopreviouschapter -->|unresolved call| unresolved_unresolved_18mqycz_call_target
|
||||
method_l29i6z_gotochapter -->|unresolved call| unresolved_unresolved_1xs8wx_call_target
|
||||
method_rb5d4b_notifynavigationchangedasync -->|unresolved call| unresolved_unresolved_1no0soz_call_target
|
||||
method_tx9z61_updatemetadataasync -->|unresolved call| unresolved_unresolved_16fqicv_call_target
|
||||
```
|
||||
|
||||
### GoToChapter() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_l29i6z_gotochapter__call_26_NotifyNavigationChangedAsync[["NotifyNavigationChangedAsync"]]
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__condition{"index < 0 || index >= TotalChapters"}
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__false("continue")
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__merge("merge")
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__true("exit")
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__condition{"index < 0 || index >= TotalChapters"}
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__false("continue")
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__merge("merge")
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__true("return (no state change)")
|
||||
method_l29i6z_gotochapter__action_25_state_change_25__linear("set CurrentChapterIndex")
|
||||
method_l29i6z_gotochapter__action_26_event_26__linear("notify subscribers")
|
||||
method_l29i6z_gotochapter__action_26_gotochapter_await_26_2__await[["Waits for async work"]]
|
||||
method_l29i6z_gotochapter__entry(["GoToChapter entry"])
|
||||
method_l29i6z_gotochapter__action_26_gotochapter_notification_26_1__linear[/"Sends notification"/]
|
||||
method_l29i6z_gotochapter__implicit_return(["return"])
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__condition -->|continue| method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__false
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__condition -->|exit| method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__true
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__false -->|next| method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__merge
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__merge -->|next| method_l29i6z_gotochapter__action_25_state_change_25__linear
|
||||
method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__true -->|next| method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__merge
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__condition -->|continue| method_l29i6z_gotochapter__action_23_guard_clause_23__false
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__condition -->|return no state change| method_l29i6z_gotochapter__action_23_guard_clause_23__true
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__false -->|next| method_l29i6z_gotochapter__action_23_guard_clause_23__merge
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__merge -->|next| method_l29i6z_gotochapter__action_23_gotochapter_guard_clause_23_0__condition
|
||||
method_l29i6z_gotochapter__action_23_guard_clause_23__true -->|next| method_l29i6z_gotochapter__action_23_guard_clause_23__merge
|
||||
method_l29i6z_gotochapter__action_25_state_change_25__linear -->|next| method_l29i6z_gotochapter__action_26_gotochapter_await_26_2__await
|
||||
method_l29i6z_gotochapter__action_26_event_26__linear -->|none| method_l29i6z_gotochapter__call_26_NotifyNavigationChangedAsync
|
||||
method_l29i6z_gotochapter__action_26_gotochapter_await_26_2__await -->|next| method_l29i6z_gotochapter__action_26_gotochapter_notification_26_1__linear
|
||||
method_l29i6z_gotochapter__action_26_gotochapter_notification_26_1__linear -->|next| method_l29i6z_gotochapter__action_26_event_26__linear
|
||||
method_l29i6z_gotochapter__call_26_NotifyNavigationChangedAsync -->|return| method_l29i6z_gotochapter__implicit_return
|
||||
method_l29i6z_gotochapter__entry -->|next| method_l29i6z_gotochapter__action_23_guard_clause_23__condition
|
||||
```
|
||||
|
||||
### GoToNextChapter() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1jsmnk6_gotonextchapter__call_33_GoToChapter[["GoToChapter"]]
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__condition{"CurrentChapterIndex < TotalChapters - 1"}
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__false("false")
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__merge("merge")
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__true("true")
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__condition{"CurrentChapterIndex < TotalChapters - 1"}
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__false("no-op")
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__merge("merge")
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__true("call GoToChapter")
|
||||
method_1jsmnk6_gotonextchapter__action_33_gotonextchapter_await_33_1__await[["Waits for async work"]]
|
||||
method_1jsmnk6_gotonextchapter__entry(["GoToNextChapter entry"])
|
||||
method_1jsmnk6_gotonextchapter__implicit_return(["return"])
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__condition -->|false| method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__false
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__condition -->|true| method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__true
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__false -->|next| method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__merge
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__merge -->|next| method_1jsmnk6_gotonextchapter__action_33_gotonextchapter_await_33_1__await
|
||||
method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__true -->|next| method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__merge
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__condition -->|no-op| method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__false
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__condition -->|call GoToChapter| method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__true
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__false -->|next| method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__merge
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__merge -->|next| method_1jsmnk6_gotonextchapter__action_31_gotonextchapter_branch_31_0__condition
|
||||
method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__true -->|next| method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__merge
|
||||
method_1jsmnk6_gotonextchapter__action_33_gotonextchapter_await_33_1__await -->|CurrentChapterIndex + 1| method_1jsmnk6_gotonextchapter__call_33_GoToChapter
|
||||
method_1jsmnk6_gotonextchapter__call_33_GoToChapter -->|return| method_1jsmnk6_gotonextchapter__implicit_return
|
||||
method_1jsmnk6_gotonextchapter__entry -->|next| method_1jsmnk6_gotonextchapter__action_31_guard_clause_31__condition
|
||||
```
|
||||
|
||||
### GoToPreviousChapter() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1lzew1d_gotopreviouschapter__call_41_GoToChapter[["GoToChapter"]]
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__condition{"CurrentChapterIndex > 0"}
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__false("false")
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__merge("merge")
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__true("true")
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__condition{"CurrentChapterIndex > 0"}
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__false("no-op")
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__merge("merge")
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__true("call GoToChapter")
|
||||
method_1lzew1d_gotopreviouschapter__action_41_gotopreviouschapter_await_41_1__await[["Waits for async work"]]
|
||||
method_1lzew1d_gotopreviouschapter__entry(["GoToPreviousChapter entry"])
|
||||
method_1lzew1d_gotopreviouschapter__implicit_return(["return"])
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__condition -->|false| method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__false
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__condition -->|true| method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__true
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__false -->|next| method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__merge
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__merge -->|next| method_1lzew1d_gotopreviouschapter__action_41_gotopreviouschapter_await_41_1__await
|
||||
method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__true -->|next| method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__merge
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__condition -->|no-op| method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__false
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__condition -->|call GoToChapter| method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__true
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__false -->|next| method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__merge
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__merge -->|next| method_1lzew1d_gotopreviouschapter__action_39_gotopreviouschapter_branch_39_0__condition
|
||||
method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__true -->|next| method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__merge
|
||||
method_1lzew1d_gotopreviouschapter__action_41_gotopreviouschapter_await_41_1__await -->|CurrentChapterIndex - 1| method_1lzew1d_gotopreviouschapter__call_41_GoToChapter
|
||||
method_1lzew1d_gotopreviouschapter__call_41_GoToChapter -->|return| method_1lzew1d_gotopreviouschapter__implicit_return
|
||||
method_1lzew1d_gotopreviouschapter__entry -->|next| method_1lzew1d_gotopreviouschapter__action_39_guard_clause_39__condition
|
||||
```
|
||||
|
||||
### UpdateMetadataAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_tx9z61_updatemetadataasync__fragment_diagram exceeds preferred complexity thresholds (26 nodes, 30 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_tx9z61_updatemetadataasync__call_54_NotifyNavigationChangedAsync[["NotifyNavigationChangedAsync"]]
|
||||
method_tx9z61_updatemetadataasync__action_48_state_change_48__linear("conditionally update CurrentChapterIndex/TotalChapters/ChapterTitle")
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__condition{"CurrentChapterIndex != currentIndex"}
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__false("false")
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__merge("merge")
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__true("true")
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__condition{"TotalChapters != totalChapters"}
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__false("false")
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__merge("merge")
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__true("true")
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__condition{"ChapterTitle != title"}
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__false("false")
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__merge("merge")
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__true("true")
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__condition{"changed == true"}
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__false("no-op")
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__merge("merge")
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__true("notify")
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__condition{"changed"}
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__false("false")
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__merge("merge")
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__true("true")
|
||||
method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_await_54_5__await[["Waits for async work"]]
|
||||
method_tx9z61_updatemetadataasync__entry(["UpdateMetadataAsync entry"])
|
||||
method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_notification_54_4__linear[/"Sends notification"/]
|
||||
method_tx9z61_updatemetadataasync__implicit_return(["return"])
|
||||
method_tx9z61_updatemetadataasync__action_48_state_change_48__linear -->|next| method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__condition
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__condition -->|false| method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__false
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__condition -->|true| method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__true
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__false -->|next| method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__merge
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__merge -->|next| method_tx9z61_updatemetadataasync__action_48_state_change_48__linear
|
||||
method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__true -->|next| method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__merge
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__condition -->|false| method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__false
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__condition -->|true| method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__true
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__false -->|next| method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__merge
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__merge -->|next| method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__condition
|
||||
method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__true -->|next| method_tx9z61_updatemetadataasync__action_49_updatemetadataasync_branch_49_1__merge
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__condition -->|false| method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__false
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__condition -->|true| method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__true
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__false -->|next| method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__merge
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__merge -->|next| method_tx9z61_updatemetadataasync__action_52_guard_clause_52__condition
|
||||
method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__true -->|next| method_tx9z61_updatemetadataasync__action_50_updatemetadataasync_branch_50_2__merge
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__condition -->|no-op| method_tx9z61_updatemetadataasync__action_52_guard_clause_52__false
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__condition -->|notify| method_tx9z61_updatemetadataasync__action_52_guard_clause_52__true
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__false -->|next| method_tx9z61_updatemetadataasync__action_52_guard_clause_52__merge
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__merge -->|next| method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__condition
|
||||
method_tx9z61_updatemetadataasync__action_52_guard_clause_52__true -->|next| method_tx9z61_updatemetadataasync__action_52_guard_clause_52__merge
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__condition -->|false| method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__false
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__condition -->|true| method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__true
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__false -->|next| method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__merge
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__merge -->|next| method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_await_54_5__await
|
||||
method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__true -->|next| method_tx9z61_updatemetadataasync__action_52_updatemetadataasync_branch_52_3__merge
|
||||
method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_await_54_5__await -->|next| method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_notification_54_4__linear
|
||||
method_tx9z61_updatemetadataasync__action_54_updatemetadataasync_notification_54_4__linear -->|none| method_tx9z61_updatemetadataasync__call_54_NotifyNavigationChangedAsync
|
||||
method_tx9z61_updatemetadataasync__call_54_NotifyNavigationChangedAsync -->|return| method_tx9z61_updatemetadataasync__implicit_return
|
||||
method_tx9z61_updatemetadataasync__entry -->|next| method_tx9z61_updatemetadataasync__action_48_updatemetadataasync_branch_48_0__condition
|
||||
```
|
||||
|
||||
### NotifyNavigationChangedAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_rb5d4b_notifynavigationchangedasync__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 24 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_rb5d4b_notifynavigationchangedasync__call_78_handler_[["handler()"]]
|
||||
method_rb5d4b_notifynavigationchangedasync__action_73_event_read_73__linear("capture invocation list")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__condition{"handlers != null"}
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__false("no-op")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__merge("merge")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__true("iterate-and-await")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__condition{"handlers != null"}
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__false("false")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__merge("merge")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__true("true")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_body[["foreach (var handler in handlers.Cast<Func<Task>>()) { await handler(); }"]]
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_entry("iterate over registered handlers")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_exit("exit loop")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_body[["foreach (var handler in handlers.Cast<Func<Task>>())"]]
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_entry("var handler in handlers.Cast<Func<Task>>()")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_exit("Leaves the loop when the condition no longer holds.")
|
||||
method_rb5d4b_notifynavigationchangedasync__action_78_notifynavigationchangedasync_await_78_3__await[["Waits for async work"]]
|
||||
method_rb5d4b_notifynavigationchangedasync__entry(["NotifyNavigationChangedAsync entry"])
|
||||
method_rb5d4b_notifynavigationchangedasync__action_71_notifynavigationchangedasync_notification_71_0__linear[/"Sends notification"/]
|
||||
method_rb5d4b_notifynavigationchangedasync__action_78_external_call_78__linear("await subscriber delegate")
|
||||
method_rb5d4b_notifynavigationchangedasync__implicit_return(["return"])
|
||||
method_rb5d4b_notifynavigationchangedasync__action_71_notifynavigationchangedasync_notification_71_0__linear -->|next| method_rb5d4b_notifynavigationchangedasync__action_73_event_read_73__linear
|
||||
method_rb5d4b_notifynavigationchangedasync__action_73_event_read_73__linear -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__condition
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__condition -->|no-op| method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__false
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__condition -->|iterate-and-await| method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__true
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__false -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__merge
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__merge -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__condition
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__true -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_guard_clause_74__merge
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__condition -->|false| method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__false
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__condition -->|true| method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__true
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__false -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__merge
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__merge -->|next| method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_entry
|
||||
method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__true -->|next| method_rb5d4b_notifynavigationchangedasync__action_74_notifynavigationchangedasync_branch_74_1__merge
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_body -->|continue| method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_entry
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_entry -->|iterate| method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_body
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_entry -->|exit| method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_exit
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_exit -->|next| method_rb5d4b_notifynavigationchangedasync__action_78_notifynavigationchangedasync_await_78_3__await
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_body -->|continue| method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_entry
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_entry -->|var handler in handlers.Cast Func Task>>| method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_body
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_entry -->|Leaves the loop when the condition no longer holds.| method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_exit
|
||||
method_rb5d4b_notifynavigationchangedasync__action_76_notifynavigationchangedasync_loop_76_2__loop_exit -->|next| method_rb5d4b_notifynavigationchangedasync__action_76_loop_76__loop_entry
|
||||
method_rb5d4b_notifynavigationchangedasync__action_78_external_call_78__linear -->|none invokes subscriber delegate| method_rb5d4b_notifynavigationchangedasync__call_78_handler_
|
||||
method_rb5d4b_notifynavigationchangedasync__action_78_notifynavigationchangedasync_await_78_3__await -->|next| method_rb5d4b_notifynavigationchangedasync__action_78_external_call_78__linear
|
||||
method_rb5d4b_notifynavigationchangedasync__call_78_handler_ -->|return| method_rb5d4b_notifynavigationchangedasync__implicit_return
|
||||
method_rb5d4b_notifynavigationchangedasync__entry -->|next| method_rb5d4b_notifynavigationchangedasync__action_71_notifynavigationchangedasync_notification_71_0__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_tx9z61_updatemetadataasync__fragment_diagram exceeds preferred complexity thresholds (26 nodes, 30 edges).
|
||||
- Warning: control-flow: diagram method_rb5d4b_notifynavigationchangedasync__fragment_diagram exceeds preferred complexity thresholds (21 nodes, 24 edges).
|
||||
@@ -0,0 +1,287 @@
|
||||
# SyncService
|
||||
|
||||
- File ID: file:1la6lrw:syncservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/SyncService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Client-side service that establishes a SignalR hub connection to synchronize reading progress (pages) with a remote server, providing debounce logic, event exposure, and lifecycle disposal.
|
||||
|
||||
## Key Details
|
||||
|
||||
Uses a trailing-edge 2s debounce to batch progress updates, retrieves an auth token from secure storage for SignalR AccessTokenProvider, registers a hub handler that forwards to an event, and safely cancels/disposes background work and hub connection on dispose.
|
||||
|
||||
## Symbols
|
||||
|
||||
- SyncService: Client-side service that establishes a SignalR hub connection to synchronize reading progress (pages) with a remote server, providing debounce logic, event exposure, and lifecycle disposal.
|
||||
- SyncService(): Constructs the SyncService and stores injected dependencies.
|
||||
- InitializeAsync(): Initializes the SignalR HubConnection (with token from secure storage), registers a progress handler, and starts the connection with automatic reconnect.
|
||||
- UpdateProgressAsync(): Debounces and sends reading progress updates to the server via the hub connection in a trailing-edge manner, avoiding duplicate sends for the same page.
|
||||
- DisposeAsync(): Cancels pending debounce, disposes the hub connection if present.
|
||||
- IAsyncDisposable.DisposeAsync(): Explicit interface implementation that forwards to DisposeAsync to unify disposal semantics.
|
||||
- SyncService: Encapsulates client synchronization logic for reading progress via SignalR, providing initialization, debounced update sending, event exposure, and disposal.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services
|
||||
- dependency-target: Microsoft.AspNetCore.SignalR.Client
|
||||
- dependency-target: Microsoft.Extensions.Logging
|
||||
- call-target: unknown
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- interaction-target: await _hubConnection.SendAsync("UpdateProgress", pageId, ebookId, progress, chapterTitle, token);
|
||||
- interaction-target: Calls _hubConnection.SendAsync('UpdateProgress', pageId, ebookId, progress, chapterTitle, token) when connected (external SignalR call)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 7
|
||||
- Executable symbols: 5
|
||||
- Executable symbols with control flow: 5
|
||||
- Grounded edges: 7
|
||||
- Unresolved references: 9
|
||||
- Control-flow fragments: 5
|
||||
- Unresolved jumps: 2
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 4
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- SyncService: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- InitializeAsync: 35 nodes, 39 edges, 2 jumps, 0 unsupported constructs
|
||||
- UpdateProgressAsync: 33 nodes, 36 edges, 1 jumps, 0 unsupported constructs
|
||||
- DisposeAsync: 9 nodes, 9 edges, 0 jumps, 0 unsupported constructs
|
||||
- IAsyncDisposable.DisposeAsync: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### SyncService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1jwtkwo_syncservice("SyncService")
|
||||
file_1la6lrw_syncservice_cs("SyncService")
|
||||
method_14llm2d_disposeasync[["DisposeAsync()"]]
|
||||
method_171cr2c_syncservice[["SyncService()"]]
|
||||
method_1oqk0x0_iasyncdisposable_disposeasync[["IAsyncDisposable.DisposeAsync()"]]
|
||||
method_1w7mi8p_updateprogressasync[["UpdateProgressAsync()"]]
|
||||
method_r2rlv7_initializeasync[["InitializeAsync()"]]
|
||||
type_1sbj28q_syncservice[/"SyncService"/]
|
||||
```
|
||||
|
||||
### SyncService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1jwtkwo_syncservice("SyncService")
|
||||
method_14llm2d_disposeasync[["DisposeAsync()"]]
|
||||
method_171cr2c_syncservice[["SyncService()"]]
|
||||
method_1oqk0x0_iasyncdisposable_disposeasync[["IAsyncDisposable.DisposeAsync()"]]
|
||||
method_1w7mi8p_updateprogressasync[["UpdateProgressAsync()"]]
|
||||
method_r2rlv7_initializeasync[["InitializeAsync()"]]
|
||||
unresolved_unresolved_1b6k3t3_call_target{"Unresolved: InitializeAsync"}
|
||||
unresolved_unresolved_1eu3rn0_call_target{"Unresolved: OnProgressReceived"}
|
||||
unresolved_unresolved_1k9vuzk_call_target{"Unresolved: DisposeAsync"}
|
||||
unresolved_unresolved_dxqwhl_call_target{"Unresolved: GetSecureString"}
|
||||
unresolved_unresolved_fglrce_interaction_target{"Unresolved: await _hubConnection.SendAsync(\\"UpdateProgress\\", pageId, ebookId, progress, chapterTitle, token);"}
|
||||
unresolved_unresolved_k2ym2b_interaction_target{"Unresolved: Calls _hubConnection.SendAsync('UpdateProgress', pageId, ebookId, progress, chapterTitle, token) when connected (external SignalR call)"}
|
||||
class_1jwtkwo_syncservice -->|contains| method_14llm2d_disposeasync
|
||||
class_1jwtkwo_syncservice -->|contains| method_171cr2c_syncservice
|
||||
class_1jwtkwo_syncservice -->|contains| method_1oqk0x0_iasyncdisposable_disposeasync
|
||||
class_1jwtkwo_syncservice -->|contains| method_1w7mi8p_updateprogressasync
|
||||
class_1jwtkwo_syncservice -->|contains| method_r2rlv7_initializeasync
|
||||
class_1jwtkwo_syncservice -->|unresolved interaction| unresolved_unresolved_fglrce_interaction_target
|
||||
class_1jwtkwo_syncservice -->|unresolved interaction| unresolved_unresolved_k2ym2b_interaction_target
|
||||
method_1oqk0x0_iasyncdisposable_disposeasync -->|unresolved call| unresolved_unresolved_1k9vuzk_call_target
|
||||
method_1w7mi8p_updateprogressasync -->|unresolved call| unresolved_unresolved_1b6k3t3_call_target
|
||||
method_r2rlv7_initializeasync -->|unresolved call| unresolved_unresolved_1eu3rn0_call_target
|
||||
method_r2rlv7_initializeasync -->|unresolved call| unresolved_unresolved_dxqwhl_call_target
|
||||
```
|
||||
|
||||
### InitializeAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_r2rlv7_initializeasync__fragment_diagram exceeds preferred complexity thresholds (35 nodes, 39 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_r2rlv7_initializeasync__call_36_GetSecureString[["GetSecureString"]]
|
||||
method_r2rlv7_initializeasync__call_53_OnProgressReceived[["OnProgressReceived"]]
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__condition{"_isInitialized == true"}
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__false("skip-init")
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__merge("merge")
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__true("return-Ok")
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__condition{"_isInitialized) return Result.Ok("}
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__false("continue")
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__merge("merge")
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__true("exit")
|
||||
method_r2rlv7_initializeasync__action_36_external_read_36__linear("read-secure-token")
|
||||
method_r2rlv7_initializeasync__action_36_initializeasync_await_36_1__await[["Waits for async work"]]
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__condition{"tokenResult.IsFailed"}
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__false("stop-init")
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__merge("merge")
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__true("return-Fail")
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__condition{"tokenResult.IsFailed) return Result.Fail(\\"Not authenticated\\""}
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__false("continue")
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__merge("merge")
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__true("exit")
|
||||
method_r2rlv7_initializeasync__action_39_compute_39__linear("build-hub-url")
|
||||
method_r2rlv7_initializeasync__action_42_configure_42__linear("configure-hub-connection")
|
||||
method_r2rlv7_initializeasync__action_50_event_subscription_50__linear("register-progress-handler")
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_await_53_4__await[["Waits for async work"]]
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__condition{"OnProgressReceived != null) await OnProgressReceived(pageId, timestamp"}
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__false("false")
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__merge("merge")
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__true("true")
|
||||
method_r2rlv7_initializeasync__action_56_initializeasync_try_56_5__try("Begins protected execution")
|
||||
method_r2rlv7_initializeasync__action_56_try_catch_56__linear("start-hub-with-fallback")
|
||||
method_r2rlv7_initializeasync__action_58_initializeasync_await_58_6__await[["Waits for async work"]]
|
||||
method_r2rlv7_initializeasync__action_62_initializeasync_catch_62_8__catch("catch Exception ex")
|
||||
method_r2rlv7_initializeasync__entry(["InitializeAsync entry"])
|
||||
method_r2rlv7_initializeasync__action_60_initializeasync_return_60_7__return(["Returns result"])
|
||||
method_r2rlv7_initializeasync__action_64_initializeasync_return_64_9__return(["Returns result"])
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__condition -->|skip-init| method_r2rlv7_initializeasync__action_34_guard_clause_34__false
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__condition -->|return-Ok| method_r2rlv7_initializeasync__action_34_guard_clause_34__true
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__false -->|next| method_r2rlv7_initializeasync__action_34_guard_clause_34__merge
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__merge -->|next| method_r2rlv7_initializeasync__action_36_initializeasync_await_36_1__await
|
||||
method_r2rlv7_initializeasync__action_34_guard_clause_34__true -->|next| method_r2rlv7_initializeasync__action_34_guard_clause_34__merge
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__condition -->|continue| method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__false
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__condition -->|exit| method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__true
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__false -->|next| method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__merge
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__merge -->|next| method_r2rlv7_initializeasync__action_34_guard_clause_34__condition
|
||||
method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__true -->|next| method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__merge
|
||||
method_r2rlv7_initializeasync__action_36_external_read_36__linear -->|nexus_auth_token| method_r2rlv7_initializeasync__call_36_GetSecureString
|
||||
method_r2rlv7_initializeasync__action_36_initializeasync_await_36_1__await -->|next| method_r2rlv7_initializeasync__action_36_external_read_36__linear
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__condition -->|stop-init| method_r2rlv7_initializeasync__action_37_guard_clause_37__false
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__condition -->|return-Fail| method_r2rlv7_initializeasync__action_37_guard_clause_37__true
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__false -->|next| method_r2rlv7_initializeasync__action_37_guard_clause_37__merge
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__merge -->|next| method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__condition
|
||||
method_r2rlv7_initializeasync__action_37_guard_clause_37__true -->|next| method_r2rlv7_initializeasync__action_37_guard_clause_37__merge
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__condition -->|continue| method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__false
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__condition -->|exit| method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__true
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__false -->|next| method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__merge
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__merge -->|next| method_r2rlv7_initializeasync__action_39_compute_39__linear
|
||||
method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__true -->|next| method_r2rlv7_initializeasync__action_37_initializeasync_guard_clause_37_2__merge
|
||||
method_r2rlv7_initializeasync__action_39_compute_39__linear -->|next| method_r2rlv7_initializeasync__action_42_configure_42__linear
|
||||
method_r2rlv7_initializeasync__action_42_configure_42__linear -->|next| method_r2rlv7_initializeasync__action_50_event_subscription_50__linear
|
||||
method_r2rlv7_initializeasync__action_50_event_subscription_50__linear -->|next| method_r2rlv7_initializeasync__action_53_initializeasync_await_53_4__await
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_await_53_4__await -->|next| method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__condition
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__condition -->|false| method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__false
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__condition -->|true| method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__true
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__false -->|next| method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__merge
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__merge -->|pageId, timestamp invoked when hub event arrives| method_r2rlv7_initializeasync__call_53_OnProgressReceived
|
||||
method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__true -->|next| method_r2rlv7_initializeasync__action_53_initializeasync_branch_53_3__merge
|
||||
method_r2rlv7_initializeasync__action_56_initializeasync_try_56_5__try -->|next| method_r2rlv7_initializeasync__action_58_initializeasync_await_58_6__await
|
||||
method_r2rlv7_initializeasync__action_56_try_catch_56__linear -->|next| method_r2rlv7_initializeasync__action_56_initializeasync_try_56_5__try
|
||||
method_r2rlv7_initializeasync__action_58_initializeasync_await_58_6__await -->|return| method_r2rlv7_initializeasync__action_60_initializeasync_return_60_7__return
|
||||
method_r2rlv7_initializeasync__action_60_initializeasync_return_60_7__return -->|exception| method_r2rlv7_initializeasync__action_62_initializeasync_catch_62_8__catch
|
||||
method_r2rlv7_initializeasync__action_62_initializeasync_catch_62_8__catch -->|return| method_r2rlv7_initializeasync__action_64_initializeasync_return_64_9__return
|
||||
method_r2rlv7_initializeasync__call_36_GetSecureString -->|next| method_r2rlv7_initializeasync__action_37_guard_clause_37__condition
|
||||
method_r2rlv7_initializeasync__call_53_OnProgressReceived -->|next| method_r2rlv7_initializeasync__action_56_try_catch_56__linear
|
||||
method_r2rlv7_initializeasync__entry -->|next| method_r2rlv7_initializeasync__action_34_initializeasync_guard_clause_34_0__condition
|
||||
```
|
||||
|
||||
### UpdateProgressAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_1w7mi8p_updateprogressasync__fragment_diagram exceeds preferred complexity thresholds (33 nodes, 36 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1w7mi8p_updateprogressasync__call_85_InitializeAsync[["InitializeAsync"]]
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__condition{"pageId == _lastSentPageId"}
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__false("skip-send")
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__merge("merge")
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__true("return-Ok")
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__condition{"pageId == _lastSentPageId) return Result.Ok("}
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__false("continue")
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__merge("merge")
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__true("exit")
|
||||
method_1w7mi8p_updateprogressasync__action_74_debounce_74__linear("trailing-edge-debounce")
|
||||
method_1w7mi8p_updateprogressasync__action_79_background_task_79__linear("delayed-send-task")
|
||||
method_1w7mi8p_updateprogressasync__action_81_updateprogressasync_try_81_1__try("Begins protected execution")
|
||||
method_1w7mi8p_updateprogressasync__action_83_updateprogressasync_await_83_2__await[["Waits for async work"]]
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_await_85_4__await[["Waits for async work"]]
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__condition{"!_isInitialized) await InitializeAsync("}
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__false("false")
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__merge("merge")
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__true("true")
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__condition{"_hubConnection?.State == HubConnectionState.Connected"}
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__false("false")
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__merge("merge")
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__true("true")
|
||||
method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_await_89_7__await[["Waits for async work"]]
|
||||
method_1w7mi8p_updateprogressasync__action_90_state_change_90__linear("update-last-sent")
|
||||
method_1w7mi8p_updateprogressasync__action_93_error_handling_93__linear("handle-cancellation")
|
||||
method_1w7mi8p_updateprogressasync__action_93_updateprogressasync_catch_93_8__catch("catch TaskCanceledException")
|
||||
method_1w7mi8p_updateprogressasync__action_94_error_handling_94__linear("log-send-error")
|
||||
method_1w7mi8p_updateprogressasync__action_94_updateprogressasync_catch_94_9__catch("catch Exception ex")
|
||||
method_1w7mi8p_updateprogressasync__action_96_updateprogressasync_log_96_10__linear("Logs runtime state")
|
||||
method_1w7mi8p_updateprogressasync__entry(["UpdateProgressAsync entry"])
|
||||
method_1w7mi8p_updateprogressasync__action_89_external_call_89__linear("send-progress-to-hub")
|
||||
method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_external_call_89_6__linear("Calls external dependency")
|
||||
method_1w7mi8p_updateprogressasync__action_100_updateprogressasync_return_100_11__return(["Returns result"])
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__condition -->|skip-send| method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__false
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__condition -->|return-Ok| method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__true
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__false -->|next| method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__merge
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__merge -->|next| method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__condition
|
||||
method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__true -->|next| method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__merge
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__condition -->|continue| method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__false
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__condition -->|exit| method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__true
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__false -->|next| method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__merge
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__merge -->|next| method_1w7mi8p_updateprogressasync__action_74_debounce_74__linear
|
||||
method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__true -->|next| method_1w7mi8p_updateprogressasync__action_72_updateprogressasync_guard_clause_72_0__merge
|
||||
method_1w7mi8p_updateprogressasync__action_74_debounce_74__linear -->|next| method_1w7mi8p_updateprogressasync__action_79_background_task_79__linear
|
||||
method_1w7mi8p_updateprogressasync__action_79_background_task_79__linear -->|next| method_1w7mi8p_updateprogressasync__action_81_updateprogressasync_try_81_1__try
|
||||
method_1w7mi8p_updateprogressasync__action_81_updateprogressasync_try_81_1__try -->|next| method_1w7mi8p_updateprogressasync__action_83_updateprogressasync_await_83_2__await
|
||||
method_1w7mi8p_updateprogressasync__action_83_updateprogressasync_await_83_2__await -->|next| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_await_85_4__await
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_await_85_4__await -->|next| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__condition
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__condition -->|false| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__false
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__condition -->|true| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__true
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__false -->|next| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__merge
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__merge -->|none ensures hub is initialized before sending| method_1w7mi8p_updateprogressasync__call_85_InitializeAsync
|
||||
method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__true -->|next| method_1w7mi8p_updateprogressasync__action_85_updateprogressasync_branch_85_3__merge
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__condition -->|false| method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__false
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__condition -->|true| method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__true
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__false -->|next| method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__merge
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__merge -->|next| method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_await_89_7__await
|
||||
method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__true -->|next| method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__merge
|
||||
method_1w7mi8p_updateprogressasync__action_89_external_call_89__linear -->|next| method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_external_call_89_6__linear
|
||||
method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_await_89_7__await -->|next| method_1w7mi8p_updateprogressasync__action_89_external_call_89__linear
|
||||
method_1w7mi8p_updateprogressasync__action_89_updateprogressasync_external_call_89_6__linear -->|next| method_1w7mi8p_updateprogressasync__action_90_state_change_90__linear
|
||||
method_1w7mi8p_updateprogressasync__action_90_state_change_90__linear -->|exception| method_1w7mi8p_updateprogressasync__action_93_updateprogressasync_catch_93_8__catch
|
||||
method_1w7mi8p_updateprogressasync__action_93_error_handling_93__linear -->|next| method_1w7mi8p_updateprogressasync__action_94_error_handling_94__linear
|
||||
method_1w7mi8p_updateprogressasync__action_93_updateprogressasync_catch_93_8__catch -->|next| method_1w7mi8p_updateprogressasync__action_93_error_handling_93__linear
|
||||
method_1w7mi8p_updateprogressasync__action_94_error_handling_94__linear -->|exception| method_1w7mi8p_updateprogressasync__action_94_updateprogressasync_catch_94_9__catch
|
||||
method_1w7mi8p_updateprogressasync__action_94_updateprogressasync_catch_94_9__catch -->|next| method_1w7mi8p_updateprogressasync__action_96_updateprogressasync_log_96_10__linear
|
||||
method_1w7mi8p_updateprogressasync__action_96_updateprogressasync_log_96_10__linear -->|return| method_1w7mi8p_updateprogressasync__action_100_updateprogressasync_return_100_11__return
|
||||
method_1w7mi8p_updateprogressasync__call_85_InitializeAsync -->|next| method_1w7mi8p_updateprogressasync__action_87_updateprogressasync_branch_87_5__condition
|
||||
method_1w7mi8p_updateprogressasync__entry -->|next| method_1w7mi8p_updateprogressasync__action_72_guard_clause_72__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 2 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_r2rlv7_initializeasync__fragment_diagram exceeds preferred complexity thresholds (35 nodes, 39 edges).
|
||||
- Warning: control-flow: diagram method_1w7mi8p_updateprogressasync__fragment_diagram exceeds preferred complexity thresholds (33 nodes, 36 edges).
|
||||
@@ -0,0 +1,114 @@
|
||||
# ThemeService
|
||||
|
||||
- File ID: file:i1pwrm:themeservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/ThemeService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
A small UI-shared service that tracks and toggles light/dark theme state and notifies subscribers when the theme changes.
|
||||
|
||||
## Key Details
|
||||
|
||||
Single-purpose service: toggles a boolean and awaits an optional async event handler to notify UI components about theme changes.
|
||||
|
||||
## Symbols
|
||||
|
||||
- ThemeService: A small UI-shared service that tracks and toggles light/dark theme state and notifies subscribers when the theme changes.
|
||||
- ToggleTheme(): Toggles the IsLightMode flag and notifies subscribers via the OnThemeChanged event.
|
||||
- ThemeService: Service that holds theme state and exposes an event to notify consumers when the theme changes.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: unknown (IThemeService referenced but implementation/interface file not in this snippet)
|
||||
- call-target: self
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 2
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- ToggleTheme: 14 nodes, 15 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### ThemeService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1ehqpz0_themeservice("ThemeService")
|
||||
file_i1pwrm_themeservice_cs("ThemeService")
|
||||
method_1fcqnzv_toggletheme[["ToggleTheme()"]]
|
||||
type_1mmobgz_themeservice[/"ThemeService"/]
|
||||
```
|
||||
|
||||
### ThemeService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1ehqpz0_themeservice("ThemeService")
|
||||
method_1fcqnzv_toggletheme[["ToggleTheme()"]]
|
||||
unresolved_unresolved_v3fr6i_call_target{"Unresolved: OnThemeChanged"}
|
||||
class_1ehqpz0_themeservice -->|contains| method_1fcqnzv_toggletheme
|
||||
method_1fcqnzv_toggletheme -->|unresolved call| unresolved_unresolved_v3fr6i_call_target
|
||||
```
|
||||
|
||||
### ToggleTheme() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1fcqnzv_toggletheme__call_11_OnThemeChanged[["OnThemeChanged"]]
|
||||
method_1fcqnzv_toggletheme__action_10_state_mutation_10__linear("Toggle IsLightMode")
|
||||
method_1fcqnzv_toggletheme__action_11_event_invoke_11__linear("Notify theme change subscribers")
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__condition{"OnThemeChanged != null"}
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__false("invoke-subscribers")
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__merge("merge")
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__true("no-subscribers")
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_await_11_1__await[["Waits for async work"]]
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__condition{"OnThemeChanged != null) await OnThemeChanged("}
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__false("false")
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__merge("merge")
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__true("true")
|
||||
method_1fcqnzv_toggletheme__entry(["ToggleTheme entry"])
|
||||
method_1fcqnzv_toggletheme__implicit_return(["return"])
|
||||
method_1fcqnzv_toggletheme__action_10_state_mutation_10__linear -->|next| method_1fcqnzv_toggletheme__action_11_toggletheme_await_11_1__await
|
||||
method_1fcqnzv_toggletheme__action_11_event_invoke_11__linear -->|next| method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__condition
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__condition -->|invoke-subscribers| method_1fcqnzv_toggletheme__action_11_guard_clause_11__false
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__condition -->|no-subscribers| method_1fcqnzv_toggletheme__action_11_guard_clause_11__true
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__false -->|next| method_1fcqnzv_toggletheme__action_11_guard_clause_11__merge
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__merge -->|no params awaits the invoked Task returned by subscribers| method_1fcqnzv_toggletheme__call_11_OnThemeChanged
|
||||
method_1fcqnzv_toggletheme__action_11_guard_clause_11__true -->|next| method_1fcqnzv_toggletheme__action_11_guard_clause_11__merge
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_await_11_1__await -->|next| method_1fcqnzv_toggletheme__action_11_event_invoke_11__linear
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__condition -->|false| method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__false
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__condition -->|true| method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__true
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__false -->|next| method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__merge
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__merge -->|next| method_1fcqnzv_toggletheme__action_11_guard_clause_11__condition
|
||||
method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__true -->|next| method_1fcqnzv_toggletheme__action_11_toggletheme_branch_11_0__merge
|
||||
method_1fcqnzv_toggletheme__call_11_OnThemeChanged -->|return| method_1fcqnzv_toggletheme__implicit_return
|
||||
method_1fcqnzv_toggletheme__entry -->|next| method_1fcqnzv_toggletheme__action_10_state_mutation_10__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+264
@@ -0,0 +1,264 @@
|
||||
# WebStorageService
|
||||
|
||||
- File ID: file:15km3l4:webstorageservice-cs
|
||||
- Path: NexusReader.UI.Shared/Services/WebStorageService.cs
|
||||
- Role: service
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Provides a web-local-storage backed implementation of INativeStorageService for Blazor/JS runtime using IJSRuntime to persist and read simple string/bool values with Result wrapping and basic error handling.
|
||||
|
||||
## Key Details
|
||||
|
||||
Implements INativeStorageService for web Blazor clients via IJSRuntime localStorage calls; secure-named methods currently just delegate to plain methods (no added encryption).
|
||||
|
||||
## Symbols
|
||||
|
||||
- WebStorageService: Provides a web-local-storage backed implementation of INativeStorageService for Blazor/JS runtime using IJSRuntime to persist and read simple string/bool values with Result wrapping and basic error handling.
|
||||
- SaveStringAsync(): Saves a string value into browser localStorage under the given key and returns a Result indicating success or failure.
|
||||
- GetStringAsync(): Reads a string value from browser localStorage for the given key and returns it wrapped in a Result; failures produce a failed Result.
|
||||
- SaveBoolAsync(): Convenience wrapper that saves a boolean by converting it to string and delegating to SaveStringAsync.
|
||||
- GetBoolAsync(): Reads a stored string for the key, attempts to parse it as bool, and returns the parsed value or a default wrapped in a Result; catches errors and returns the default.
|
||||
- RemoveAsync(): Removes an item from browser localStorage by key and returns Result success/failure.
|
||||
- SaveSecureString(): Secure-named wrapper that currently delegates to SaveStringAsync (no extra security applied).
|
||||
- GetSecureString(): Secure-named wrapper that delegates to GetStringAsync (no extra security applied).
|
||||
- RemoveSecureAsync(): Secure-named wrapper that delegates to RemoveAsync (no extra security applied).
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (INativeStorageService)
|
||||
- dependency-target: Microsoft.JSInterop (IJSRuntime)
|
||||
- dependency-target: FluentResults (Result)
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- call-target: self
|
||||
- interaction-target: _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, value)
|
||||
- interaction-target: _jsRuntime.InvokeAsync<string?>("localStorage.getItem", key)
|
||||
- interaction-target: _jsRuntime.InvokeAsync<string?>("localStorage.getItem", key)
|
||||
- interaction-target: _jsRuntime.InvokeVoidAsync("localStorage.removeItem", key)
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 9
|
||||
- Executable symbols: 8
|
||||
- Executable symbols with control flow: 8
|
||||
- Grounded edges: 9
|
||||
- Unresolved references: 11
|
||||
- Control-flow fragments: 8
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 6
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- SaveStringAsync: 10 nodes, 9 edges, 0 jumps, 0 unsupported constructs
|
||||
- GetStringAsync: 10 nodes, 9 edges, 0 jumps, 0 unsupported constructs
|
||||
- SaveBoolAsync: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetBoolAsync: 20 nodes, 22 edges, 0 jumps, 0 unsupported constructs
|
||||
- RemoveAsync: 10 nodes, 9 edges, 0 jumps, 0 unsupported constructs
|
||||
- SaveSecureString: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- GetSecureString: 5 nodes, 4 edges, 1 jumps, 0 unsupported constructs
|
||||
- RemoveSecureAsync: 4 nodes, 3 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### WebStorageService Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1uirugg_webstorageservice("WebStorageService")
|
||||
file_15km3l4_webstorageservice_cs("WebStorageService")
|
||||
method_16m1d8f_savestringasync[["SaveStringAsync()"]]
|
||||
method_17924up_removeasync[["RemoveAsync()"]]
|
||||
method_1bx0ikl_removesecureasync[["RemoveSecureAsync()"]]
|
||||
method_1rgphlw_getstringasync[["GetStringAsync()"]]
|
||||
method_1xwytsy_getsecurestring[["GetSecureString()"]]
|
||||
method_en9pi8_getboolasync[["GetBoolAsync()"]]
|
||||
method_hj2kxb_saveboolasync[["SaveBoolAsync()"]]
|
||||
method_ly29k7_savesecurestring[["SaveSecureString()"]]
|
||||
```
|
||||
|
||||
### WebStorageService Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1uirugg_webstorageservice("WebStorageService")
|
||||
method_16m1d8f_savestringasync[["SaveStringAsync()"]]
|
||||
method_17924up_removeasync[["RemoveAsync()"]]
|
||||
method_1bx0ikl_removesecureasync[["RemoveSecureAsync()"]]
|
||||
method_1rgphlw_getstringasync[["GetStringAsync()"]]
|
||||
method_1xwytsy_getsecurestring[["GetSecureString()"]]
|
||||
method_en9pi8_getboolasync[["GetBoolAsync()"]]
|
||||
method_hj2kxb_saveboolasync[["SaveBoolAsync()"]]
|
||||
method_ly29k7_savesecurestring[["SaveSecureString()"]]
|
||||
unresolved_unresolved_115hkr2_interaction_target{"Unresolved: _jsRuntime.InvokeVoidAsync(\\"localStorage.removeItem\\", key)"}
|
||||
unresolved_unresolved_1m7ni06_call_target{"Unresolved: GetStringAsync"}
|
||||
unresolved_unresolved_1oqkmck_interaction_target{"Unresolved: _jsRuntime.InvokeAsync<string?>(\\"localStorage.getItem\\", key)"}
|
||||
unresolved_unresolved_1yjg6nw_call_target{"Unresolved: RemoveAsync"}
|
||||
unresolved_unresolved_goqrxi_call_target{"Unresolved: SaveStringAsync"}
|
||||
unresolved_unresolved_h6kn8d_call_target{"Unresolved: SaveStringAsync"}
|
||||
unresolved_unresolved_zqfpll_interaction_target{"Unresolved: _jsRuntime.InvokeVoidAsync(\\"localStorage.setItem\\", key, value)"}
|
||||
class_1uirugg_webstorageservice -->|contains| method_16m1d8f_savestringasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_17924up_removeasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_1bx0ikl_removesecureasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_1rgphlw_getstringasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_1xwytsy_getsecurestring
|
||||
class_1uirugg_webstorageservice -->|contains| method_en9pi8_getboolasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_hj2kxb_saveboolasync
|
||||
class_1uirugg_webstorageservice -->|contains| method_ly29k7_savesecurestring
|
||||
class_1uirugg_webstorageservice -->|unresolved interaction| unresolved_unresolved_115hkr2_interaction_target
|
||||
class_1uirugg_webstorageservice -->|unresolved interaction| unresolved_unresolved_1oqkmck_interaction_target
|
||||
class_1uirugg_webstorageservice -->|unresolved interaction| unresolved_unresolved_1oqkmck_interaction_target
|
||||
class_1uirugg_webstorageservice -->|unresolved interaction| unresolved_unresolved_zqfpll_interaction_target
|
||||
method_1bx0ikl_removesecureasync -->|unresolved call| unresolved_unresolved_1yjg6nw_call_target
|
||||
method_1xwytsy_getsecurestring -->|unresolved call| unresolved_unresolved_1m7ni06_call_target
|
||||
method_hj2kxb_saveboolasync -->|unresolved call| unresolved_unresolved_goqrxi_call_target
|
||||
method_ly29k7_savesecurestring -->|unresolved call| unresolved_unresolved_h6kn8d_call_target
|
||||
```
|
||||
|
||||
### SaveStringAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_16m1d8f_savestringasync__action_18_savestringasync_try_18_0__try("Begins protected execution")
|
||||
method_16m1d8f_savestringasync__action_18_try_catch_18__linear("Wraps JS call with exception handling")
|
||||
method_16m1d8f_savestringasync__action_20_savestringasync_await_20_1__await[["Waits for async work"]]
|
||||
method_16m1d8f_savestringasync__action_23_savestringasync_catch_23_3__catch("catch Exception ex")
|
||||
method_16m1d8f_savestringasync__entry(["SaveStringAsync entry"])
|
||||
method_16m1d8f_savestringasync__action_20_external_call_20__linear("Invoke JS localStorage.setItem")
|
||||
method_16m1d8f_savestringasync__action_21_return_21__return(["success"])
|
||||
method_16m1d8f_savestringasync__action_21_savestringasync_return_21_2__return(["Returns result"])
|
||||
method_16m1d8f_savestringasync__action_25_return_25__return(["failure"])
|
||||
method_16m1d8f_savestringasync__action_25_savestringasync_return_25_4__return(["Returns result"])
|
||||
method_16m1d8f_savestringasync__action_18_savestringasync_try_18_0__try -->|next| method_16m1d8f_savestringasync__action_20_savestringasync_await_20_1__await
|
||||
method_16m1d8f_savestringasync__action_18_try_catch_18__linear -->|next| method_16m1d8f_savestringasync__action_18_savestringasync_try_18_0__try
|
||||
method_16m1d8f_savestringasync__action_20_external_call_20__linear -->|return| method_16m1d8f_savestringasync__action_21_return_21__return
|
||||
method_16m1d8f_savestringasync__action_20_savestringasync_await_20_1__await -->|next| method_16m1d8f_savestringasync__action_20_external_call_20__linear
|
||||
method_16m1d8f_savestringasync__action_21_return_21__return -->|return| method_16m1d8f_savestringasync__action_21_savestringasync_return_21_2__return
|
||||
method_16m1d8f_savestringasync__action_21_savestringasync_return_21_2__return -->|exception| method_16m1d8f_savestringasync__action_23_savestringasync_catch_23_3__catch
|
||||
method_16m1d8f_savestringasync__action_23_savestringasync_catch_23_3__catch -->|return| method_16m1d8f_savestringasync__action_25_savestringasync_return_25_4__return
|
||||
method_16m1d8f_savestringasync__action_25_savestringasync_return_25_4__return -->|return| method_16m1d8f_savestringasync__action_25_return_25__return
|
||||
method_16m1d8f_savestringasync__entry -->|next| method_16m1d8f_savestringasync__action_18_try_catch_18__linear
|
||||
```
|
||||
|
||||
### GetStringAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1rgphlw_getstringasync__action_31_getstringasync_try_31_0__try("Begins protected execution")
|
||||
method_1rgphlw_getstringasync__action_31_try_catch_31__linear("Wraps JS call with exception handling")
|
||||
method_1rgphlw_getstringasync__action_33_getstringasync_await_33_1__await[["Waits for async work"]]
|
||||
method_1rgphlw_getstringasync__action_36_getstringasync_catch_36_3__catch("catch Exception ex")
|
||||
method_1rgphlw_getstringasync__entry(["GetStringAsync entry"])
|
||||
method_1rgphlw_getstringasync__action_33_external_call_33__linear("Invoke JS localStorage.getItem")
|
||||
method_1rgphlw_getstringasync__action_34_getstringasync_return_34_2__return(["Returns result"])
|
||||
method_1rgphlw_getstringasync__action_34_return_34__return(["success"])
|
||||
method_1rgphlw_getstringasync__action_38_getstringasync_return_38_4__return(["Returns result"])
|
||||
method_1rgphlw_getstringasync__action_38_return_38__return(["failure"])
|
||||
method_1rgphlw_getstringasync__action_31_getstringasync_try_31_0__try -->|next| method_1rgphlw_getstringasync__action_33_getstringasync_await_33_1__await
|
||||
method_1rgphlw_getstringasync__action_31_try_catch_31__linear -->|next| method_1rgphlw_getstringasync__action_31_getstringasync_try_31_0__try
|
||||
method_1rgphlw_getstringasync__action_33_external_call_33__linear -->|return| method_1rgphlw_getstringasync__action_34_return_34__return
|
||||
method_1rgphlw_getstringasync__action_33_getstringasync_await_33_1__await -->|next| method_1rgphlw_getstringasync__action_33_external_call_33__linear
|
||||
method_1rgphlw_getstringasync__action_34_getstringasync_return_34_2__return -->|exception| method_1rgphlw_getstringasync__action_36_getstringasync_catch_36_3__catch
|
||||
method_1rgphlw_getstringasync__action_34_return_34__return -->|return| method_1rgphlw_getstringasync__action_34_getstringasync_return_34_2__return
|
||||
method_1rgphlw_getstringasync__action_36_getstringasync_catch_36_3__catch -->|return| method_1rgphlw_getstringasync__action_38_getstringasync_return_38_4__return
|
||||
method_1rgphlw_getstringasync__action_38_getstringasync_return_38_4__return -->|return| method_1rgphlw_getstringasync__action_38_return_38__return
|
||||
method_1rgphlw_getstringasync__entry -->|next| method_1rgphlw_getstringasync__action_31_try_catch_31__linear
|
||||
```
|
||||
|
||||
### GetBoolAsync() Control Flow
|
||||
|
||||
_Warnings: diagram method_en9pi8_getboolasync__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 22 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_en9pi8_getboolasync__action_46_getboolasync_try_46_0__try("Begins protected execution")
|
||||
method_en9pi8_getboolasync__action_48_getboolasync_await_48_1__await[["Waits for async work"]]
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__condition{"string.IsNullOrEmpty(value)) return Result.Ok(defaultValue"}
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__false("continue")
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__merge("merge")
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__true("exit")
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__condition{"string.IsNullOrEmpty(value)"}
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__false("continue")
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__merge("merge")
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__true("return default")
|
||||
method_en9pi8_getboolasync__action_50_branch_50__condition{"bool.TryParse(value, out result)"}
|
||||
method_en9pi8_getboolasync__action_50_branch_50__false("use default")
|
||||
method_en9pi8_getboolasync__action_50_branch_50__merge("merge")
|
||||
method_en9pi8_getboolasync__action_50_branch_50__true("parsed bool")
|
||||
method_en9pi8_getboolasync__action_52_getboolasync_catch_52_4__catch("Handles exception path")
|
||||
method_en9pi8_getboolasync__action_52_try_catch_52__linear("Returns default on any exception")
|
||||
method_en9pi8_getboolasync__entry(["GetBoolAsync entry"])
|
||||
method_en9pi8_getboolasync__action_48_external_call_48__linear("Invoke JS localStorage.getItem")
|
||||
method_en9pi8_getboolasync__action_50_getboolasync_return_50_3__return(["Returns result"])
|
||||
method_en9pi8_getboolasync__action_54_getboolasync_return_54_5__return(["Returns result"])
|
||||
method_en9pi8_getboolasync__action_46_getboolasync_try_46_0__try -->|next| method_en9pi8_getboolasync__action_48_getboolasync_await_48_1__await
|
||||
method_en9pi8_getboolasync__action_48_external_call_48__linear -->|next| method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__condition
|
||||
method_en9pi8_getboolasync__action_48_getboolasync_await_48_1__await -->|next| method_en9pi8_getboolasync__action_48_external_call_48__linear
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__condition -->|continue| method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__false
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__condition -->|exit| method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__true
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__false -->|next| method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__merge
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__merge -->|next| method_en9pi8_getboolasync__action_49_guard_clause_49__condition
|
||||
method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__true -->|next| method_en9pi8_getboolasync__action_49_getboolasync_guard_clause_49_2__merge
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__condition -->|continue| method_en9pi8_getboolasync__action_49_guard_clause_49__false
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__condition -->|return default| method_en9pi8_getboolasync__action_49_guard_clause_49__true
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__false -->|next| method_en9pi8_getboolasync__action_49_guard_clause_49__merge
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__merge -->|next| method_en9pi8_getboolasync__action_50_branch_50__condition
|
||||
method_en9pi8_getboolasync__action_49_guard_clause_49__true -->|next| method_en9pi8_getboolasync__action_49_guard_clause_49__merge
|
||||
method_en9pi8_getboolasync__action_50_branch_50__condition -->|use default| method_en9pi8_getboolasync__action_50_branch_50__false
|
||||
method_en9pi8_getboolasync__action_50_branch_50__condition -->|parsed bool| method_en9pi8_getboolasync__action_50_branch_50__true
|
||||
method_en9pi8_getboolasync__action_50_branch_50__false -->|next| method_en9pi8_getboolasync__action_50_branch_50__merge
|
||||
method_en9pi8_getboolasync__action_50_branch_50__merge -->|return| method_en9pi8_getboolasync__action_50_getboolasync_return_50_3__return
|
||||
method_en9pi8_getboolasync__action_50_branch_50__true -->|next| method_en9pi8_getboolasync__action_50_branch_50__merge
|
||||
method_en9pi8_getboolasync__action_50_getboolasync_return_50_3__return -->|next| method_en9pi8_getboolasync__action_52_try_catch_52__linear
|
||||
method_en9pi8_getboolasync__action_52_getboolasync_catch_52_4__catch -->|return| method_en9pi8_getboolasync__action_54_getboolasync_return_54_5__return
|
||||
method_en9pi8_getboolasync__action_52_try_catch_52__linear -->|exception| method_en9pi8_getboolasync__action_52_getboolasync_catch_52_4__catch
|
||||
method_en9pi8_getboolasync__entry -->|next| method_en9pi8_getboolasync__action_46_getboolasync_try_46_0__try
|
||||
```
|
||||
|
||||
### RemoveAsync() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_17924up_removeasync__action_60_removeasync_try_60_0__try("Begins protected execution")
|
||||
method_17924up_removeasync__action_60_try_catch_60__linear("Wraps JS call with exception handling")
|
||||
method_17924up_removeasync__action_62_removeasync_await_62_1__await[["Waits for async work"]]
|
||||
method_17924up_removeasync__action_65_removeasync_catch_65_3__catch("catch Exception ex")
|
||||
method_17924up_removeasync__entry(["RemoveAsync entry"])
|
||||
method_17924up_removeasync__action_62_external_call_62__linear("Invoke JS localStorage.removeItem")
|
||||
method_17924up_removeasync__action_63_removeasync_return_63_2__return(["Returns result"])
|
||||
method_17924up_removeasync__action_63_return_63__return(["success"])
|
||||
method_17924up_removeasync__action_67_removeasync_return_67_4__return(["Returns result"])
|
||||
method_17924up_removeasync__action_67_return_67__return(["failure"])
|
||||
method_17924up_removeasync__action_60_removeasync_try_60_0__try -->|next| method_17924up_removeasync__action_62_removeasync_await_62_1__await
|
||||
method_17924up_removeasync__action_60_try_catch_60__linear -->|next| method_17924up_removeasync__action_60_removeasync_try_60_0__try
|
||||
method_17924up_removeasync__action_62_external_call_62__linear -->|return| method_17924up_removeasync__action_63_return_63__return
|
||||
method_17924up_removeasync__action_62_removeasync_await_62_1__await -->|next| method_17924up_removeasync__action_62_external_call_62__linear
|
||||
method_17924up_removeasync__action_63_removeasync_return_63_2__return -->|exception| method_17924up_removeasync__action_65_removeasync_catch_65_3__catch
|
||||
method_17924up_removeasync__action_63_return_63__return -->|return| method_17924up_removeasync__action_63_removeasync_return_63_2__return
|
||||
method_17924up_removeasync__action_65_removeasync_catch_65_3__catch -->|return| method_17924up_removeasync__action_67_removeasync_return_67_4__return
|
||||
method_17924up_removeasync__action_67_removeasync_return_67_4__return -->|return| method_17924up_removeasync__action_67_return_67__return
|
||||
method_17924up_removeasync__entry -->|next| method_17924up_removeasync__action_60_try_catch_60__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: control-flow: diagram method_en9pi8_getboolasync__fragment_diagram exceeds preferred complexity thresholds (20 nodes, 22 edges).
|
||||
@@ -0,0 +1,77 @@
|
||||
# _Imports
|
||||
|
||||
- File ID: file:1molfey:imports-razor
|
||||
- Path: NexusReader.UI.Shared/_Imports.razor
|
||||
- Role: config
|
||||
- Layer: frontend
|
||||
|
||||
## Purpose
|
||||
|
||||
Centralizes Razor @using directives for the NexusReader.UI.Shared Razor component library so components can share common namespaces (components, layout, services, application DTOs/queries, logging, and Blazor primitives).
|
||||
|
||||
## Key Details
|
||||
|
||||
A non-executable Razor import file (lines 1-21) that reduces per-component using clutter by exposing common namespaces to all Razor files in the UI.Shared project; no methods or types are declared here.
|
||||
|
||||
## Symbols
|
||||
|
||||
- No extracted symbols.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: System.Net.Http
|
||||
- dependency-target: System.Net.Http.Json
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Forms
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Routing
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Web
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Authorization
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Web.RenderMode (static)
|
||||
- dependency-target: Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
- dependency-target: Microsoft.JSInterop
|
||||
- dependency-target: NexusReader.UI.Shared
|
||||
- dependency-target: NexusReader.UI.Shared.Layout
|
||||
- dependency-target: Microsoft.AspNetCore.Authorization
|
||||
- dependency-target: NexusReader.UI.Shared.Components
|
||||
- dependency-target: NexusReader.UI.Shared.Components.Atoms
|
||||
- dependency-target: NexusReader.UI.Shared.Components.Molecules
|
||||
- dependency-target: NexusReader.UI.Shared.Components.Organisms
|
||||
- dependency-target: NexusReader.UI.Shared.Services
|
||||
- dependency-target: Microsoft.Extensions.Logging
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services
|
||||
- dependency-target: NexusReader.Application.DTOs.User
|
||||
- dependency-target: NexusReader.Application.Queries.Reader
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 0
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 0
|
||||
- Unresolved references: 21
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### _Imports Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1molfey_imports_razor("_Imports")
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
Reference in New Issue
Block a user