import { type ReactNode, useEffect, useMemo, useState } from 'react'; import { Condition } from '@quotalab/react'; import { getObjectValues, isEmpty } from '@quotalab/utils'; import { componentNameStyle, nameColumnStyle, progressCardStyle, progressRateTxtStyle, } from './component-progress-table.css'; import { Flex, Txt } from '../../src/components'; import Table from '../components/Table/table'; type ComponentProgressData = { path: string; name: string; hasTest: boolean; hasStory: boolean; }; const isProgressData = (data: unknown): data is ComponentProgressData => { return ( typeof data === 'object' && data !== null && 'path' in data && 'name' in data && 'hasTest' in data && 'hasStory' in data ); }; const getVSCFilePath = (path: string) => `vscode://file/${path}`; const componentProgress = (items: ComponentProgressData[], key: keyof ComponentProgressData) => isEmpty(items) ? 0 : (items.filter((item) => item[key]).length / items.length) * 100; const ComponentProgressTable = () => { const [componentProgressData, setComponentProgressData] = useState([]); const isEmpty = useMemo(() => componentProgressData.length === 0, [componentProgressData]); const getComponentProgressData = async () => { try { const data = await fetch('components-coverage.json'); const convertedData = await data.json(); if (Array.isArray(convertedData)) { setComponentProgressData(convertedData.filter(isProgressData)); } } catch {} }; const storyCompleteRate = useMemo( () => componentProgress(componentProgressData, 'hasStory'), [componentProgressData] ); const testCompleteRate = useMemo(() => componentProgress(componentProgressData, 'hasTest'), [componentProgressData]); useEffect(() => { getComponentProgressData(); }, []); const convertedData = getObjectValues(componentProgressData) .filter(isProgressData) .sort((a, b) => a.name.localeCompare(b.name)); return ( 컴포넌트 Story Test Empty } else={convertedData.map((data) => ( {data.name} ))} />
); }; const ProgressTxt = ({ isDone }: { isDone: boolean }) => { return ( Done } else={ To do } /> ); }; const ProgressCard = ({ title, percent }: { title: ReactNode; percent: number }) => { return ( {title} {percent.toFixed(0)}% /100% ); }; export default ComponentProgressTable;