import { HandThumbDownIcon, HandThumbUpIcon, } from "@heroicons/react/24/outline"; import { ChatHistoryItem } from "../../shims/typings"; import { stripImages } from "../../shims/utils"; import { useState } from "react"; import { useSelector } from "react-redux"; import styled from "styled-components"; import { defaultBorderRadius, lightGray, vscBackground, vscInputBackground, } from ".."; import { RootState } from "../../redux/store"; import { getFontSize } from "../../util"; import { postToIde } from "../../util/ide"; import HeaderButtonWithText from "../HeaderButtonWithText"; import StyledMarkdownPreview from "../markdown/StyledMarkdownPreview"; interface StepContainerProps { item: ChatHistoryItem; onReverse: () => void; onUserInput: (input: string) => void; onRetry: () => void; onDelete: () => void; open: boolean; isFirst: boolean; isLast: boolean; index: number; } // #region styled components const ButtonsDiv = styled.div` display: flex; gap: 2px; align-items: center; background-color: ${vscBackground}; box-shadow: 1px 1px 10px ${vscBackground}; border-radius: ${defaultBorderRadius}; z-index: 100; position: absolute; right: 8px; top: 16px; height: 0; `; const ContentDiv = styled.div<{ isUserInput: boolean; fontSize?: number }>` padding: 2px; padding-right: 0px; background-color: ${(props) => props.isUserInput ? vscInputBackground : vscBackground}; font-size: ${(props) => props.fontSize || getFontSize()}px; border-radius: ${defaultBorderRadius}; overflow: hidden; `; // #endregion function StepContainer(props: StepContainerProps) { const [isHovered, setIsHovered] = useState(false); const isUserInput = props.item.message.role === "user"; const active = useSelector((store: RootState) => store.state.active); const [feedback, setFeedback] = useState(undefined); const sendFeedback = (feedback: boolean) => { setFeedback(feedback); if (props.item.promptLogs?.length) { for (const [prompt, completion] of props.item.promptLogs) { postToIde("devdata/log", { tableName: "chat", data: { prompt, completion, feedback }, }); } } }; return (
{ setIsHovered(true); }} onMouseLeave={() => { setIsHovered(false); }} >
{(isHovered || typeof feedback !== "undefined") && !active && (
{feedback === false || ( { sendFeedback(true); }} /> )} {feedback === true || ( { sendFeedback(false); }} /> )}
)}
); } export default StepContainer;