wikimedica-disease-search/app/src/components/DiseaseGraph.js

88 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import PropTypes from 'prop-types';
import Graph from './Graph.js';
import {useAsync} from '../util.js';
import {Term, termTypes} from '../data/model.js';
import {symptomsSubgraph} from '../data/mock';
/**
* Graphe de maladies et symptômes.
*
* @prop terms Ensemble de symptômes recherchés par lutilisateur.
* @prop setTerms Fonction de rappel pour ajouter de nouveaux termes de
* recherche.
* @prop results Maladies correspondant à la recherche de lutilisateur.
*/
const DiseaseGraph = ({terms, setTerms, results}) =>
{
const {nodes, edges} = useAsync({
nodes: {},
edges: []
}, symptomsSubgraph, results);
/**
* Rendu dun nœud du graphe.
*
* @param id Identifiant du nœud à afficher.
*/
const render = id =>
{
const isTerm = terms.some(({id: termId}) => termId === id);
const isDisease = nodes[id].types.includes(termTypes.disease);
return (
<span className={[
'SearchResults_result',
isTerm ? 'SearchResults_result-term' : '',
isDisease ? 'SearchResults_result-disease' : '',
].join(' ')}>{nodes[id].name}</span>
);
};
/**
* Gère le clic sur un nœud du graphe.
*
* @param id Identifiant du nœud cliqué.
*/
const handleNodeClick = id =>
{
const result = results.find(({id: termId}) => termId === id);
const termIndex = terms.findIndex(({id: termId}) => termId === id);
if (result !== undefined)
{
if (termIndex >= 0)
{
// Retrait dun terme déjà dans la requête
setTerms([
...terms.slice(0, termIndex),
...terms.slice(termIndex + 1)
]);
}
else
{
// Ajout dun nouveau terme dans la requête
setTerms(terms.concat([result]));
}
}
};
return (
<Graph
nodes={Object.keys(nodes)}
edges={edges}
emptyMessage="Aucune maladie ne corresond à ces symptômes"
render={render}
onNodeClick={handleNodeClick}
/>
);
};
DiseaseGraph.propTypes = {
terms: PropTypes.arrayOf(Term).isRequired,
setTerms: PropTypes.func.isRequired,
results: PropTypes.arrayOf(Term).isRequired,
};
export default DiseaseGraph;