Apply suggestions from code review
Co-authored-by: Pierre de La Morinerie <kemenaran@gmail.com>
This commit is contained in:
parent
7f28c49887
commit
10cdd2c77e
2 changed files with 16 additions and 4 deletions
|
@ -3,16 +3,24 @@ import { QueryClientProvider } from 'react-query';
|
||||||
import { matchSorter } from 'match-sorter';
|
import { matchSorter } from 'match-sorter';
|
||||||
|
|
||||||
import ComboSearch from './ComboSearch';
|
import ComboSearch from './ComboSearch';
|
||||||
import { queryClient } from './shared/queryClient';
|
import { queryClient, searchResultsLimit } from './shared/queryClient';
|
||||||
|
|
||||||
function expandResultsWithMultiplePostalCodes(term, results) {
|
function expandResultsWithMultiplePostalCodes(term, results) {
|
||||||
|
// A single result may have several associated postal codes.
|
||||||
|
// To make the search results more precise, we want to generate
|
||||||
|
// an actual result for each postal code.
|
||||||
const expandedResults = results.flatMap((result) =>
|
const expandedResults = results.flatMap((result) =>
|
||||||
result.codesPostaux.map((codePostal) => ({
|
result.codesPostaux.map((codePostal) => ({
|
||||||
...result,
|
...result,
|
||||||
codesPostaux: [codePostal]
|
codesPostaux: [codePostal]
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
const limit = term.length > 5 ? 10 : 5;
|
|
||||||
|
// Some very large cities (like Paris) have A LOT of associated postal codes.
|
||||||
|
// As we generated one result per postal code, we now have a lot of results
|
||||||
|
// for the same city. If the number of results is above the threshold, we use
|
||||||
|
// local search to narrow the results.
|
||||||
|
const limit = searchResultsLimit(term);
|
||||||
if (expandedResults.length > limit) {
|
if (expandedResults.length > limit) {
|
||||||
return matchSorter(expandedResults, term, {
|
return matchSorter(expandedResults, term, {
|
||||||
keys: [(item) => `${item.nom} (${item.codesPostaux[0]})`, 'code'],
|
keys: [(item) => `${item.nom} (${item.codesPostaux[0]})`, 'code'],
|
||||||
|
|
|
@ -13,6 +13,11 @@ export const queryClient = new QueryClient({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Avoid hiding similar matches for precise queries (like "Sainte Marie")
|
||||||
|
export function searchResultsLimit(term) {
|
||||||
|
return term.length > 5 ? 10 : 5;
|
||||||
|
}
|
||||||
|
|
||||||
function buildURL(scope, term) {
|
function buildURL(scope, term) {
|
||||||
term = encodeURIComponent(term.replace(/\(|\)/g, ''));
|
term = encodeURIComponent(term.replace(/\(|\)/g, ''));
|
||||||
if (scope === 'adresse') {
|
if (scope === 'adresse') {
|
||||||
|
@ -23,8 +28,7 @@ function buildURL(scope, term) {
|
||||||
if (isNumeric(term)) {
|
if (isNumeric(term)) {
|
||||||
return `${api_geo_url}/communes?codePostal=${term}&limit=5`;
|
return `${api_geo_url}/communes?codePostal=${term}&limit=5`;
|
||||||
}
|
}
|
||||||
// Avoid hiding similar matches for precise queries (like "Sainte Marie")
|
const limit = searchResultsLimit(term);
|
||||||
const limit = term.length > 5 ? 10 : 5;
|
|
||||||
return `${api_geo_url}/communes?nom=${term}&boost=population&limit=${limit}`;
|
return `${api_geo_url}/communes?nom=${term}&boost=population&limit=${limit}`;
|
||||||
} else if (isNumeric(term)) {
|
} else if (isNumeric(term)) {
|
||||||
const code = term.padStart(2, '0');
|
const code = term.padStart(2, '0');
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue