88 lines
2.4 KiB
JavaScript
88 lines
2.4 KiB
JavaScript
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 l’utilisateur.
|
||
* @prop setTerms Fonction de rappel pour ajouter de nouveaux termes de
|
||
* recherche.
|
||
* @prop results Maladies correspondant à la recherche de l’utilisateur.
|
||
*/
|
||
const DiseaseGraph = ({terms, setTerms, results}) =>
|
||
{
|
||
const {nodes, edges} = useAsync({
|
||
nodes: {},
|
||
edges: []
|
||
}, symptomsSubgraph, results);
|
||
|
||
/**
|
||
* Rendu d’un 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 d’un terme déjà dans la requête
|
||
setTerms([
|
||
...terms.slice(0, termIndex),
|
||
...terms.slice(termIndex + 1)
|
||
]);
|
||
}
|
||
else
|
||
{
|
||
// Ajout d’un 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;
|