import * as React from 'react'; import { Box, Button, Checkbox, IconButton, ListItem, Sheet, Typography, useTheme } from '@mui/joy'; import ClearIcon from '@mui/icons-material/Clear'; import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; import { DMessage } from '@/lib/stores/store-chats'; import { TokenBadge } from '@/components/util/TokenBadge'; import { makeAvatar, messageBackground } from '@/components/ChatMessage'; /** * Header bar for controlling the operations during the Selection mode */ export const MessagesSelectionHeader = (props: { hasSelected: boolean, isBottom: boolean, onClose: () => void, onSelectAll: (selected: boolean) => void, onDeleteMessages: () => void }) => props.onSelectAll(event.target.checked)} sx={{ minWidth: 24, justifyContent: 'center' }} /> Select All ; /** * Small representation of a ChatMessage, used when in selection mode * * Shall look similarly to the main ChatMessage, for consistency, but just allow a simple checkbox selection */ export function ChatMessageSelectable(props: { message: DMessage, isBottom: boolean, selected: boolean, onToggleSelected: (messageId: string, selected: boolean) => void }) { // external state const theme = useTheme(); const { id: messageId, text: messageText, sender: messageSender, avatar: messageAvatar, typing: messageTyping, role: messageRole, purposeId: messagePurposeId, // originLLM: messageModelId, tokenCount: messageTokenCount, updated: messageUpdated, } = props.message; const fromAssistant = messageRole === 'assistant'; const isAssistantError = fromAssistant && (messageText.startsWith('[Issue] ') || messageText.startsWith('[OpenAI Issue]')); const background = messageBackground(theme, messageRole, !!messageUpdated, isAssistantError); const avatarEl: JSX.Element | null = React.useMemo(() => makeAvatar(messageAvatar, messageRole, messagePurposeId, messageSender, messageTyping, 'sm'), [messageAvatar, messagePurposeId, messageRole, messageSender, messageTyping], ); const handleCheckedChange = (event: React.ChangeEvent) => props.onToggleSelected(messageId, event.target.checked); return ( button': { opacity: 1 }, }}> {avatarEl} {messageRole} {messageText} ); }