'use client'; import { useState, useEffect, useContext } from 'react'; import { title, subtitle } from '@/components/primitives'; import { Card, CardBody, Chip, Divider } from '@nextui-org/react'; import { Folder, Clipboard, FlaskConical } from 'lucide-react'; import { CaseTypeCountType, CasePriorityCountType } from '@/types/case'; import { ProgressSeriesType } from '@/types/run'; import { HomeMessages } from './page'; import { TokenContext } from '@/utils/TokenProvider'; import { aggregateBasicInfo, aggregateTestPriority, aggregateTestType, aggregateProgress } from './aggregate'; import Config from '@/config/config'; import { useTheme } from 'next-themes'; import TestTypesChart from './TestTypesDonutChart'; import TestPriorityChart from './TestPriorityDonutChart'; import TestProgressBarChart from './TestProgressColumnChart'; import { TestStatusMessages } from '@/types/testStatus'; import { TestTypeMessages } from '@/types/testType'; import { PriorityMessages } from '@/types/priority'; const apiServer = Config.apiServer; async function fetchProject(jwt: string, projectId: number) { const fetchOptions = { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${jwt}`, }, }; const url = `${apiServer}/home/${projectId}`; try { const response = await fetch(url, fetchOptions); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); return data; } catch (error: any) { console.error('Error fetching data:', error.message); } } type Props = { projectId: string; messages: HomeMessages; statusMessages: TestStatusMessages; testTypeMessages: TestTypeMessages; priorityMessages: PriorityMessages; }; export function ProjectHome({ projectId, messages, statusMessages, testTypeMessages, priorityMessages }: Props) { const context = useContext(TokenContext); const { theme, setTheme } = useTheme(); const [project, setProject] = useState({ name: '', detail: '', Folders: [{ Cases: [] }], Runs: [{ RunCases: [] }], }); const [folderNum, setFolderNum] = useState(0); const [caseNum, setCaseNum] = useState(0); const [runNum, setRunNum] = useState(0); const [typesCounts, setTypesCounts] = useState(); const [priorityCounts, setPriorityCounts] = useState(); const [progressCategories, setProgressCategories] = useState(); const [progressSeries, setProgressSeries] = useState(); useEffect(() => { async function fetchDataEffect() { if (!context.isSignedIn()) { return; } try { const data = await fetchProject(context.token.access_token, Number(projectId)); setProject(data); } catch (error: any) { console.error('Error in effect:', error.message); } } fetchDataEffect(); }, [context]); useEffect(() => { async function aggregate() { const { folderNum, runNum, caseNum } = aggregateBasicInfo(project); setFolderNum(folderNum); setRunNum(runNum); setCaseNum(caseNum); const typeRet = aggregateTestType(project); setTypesCounts([...typeRet]); const priorityRet = aggregateTestPriority(project); setPriorityCounts([...priorityRet]); const { series, categories } = aggregateProgress(project, statusMessages); setProgressSeries([...series]); setProgressCategories([...categories]); } aggregate(); }, [project]); return (

{project.name}

} className="px-3"> {folderNum} {messages.folders} } className="px-3 ms-2"> {caseNum} {messages.testCases} } className="px-3 ms-2"> {runNum} {messages.testRuns}
{project.detail && ( {project.detail} )}

{messages.progress}

{messages.testClassification}

{messages.byType}

{messages.byPriority}

); }