import { useEffect, useRef, useState } from 'react'; import { GradeResultInterface, MeritProfileInterface } from '@services/type'; import { getMajorityGrade } from '@services/majorityJudgment'; interface GradeBarInterface { grade: GradeResultInterface; size: number; } const GradeBar = ({ grade, size }: GradeBarInterface) => { const width = `${size * 100}%`; if (size < 0.001) { return null; } return (
); }; const DashedMedian = () => { return (
); }; const MajorityGrade = ({ grade, left }) => { // const spanRef = useRef(); const spanRef = useRef(); const [width, setWidth] = useState(0); const offsetWidth = spanRef && spanRef.current && spanRef.current.offsetWidth; useEffect(() => { setTimeout(() => { setWidth(spanRef.current.offsetWidth); }, 100); }, [offsetWidth]); return (
{grade.name}
); }; interface MeritProfileBarInterface { profile: MeritProfileInterface; grades: Array; } const MeritProfileBar = ({ profile, grades }: MeritProfileBarInterface) => { const gradesByValue: { [key: number]: GradeResultInterface } = {}; grades.forEach((g) => (gradesByValue[g.value] = g)); const numVotes = Object.values(profile).reduce((a, b) => a + b, 0); const values = grades.map((g) => g.value).sort(); const normalized = {}; values.forEach((v) => (normalized[v] = profile[v] / numVotes || 0)); // low values means great grade // find the majority grade const majorityValue = getMajorityGrade(normalized); const majorityGrade = gradesByValue[majorityValue]; const proponentSizes = values .filter((v) => v > majorityGrade.value) .map((v) => normalized[v]); const proponentWidth = proponentSizes.reduce((a, b) => a + b, 0); const opponentSizes = values .filter((v) => v < majorityGrade.value) .map((v) => normalized[v]); const opponentWidth = opponentSizes.reduce((a, b) => a + b, 0); // is proponent higher than opposant? const proponentMajority = proponentWidth > opponentWidth; return ( <>
{proponentWidth > 1e-5 ? (
{values .filter((v) => v > majorityGrade.value) .reverse() .map((v, i) => { const size = proponentWidth < 1e-3 ? 0 : normalized[v] / proponentWidth; return ( ); })}
) : (
)}
{values .filter((v) => v === majorityGrade.value) .map((v, i) => { return ; })}
{opponentWidth > 1e-5 ? (
{values .filter((v) => v < majorityGrade.value) .reverse() .map((v, i) => { const size = opponentWidth < 1e-3 ? 0 : normalized[v] / opponentWidth; return ( ); })}
) : (
)}
{/*
*/} ); }; export default MeritProfileBar;