|
import React, { useState, FormEvent } from 'react'; |
|
|
|
interface InputData { |
|
prompt: string; |
|
width: number; |
|
height: number; |
|
steps: number; |
|
fps: number; |
|
seed?: number; |
|
} |
|
|
|
const IndexPage = () => { |
|
const [inputData, setInputData] = useState<InputData>({ |
|
prompt: '', |
|
width: 1024, |
|
height: 576, |
|
steps: 40, |
|
fps: 15, |
|
seed: undefined, |
|
}); |
|
const [output, setOutput] = useState<any>(null); |
|
const [isLoading, setIsLoading] = useState(false); |
|
|
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { |
|
const { name, value } = e.target; |
|
setInputData((prevData) => ({ ...prevData, [name]: value })); |
|
}; |
|
|
|
const handleSubmit = async (e: FormEvent) => { |
|
e.preventDefault(); |
|
setIsLoading(true); |
|
console.log("Making API call with payload:", inputData); |
|
|
|
try { |
|
const response = await fetch('/api/replicate', { |
|
method: 'POST', |
|
headers: { |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(inputData), |
|
}); |
|
|
|
const result = await response.json(); |
|
console.log("API call response:", result); |
|
|
|
if (response.ok) { |
|
setIsLoading(false); |
|
setOutput(result.prediction); |
|
} else { |
|
setIsLoading(false); |
|
console.error("API returned an error:", result); |
|
} |
|
} catch (error) { |
|
setIsLoading(false); |
|
console.error("An error occurred:", error); |
|
} |
|
}; |
|
|
|
|
|
return ( |
|
<div> |
|
<form onSubmit={handleSubmit}> |
|
<input |
|
type="text" |
|
name="prompt" |
|
value={inputData.prompt} |
|
onChange={handleChange} |
|
placeholder="Enter your prompt" |
|
/> |
|
<input |
|
type="number" |
|
name="width" |
|
value={inputData.width} |
|
onChange={handleChange} |
|
/> |
|
<input |
|
type="number" |
|
name="height" |
|
value={inputData.height} |
|
onChange={handleChange} |
|
/> |
|
<input |
|
type="number" |
|
name="steps" |
|
value={inputData.steps} |
|
onChange={handleChange} |
|
/> |
|
<input |
|
type="number" |
|
name="fps" |
|
value={inputData.fps} |
|
onChange={handleChange} |
|
/> |
|
<input |
|
type="number" |
|
name="seed" |
|
value={inputData.seed || ''} |
|
onChange={handleChange} |
|
placeholder="Seed (Optional)" |
|
/> |
|
<button type="submit">Submit</button> |
|
</form> |
|
|
|
{isLoading && <div>Processing...</div>} |
|
|
|
{output && output.output && ( |
|
<div> |
|
<h2>Generated Video:</h2> |
|
<video controls width="500"> |
|
<source src={output.output} type="video/mp4" /> |
|
Your browser does not support the video tag. |
|
</video> |
|
</div> |
|
)} |
|
</div> |
|
); |
|
}; |
|
|
|
export default IndexPage; |
|
|