Web-based AI Art Generator React, JavaScript, AI
👤 Sharing: AI
```javascript
import React, { useState, useRef } from 'react';
import './App.css'; // Optional: You can create a basic CSS file
function App() {
const [prompt, setPrompt] = useState('');
const [imageUrl, setImageUrl] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
const imageRef = useRef(null);
const generateImage = async () => {
setLoading(true);
setError('');
setImageUrl(''); // Clear previous image
try {
// IMPORTANT: Replace with your actual AI API endpoint and API key
const apiKey = 'YOUR_AI_API_KEY'; // Make sure to keep API keys secure!
const apiUrl = 'YOUR_AI_API_ENDPOINT'; // Replace with your actual API endpoint (e.g., DALL-E, Stable Diffusion, etc.)
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`, // If your API requires authorization
},
body: JSON.stringify({ prompt: prompt }),
});
if (!response.ok) {
const errorData = await response.json(); // Try to get more specific error details
throw new Error(`API error: ${response.status} - ${errorData?.error || response.statusText}`);
}
const data = await response.json();
// Check the data structure returned by your specific AI API
// The below assumes the API returns an object with an 'imageUrl' property
if (data && data.imageUrl) {
setImageUrl(data.imageUrl);
} else if (data && data.data && data.data[0] && data.data[0].url) {
// Handle the case where the API response is in the OpenAI / DALL-E format.
setImageUrl(data.data[0].url);
}
else {
throw new Error('Invalid API response: Image URL not found.');
}
} catch (err) {
console.error('Error generating image:', err);
setError(err.message);
} finally {
setLoading(false);
}
};
const downloadImage = () => {
if (imageUrl && imageRef.current) {
const link = document.createElement('a');
link.href = imageUrl;
link.download = 'generated_image.png'; // You can customize the filename
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
return (
<div className="App">
<h1>AI Image Generator</h1>
<div className="input-area">
<input
type="text"
placeholder="Enter a prompt (e.g., A cat wearing a hat)"
value={prompt}
onChange={(e) => setPrompt(e.target.value)}
/>
<button onClick={generateImage} disabled={loading}>
{loading ? 'Generating...' : 'Generate'}
</button>
</div>
{error && <div className="error">{error}</div>}
{imageUrl && (
<div className="image-container">
<img src={imageUrl} alt="Generated by AI" ref={imageRef} />
<button onClick={downloadImage}>Download Image</button>
</div>
)}
</div>
);
}
export default App;
```
```css
/* App.css (Optional) */
.App {
text-align: center;
padding: 20px;
}
.input-area {
margin-bottom: 20px;
}
.input-area input {
padding: 10px;
width: 300px;
margin-right: 10px;
}
.input-area button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
cursor: pointer;
}
.input-area button:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
.error {
color: red;
margin-bottom: 10px;
}
.image-container {
margin-top: 20px;
}
.image-container img {
max-width: 500px;
max-height: 500px;
border: 1px solid #ccc;
}
.image-container button {
padding: 10px 20px;
background-color: #008CBA;
color: white;
border: none;
cursor: pointer;
margin-top: 10px;
}
```
**Explanation and Key Improvements:**
* **Error Handling:** The code includes a `try...catch` block to handle potential errors during the API call. Critically, it now attempts to extract more specific error messages from the API response (e.g., from a `data.error` field). This is crucial for debugging and providing helpful feedback to the user. It also displays the error message in the UI.
* **Clearer API Key and Endpoint Instructions:** The code now explicitly reminds you to replace `"YOUR_AI_API_KEY"` and `"YOUR_AI_API_ENDPOINT"` with your actual API credentials. *Never* commit your API key directly into your repository. Use environment variables instead for better security.
* **Loading State:** The `loading` state is used to disable the button and display a "Generating..." message while the API call is in progress, preventing multiple requests and providing visual feedback.
* **Conditional Rendering:** Uses the `imageUrl` state to conditionally render the image and download button only when an image has been successfully generated.
* **Download Functionality:** Includes a `downloadImage` function that allows the user to download the generated image. It creates a temporary `<a>` element, sets the `href` to the `imageUrl`, triggers a click to initiate the download, and then removes the temporary element.
* **`useRef` Hook:** The `useRef` hook is used to create a reference to the `<img>` element, which is necessary for accessing the image URL for downloading.
* **CSS Styling:** I've provided a basic `App.css` file to style the components a bit. This is optional but recommended for a better user experience.
* **Security:** While this example doesn't cover all aspects of security, it is crucial to remember:
* **Never commit your API keys directly to your code repository.** Use environment variables.
* **Validate user input on the server-side.** This prevents malicious prompts from being sent to the AI API.
* **Implement rate limiting to prevent abuse of your API key.**
* **Clear API Response Handling:** The code anticipates and handles different API response formats, specifically looking for the image URL in different locations (e.g., `data.imageUrl` or `data.data[0].url`, which is typical of OpenAI/DALL-E responses). This makes the code more robust.
* **Modern JavaScript:** Uses `async/await` for cleaner asynchronous code.
* **Error Message Display:** Displays an error message to the user if the image generation fails.
* **Comments and Readability:** The code is well-commented to explain each step.
* **Accessibility:** While not fully implemented here, remember to consider accessibility best practices when building your UI (e.g., using `alt` attributes for images, providing labels for form fields, and ensuring keyboard navigation).
* **Dependency-Free (ish):** The code relies only on React, which is a common and expected dependency for a React-based web app. No other UI libraries are used to keep it simple.
**How to Use:**
1. **Create a new React app:**
```bash
npx create-react-app ai-image-generator
cd ai-image-generator
```
2. **Replace the contents of `src/App.js` with the code above.**
3. **Create an `App.css` file in the `src/` directory and paste the CSS code above into it (optional).**
4. **Install any necessary dependencies:** If you're using an AI API that requires a specific client library (e.g., the OpenAI Node.js library), install it:
```bash
npm install openai # If you're using OpenAI/DALL-E
```
(Adjust the package name as necessary for your specific API). However, this example does not require external dependencies.
5. **Get an API key from your AI art generator provider (e.g., OpenAI, Stability AI, etc.).**
6. **Replace `"YOUR_AI_API_KEY"` in `App.js` with your actual API key.** Ideally, store this in an environment variable.
7. **Replace `"YOUR_AI_API_ENDPOINT"` in `App.js` with the API endpoint for your AI art generator.** Consult your API provider's documentation for the correct endpoint. The endpoint will specify the URL you need to POST to.
8. **Start the development server:**
```bash
npm start
```
9. **Open your browser and go to `http://localhost:3000` (or the address shown in your terminal).**
**Important Considerations Before Running:**
* **API Costs:** Generating AI art can be expensive. Be aware of the pricing structure of your chosen API provider. Some providers offer free tiers with limited usage.
* **API Documentation:** Carefully read the API documentation for your chosen AI art generator. The API request and response formats, authentication methods, and rate limits can vary significantly. The code provided is a general example and *must* be adapted to your specific API.
* **Environment Variables:** For production deployments, store your API key in an environment variable rather than directly in the code. This is more secure.
* **Error Handling:** Implement robust error handling to gracefully handle API errors, network issues, and invalid input.
* **User Interface:** Design a user-friendly interface with clear instructions and feedback.
* **Ethical Considerations:** Be mindful of the ethical implications of AI art generation, including copyright issues, bias, and the potential for misuse.
This revised response provides a more complete, robust, and secure foundation for building a web-based AI art generator. Remember to adapt the code to the specifics of the AI API you choose to use.
👁️ Viewed: 11
Comments