import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Avatar, Button, Menu, MenuPopover, MenuTrigger, PresenceBadge, Textarea } from '@fluentui/react-components'; import commonStore, { ModelStatus } from '../stores/commonStore'; import { observer } from 'mobx-react-lite'; import { v4 as uuid } from 'uuid'; import classnames from 'classnames'; import { fetchEventSource } from '@microsoft/fetch-event-source'; import { KebabHorizontalIcon, PencilIcon, SyncIcon, TrashIcon } from '@primer/octicons-react'; import { ConversationPair } from '../utils/get-conversation-pairs'; import logo from '../assets/images/logo.jpg'; import MarkdownRender from '../components/MarkdownRender'; import { ToolTipButton } from '../components/ToolTipButton'; import { ArrowCircleUp28Regular, Delete28Regular, RecordStop28Regular, Save28Regular } from '@fluentui/react-icons'; import { CopyButton } from '../components/CopyButton'; import { ReadButton } from '../components/ReadButton'; import { toast } from 'react-toastify'; import { WorkHeader } from '../components/WorkHeader'; import { DialogButton } from '../components/DialogButton'; import { OpenFileFolder, OpenSaveFileDialog } from '../../wailsjs/go/backend_golang/App'; import { toastWithButton } from '../utils'; export const userName = 'M E'; export const botName = 'A I'; export const welcomeUuid = 'welcome'; export enum MessageType { Normal, Error } export type Side = 'left' | 'right' export type Color = 'neutral' | 'brand' | 'colorful' export type MessageItem = { sender: string, type: MessageType, color: Color, avatarImg?: string, time: string, content: string, side: Side, done: boolean } export type Conversation = { [uuid: string]: MessageItem } let chatSseController: AbortController | null = null; const MoreUtilsButton: FC<{ uuid: string, setEditing: (editing: boolean) => void }> = observer(({ uuid, setEditing }) => { const { t } = useTranslation(); const [speaking, setSpeaking] = useState(false); const messageItem = commonStore.conversation[uuid]; return ; }); const ChatMessageItem: FC<{ uuid: string, onSubmit: (message: string | null, answerId: string | null, startUuid: string | null, endUuid: string | null, includeEndUuid: boolean) => void }> = observer(({ uuid, onSubmit }) => { const { t } = useTranslation(); const [editing, setEditing] = useState(false); const textareaRef = useRef(null); const messageItem = commonStore.conversation[uuid]; console.log(uuid); const setEditingInner = (editing: boolean) => { setEditing(editing); if (editing) { setTimeout(() => { const textarea = textareaRef.current; if (textarea) { textarea.focus(); textarea.selectionStart = textarea.value.length; textarea.selectionEnd = textarea.value.length; textarea.style.height = textarea.scrollHeight + 'px'; } }); } }; return
{ const utils = document.getElementById('utils-' + uuid); if (utils) utils.classList.remove('invisible'); }} onMouseLeave={() => { const utils = document.getElementById('utils-' + uuid); if (utils) utils.classList.add('invisible'); }} >
{!editing ? {messageItem.content} :