Skip to content

Commit 9deb5ad

Browse files
authored
Merge pull request #1435 from mas-who/fix-add-prompt-modal
Improve UX for adding and editing prompts in the settings page
2 parents edc81d8 + f6e9f90 commit 9deb5ad

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

frontend/src/components/Dropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ function Dropdown({
140140
: option.description
141141
}`}
142142
</span>
143-
{showEdit && onEdit && (
143+
{showEdit && onEdit && option.type !== 'public' && (
144144
<img
145145
src={Edit}
146146
alt="Edit"

frontend/src/preferences/PromptsModal.tsx

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ActiveState } from '../models/misc';
22
import Exit from '../assets/exit.svg';
33
import Input from '../components/Input';
4+
import React from 'react';
45

56
function AddPrompt({
67
setModalState,
@@ -9,20 +10,24 @@ function AddPrompt({
910
setNewPromptName,
1011
newPromptContent,
1112
setNewPromptContent,
13+
disableSave,
1214
}: {
1315
setModalState: (state: ActiveState) => void;
1416
handleAddPrompt?: () => void;
1517
newPromptName: string;
1618
setNewPromptName: (name: string) => void;
1719
newPromptContent: string;
1820
setNewPromptContent: (content: string) => void;
21+
disableSave: boolean;
1922
}) {
2023
return (
2124
<div className="relative">
2225
<button
2326
className="absolute top-3 right-4 m-2 w-3"
2427
onClick={() => {
2528
setModalState('INACTIVE');
29+
setNewPromptName('');
30+
setNewPromptContent('');
2631
}}
2732
>
2833
<img className="filter dark:invert" src={Exit} />
@@ -41,7 +46,7 @@ function AddPrompt({
4146
className="h-10 rounded-lg"
4247
value={newPromptName}
4348
onChange={(e) => setNewPromptName(e.target.value)}
44-
></Input>
49+
/>
4550
<div className="relative bottom-12 left-3 mt-[-3.00px]">
4651
<span className="bg-white px-1 text-xs text-silver dark:bg-outer-space dark:text-silver">
4752
Prompt Name
@@ -62,6 +67,8 @@ function AddPrompt({
6267
<button
6368
onClick={handleAddPrompt}
6469
className="rounded-3xl bg-purple-30 px-5 py-2 text-sm text-white transition-all hover:opacity-90"
70+
disabled={disableSave}
71+
title={disableSave && newPromptName ? 'Name already exists' : ''}
6572
>
6673
Save
6774
</button>
@@ -79,6 +86,7 @@ function EditPrompt({
7986
editPromptContent,
8087
setEditPromptContent,
8188
currentPromptEdit,
89+
disableSave,
8290
}: {
8391
setModalState: (state: ActiveState) => void;
8492
handleEditPrompt?: (id: string, type: string) => void;
@@ -87,6 +95,7 @@ function EditPrompt({
8795
editPromptContent: string;
8896
setEditPromptContent: (content: string) => void;
8997
currentPromptEdit: { name: string; id: string; type: string };
98+
disableSave: boolean;
9099
}) {
91100
return (
92101
<div className="relative">
@@ -140,7 +149,8 @@ function EditPrompt({
140149
handleEditPrompt &&
141150
handleEditPrompt(currentPromptEdit.id, currentPromptEdit.type);
142151
}}
143-
disabled={currentPromptEdit.type === 'public'}
152+
disabled={currentPromptEdit.type === 'public' || disableSave}
153+
title={disableSave && editPromptName ? 'Name already exists' : ''}
144154
>
145155
Save
146156
</button>
@@ -151,6 +161,7 @@ function EditPrompt({
151161
}
152162

153163
export default function PromptsModal({
164+
existingPrompts,
154165
modalState,
155166
setModalState,
156167
type,
@@ -166,6 +177,7 @@ export default function PromptsModal({
166177
handleAddPrompt,
167178
handleEditPrompt,
168179
}: {
180+
existingPrompts: { name: string; id: string; type: string }[];
169181
modalState: ActiveState;
170182
setModalState: (state: ActiveState) => void;
171183
type: 'ADD' | 'EDIT';
@@ -181,6 +193,25 @@ export default function PromptsModal({
181193
handleAddPrompt?: () => void;
182194
handleEditPrompt?: (id: string, type: string) => void;
183195
}) {
196+
const [disableSave, setDisableSave] = React.useState(true);
197+
const handlePrompNameChange = (edit: boolean, newName: string) => {
198+
const nameExists = existingPrompts.find(
199+
(prompt) => newName === prompt.name,
200+
);
201+
202+
if (newName && !nameExists) {
203+
setDisableSave(false);
204+
} else {
205+
setDisableSave(true);
206+
}
207+
208+
if (edit) {
209+
setEditPromptName(newName);
210+
} else {
211+
setNewPromptName(newName);
212+
}
213+
};
214+
184215
let view;
185216

186217
if (type === 'ADD') {
@@ -189,9 +220,10 @@ export default function PromptsModal({
189220
setModalState={setModalState}
190221
handleAddPrompt={handleAddPrompt}
191222
newPromptName={newPromptName}
192-
setNewPromptName={setNewPromptName}
223+
setNewPromptName={handlePrompNameChange.bind(null, false)}
193224
newPromptContent={newPromptContent}
194225
setNewPromptContent={setNewPromptContent}
226+
disableSave={disableSave}
195227
/>
196228
);
197229
} else if (type === 'EDIT') {
@@ -200,10 +232,11 @@ export default function PromptsModal({
200232
setModalState={setModalState}
201233
handleEditPrompt={handleEditPrompt}
202234
editPromptName={editPromptName}
203-
setEditPromptName={setEditPromptName}
235+
setEditPromptName={handlePrompNameChange.bind(null, true)}
204236
editPromptContent={editPromptContent}
205237
setEditPromptContent={setEditPromptContent}
206238
currentPromptEdit={currentPromptEdit}
239+
disableSave={disableSave}
207240
/>
208241
);
209242
} else {

frontend/src/settings/Prompts.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export default function Prompts({
5858
}
5959
setModalState('INACTIVE');
6060
onSelectPrompt(newPromptName, newPrompt.id, newPromptContent);
61-
setNewPromptName(newPromptName);
61+
setNewPromptName('');
62+
setNewPromptContent('');
6263
} catch (error) {
6364
console.error(error);
6465
}
@@ -178,6 +179,7 @@ export default function Prompts({
178179
</div>
179180
</div>
180181
<PromptsModal
182+
existingPrompts={prompts}
181183
type={modalType}
182184
modalState={modalState}
183185
setModalState={setModalState}

0 commit comments

Comments
 (0)