generative_front/components/tabs/textImagePanel.js
Hossein Salari 75600bcf62
All checks were successful
Build and Deploy Next.js + Nginx Docker Image / build-and-deploy (push) Successful in 3m0s
Build and Deploy Next.js + Nginx Docker Image / deploy (push) Successful in 7s
update
2026-03-16 11:52:12 +03:30

209 lines
5.5 KiB
JavaScript

// components/PhoneInput.tsx
import {
Button,
Divider,
FormControl,
FormLabel,
HStack,
Icon,
Input,
Table,
TableContainer,
Tbody,
Textarea,
Th,
Thead,
Tr,
VStack,
} from "@chakra-ui/react";
import { MdHeight } from "react-icons/md";
import { RxWidth } from "react-icons/rx";
import { BsBarChartSteps } from "react-icons/bs";
import { TbPrompt } from "react-icons/tb";
import { FaDraft2Digital, FaPlay } from "react-icons/fa";
import { useState } from "react";
import { useForm } from "react-hook-form";
import ResultBox from "../ui/ResultBox";
import axiosInstance, { baseUrl } from "@/lib/api";
import useSWRMutation from "swr/mutation";
const modelsDic = {
sdxl: "base",
sdxl_lora: "lora",
};
const postRequest = async (url, { arg }) => {
const response = await axiosInstance.post(baseUrl + url, arg);
return response?.data;
};
export default function TextImagePanel({ filters }) {
const { register, handleSubmit, watch } = useForm("");
const [images, setImages] = useState([]);
const width = watch("width");
const height = watch("height");
const { trigger: triggerGenerateImage, isMutating: isGeneratingImage } =
useSWRMutation(
`/content/sdxl/${modelsDic[filters?.tab_menu]}`,
postRequest,
{
onSuccess: (data) => setImages(data?.images),
},
);
const onSubmit = (data) => {
triggerGenerateImage(data);
};
return (
<VStack
spacing={4}
w="100%"
h="100%"
alignItems="start"
overflowY="auto"
as={"form"}
onSubmit={handleSubmit(onSubmit)}
>
{" "}
<HStack>
<FormControl as={VStack} alignItems={"start"}>
<HStack w={"100%"} alignItems={"start"}>
<Icon
as={MdHeight}
bgColor={"gray.200"}
borderRadius={"50%"}
p={"5px"}
fontSize={"25px"}
border={"1px"}
borderColor={"gray.300"}
/>
<FormLabel>طول:</FormLabel>
</HStack>
<Input
bgColor={"white"}
{...register("height")}
type="number"
defaultValue={768}
/>
</FormControl>
<FormControl as={VStack} alignItems={"start"}>
<HStack w={"100%"} alignItems={"start"}>
<Icon
as={RxWidth}
bgColor={"gray.200"}
borderRadius={"50%"}
p={"5px"}
fontSize={"25px"}
border={"1px"}
borderColor={"gray.300"}
/>
<FormLabel>عرض:</FormLabel>
</HStack>
<Input
bgColor={"white"}
{...register("width")}
type="number"
defaultValue={768}
/>
</FormControl>
<FormControl as={VStack} alignItems={"start"}>
<FormLabel>seed:</FormLabel>
<Input
bgColor={"white"}
{...register("seed")}
type="number"
defaultValue={42}
/>
</FormControl>
<FormControl as={VStack} alignItems={"start"}>
<HStack alignItems={"start"}>
<Icon
as={BsBarChartSteps}
bgColor={"gray.200"}
borderRadius={"50%"}
p={"5px"}
fontSize={"25px"}
border={"1px"}
borderColor={"gray.300"}
/>
<FormLabel>تعداد مراحل استنتاج:</FormLabel>
</HStack>
<Input
bgColor={"white"}
{...register("num_inference_steps")}
type="number"
defaultValue={60}
/>
</FormControl>
<FormControl as={VStack} alignItems={"start"}>
<HStack alignItems={"start"}>
<Icon
as={FaDraft2Digital}
bgColor={"gray.200"}
borderRadius={"50%"}
p={"5px"}
fontSize={"25px"}
border={"1px"}
borderColor={"gray.300"}
/>
<FormLabel>مقیاس راهنمایی:</FormLabel>
</HStack>
<Input
bgColor={"white"}
{...register("guidance_scale")}
type="number"
defaultValue={7}
/>
</FormControl>
</HStack>
<FormControl as={VStack} alignItems={"start"}>
<HStack alignItems={"start"}>
<Icon
as={TbPrompt}
bgColor={"gray.200"}
borderRadius={"50%"}
p={"5px"}
fontSize={"25px"}
border={"1px"}
borderColor={"gray.300"}
/>
<FormLabel>پرامپت:</FormLabel>
</HStack>
<Textarea bgColor={"white"} {...register("prompt")} />
</FormControl>
<Button
p={"20px"}
colorScheme="pink"
leftIcon={<FaPlay />}
type="submit"
isLoading={isGeneratingImage}
alignSelf={"end"}
>
اجرا
</Button>
{/* <Divider my={"20px"} borderColor={"gray.300"} />
<TableContainer w={"100%"} mt={"10px"}>
<Table>
<Thead>
<Tr>
<Th fontSize={"md"}>ردیف</Th>
</Tr>
</Thead>
<Tbody></Tbody>
</Table>
</TableContainer> */}
<Divider my={"20px"} borderColor={"gray.300"} />
<ResultBox
type="image"
loading={isGeneratingImage}
resultData={images}
imgWidth={width || 500}
imgHeight={height || 500}
/>
</VStack>
);
}