|
@@ -106,6 +106,59 @@ export function MaskConfig(props: {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+function ContextPromptItem(props: {
|
|
|
+ prompt: Message;
|
|
|
+ update: (prompt: Message) => void;
|
|
|
+ remove: () => void;
|
|
|
+}) {
|
|
|
+ const [focusingInput, setFocusingInput] = useState(false);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div className={chatStyle["context-prompt-row"]}>
|
|
|
+ {!focusingInput && (
|
|
|
+ <select
|
|
|
+ value={props.prompt.role}
|
|
|
+ className={chatStyle["context-role"]}
|
|
|
+ onChange={(e) =>
|
|
|
+ props.update({
|
|
|
+ ...props.prompt,
|
|
|
+ role: e.target.value as any,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ >
|
|
|
+ {ROLES.map((r) => (
|
|
|
+ <option key={r} value={r}>
|
|
|
+ {r}
|
|
|
+ </option>
|
|
|
+ ))}
|
|
|
+ </select>
|
|
|
+ )}
|
|
|
+ <Input
|
|
|
+ value={props.prompt.content}
|
|
|
+ type="text"
|
|
|
+ className={chatStyle["context-content"]}
|
|
|
+ rows={focusingInput ? 5 : 1}
|
|
|
+ onFocus={() => setFocusingInput(true)}
|
|
|
+ onBlur={() => setFocusingInput(false)}
|
|
|
+ onInput={(e) =>
|
|
|
+ props.update({
|
|
|
+ ...props.prompt,
|
|
|
+ content: e.currentTarget.value as any,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ />
|
|
|
+ {!focusingInput && (
|
|
|
+ <IconButton
|
|
|
+ icon={<DeleteIcon />}
|
|
|
+ className={chatStyle["context-delete-button"]}
|
|
|
+ onClick={() => props.remove()}
|
|
|
+ bordered
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
export function ContextPrompts(props: {
|
|
|
context: Message[];
|
|
|
updateContext: (updater: (context: Message[]) => void) => void;
|
|
@@ -128,42 +181,12 @@ export function ContextPrompts(props: {
|
|
|
<>
|
|
|
<div className={chatStyle["context-prompt"]} style={{ marginBottom: 20 }}>
|
|
|
{context.map((c, i) => (
|
|
|
- <div className={chatStyle["context-prompt-row"]} key={i}>
|
|
|
- <select
|
|
|
- value={c.role}
|
|
|
- className={chatStyle["context-role"]}
|
|
|
- onChange={(e) =>
|
|
|
- updateContextPrompt(i, {
|
|
|
- ...c,
|
|
|
- role: e.target.value as any,
|
|
|
- })
|
|
|
- }
|
|
|
- >
|
|
|
- {ROLES.map((r) => (
|
|
|
- <option key={r} value={r}>
|
|
|
- {r}
|
|
|
- </option>
|
|
|
- ))}
|
|
|
- </select>
|
|
|
- <Input
|
|
|
- value={c.content}
|
|
|
- type="text"
|
|
|
- className={chatStyle["context-content"]}
|
|
|
- rows={1}
|
|
|
- onInput={(e) =>
|
|
|
- updateContextPrompt(i, {
|
|
|
- ...c,
|
|
|
- content: e.currentTarget.value as any,
|
|
|
- })
|
|
|
- }
|
|
|
- />
|
|
|
- <IconButton
|
|
|
- icon={<DeleteIcon />}
|
|
|
- className={chatStyle["context-delete-button"]}
|
|
|
- onClick={() => removeContextPrompt(i)}
|
|
|
- bordered
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <ContextPromptItem
|
|
|
+ key={i}
|
|
|
+ prompt={c}
|
|
|
+ update={(prompt) => updateContextPrompt(i, prompt)}
|
|
|
+ remove={() => removeContextPrompt(i)}
|
|
|
+ />
|
|
|
))}
|
|
|
|
|
|
<div className={chatStyle["context-prompt-row"]}>
|