diff --git a/app/atoms.ts b/app/atoms.ts index 957e482..346bd27 100644 --- a/app/atoms.ts +++ b/app/atoms.ts @@ -3,6 +3,7 @@ import { atom } from "jotai"; import { LatLngBounds } from "leaflet"; import atomWithDebounce from "@/utils/atomWithDebounce"; +import { normalizedContains } from "@/utils/string"; export const tournamentsAtom = atom([]); export const mapBoundsAtom = atom(null); @@ -52,10 +53,9 @@ export const filteredTournamentsListAtom = atom((get) => { : tournaments; // When searching, we search all the tournament, regardless of the map display - if (searchString !== "") - return filteredByNorm.filter((t) => - t.town.includes(searchString.toUpperCase()), - ); + if (searchString !== "") { + return filteredByNorm.filter((t) => normalizedContains(t.town, searchString) || normalizedContains(t.tournament, searchString)); + } // If we not syncing to the map, return all tournaments if (mapBounds === null || !syncVisible) return filteredByNorm; diff --git a/utils/string.ts b/utils/string.ts new file mode 100644 index 0000000..c29ef27 --- /dev/null +++ b/utils/string.ts @@ -0,0 +1,9 @@ +export const removeDiacritics = (str: string) => { + // We normalize to the composed Unicode form, then we can remove the accents + return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); +}; + +export const normalizedContains = (haystack: string, needle: string) => { + const regExp = new RegExp(removeDiacritics(needle), "gi"); + return regExp.test(removeDiacritics(haystack)); +};