From 495aa3c795e7ec58978693da41411d5714ae3927 Mon Sep 17 00:00:00 2001 From: ktutak1337 Date: Wed, 22 May 2024 07:54:25 +0200 Subject: [PATCH] Code(WEB::AssistantForm): Add AssistantForm component --- .../Components/Assistants/AssistantForm.razor | 101 ++++++++++++++++++ .../Components/Assistants/AssistantItem.razor | 9 +- .../Assistants/AssistantsDrawer.razor | 50 ++++++--- .../Models/Assistant.cs | 15 +++ .../StellarChat.Client.Web/_Imports.razor | 2 + 5 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 src/Client/StellarChat.Client.Web/Components/Assistants/AssistantForm.razor create mode 100644 src/Client/StellarChat.Client.Web/Models/Assistant.cs diff --git a/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantForm.razor b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantForm.razor new file mode 100644 index 0000000..63d6b00 --- /dev/null +++ b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantForm.razor @@ -0,0 +1,101 @@ +@inject NavigationManager _navigationManager +@inject IAssistantService _assistantService + + + +
+ Name + + + Description + + + Avatar +
+ + + + + + + Change + + + + +
+ Max file size: 5MB. Accepted formats: JPG, PNG, GIF + + Model + + @foreach (var model in AvailableModels) + { + + } + + + Metaprompt + +
+
+ Save +
+
+ +@code +{ + [Parameter] public Guid AssistantId { get; set; } + private Assistant? Assistant { get; set; } = new(); + private List AvailableModels { get; set; } = new() { "gpt-4", "gpt-3.5-turbo" }; + + private const string assistantBehaviorGuidelines = @" +Enter the Metaprompt here. This set of instructions will define your assistant's behavior +in every conversation, guiding how it interacts and responds. Keep it concise, clear, and +reflective of the assistant's intended personality and capabilities."; + + + private bool success; + + protected async override Task OnParametersSetAsync() + { + await PopulateForm(); + } + + private void OnValidSubmit(EditContext context) + { + success = true; + StateHasChanged(); + } + + private async Task PopulateForm() + { + if (Guid.Empty != AssistantId) + { + var assistant = await _assistantService.GetAssistant(AssistantId); + + if (assistant is not null) + { + var (id, name, metaprompt, description, avatarUrl, defaultModel, defaultVoice, isDefault, createdAt, updatedAt) = assistant; + + Assistant = new Assistant + { + Id = id, + Name = name, + Metaprompt = metaprompt, + Description = description, + // TODO: temp solution + AvatarUrl = "https://th.bing.com/th/id/OIG3.PYK1.ctv1ceJsoR9RZxZ?w=270&h=270&c=6&r=0&o=5&dpr=1.1&pid=ImgGn", + DefaultModel = defaultModel, + DefaultVoice = defaultVoice, + IsDefault = isDefault, + CreatedAt = createdAt, + UpdatedAt = updatedAt + }; + } + } + } +} diff --git a/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantItem.razor b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantItem.razor index a87fbbf..ccd106d 100644 --- a/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantItem.razor +++ b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantItem.razor @@ -11,7 +11,7 @@ Set as default - Edit + Edit Delete @@ -19,18 +19,19 @@ -@code +@code { [Parameter] public AssistantResponse? Assistant { get; set; } + [Parameter] public EventCallback OnEdit { get; set; } private async Task SetDefaultAssitant() { await Task.CompletedTask; } - private async Task EditAssistant() + private async Task EditAssistant(Guid id) { - await Task.CompletedTask; + await OnEdit.InvokeAsync(id); } private async Task DeleteAssistant() diff --git a/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantsDrawer.razor b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantsDrawer.razor index e0c0dbc..1e7f917 100644 --- a/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantsDrawer.razor +++ b/src/Client/StellarChat.Client.Web/Components/Assistants/AssistantsDrawer.razor @@ -2,18 +2,34 @@ - - Select or Manage Assistants - - - - - - @foreach (var assistant in Assistants) - { - - } - + @if (isEditing) + { + + Edit Assistant + + + +
+ + +
+ } + else + { + + Select or Manage Assistants + + + + + + @foreach (var assistant in Assistants) + { + + } + + }
@@ -28,6 +44,9 @@ [CascadingParameter] private bool _IsDarkModeEnabled { get; set; } + private bool isEditing = false; + private Guid selectedAssistantId; + public List Assistants { get; set; } = new(); protected override async Task OnInitializedAsync() @@ -44,6 +63,13 @@ private void CloseDrawer() { IsOpen = false; + isEditing = false; IsOpenChanged.InvokeAsync(IsOpen); } + + private void EditAssistant(Guid id) + { + selectedAssistantId = id; + isEditing = true; + } } diff --git a/src/Client/StellarChat.Client.Web/Models/Assistant.cs b/src/Client/StellarChat.Client.Web/Models/Assistant.cs new file mode 100644 index 0000000..30c9fe0 --- /dev/null +++ b/src/Client/StellarChat.Client.Web/Models/Assistant.cs @@ -0,0 +1,15 @@ +namespace StellarChat.Client.Web.Models; + +public class Assistant +{ + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Metaprompt { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string AvatarUrl { get; set; } = string.Empty; + public string DefaultModel { get; set; } = string.Empty; + public string DefaultVoice { get; set; } = string.Empty; + public bool IsDefault { get; set; } + public DateTimeOffset CreatedAt { get; set; } + public DateTimeOffset UpdatedAt { get; set; } +} diff --git a/src/Client/StellarChat.Client.Web/_Imports.razor b/src/Client/StellarChat.Client.Web/_Imports.razor index 338cd40..2fdbb60 100644 --- a/src/Client/StellarChat.Client.Web/_Imports.razor +++ b/src/Client/StellarChat.Client.Web/_Imports.razor @@ -18,3 +18,5 @@ @using StellarChat.Client.Web.Services.Chat @using StellarChat.Client.Web.Models @using StellarChat.Client.Web.State +@using System.Text.RegularExpressions +@using System.ComponentModel.DataAnnotations