40 lines
1 KiB
JavaScript
40 lines
1 KiB
JavaScript
|
import { QueryCache } from 'react-query';
|
||
|
import { isNumeric } from '@utils';
|
||
|
|
||
|
const { api_geo_url, api_adresse_url } = gon.autocomplete || {};
|
||
|
|
||
|
export const queryCache = new QueryCache({
|
||
|
defaultConfig: {
|
||
|
queries: {
|
||
|
queryFn: defaultQueryFn
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function buildURL(scope, term) {
|
||
|
if (scope === 'adresse') {
|
||
|
return `${api_adresse_url}/search?q=${term}&limit=5`;
|
||
|
} else if (isNumeric(term)) {
|
||
|
const code = term.padStart(2, '0');
|
||
|
return `${api_geo_url}/${scope}?code=${code}&limit=5`;
|
||
|
}
|
||
|
return `${api_geo_url}/${scope}?nom=${term}&limit=5`;
|
||
|
}
|
||
|
|
||
|
function buildOptions() {
|
||
|
if (window.AbortController) {
|
||
|
const controller = new AbortController();
|
||
|
const signal = controller.signal;
|
||
|
return [{ signal }, controller];
|
||
|
}
|
||
|
return [{}, null];
|
||
|
}
|
||
|
|
||
|
async function defaultQueryFn(scope, term) {
|
||
|
const url = buildURL(scope, term);
|
||
|
const [options, controller] = buildOptions();
|
||
|
const promise = fetch(url, options).then((response) => response.json());
|
||
|
promise.cancel = () => controller && controller.abort();
|
||
|
return promise;
|
||
|
}
|