< Summary

Information
Class: UIBlazor.Components.ChatMessageView
Assembly: UIBlazor
File(s): /home/runner/work/InvAit/InvAit/UIBlazor/Components/ChatMessageView.razor
Tag: 14_22728831704
Line coverage
0%
Covered lines: 0
Uncovered lines: 52
Coverable lines: 52
Total lines: 151
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 66
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Message()100%210%
get_UserAvatarText()100%210%
get_IsLoading()100%210%
get_IsLast()100%210%
get_OnToolApproval()100%210%
get_OnExecutePlan()100%210%
get_OnEdit()100%210%
get_OnCancelEdit()100%210%
get_OnSaveEdit()100%210%
get_OnDelete()100%210%
get_OnRegenerate()100%210%
.ctor()100%210%
ShouldRender()0%600240%
OnParametersSet()100%210%

File(s)

/home/runner/work/InvAit/InvAit/UIBlazor/Components/ChatMessageView.razor

#LineLine coverage
 1@using UIBlazor.Constants
 2@using UIBlazor.Models
 3@using UIBlazor.Components.Chat
 4
 5<div class="rz-chat-message rz-chat-message-@Message.Role" @key="Message.Id">
 6    <RadzenStack class="rz-chat-message-avatar" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Ga
 7        <span class="rz-chat-avatar-initials" >
 08            @if (Message.Role == ChatMessageRole.User)
 9            {
 010                @UserAvatarText
 11            }
 012            else if (Message.Role == ChatMessageRole.Assistant)
 13            {
 14                <RadzenIcon Icon="robot_2" IconStyle="IconStyle.Info" />
 15            }
 016            else if (Message.Role == ChatMessageRole.Tool)
 17            {
 18                <RadzenIcon Icon="design_services" />
 19            }
 20        </span>
 21    </RadzenStack>
 22    <RadzenStack Orientation="Orientation.Vertical" AlignItems="@(Message.Role == ChatMessageRole.User ? AlignItems.End 
 23        <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="@(Message.Role 
 24            <div class="rz-chat-message-time">
 025                @Message.Timestamp.ToString("HH:mm")
 26            </div>
 027            @if (Message.Model != null)
 28            {
 029                <div class="rz-chat-message-time"> @Message.Model </div>
 30            }
 31        </RadzenStack>
 32            <div class="rz-chat-message-text" style="display: grid; width: 100%; position: relative;">
 33                <div class="message-content-wrapper @(Message.IsExpanded ? "expanded" : "collapsed")"
 34                     style="grid-area: 1/1; opacity: @(Message.IsEditing ? 0 : 1); visibility: @(Message.IsEditing ? "hi
 35
 36                    <AiChatMessage Message="@Message" OnToolApproval="@OnToolApproval" />
 37
 038                    @if (Message.HasPlan)
 39                    {
 40                        <div class="plan-box rz-p-3 rz-mt-2 rz-mb-2" style="border: 1px solid var(--rz-primary-light); b
 41                            <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" Gap="0.5rem
 42                                <RadzenIcon Icon="assignment" IconStyle="IconStyle.Primary" />
 043                                <RadzenText TextStyle="TextStyle.Subtitle2" Style="margin: 0; color: var(--rz-primary-li
 44                            </RadzenStack>
 45                            <MarkdownBlock Content="@Message.PlanContent" />
 046                            @if (!IsLoading)
 47                            {
 48                                <RadzenButton Text="@SharedResource.ExecutePlan" Icon="play_arrow" ButtonStyle="ButtonSt
 049                                             Click="@(() => OnExecutePlan.InvokeAsync(Message))" class="rz-mt-2" />
 50                            }
 51                        </div>
 52                    }
 53                </div>
 54
 055                @if (!Message.IsEditing && !Message.IsExpanded && !Message.IsStreaming)
 56                {
 57                    <RadzenButton Text="@SharedResource.ShowMore" Icon="expand_more" ButtonStyle="ButtonStyle.Light" Siz
 058                                 class="show-more-button rz-align-self-center" Click="@(() => Message.IsExpanded = true)
 59                }
 60
 061                @if (Message.IsEditing)
 62                {
 63                    <div style="grid-area: 1/1; display: flex; flex-direction: column; width: 100%; height: 100%;">
 64                        <RadzenTextArea @bind-Value="@Message.TempContent" AutoSize="true" Style="width: 100%; min-heigh
 65                        <RadzenStack Orientation="Orientation.Horizontal" Gap="0.5rem" JustifyContent="JustifyContent.En
 066                            <RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Size="ButtonSize.Small" Click="@(
 067                            <RadzenButton Icon="check" ButtonStyle="ButtonStyle.Primary" Size="ButtonSize.Small" Click="
 68                        </RadzenStack>
 69                    </div>
 70                }
 71
 072                @if (Message.IsStreaming)
 73                {
 74                    <RadzenIcon Icon="more_horiz" class="rz-chat-message-streaming-icon" />
 75                }
 76
 077                @if (Message.IsRetrying)
 78                {
 79                    <div class="retry-countdown" style="margin-top: 0.5rem; color: var(--rz-warning); font-size: 0.85rem
 80                        <RadzenIcon Icon="autorenew" class="rz-spin" Style="font-size: 1rem;" />
 081                        <span>@SharedResource.RetryIn @Message.RetryCountdown... (@Message.RetryAttempt / @Message.MaxRe
 82                    </div>
 83                }
 84            </div>
 85
 86        <!-- Message Actions -->
 087        @if (!Message.IsStreaming && !Message.IsEditing)
 88        {
 89            <RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.End" Gap="0.25rem" class="r
 90                <RadzenButton Icon="edit" Variant="Variant.Text" ButtonStyle="ButtonStyle.Base" Size="ButtonSize.ExtraSm
 091                              Click="@(() => OnEdit.InvokeAsync(Message))" Title="@SharedResource.MessageEdit" />
 92                <RadzenButton Icon="delete" Variant="Variant.Text" ButtonStyle="ButtonStyle.Base" Size="ButtonSize.Extra
 093                              Click="@(() => OnDelete.InvokeAsync(Message))" Title="@SharedResource.MessageDelete" />
 094                @if (!IsLoading && IsLast && Message.Role == ChatMessageRole.Assistant)
 95                {
 96                    <RadzenButton Icon="refresh" Variant="Variant.Text" ButtonStyle="ButtonStyle.Base" Size="ButtonSize.
 97                                  Click="@OnRegenerate" Title="@SharedResource.MessageRegenerate" />
 98                }
 99            </RadzenStack>
 100        }
 101    </RadzenStack>
 102</div>
 103
 104@code {
 0105    [Parameter] public VisualChatMessage Message { get; set; } = null!;
 0106    [Parameter] public string UserAvatarText { get; set; } = "U"; // TODO сделать что-то поинтереснее
 0107    [Parameter] public bool IsLoading { get; set; }
 0108    [Parameter] public bool IsLast { get; set; }
 0109    [Parameter] public EventCallback<(string MessageId, string SegmentId, bool Approved)> OnToolApproval { get; set; }
 0110    [Parameter] public EventCallback<VisualChatMessage> OnExecutePlan { get; set; }
 0111    [Parameter] public EventCallback<VisualChatMessage> OnEdit { get; set; }
 0112    [Parameter] public EventCallback<VisualChatMessage> OnCancelEdit { get; set; }
 0113    [Parameter] public EventCallback<VisualChatMessage> OnSaveEdit { get; set; }
 0114    [Parameter] public EventCallback<VisualChatMessage> OnDelete { get; set; }
 0115    [Parameter] public EventCallback OnRegenerate { get; set; }
 116
 117    private bool _oldIsStreaming;
 118    private bool _oldIsEditing;
 119    private bool _oldIsLast;
 120    private bool _oldIsLoading;
 121    private bool _oldIsExpanded;
 122    private int _oldRetryCountdown;
 0123    private string _oldContent = string.Empty;
 124
 125    protected override bool ShouldRender()
 126    {
 0127        if (Message.IsStreaming || _oldIsStreaming ||
 0128            Message.IsRetrying || _oldRetryCountdown != Message.RetryCountdown ||
 0129            Message.IsEditing || _oldIsEditing ||
 0130            IsLast || _oldIsLast != IsLast ||
 0131            IsLoading || _oldIsLoading != IsLoading ||
 0132            Message.IsExpanded != _oldIsExpanded ||
 0133            Message.Content != _oldContent)
 134        {
 0135            return true;
 136        }
 137
 0138        return false;
 139    }
 140
 141    protected override void OnParametersSet()
 142    {
 0143        _oldIsStreaming = Message.IsStreaming;
 0144        _oldIsEditing = Message.IsEditing;
 0145        _oldIsLast = IsLast;
 0146        _oldIsLoading = IsLoading;
 0147        _oldIsExpanded = Message.IsExpanded;
 0148        _oldRetryCountdown = Message.RetryCountdown;
 0149        _oldContent = Message.Content;
 0150    }
 151}