tfrere's picture
add multi selection and update language specific list
5621ad9
raw
history blame
2.04 kB
import { useSearchParams, useLocation } from "react-router-dom";
import { useCallback, useEffect } from "react";
/**
* Hook personnalisé pour gérer l'état de l'URL
* @returns {Object} Méthodes et données pour gérer l'état de l'URL
*/
export const useUrlState = () => {
const [searchParams, setSearchParams] = useSearchParams();
const location = useLocation();
// Convertit les searchParams en objet
const getParams = useCallback(() => {
const params = {};
for (const [key, value] of searchParams.entries()) {
if (key === "categories") {
params[key] = value.split(",").filter(Boolean);
} else if (key === "arena") {
params[key] = value === "true";
} else {
params[key] = value;
}
}
return params;
}, [searchParams]);
// Met à jour les paramètres d'URL
const updateParams = useCallback(
(newParams) => {
const updatedParams = new URLSearchParams(searchParams);
Object.entries(newParams).forEach(([key, value]) => {
if (value && (Array.isArray(value) ? value.length > 0 : true)) {
if (Array.isArray(value)) {
updatedParams.set(key, value.join(","));
} else {
updatedParams.set(key, value.toString());
}
} else {
updatedParams.delete(key);
}
});
setSearchParams(updatedParams);
},
[searchParams, setSearchParams]
);
// Réinitialise tous les paramètres d'URL
const resetParams = useCallback(() => {
setSearchParams(new URLSearchParams());
}, [setSearchParams]);
// Gestion de l'intégration avec Hugging Face
useEffect(() => {
const isHFSpace = window.location !== window.parent.location;
if (!isHFSpace) return;
window.parent.postMessage(
{
queryString: location.search,
hash: location.hash,
},
"https://huggingface.co"
);
}, [location]);
return {
params: getParams(),
updateParams,
resetParams,
searchParams,
location,
};
};