wikimedica-disease-search/app/src/util.js

70 lines
1.8 KiB
JavaScript
Raw Normal View History

import {useState, useEffect} from 'react';
/**
* Hook permettant dobtenir des résultats asynchrones.
*
* @param initial Valeur initiale lorsque la promesse na pas répondu.
* @param func Fonction renvoyant une promesse.
* @param ...args Arguments à passer à `func` qui sont susceptibles de changer.
* @return Résultats de la promesse.
*/
export const useAsync = (initial, func, ...args) =>
{
const [results, setResults] = useState(initial);
useEffect(() =>
{
const fetcher = async () =>
{
setResults(await func(...args));
};
fetcher();
}, args);
return results;
};
/**
* Crée un état composé dune liste et dun élément ayant le focus dans cette
* liste. À la modification de la liste ou de lindice de lélément ayant le
* focus, la contrainte focus [0, taille de la liste] est imposée.
*
* @return Objet contenant la liste, lindice de lélément ayant le focus ainsi
* que des fonctions de modification.
*/
export const useFocusableList = () =>
{
const [list, setList] = useState([]);
const [focus, setFocus] = useState(0);
return {
list,
focus,
/**
* Modifie la liste et sassure que lélément ayant le focus est
* toujours dans sa plage de valeurs possibles.
*
* @param nextList Nouvelle liste.
*/
setList(nextList)
{
setList(nextList);
setFocus(Math.min(nextList.length, focus));
},
/**
* Modifie lélément ayant le focus en imposant les contraintes
* dintégrité.
*
* @param nextFocus Indice du nouvel élément ayant le focus.
*/
setFocus(nextFocus)
{
setFocus(Math.min(nextList.length, Math.max(0, focus)));
}
};
};