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

73 lines
1.9 KiB
JavaScript
Raw Normal View History

import React from 'react';
import Graph from './Graph.js';
import {types} from '../data/mock.js';
import {useAsync} from '../util.js';
import {symptomsSubgraph} from '../data/fetch.js';
2019-12-04 04:20:06 +00:00
const DiseaseGraph = ({terms, setTerms, results}) =>
{
const {nodes, edges} = useAsync({
nodes: {},
edges: []
}, symptomsSubgraph, results);
2019-12-04 04:20:06 +00:00
/**
* 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(types.disease);
return (
<span className={[
'SearchResults_result',
isTerm ? 'SearchResults_result-term' : '',
isDisease ? 'SearchResults_result-disease' : '',
].join(' ')}>{nodes[id].name}</span>
);
};
2019-12-04 04:20:06 +00:00
/**
* 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}
2019-12-04 04:20:06 +00:00
emptyMessage="Aucune maladie ne corresond à ces symptômes"
render={render}
2019-12-04 04:20:06 +00:00
onNodeClick={handleNodeClick}
/>
);
};
export default DiseaseGraph;