LANCommander/LANCommander.UI/Components/Chat/ChatMessageInput.razor
Pat Hartl e1c1469614 Fix chat component rendering
- Load thread after creation
- Change thread list from DataList to Flex
- Move unread badge to right side of chat thread list item
- Fix avatar rerendering after another message is added to message group
- Add styling to thread list
- Change message input to support markdown and add markdown rendering for message contents
2025-12-30 18:08:20 -06:00

75 lines
No EOL
1.9 KiB
Text

@using Microsoft.Extensions.Logging
@using EasyMDE.Blazor
@using LANCommander.SDK.Services
@namespace LANCommander.UI.Components
@inject ILogger<ChatMessageInput> Logger
@inject IChatClient ChatClient
<EasyMdeEditor
@bind-Value="_message"
InterceptKeys="_keys"
OnKey="HandleKey"
ReadOnly="_readonly"
Options="_options" />
@code {
[Parameter] public Guid? ThreadId { get; set; }
string _message = string.Empty;
bool _sendingMessage;
string _errorMessage = string.Empty;
FormValidateStatus _validateStatus => _hasError ? FormValidateStatus.Error : FormValidateStatus.Default;
bool _hasError => !string.IsNullOrWhiteSpace(_errorMessage);
EasyMdeReadOnly _readonly => _sendingMessage ? EasyMdeReadOnly.Disabled : EasyMdeReadOnly.Default;
readonly EasyMdeOptions _options = new()
{
MinHeight = "0px",
Toolbar = EasyMdeToolbar.Disabled,
Status = EasyMdeStatus.Disabled,
};
readonly EasyMdeKeyRegistration[] _keys =
[
new() { Key = "Enter", NotifyDotNet = true },
new() { Key = "Enter", Ctrl = true, NotifyDotNet = true }
];
async ValueTask<bool> HandleKey(EasyMdeKeyEvent e)
{
if (e.Ctrl && e.Key is "Enter")
return true; // allow newline
if (e.Key is "Enter")
await SendMessage();
return true;
}
async Task SendMessage()
{
if (_sendingMessage)
return;
_sendingMessage = true;
await InvokeAsync(StateHasChanged);
try
{
await ChatClient.SendMessageAsync(ThreadId.GetValueOrDefault(), _message);
_message = string.Empty;
}
catch (Exception ex)
{
Logger.LogError(ex, "Failure sending message");
}
finally
{
_sendingMessage = false;
await InvokeAsync(StateHasChanged);
}
}
}