Skip to content

Commit

Permalink
feat: close #2449 edit / insert / delete messages modal
Browse files Browse the repository at this point in the history
  • Loading branch information
Yidadaa committed Jul 20, 2023
1 parent e5f6133 commit 7c2fa9f
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 110 deletions.
19 changes: 18 additions & 1 deletion app/components/chat.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,28 @@
}

.context-prompt {
.context-prompt-insert {
display: flex;
justify-content: center;
padding: 4px;
opacity: 0.2;
transition: all ease 0.3s;
background-color: rgba(0, 0, 0, 0);
cursor: pointer;
border-radius: 4px;
margin-top: 4px;
margin-bottom: 4px;

&:hover {
opacity: 1;
background-color: rgba(0, 0, 0, 0.05);
}
}

.context-prompt-row {
display: flex;
justify-content: center;
width: 100%;
margin-bottom: 10px;

&:hover {
.context-drag {
Expand Down
108 changes: 79 additions & 29 deletions app/components/chat.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import SettingsIcon from "../icons/chat-settings.svg";
import DeleteIcon from "../icons/clear.svg";
import PinIcon from "../icons/pin.svg";
import EditIcon from "../icons/rename.svg";
import ConfirmIcon from "../icons/confirm.svg";
import CancelIcon from "../icons/cancel.svg";

import LightIcon from "../icons/light.svg";
import DarkIcon from "../icons/dark.svg";
Expand Down Expand Up @@ -63,6 +65,7 @@ import { IconButton } from "./button";
import styles from "./chat.module.scss";

import {
List,
ListItem,
Modal,
Selector,
Expand All @@ -73,7 +76,7 @@ import {
import { useLocation, useNavigate } from "react-router-dom";
import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant";
import { Avatar } from "./emoji";
import { MaskAvatar, MaskConfig } from "./mask";
import { ContextPrompts, MaskAvatar, MaskConfig } from "./mask";
import { useMaskStore } from "../store/mask";
import { ChatCommandPrefix, useChatCommand, useCommand } from "../command";
import { prettyObject } from "../utils/format";
Expand Down Expand Up @@ -520,6 +523,68 @@ export function ChatActions(props: {
);
}

export function EditMessageModal(props: { onClose: () => void }) {
const chatStore = useChatStore();
const session = chatStore.currentSession();
const [messages, setMessages] = useState(session.messages.slice());

return (
<div className="modal-mask">
<Modal
title={Locale.UI.Edit}
onClose={props.onClose}
actions={[
<IconButton
text={Locale.UI.Cancel}
icon={<CancelIcon />}
key="cancel"
onClick={() => {
props.onClose();
}}
/>,
<IconButton
type="primary"
text={Locale.UI.Confirm}
icon={<ConfirmIcon />}
key="ok"
onClick={() => {
chatStore.updateCurrentSession(
(session) => (session.messages = messages),
);
props.onClose();
}}
/>,
]}
>
<List>
<ListItem
title={Locale.Chat.EditMessage.Topic.Title}
subTitle={Locale.Chat.EditMessage.Topic.SubTitle}
>
<input
type="text"
value={session.topic}
onInput={(e) =>
chatStore.updateCurrentSession(
(session) => (session.topic = e.currentTarget.value),
)
}
></input>
</ListItem>
</List>
<ContextPrompts
context={messages}
updateContext={(updater) => {
const newMessages = messages.slice();
updater(newMessages);
setMessages(newMessages);
}}
/>
</Modal>
</div>
);
}

export function Chat() {
type RenderMessage = ChatMessage & { preview?: boolean };

Expand Down Expand Up @@ -710,22 +775,6 @@ export function Chat() {
}
};

const findLastUserIndex = (messageId: string) => {
// find last user input message
let lastUserMessageIndex: number | null = null;
for (let i = 0; i < session.messages.length; i += 1) {
const message = session.messages[i];
if (message.role === "user") {
lastUserMessageIndex = i;
}
if (message.id === messageId) {
break;
}
}

return lastUserMessageIndex;
};

const deleteMessage = (msgId?: string) => {
chatStore.updateCurrentSession(
(session) =>
Expand Down Expand Up @@ -859,16 +908,6 @@ export function Chat() {

const [showPromptModal, setShowPromptModal] = useState(false);

const renameSession = () => {
showPrompt(Locale.Chat.Rename, session.topic).then((newTopic) => {
if (newTopic && newTopic !== session.topic) {
chatStore.updateCurrentSession(
(session) => (session.topic = newTopic!),
);
}
});
};

const clientConfig = useMemo(() => getClientConfig(), []);

const location = useLocation();
Expand Down Expand Up @@ -919,6 +958,9 @@ export function Chat() {
},
});

// edit / insert message modal
const [isEditingMessage, setIsEditingMessage] = useState(false);

return (
<div className={styles.chat} key={session.id}>
<div className="window-header" data-tauri-drag-region>
Expand All @@ -938,7 +980,7 @@ export function Chat() {
<div className={`window-header-title ${styles["chat-body-title"]}`}>
<div
className={`window-header-main-title ${styles["chat-body-main-title"]}`}
onClickCapture={renameSession}
onClickCapture={() => setIsEditingMessage(true)}
>
{!session.topic ? DEFAULT_TOPIC : session.topic}
</div>
Expand All @@ -952,7 +994,7 @@ export function Chat() {
<IconButton
icon={<RenameIcon />}
bordered
onClick={renameSession}
onClick={() => setIsEditingMessage(true)}
/>
</div>
)}
Expand Down Expand Up @@ -1170,6 +1212,14 @@ export function Chat() {
{showExport && (
<ExportMessageModal onClose={() => setShowExport(false)} />
)}

{isEditingMessage && (
<EditMessageModal
onClose={() => {
setIsEditingMessage(false);
}}
/>
)}
</div>
);
}
Loading

0 comments on commit 7c2fa9f

Please sign in to comment.