LANCommander/LANCommander.UI/Components/Chat/ChatMessageInput.razor
2026-01-02 02:10:42 -06:00

76 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"
Class="chat-message-input"
InterceptKeys="_keys"
OnKey="HandleKey"
ReadOnly="_sendingMessage"
Placeholder="@Placeholder"
Options="_options" />
@code {
[Parameter] public Guid? ThreadId { get; set; }
[Parameter] public string? Placeholder { get; set; }
string _message = string.Empty;
bool _sendingMessage;
string _errorMessage = string.Empty;
FormValidateStatus _validateStatus => _hasError ? FormValidateStatus.Error : FormValidateStatus.Default;
bool _hasError => !string.IsNullOrWhiteSpace(_errorMessage);
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);
}
}
}