Hossein Salari 8dda6b05d7
All checks were successful
Build and Deploy Next.js + Nginx Docker Image / build-and-deploy (push) Successful in 2m50s
Build and Deploy Next.js + Nginx Docker Image / deploy (push) Successful in 8s
feat: connect LLM + LoRA tab to backend api
2026-02-26 17:34:37 +03:30

195 lines
5.3 KiB
JavaScript

import LlmPanel from "@/components/tabs/llmPanel";
import TextImagePanel from "@/components/tabs/textImagePanel";
import TextVideoPanel from "@/components/tabs/textVideoPanel";
import {
Box,
Flex,
VStack,
Text,
Tabs,
Tab,
TabList,
TabPanel,
TabPanels,
HStack,
} from "@chakra-ui/react";
import {
IoDocumentTextOutline,
IoImageOutline,
IoVideocamOutline,
} from "react-icons/io5";
import { IoIosGitMerge } from "react-icons/io";
import {
NumberParam,
StringParam,
useQueryParams,
withDefault,
} from "use-query-params";
import { AiOutlinePoweroff } from "react-icons/ai";
import keycloak from "@/lib/keycloak";
import AppHeader from "@/components/layout/AppHeader";
import SidebarList from "@/components/layout/SidebarList";
import { useEffect } from "react";
export default function Home() {
const [filters, setFilters] = useQueryParams({
tab: withDefault(NumberParam, 0),
tab_menu: withDefault(StringParam, "gemma_base"),
model_name: withDefault(NumberParam, 0),
});
useEffect(() => {
if (filters?.tab == 0) setFilters({ tab_menu: "gemma_base" });
else if (filters?.tab == 1) setFilters({ tab_menu: "sdxl" });
else if (filters?.tab == 2) setFilters({ tab_menu: "cogvideo_base" });
}, [filters?.tab]);
return (
<Flex direction={"column"} minH="100vh" bg="gray.50" dir="rtl">
{/* Header */}
<AppHeader />
{/* Page Layout */}
<Flex flex="1" minH={0} mt={"92px"}>
{/* Sidebar */}
<Box
w="280px"
bg="#fdfbff"
borderLeft="1px solid"
borderColor="gray.200"
py={8}
position={"relative"}
>
<VStack
align="stretch"
spacing={6}
overflowY={"auto"}
maxH={"calc(100vh - 150px)"}
sx={{
"::-webkit-scrollbar": { display: "none" },
"scrollbar-width": "none",
"-ms-overflow-style": "none",
}}
>
{/* Menu */}
<Tabs
isFitted
variant="soft-rounded"
colorScheme="green"
px={6}
onChange={(e) => setFilters({ model_name: e })}
index={filters?.model_name}
>
<TabList mb={2}>
<Tab>خانم ستاری</Tab>
<Tab>رکن آبادی</Tab>
</TabList>
<TabPanels>
<TabPanel>
<SidebarList filters={filters} setFilters={setFilters} />
</TabPanel>
<TabPanel>
<SidebarList filters={filters} setFilters={setFilters} />
</TabPanel>
</TabPanels>
</Tabs>
{/* Footer */}
</VStack>
<Box
w={"full"}
position={"absolute"}
bottom={0}
left={0}
right={0}
zIndex={10}
borderTop={"1px"}
borderColor={"gray.300"}
bg={"gray.50"}
>
<HStack
w={"full"}
py={2}
gap={2}
justifyContent={"center"}
alignItems={"center"}
color={"gray.700"}
cursor={"pointer"}
transition={"all"}
transitionDuration={"200"}
_hover={{ color: "red.600" }}
onClick={() => keycloak.logout()}
>
<AiOutlinePoweroff size={20} />
<Text>خروج از حساب</Text>
</HStack>
</Box>
</Box>
{/* Content */}
<Box
flex="1"
p={8}
minW={0}
overflowY={"auto"}
maxH={"calc(100vh - 92px)"}
sx={{
"::-webkit-scrollbar": { display: "none" },
"scrollbar-width": "none",
"-ms-overflow-style": "none",
}}
>
<Tabs
variant="soft-rounded"
colorScheme="purple"
onChange={(e) => setFilters({ tab: e })}
index={filters?.tab}
>
<TabList mb={6}>
<Tab>
<HStack>
<IoDocumentTextOutline fontSize={"20px"} />
<Text>پنل تولید متن</Text>
</HStack>
</Tab>
<Tab>
<HStack>
<IoImageOutline fontSize={"20px"} />
<Text>پنل تولید تصویر</Text>
</HStack>
</Tab>
<Tab>
<HStack>
<IoVideocamOutline fontSize={"20px"} />
<Text>پنل تولید ویدئو</Text>
</HStack>
</Tab>
<Tab>
<HStack>
<IoIosGitMerge fontSize={"20px"} />
<Text>مرج و تولید نهایی</Text>
</HStack>
</Tab>
</TabList>
<TabPanels>
<TabPanel>
<LlmPanel filters={filters} />
</TabPanel>
<TabPanel>
<TextImagePanel />
</TabPanel>
<TabPanel>
<TextVideoPanel />
</TabPanel>
<TabPanel>مرج نهایی</TabPanel>
</TabPanels>
</Tabs>
</Box>
</Flex>
</Flex>
);
}