"use client"; import { LoadingIcon } from "@/components/LoadingIcon"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { checkStatus, generate, generate_img, generate_img_with_controlnet, getUploadUrl, } from "@/server/generate"; import { useEffect, useState } from "react"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { ImageGenerationResult } from "@/components/ImageGenerationResult"; export default function Page() { return (
txt2img img2img Controlpose
); } function Txt2img() { const [prompt, setPrompt] = useState(""); const [loading, setLoading] = useState(false); const [runIds, setRunIds] = useState([]); return ( Comfy Deploy - Vector Line Art Tool
Lora -{" "} stick-line-vector-illustration
{ e.preventDefault(); if (loading) return; setLoading(true); const promises = Array(4).fill(null).map(() => { return generate(prompt) .then((res) => { if (res) { setRunIds((ids) => [...ids, res.run_id]); } return res; }) .catch((error) => { console.error(error); }); }); Promise.all(promises).finally(() => { setLoading(false); }); }} > setPrompt(e.target.value)} />
{runIds.map((runId, index) => ( ))}
); } function Img2img() { const [prompt, setPrompt] = useState(); const [image, setImage] = useState(""); const [loading, setLoading] = useState(false); const [runId, setRunId] = useState(""); const [status, setStatus] = useState(); const handleFileChange = (e: React.ChangeEvent) => { if (!e.target.files) return; setPrompt(e.target.files[0]); }; // Polling in frontend to check for the useEffect(() => { if (!runId) return; const interval = setInterval(() => { checkStatus(runId).then((res) => { if (res) setStatus(res.status); if (res && res.status === "success") { console.log(res.outputs[0]?.data); setImage(res.outputs[0]?.data?.images[0].url); setLoading(false); clearInterval(interval); } }); }, 2000); return () => clearInterval(interval); }, [runId]); return ( Comfy Deploy - Scribble to Anime Girl
{ e.preventDefault(); if (loading) return; if (!prompt) return; setImage(""); setStatus("getting url for upload"); console.log(prompt?.type, prompt?.size); getUploadUrl(prompt?.type, prompt?.size).then((res) => { if (!res) return; setStatus("uploading input"); console.log(res); fetch(res.upload_url, { method: "PUT", body: prompt, headers: { "Content-Type": prompt.type, "x-amz-acl": "public-read", "Content-Length": prompt.size.toString(), }, }).then((_res) => { if (_res.ok) { setStatus("uploaded input"); setLoading(true); generate_img(res.download_url).then((res) => { console.log(res); if (!res) { setStatus("error"); setLoading(false); return; } setRunId(res.run_id); }); setStatus("preparing"); } }); }); }} > {runId && }
); } const poses = { arms_on_hips: { url: "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(1).png", name: "Arms on Hips", }, waving: { url: "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(2).png", name: "Waving", }, legs_together_sideways: { url: "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(3).png", name: "Legs together, body at an angle", }, excited_jump: { url: "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(4).png", name: "excited jump", }, pointing_to_the_stars: { url: "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(5).png", name: "Pointing to the stars", }, }; function OpenposeToImage() { const [prompt, setPrompt] = useState(""); const [poseImageUrl, setPoseImageUrl] = useState( "https://pub-6230db03dc3a4861a9c3e55145ceda44.r2.dev/openpose-pose%20(1).png", ); const [poseLoading, setPoseLoading] = useState(false); const [image, setImage] = useState(""); const [loading, setLoading] = useState(false); const [runId, setRunId] = useState(""); const [status, setStatus] = useState(); const handleSelectChange = (value: keyof typeof poses) => { setPoseImageUrl(poses[value].url); // Update image based on selection }; // Polling in frontend to check for the useEffect(() => { if (!runId) return; const interval = setInterval(() => { checkStatus(runId).then((res) => { if (res) setStatus(res.status); if (res && res.status === "success") { console.log(res.outputs[0]?.data); setImage(res.outputs[0]?.data?.images[0].url); setLoading(false); clearInterval(interval); } }); }, 2000); return () => clearInterval(interval); }, [runId]); return ( Comfy Deploy - Pose Creator Tool
OpenPose -{" "} pose book
{ if (loading) return; e.preventDefault(); setLoading(true); generate_img_with_controlnet(poseImageUrl, prompt).then((res) => { console.log("here", res); if (!res) { setStatus("error"); setLoading(false); return; } setRunId(res.run_id); }); setStatus("preparing"); }} > setPrompt(e.target.value)} />
{/* Pose Image */} {poseLoading && (
)} {poseImageUrl && ( Selected pose setPoseLoading(false)} > )}
{/* */}
{runId && }
); }