import React, { FC, useState } from 'react'; import { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd'; import commonStore from '../../stores/commonStore'; import { Preset } from './PresetsButton'; import { observer } from 'mobx-react-lite'; import { v4 as uuid } from 'uuid'; import { Button, Card, Dropdown, Option, Textarea } from '@fluentui/react-components'; import { useTranslation } from 'react-i18next'; import { ToolTipButton } from '../../components/ToolTipButton'; import { Delete20Regular, ReOrderDotsVertical20Regular } from '@fluentui/react-icons'; import { ConversationMessage, Role } from '../Chat'; type Item = { id: string; role: Role; content: string; } const getItems = (messages: ConversationMessage[]) => messages.map((message, index) => ({ id: uuid(), role: message.role, content: message.content })) as Item[]; const reorder = (list: Item[], startIndex: number, endIndex: number) => { const result = Array.from(list); const [removed] = result.splice(startIndex, 1); result.splice(endIndex, 0, removed); return result; }; export const MessagesEditor: FC = observer(() => { const { t } = useTranslation(); const editingPreset = commonStore.editingPreset!; const setEditingPreset = (newParams: Partial) => { commonStore.setEditingPreset({ ...editingPreset, ...newParams }); }; const [items, setItems] = useState(getItems(editingPreset.messages)); const updateItems = (items: Item[]) => { setEditingPreset({ messages: items.map(item => ({ role: item.role, content: item.content })) }); setItems(items); }; const onDragEnd = (result: DropResult) => { if (!result.destination) { return; } const newItems = reorder( items, result.source.index, result.destination.index ); updateItems(newItems); }; const createNewItem = () => { const newItems: Item[] = [...items, { id: uuid(), role: 'assistant', content: '' }]; updateItems(newItems); }; const deleteItem = (id: string) => { const newItems: Item[] = items.filter(item => item.id !== id); updateItems(newItems); }; return (
{(provided, snapshot) => (
{items.map((item, index) => ( {(provided, snapshot) => (
{ if (data.optionValue) { items[index] = { ...item, role: data.optionValue as Role }; updateItems([...items]); } }}> {/* TODO */} } onClick={() => { deleteItem(item.id); }} />
)}
))} {provided.placeholder}
)}
); });