여기서 기능 기획을 했던 것 처럼
Create {countVariable} {subject} related variable names with {namingConvention}
이런 식으로 변수화 시켜서 prompt
변수에 할당할 것이다! 자연스레 저 변수들을 버튼으로 만들어 값을 넣을 것이다!
이제 버튼 메뉴 및 주제별로 값을 받는 걸 구현하려고 한다.
저 변수들을 상태로 만들어야겠지? 그러니 3개의 상태를 만들고 inputValue
를 없애보자!
import { useState } from "react";
import { QueryClient, QueryClientProvider } from "react-query";
import { ReactQueryDevtools } from "react-query/devtools";
import { ChatResponse } from "./ChatResponse";
const queryClient = new QueryClient();
export default function PromptInput() {
// const [inputValue, setInputValue] = useState("");
const [promptValue, setPromptValue] = useState<string>("");
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
queryClient.invalidateQueries("chatResponse");
setPromptValue(
`Create ${countVariable} ${subject} related variable names with ${namingConvention}`
);
// if (inputValue !== "") {
// setPromptValue(inputValue);
// }
};
return (
<QueryClientProvider client={queryClient}>
<form onSubmit={handleSubmit}>
{/* <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> */}
<button type="submit">Submit</button>
</form>
{/* <ChatResponse prompt={`Create 10 게시판 related variable names with camelCase`} /> */}
{promptValue && <ChatResponse prompt={promptValue} />}
<ReactQueryDevtools />
</QueryClientProvider>
);
}
input을 없애고, Create ${countVariable} ${subject} related variable names with ${namingConvention}
를 넣었다.
3개 상태를 제작하겠다! countVariable
, subject
, namingConvention
를 state로 만들어보자!
// import문 동일
type CountVariable = 5 | 10 | 20;
type NamingConvention = "camelCase" | "PascalCase" | "snake_case";
export default function PromptInput() {
// const [inputValue, setInputValue] = useState("");
const [countVariable, setCountVariable] = useState<CountVariable>(5);
const [subject, setSubject] = useState<string>("");
const [namingConvention, setNamingConvention] = useState<NamingConvention>("");
const [promptValue, setPromptValue] = useState<string>("");
// 동일
이렇게 말이다! type
선언자로 들어갈 값을 먼저 설정했고, 각각 맞는 상태를 만들었다.
handleChange
관련 함수를 만들어보았다.
// 동일
const handleCountChange = (e: ChangeEvent<HTMLSelectElement>) => {
setCountVariable(parseInt(e.target.value) as CountVariable);
};
const handleSubjectChange = (e: ChangeEvent<HTMLInputElement>) => {
setSubject(e.target.value);
};
const handleNamingConventionChange = (e: ChangeEvent<HTMLSelectElement>) => {
setNamingConvention(e.target.value as NamingConvention);
};
// 동일
이거 하는데 좀 오래 걸렸다. 망할 타입 ㅋㅋㅋㅋ 특히 setCountVariable
부분 할 때인데 그냥 네이밍컨벤션과 똑같이 했는데 오류가 생겼다.
'string' 형식을 'CountVariable' 형식으로 변환한 작업은 실수일 수 있습니다. 두 형식이 서로 충분히 겹치지 않기 때문입니다. 의도적으로 변환한 경우에는 먼저 'unknown'으로 식을 변환합니다.
처음에 이걸 보고 unknown
도 같이 단언해야하나? 이게 맞나? 싶었다. 그렇게 하니깐 되긴 됐기도 했고 말이다. 근데 아무리 봐도 as unknown as CountVariable
이 모양이 아닌 거 같았다. 구글링한 결과 그냥 countVariable
변수 자체의 타입이 균일하게 들어오지 않을 수도 있어서 오류가 뜨는 것이다. 실제로 string
값이 들어오기도 했고, 그래서 parseInt
를 써서 타입을 고정시켰다.
return (
<QueryClientProvider client={queryClient}>
<form onSubmit={handleSubmit}>
{/* <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> */}
<label>
Number of Variables:
<select value={countVariable} onChange={handleCountChange}>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
</select>
</label>
<br />
<label>
Subject:
<input type="text" value={subject} onChange={handleSubjectChange} />
</label>
<br />
<label>
Naming Convention:
<select value={namingConvention} onChange={handleNamingConventionChange}>
<option value="camelCase">camelCase</option>
<option value="PascalCase">PascalCase</option>
<option value="snake_case">snake_case</option>
</select>
</label>
<br />
<button type="submit">Submit</button>
</form>
{/* <ChatResponse prompt={`Create 10 게시판 related variable names with camelCase`} /> */}
{promptValue && <ChatResponse prompt={promptValue} />}
<ReactQueryDevtools />
</QueryClientProvider>
);
}
일단 임시로 되게 조악하게 했다. 드롭다운 메뉴를 구현하고 싶어서 select
및 option
태그를 작성했고, subject
는 input
태그로 직접 입력하게 했다.
여기서 아쉬운 점은 간편하게 클릭으로만 끝내고 싶은데 subject
자체가 input
으로만 하는 거 같아 아쉬웠다. 나중에 디자인 완성되고 나면 모달창으로 연 다음 버튼 식으로도 구현 해볼 것이다.
디자인 없어서 이상하긴 하지만 쨌든 저기서 값을 넣고 Submit 버튼을 누르면?
이렇게 되면 끝이다! 은근 오래 걸렸다! 이제 저 메뉴들을 디자인 하고, 결과값도 예쁘게 나오게 디자인해보겠다.. 디자인이 오래 걸리고 귀찮더라 나는 ;;
오 이제 거의 완성하셨네요 수고하셨어요!