11import { ActiveState } from '../models/misc' ;
22import Exit from '../assets/exit.svg' ;
33import Input from '../components/Input' ;
4+ import React from 'react' ;
45
56function 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
153163export 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 {
0 commit comments