Learn How to Build a React Mini Chat GPT App
Table of Contents
- Introduction
- Creating a Mini Chartability App on React
- Project Setup with Vite
- Adding Bootstrap for Styling
- Creating the Header Component
- Creating the Char Component
- Creating the Prompt Component
- Handling Form Submission and API Call
- Displaying the Response
- Adding a Loading Indicator
- Conclusion
Introduction
In this tutorial, we will learn how to Create a mini Chartability app using React. We will be building a simple web application that allows users to ask questions and receive responses using the Chart GPT API. Although it is generally recommended to use backend technologies to securely handle API calls, we will be bypassing this requirement for the purpose of this tutorial.
Creating a Mini Chartability App on React
To get started, we will use Vite to set up our React project quickly and efficiently. Vite is a fast and modern build tool that enables us to create React applications with ease. In this tutorial, we will be using Vite's "react-ts" template to scaffold our project.
Project Setup with Vite
Before we can begin developing our Chartability app, we need to set up our project using Vite. To do this, we will follow these steps:
-
Install Vite globally by running the following command in your terminal:
npm install -g create-vite
-
Initialize a new Vite project using the following command:
create-vite my-chartability-app --template react-ts
-
Change into the project directory:
cd my-chartability-app
-
Install the project dependencies:
npm install
Adding Bootstrap for Styling
Next, we will add Bootstrap to our project to simplify the styling process. Bootstrap is a popular CSS framework that provides a variety of pre-defined styles and components. By leveraging Bootstrap, we can achieve a clean and professional look for our Chartability app without having to write extensive CSS code.
To add Bootstrap, we will follow these steps:
-
Install the react-bootstrap Package:
npm install react-bootstrap
-
Import the necessary Bootstrap components into our project. This can be done by adding the following import statements at the top of your App.tsx file:
import 'bootstrap/dist/css/bootstrap.min.css';
import { Navbar } from 'react-bootstrap';
-
Use the imported Bootstrap components within your application. For example, you can replace the default Contents of the App.tsx file with the following code:
import React from 'react';
import { Navbar } from 'react-bootstrap';
function App() {
return (
<Navbar bg="primary" variant="dark">
<Navbar.Brand href="#home">Chartability App</Navbar.Brand>
</Navbar>
);
}
export default App;
Creating the Header Component
One of the key components in our Chartability app is the header component, which will display the title of our application. To create the header component, we will follow these steps:
-
Create a new folder called "components" within our project directory.
-
Inside the "components" folder, create another folder called "layout".
-
Inside the "layout" folder, create a new file called "Header.tsx".
-
In the "Header.tsx" file, import the necessary dependencies:
import React from 'react';
import { Navbar } from 'react-bootstrap';
-
Define the "Header" component:
function Header() {
return (
<Navbar bg="primary" variant="dark">
<Navbar.Brand href="#home">Chartability App</Navbar.Brand>
</Navbar>
);
}
-
Export the "Header" component as the default export:
export default Header;
Now that we have created the Header component, we can import and use it in our App.tsx file to render our application's header.
Creating the Char Component
Next, we will create the Char component, which will be responsible for handling user input and making API calls to retrieve responses from the Chart GPT API. To create the Char component, we will follow these steps:
-
Inside the "components" folder, create a new file called "Char.tsx".
-
In the "Char.tsx" file, import the necessary dependencies:
import React, { useState } from 'react';
import { Form, Button } from 'react-bootstrap';
-
Define the "Char" component:
function Char() {
const [prompt, setPrompt] = useState('');
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
// Make API call and handle response
};
return (
<div className="container">
<Form onSubmit={handleSubmit}>
<Form.Group controlId="prompt">
<Form.Label>Ask a question:</Form.Label>
<Form.Control type="text" value={prompt} onChange={(e) => setPrompt(e.target.value)} />
</Form.Group>
<Button variant="primary" type="submit">
Submit
</Button>
</Form>
</div>
);
}
-
Export the "Char" component as the default export:
export default Char;
Now that we have created the Char component, we can import and use it in our App.tsx file to render the user input form.
Creating the Prompt Component
The Prompt component will be responsible for displaying the prompt entered by the user and handling the submission of the form. To create the Prompt component, we will follow these steps:
-
Inside the "components" folder, create a new file called "Prompt.tsx".
-
In the "Prompt.tsx" file, import the necessary dependencies:
import React from 'react';
import { Form, Button } from 'react-bootstrap';
-
Define the "Prompt" component:
interface PromptProps {
onSubmit: (input: string) => void;
}
function Prompt({ onSubmit }: PromptProps) {
const [prompt, setPrompt] = useState('');
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
onSubmit(prompt);
};
return (
<div className="container">
<Form onSubmit={handleSubmit}>
<Form.Group controlId="prompt">
<Form.Label>Ask a question:</Form.Label>
<Form.Control type="text" value={prompt} onChange={(e) => setPrompt(e.target.value)} />
</Form.Group>
<Button variant="primary" type="submit">
Submit
</Button>
</Form>
</div>
);
}
-
Export the "Prompt" component as the default export:
export default Prompt;
Now that we have created the Prompt component, we can import and use it in our Char component to render the user input form.
Handling Form Submission and API Call
In order to handle the submission of the form and make an API call to retrieve a response from the Chart GPT API, we will follow these steps:
-
Import the necessary dependencies in the Char component:
import React, { useState } from 'react';
import { Form, Button } from 'react-bootstrap';
import { getResponse } from '../services/ChartGptService';
-
Define the "Char" component and its state variables:
function Char() {
const [prompt, setPrompt] = useState('');
const [response, setResponse] = useState('');
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setResponse('');
try {
const data = await getResponse(prompt);
if (data.choices && data.choices.length > 0) {
setResponse(data.choices[0].message.content);
} else {
setResponse('No response received. Please try again.');
}
} catch (error) {
setResponse('An error occurred. Please try again.');
}
setPrompt('');
};
return (
<div className="container">
// User input form goes here
// Display response goes here
</div>
);
}
-
Implement the necessary API call function in the ChartGptService file:
import exos from 'exos';
export async function getResponse(prompt: string) {
const body = {
prompt: {
content: prompt,
'char-level-temperature': 0.8,
},
};
const headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${import.meta.env.VITE_CHART_GPT_KEY}`,
};
const response = await exos.post('https://api.openai.com/v1/engines/chart-gpt-3.5-turbo/completions', {
body,
headers,
});
return response.data.choices[0];
}
Now, when a user submits a prompt through the Char component, the form will call the handleSubmit
function. This function will make an API call to the Chart GPT API using the getResponse
function from the ChartGptService file. The response from the API call is then stored in the response
state variable to be displayed to the user.
Displaying the Response
To display the response from the Chart GPT API, we will add a new component called Response. This component will take the response as a prop and display it to the user. Here are the steps to create the Response component:
-
Inside the "components" folder, create a new file called "Response.tsx".
-
In the "Response.tsx" file, import the necessary dependencies:
import React from 'react';
-
Define the "Response" component:
interface ResponseProps {
response: string;
}
function Response({ response }: ResponseProps) {
return (
<div className="container">
<p>Response: {response}</p>
</div>
);
}
export default Response;
Now that we have created the Response component, we can import and use it in our Char component to display the response to the user.
Adding a Loading Indicator
To enhance the user experience, we can add a loading indicator to indicate that the app is processing the user's request. We will accomplish this by adding a "busy" state variable to the Char component and conditionally rendering the loading indicator Based on the value of this variable.
-
Add the following state variable to the Char component:
const [busy, setBusy] = useState(false);
-
Update the handleSubmit function to set the "busy" state variable:
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setBusy(true);
setResponse('');
try {
// Make API call and handle response
} catch (error) {
// Handle error
}
setPrompt('');
setBusy(false);
};
-
Conditionally render the loading indicator in the Char component:
{busy ? (
<div className="text-center">
<Spinner animation="border" role="status">
<span className="sr-only">Loading...</span>
</Spinner>
</div>
) : (
// Render form and response components here
)}
Now, when a user submits a prompt, the loading indicator will be displayed until a response is received or an error occurs.
Conclusion
We have successfully created a mini Chartability app using React. The app allows users to ask questions and receive responses using the Chart GPT API. We have learned how to set up a React project with Vite, integrate Bootstrap for styling, create reusable components, handle form submission and API calls, and display responses to the user. The app also includes a loading indicator to enhance the user experience. Feel free to explore and expand upon the functionality of the app based on your specific needs.
Highlights
- Created a mini Chartability app using React without backend technologies
- Utilized Vite for fast project setup
- Integrated Bootstrap for Simplified styling
- Developed reusable components for user input, API calls, and response display
- Implemented loading indicator for a better user experience
FAQ
Q: Why did we bypass backend technologies for this app?
A: This tutorial focused on the frontend implementation of the app for educational purposes. In a production environment, it is recommended to use backend technologies to securely handle API calls and keep the API key protected.
Q: Can this app be easily expanded with additional features?
A: Yes, the app's modular architecture allows for easy addition of new components and functionality. You can customize the prompts and responses, add more user input fields, and further enhance the UI/UX.
Q: What other AI models can be integrated into this app?
A: With proper integration and access tokens, you can utilize other OpenAI models, such as Codex or DALL-E, to extend the app's capabilities and provide more interactive experiences. Remember to review the model documentation and API guidelines to understand their specific usage instructions.