properly renders new responses

This commit is contained in:
Mikayla Dobson
2022-05-18 08:43:45 -05:00
parent 8c27801158
commit 2f81a88b03
5 changed files with 68 additions and 52 deletions

View File

@@ -62,6 +62,10 @@ button:active {
flex-direction: column; flex-direction: column;
} }
select {
border-radius: 5px;
}
/* Response section styles */ /* Response section styles */
#responses { #responses {

View File

@@ -1,4 +1,4 @@
import { useCallback, useState, useRef, useEffect } from "react"; import { useCallback, useState, useRef } from "react";
import ResponseSection from './components/ResponseSection'; import ResponseSection from './components/ResponseSection';
import './App.css'; import './App.css';
import SubmitSection from "./components/SubmitSection"; import SubmitSection from "./components/SubmitSection";
@@ -7,7 +7,7 @@ function App() {
const [userInput, setUserInput] = useState(''); const [userInput, setUserInput] = useState('');
const [response, setResponse] = useState(null); const [response, setResponse] = useState(null);
const responseRef = useRef(null); const responseRef = useRef();
const promptCallback = useCallback((userPrompt) => { const promptCallback = useCallback((userPrompt) => {
setUserInput(userPrompt); setUserInput(userPrompt);
@@ -17,10 +17,6 @@ function App() {
setResponse(APIresponse); setResponse(APIresponse);
}, []); }, []);
useEffect(() => {
response && responseRef.current();
}, [response]);
return ( return (
<div className="App"> <div className="App">
<h1 id="page-title">Fun with AI</h1> <h1 id="page-title">Fun with AI</h1>
@@ -33,7 +29,7 @@ function App() {
</section> </section>
<SubmitSection userInput={userInput} promptCallback={promptCallback} responseCallback={responseCallback} /> <SubmitSection userInput={userInput} promptCallback={promptCallback} responseCallback={responseCallback} />
<ResponseSection responseRef={responseRef} userInput={userInput} response={response} /> <ResponseSection userInput={userInput} response={response} responseRef={responseRef} />
</div> </div>
); );
} }

18
src/components/GPT3.js Normal file
View File

@@ -0,0 +1,18 @@
export const getResponse = async (input) => {
let data = { prompt: input };
let response = await fetch("https://api.openai.com/v1/engines/text-curie-001/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.REACT_APP_API_SECRET}`
},
body: JSON.stringify(data)
}).then(res => res.json());
console.log(response);
let text = response.choices[0].text;
return text;
}

View File

@@ -1,42 +1,47 @@
import { useEffect, useState } from "react"; import { useState, useEffect } from "react";
export default function ResponseSection({ userInput, response, responseRef }) { export default function ResponseSection({ userInput, response, responseRef }) {
const [resCount, setResCount] = useState(1); const [resCount, setResCount] = useState(1);
const [contents, setContents] = useState([]);
const [responseToRender, setResponseToRender] = useState(null);
const [contents, setContents] = useState([ useEffect(() => {
response && setResponseToRender(response);
}, [response]);
useEffect(() => {
if (responseToRender) {
setContents((prev) => {
return [
<div key={`response-${resCount+1}`} className="single-response-block">
<p className="response-component label prompt-label">Prompt:</p>
<p className="response-component prompt">{userInput}</p>
<p className="response-component label response-label">Response:</p>
<p className="response-component response">{responseToRender}</p>
</div>,
...prev]
});
setResCount(resCount + 1);
setResponseToRender(null);
}
}, [responseToRender, contents, resCount, userInput]);
useEffect(() => {
console.log(contents);
}, [contents]);
return (
<section id="responses">
<h2>Responses</h2>
<div className="contents">
{contents.length > 0 ? contents : null}
<div key="response-1" className="single-response-block"> <div key="response-1" className="single-response-block">
<p className="response-component label prompt-label">Prompt:</p> <p className="response-component label prompt-label">Prompt:</p>
<p className="response-component prompt">Your prompt will appear here...</p> <p className="response-component prompt">Your prompt will appear here...</p>
<p className="response-component label response-label">Response:</p> <p className="response-component label response-label">Response:</p>
<p className="response-component response">... and the AI response will appear here!</p> <p className="response-component response">... and the AI response will appear here!</p>
</div> </div>
]);
const appendResponse = () => {
let newState = contents;
let newCount;
response && (newCount = setContents(newState.unshift(
<div key={`response-${resCount+1}`} className="single-response-block">
<p className="response-component label prompt-label">Prompt:</p>
<p className="response-component prompt">{userInput}</p>
<p className="response-component label response-label">Response:</p>
<p className="response-component response">{response}</p>
</div> </div>
)));
setResCount(newCount);
console.log(contents);
}
useEffect(() => {
responseRef.current = appendResponse;
}, []);
return (
<section id="responses">
<h2>Responses</h2>
{contents}
</section> </section>
) );
} }

View File

@@ -1,16 +1,9 @@
export default function SubmitSection({ promptCallback, userInput, responseCallback }) { import { getResponse } from "./GPT3.js";
const getResponse = async () => {
let data = { prompt: userInput };
await fetch("https://api.openai.com/v1/engines/text-curie-001/completions", { export default function SubmitSection({ promptCallback, userInput, responseCallback }) {
method: "POST", const createNewEntry = async () => {
headers: { if (!userInput) return;
"Content-Type": "application/json", await getResponse(userInput).then((x) => responseCallback(x));
Authorization: `Bearer ${process.env.REACT_APP_API_SECRET}`
},
body: JSON.stringify(data)
}).then(res => res.json())
.then(x => responseCallback(x.choices[0].text));
} }
return ( return (
@@ -24,7 +17,7 @@ export default function SubmitSection({ promptCallback, userInput, responseCallb
<option value="Tell me a good joke.">Tell me a good joke.</option> <option value="Tell me a good joke.">Tell me a good joke.</option>
</select> </select>
</div> </div>
<button onClick={getResponse}>Submit</button> <button onClick={createNewEntry}>Submit</button>
</div> </div>
) )
} }