diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss index 822e0fb7..54f1dae5 100644 --- a/app/components/chat.module.scss +++ b/app/components/chat.module.scss @@ -279,19 +279,22 @@ min-width: 0; &:hover { - min-width: 300px; + min-width: 330px; .chat-message-actions { height: 40px; opacity: 1; transform: translateY(0px); + + .chat-message-action-date { + opacity: 0.3; + } } } .chat-message-actions { display: flex; width: 100%; - padding-top: 5px; box-sizing: border-box; font-size: 12px; align-items: flex-end; @@ -304,7 +307,7 @@ .chat-message-action-date { color: var(--black); - opacity: 0.3; + opacity: 0; } } @@ -323,8 +326,6 @@ padding-top: 10px; box-sizing: border-box; flex-direction: column; - border-top-left-radius: 10px; - border-top-right-radius: 10px; border-top: var(--border-in-light); box-shadow: var(--card-shadow); } diff --git a/app/components/chat.tsx b/app/components/chat.tsx index b959585a..279addf6 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -22,6 +22,7 @@ import ResetIcon from "../icons/reload.svg"; import BreakIcon from "../icons/break.svg"; import SettingsIcon from "../icons/chat-settings.svg"; import DeleteIcon from "../icons/clear.svg"; +import PinIcon from "../icons/pin.svg"; import LightIcon from "../icons/light.svg"; import DarkIcon from "../icons/dark.svg"; @@ -60,7 +61,7 @@ import Locale from "../locales"; import { IconButton } from "./button"; import styles from "./chat.module.scss"; -import { ListItem, Modal } from "./ui-lib"; +import { ListItem, Modal, showToast } from "./ui-lib"; import { useLocation, useNavigate } from "react-router-dom"; import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant"; import { Avatar } from "./emoji"; @@ -696,6 +697,24 @@ export function Chat() { inputRef.current?.focus(); }; + const onPinMessage = (botMessage: ChatMessage) => { + if (!botMessage.id) return; + const userMessageIndex = findLastUserIndex(botMessage.id); + if (!userMessageIndex) return; + + const userMessage = session.messages[userMessageIndex]; + chatStore.updateCurrentSession((session) => + session.mask.context.push(userMessage, botMessage), + ); + + showToast(Locale.Chat.Actions.PinToastContent, { + text: Locale.Chat.Actions.PinToastAction, + onClick: () => { + setShowPromptModal(true); + }, + }); + }; + const context: RenderMessage[] = session.mask.hideContext ? [] : session.mask.context.slice(); @@ -922,6 +941,12 @@ export function Chat() { icon={} onClick={() => onResend(message.id ?? i)} /> + + } + onClick={() => onPinMessage(message)} + /> )} diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 14ee7ec9..b8161d44 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -25,6 +25,9 @@ const cn = { Copy: "复制", Stop: "停止", Retry: "重试", + Pin: "固定", + PinToastContent: "已将 2 条对话固定至预设提示词", + PinToastAction: "查看", Delete: "删除", }, Commands: { diff --git a/app/locales/en.ts b/app/locales/en.ts index 1659ddb1..e0ccd1f7 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -26,6 +26,9 @@ const en: LocaleType = { Copy: "Copy", Stop: "Stop", Retry: "Retry", + Pin: "Pin", + PinToastContent: "Pinned 2 messages to contextual prompts", + PinToastAction: "View", Delete: "Delete", }, Commands: {