properly renders new responses
This commit is contained in:
@@ -62,6 +62,10 @@ button:active {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Response section styles */
|
/* Response section styles */
|
||||||
|
|
||||||
#responses {
|
#responses {
|
||||||
|
|||||||
10
src/App.js
10
src/App.js
@@ -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
18
src/components/GPT3.js
Normal 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;
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user