Leon4gr45's picture
Add GitHub upload page with AI assistant for errors
c52cc9e verified
'use client';
import { useState } from 'react';
export default function GitHubUpload() {
const [repo, setRepo] = useState('');
const [branch, setBranch] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [success, setSuccess] = useState<string | null>(null);
const [aiResponse, setAiResponse] = useState<string | null>(null);
const [aiLoading, setAiLoading] = useState(false);
const handleUpload = async () => {
setLoading(true);
setError(null);
setSuccess(null);
setAiResponse(null);
const response = await fetch('/api/github-upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ repo, branch }),
});
const result = await response.json();
setLoading(false);
if (response.ok) {
setSuccess(result.message);
} else {
setError(result.error);
}
};
const getAiHelp = async () => {
if (!error) return;
setAiLoading(true);
setAiResponse(null);
const response = await fetch('/api/text-generation', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: `I encountered the following error while trying to upload to GitHub: "${error}". Please help me understand and resolve this issue.`,
model: 'alias-fast', // Or any other suitable model
}),
});
if (!response.body) {
setAiLoading(false);
return;
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let done = false;
let fullResponse = '';
while (!done) {
const { value, done: readerDone } = await reader.read();
done = readerDone;
const chunkValue = decoder.decode(value);
fullResponse += chunkValue;
setAiResponse(fullResponse);
}
setAiLoading(false);
};
return (
<div className="flex flex-col items-center justify-center min-h-screen py-2">
<main className="flex flex-col items-center justify-center w-full flex-1 px-20 text-center">
<h1 className="text-4xl font-bold mb-8">
Upload to GitHub
</h1>
<div className="w-full max-w-xs">
<div className="mb-4">
<label className="block text-gray-700 text-sm font-bold mb-2" htmlFor="repo">
Repository Name (e.g., your-username/your-repo)
</label>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
id="repo"
type="text"
placeholder="your-username/your-repo"
value={repo}
onChange={(e) => setRepo(e.target.value)}
/>
</div>
<div className="mb-6">
<label className="block text-gray-700 text-sm font-bold mb-2" htmlFor="branch">
Branch
</label>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline"
id="branch"
type="text"
placeholder="main"
value={branch}
onChange={(e) => setBranch(e.target.value)}
/>
</div>
<div className="flex items-center justify-between">
<button
className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
type="button"
onClick={handleUpload}
disabled={loading}
>
{loading ? 'Uploading...' : 'Upload'}
</button>
</div>
{error && (
<div className="mt-4 text-red-500">
<p>Upload failed:</p>
<p>{error}</p>
<button
className="mt-2 bg-gray-500 hover:bg-gray-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
type="button"
onClick={getAiHelp}
disabled={aiLoading}
>
{aiLoading ? 'Getting help...' : 'Get help from AI assistant'}
</button>
</div>
)}
{aiResponse && (
<div className="mt-4 p-4 border rounded bg-gray-100 text-left">
<h3 className="font-bold mb-2">AI Assistant says:</h3>
<p>{aiResponse}</p>
</div>
)}
{success && (
<div className="mt-4 text-green-500">
<p>{success}</p>
</div>
)}
</div>
</main>
</div>
);
}