import React from 'react'; import styled from 'styled-components'; import ListItem from './ListItem'; import FullWidthDiv from './FullWidthDiv'; import Result from './Result'; import FilterOption from './FilterOption'; import { ENDPOINT_PARETO } from '../constants'; const List = styled.div` margin: 5px; display: flex; flex-direction: column; `; const Options = styled.div` display: flex; `; const detailsStyle = { padding: '3px' }; const filenameTitle = { fontWeight: '600' }; class Pareto extends React.Component { state = { data: [], all: [], selectedFileType: 'all', selectedLanguage: 'all', options: {}, rateLimitMessage: '' }; componentDidMount() { fetch(ENDPOINT_PARETO) .then((response) => response.json()) .then(({ ok, rateLimitMessage, pareto }) => { if (ok) { if (!pareto.length) { pareto.push({ filename: 'Nothing to show in Pareto Report', count: 0, prs: [] }); } this.setState((prevState) => ({ data: pareto, all: [...pareto], options: this.createOptions(pareto) })); } else if (rateLimitMessage) { this.setState((prevState) => ({ rateLimitMessage })); } }) .catch(() => { const pareto = [ { filename: 'Nothing to show in Pareto Report', count: 0, prs: [] } ]; this.setState((prevState) => ({ data: pareto })); }); } createOptions = (data) => { const options = data.reduce((seen, { filename }) => { const { articleType, language } = this.getFilenameOptions(filename); if (articleType && language) { if (!seen.hasOwnProperty(articleType)) { seen[articleType] = {}; } seen[articleType][language] = true; } return seen; }, {}); return options; }; handleFileTypeOptionChange = (changeEvent) => { let { all, selectedLanguage, options } = this.state; const selectedFileType = changeEvent.target.value; let data = [...all].filter(({ filename }) => { const { articleType, language } = this.getFilenameOptions(filename); let condition; if (selectedFileType === 'all') { condition = true; selectedLanguage = 'all'; } else { if (selectedLanguage === 'all') { condition = articleType === selectedFileType; } else if (!options[selectedFileType][selectedLanguage]) { condition = articleType === selectedFileType; selectedLanguage = 'all'; } else { condition = articleType === selectedFileType && language === selectedLanguage; } } return condition; }); this.setState((prevState) => ({ data, selectedFileType, selectedLanguage })); }; handleLanguageOptionChange = (changeEvent) => { const { all, selectedFileType } = this.state; const selectedLanguage = changeEvent.target.value; let data = [...all].filter(({ filename }) => { const { articleType, language } = this.getFilenameOptions(filename); let condition; if (selectedLanguage === 'all') { condition = articleType === selectedFileType; } else { condition = language === selectedLanguage && articleType === selectedFileType; } return condition; }); this.setState((prevState) => ({ data, selectedLanguage })); }; getFilenameOptions = (filename) => { const filenameReplacement = filename.replace( /^curriculum\/challenges\//, 'curriculum/' ); const regex = /^(docs|curriculum|guide)(?:\/)(english|arabic|chinese|portuguese|russian|spanish)?\/?/; // need an array to pass to labelsAdder // eslint-disable-next-line const [_, articleType, language] = filenameReplacement.match(regex) || []; return { articleType, language }; }; render() { const { data, options, selectedFileType, selectedLanguage, rateLimitMessage } = this.state; const elements = rateLimitMessage ? rateLimitMessage : data.map((entry) => { const { filename, count, prs } = entry; const prsList = prs.map(({ number, username, title }) => { return ( ); }); const fileOnMain = `https://github.com/freeCodeCamp/freeCodeCamp/blob/main/${filename}`; return ( {filename}{' '} (File on Main)
# of PRs: {count} {prsList}
); }); let fileTypeOptions = Object.keys(options).map( (articleType) => articleType ); const typeOptions = ['all', ...fileTypeOptions].map((type) => ( {type.charAt().toUpperCase() + type.slice(1)} )); let languageOptions = null; if (selectedFileType !== 'all') { let languages = Object.keys(options[selectedFileType]); languages = ['all', ...languages.sort()]; languageOptions = languages.map((language) => ( {language.charAt().toUpperCase() + language.slice(1)} )); } return ( {fileTypeOptions.length > 0 && Filter Options} {fileTypeOptions.length > 0 && ( <>
File Type:
{typeOptions}
)} {languageOptions && (
Language:
{languageOptions}
)}
{rateLimitMessage ? rateLimitMessage : data.length ? elements : 'Report Loading...'}
); } } export default Pareto;