1+ import { Settings } from "../types" ;
2+
3+ import {
4+ Dialog ,
5+ DialogClose ,
6+ DialogContent ,
7+ DialogFooter ,
8+ DialogHeader ,
9+ DialogTitle ,
10+ DialogTrigger ,
11+ } from "./ui/dialog" ;
12+ import { Label } from "./ui/label" ;
13+ import { Textarea } from "./ui/textarea" ;
14+ import { Input } from "./ui/input" ;
15+ import { useContext , useState } from 'react' ;
16+ import { promptContext , PromptType } from '../contexts/PromptContext'
17+ import { GeneratedCodeConfig } from '../types'
18+ import { cloneDeep } from "lodash" ;
19+ import { FaTrashAlt , FaHammer } from "react-icons/fa" ;
20+ import classNames from "classnames" ;
21+ import { useEffect } from "react" ;
22+ import { toast } from "react-hot-toast" ;
23+ import {
24+ Select ,
25+ SelectContent ,
26+ SelectGroup ,
27+ SelectItem ,
28+ SelectLabel ,
29+ SelectTrigger ,
30+ SelectValue ,
31+ } from "./ui/select"
32+ import { TechnologyStackList } from './OutputSettingsSection' ;
33+
34+ interface Props {
35+ settings : Settings ;
36+ setSettings : ( newState : Settings ) => void ; }
37+
38+ function PromptPanel ( { settings, setSettings} : Props ) {
39+ const [ selectedId , setSelectedId ] = useState < string > ( '' ) ;
40+ const { promptList, addPrompt, getPromptById, removePrompt } = useContext ( promptContext ) ;
41+ const initPrompt = {
42+ id : '' ,
43+ name : '' ,
44+ des : '' ,
45+ imgUrl : '' ,
46+ prompt : '' ,
47+ type : GeneratedCodeConfig . REACT_ANTD
48+ }
49+ const [ prompt , setPrompt ] = useState < PromptType > ( cloneDeep ( initPrompt ) ) ;
50+ const [ showDialog , setShowDialog ] = useState < boolean > ( false ) ;
51+
52+ async function addPromptHanler ( ) {
53+ // generatedCodeConfig: "react_tailwind"
54+ prompt . type = settings && settings . generatedCodeConfig ;
55+ if ( ! prompt . prompt ) {
56+ toast . error ( 'enter prompt' )
57+ return ;
58+ }
59+ addPrompt ( prompt ) ;
60+ setPrompt ( cloneDeep ( initPrompt ) ) ;
61+ }
62+
63+ useEffect ( ( ) => {
64+ if ( selectedId ) {
65+ const prompt = getPromptById ( selectedId ) ;
66+ setSettings ( {
67+ ...settings ,
68+ promptCode : prompt ? prompt . prompt : '' ,
69+ } ) ;
70+ } else {
71+ setSettings ( {
72+ ...settings ,
73+ promptCode : '' ,
74+ } ) ;
75+ }
76+ } , [ selectedId ] ) ;
77+
78+ useEffect ( ( ) => {
79+ setSettings ( {
80+ ...settings ,
81+ promptCode : '' ,
82+ } ) ;
83+
84+ setSelectedId ( '' ) ;
85+
86+ } , [ settings ?. generatedCodeConfig ] ) ;
87+
88+ const updatePromptHandler = ( e : any , id : string ) => {
89+ e . stopPropagation ( ) ;
90+ setShowDialog ( true ) ;
91+ const prompt = getPromptById ( id ) ;
92+ prompt && setPrompt ( prompt ) ;
93+ }
94+
95+ return (
96+ < div className = "bg-white shadow-lg rounded-lg p-4 flex flex-col hover:ring ring-black relative border-dashed border-2 border-gray-300" >
97+ < div className = "rounded-lg flex justify-center items-center w-full h-full" >
98+ < Dialog open = { showDialog } onOpenChange = { setShowDialog } >
99+ < DialogTrigger
100+ className = "w-full h-full"
101+ onClick = { ( ) => {
102+ setPrompt ( cloneDeep ( initPrompt ) ) ;
103+ } }
104+ >
105+ < div >
106+ + Add own template
107+ </ div >
108+ </ DialogTrigger >
109+ < DialogContent >
110+ < DialogHeader >
111+ < DialogTitle className = "mb-4" > template</ DialogTitle >
112+ </ DialogHeader >
113+ < div className = "flex flex-col space-y-4" >
114+ < Label htmlFor = "" >
115+ < div > stack</ div >
116+ </ Label >
117+ < Select defaultValue = { GeneratedCodeConfig . HTML_TAILWIND } >
118+ < SelectTrigger className = "w-[180px]" >
119+ < SelectValue placeholder = "Select a stack" />
120+ </ SelectTrigger >
121+ < SelectContent >
122+ < SelectGroup >
123+ < SelectLabel > stack</ SelectLabel >
124+ { TechnologyStackList . map ( ( stack ) => {
125+ return (
126+ < SelectItem value = { stack . label } > { stack . value } </ SelectItem >
127+ )
128+ } ) }
129+ </ SelectGroup >
130+ </ SelectContent >
131+ </ Select >
132+ </ div >
133+ < div className = "flex flex-col space-y-4" >
134+ < Label htmlFor = "inputcode" >
135+ < div > input code</ div >
136+ </ Label >
137+ < Textarea
138+ id = "inputcode"
139+ placeholder = "inputcode"
140+ value = { prompt . prompt }
141+ onChange = { ( e ) => {
142+ setPrompt ( ( s ) => ( {
143+ ...s ,
144+ prompt : e . target . value ,
145+ } ) ) ;
146+ } }
147+ > </ Textarea >
148+ </ div >
149+ < div className = "flex flex-col space-y-4" >
150+ < Label htmlFor = "name" >
151+ < div > name</ div >
152+ </ Label >
153+ < Input
154+ id = "name"
155+ placeholder = "name"
156+ value = { prompt . name }
157+ onChange = { ( e ) => {
158+ setPrompt ( ( s ) => ( {
159+ ...s ,
160+ name : e . target . value ,
161+ } ) ) ;
162+ } }
163+ />
164+ </ div >
165+ < div className = "flex flex-col space-y-4" >
166+ < Label htmlFor = "des" >
167+ < div > des</ div >
168+ </ Label >
169+ < Input
170+ id = "des"
171+ placeholder = "des"
172+ value = { prompt . des }
173+ onChange = { ( e ) => {
174+ setPrompt ( ( s ) => ( {
175+ ...s ,
176+ des : e . target . value ,
177+ } ) ) ;
178+ } }
179+ />
180+ </ div >
181+ < div className = "flex flex-col space-y-4" >
182+ < Label htmlFor = "img-url" >
183+ < div > image url</ div >
184+ </ Label >
185+ < Input
186+ id = "img-url"
187+ placeholder = "img url"
188+ value = { prompt . imgUrl }
189+ onChange = { ( e ) => {
190+ setPrompt ( ( s ) => ( {
191+ ...s ,
192+ imgUrl : e . target . value ,
193+ } ) ) ;
194+ } }
195+ />
196+ </ div >
197+ < DialogFooter >
198+ < DialogClose onClick = { addPromptHanler } > Save</ DialogClose >
199+ </ DialogFooter >
200+ </ DialogContent >
201+ </ Dialog >
202+ </ div >
203+ </ div >
204+ )
205+ }
206+
207+ export default PromptPanel ;
0 commit comments