'use client'; import { useState, useEffect, useContext } from 'react'; import { Card, CardBody, Chip, Divider } from '@heroui/react'; import { Folder, Clipboard, FlaskConical } from 'lucide-react'; import { useTheme } from 'next-themes'; import { aggregateBasicInfo, aggregateTestPriority, aggregateTestType, aggregateProgress } from './aggregate'; import { HomeMessages } from './page'; import TestTypesChart from './TestTypesDonutChart'; import TestPriorityChart from './TestPriorityDonutChart'; import TestProgressBarChart from './TestProgressColumnChart'; import Config from '@/config/config'; import { TokenContext } from '@/utils/TokenProvider'; import { ProgressSeriesType } from '@/types/run'; import { title, subtitle } from '@/components/primitives'; import { TestRunCaseStatusMessages } from '@/types/status'; import { TestTypeMessages } from '@/types/testType'; import { PriorityMessages } from '@/types/priority'; import { ProjectType } from '@/types/project'; import { CasePriorityCountType, CaseTypeCountType } from '@/types/chart'; import { logError } from '@/utils/errorHandler'; 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: unknown) { logError('Error fetching data:', error); } } type Props = { projectId: string; messages: HomeMessages; testRunCaseStatusMessages: TestRunCaseStatusMessages; testTypeMessages: TestTypeMessages; priorityMessages: PriorityMessages; }; export function ProjectHome({ projectId, messages, testRunCaseStatusMessages, testTypeMessages, priorityMessages, }: Props) { const context = useContext(TokenContext); const { theme } = useTheme(); const [project, setProject] = useState({ id: 0, name: '', detail: '', isPublic: false, userId: 0, createdAt: '', updatedAt: '', Folders: [], Runs: [], }); 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: unknown) { logError('Error in effect:', error); } } fetchDataEffect(); }, [context, projectId]); useEffect(() => { async function aggregate() { if (!project) { return; } 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, testRunCaseStatusMessages); setProgressSeries([...series]); setProgressCategories([...categories]); } aggregate(); }, [project, testRunCaseStatusMessages]); 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}

); }