LANCommander/LANCommander.UI/Components/Chat/ChatThread.razor
2026-01-03 23:22:25 -06:00

55 lines
No EOL
1.8 KiB
Text

@using System.Collections.Specialized
@using LANCommander.SDK.Services
@using Microsoft.AspNetCore.Components.Web.Virtualization
@inject IChatClient ChatClient
@namespace LANCommander.UI.Components
<Flex Direction="FlexDirection.Vertical" Class="chat-thread">
<Flex Direction="FlexDirection.Vertical" Class="chat-thread-messages">
@if (_thread != null)
{
<InfiniteLoader
T="SDK.Models.ChatMessage"
KeySelector="g => g.Id.ToString()"
Loader="LoadMessages"
PageSize="10">
<ChatMessage Id="context.Id" Content="@context.Content" SentOn="context.SentOn" />
</InfiniteLoader>
}
</Flex>
<ChatMessageInput ThreadId="@Id" Placeholder="@($"Message {_thread?.Title}")" />
</Flex>
@code {
[Parameter] public Guid? Id { get; set; }
SDK.Models.ChatThread? _thread;
protected override async Task OnParametersSetAsync()
{
if ((_thread == null || _thread.Id != Id) && Id.HasValue)
{
_thread = await ChatClient.GetThreadAsync(Id.Value);
_thread.MessageGroups.CollectionChanged += MessageGroupsOnCollectionChanged;
await ChatClient.GetMessagesAsync(Id.Value, null, 10);
}
}
void MessageGroupsOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
=> InvokeAsync(StateHasChanged);
async Task<InfiniteLoadResponse<SDK.Models.ChatMessage>> LoadMessages(SDK.Models.ChatMessage cursor, int pageSize)
{
var messages = await ChatClient.GetMessagesAsync(Id.Value, cursor, pageSize);
return new InfiniteLoadResponse<SDK.Models.ChatMessage>()
{
Items = messages,
HasMore = true,
};
}
}