From 0eebb2be4dce2be6f899fb7da8ca2dad3ed9e1ab Mon Sep 17 00:00:00 2001 From: Antoine M Date: Thu, 15 Feb 2024 18:55:19 +0100 Subject: [PATCH] refactoring countrySelect --- src/components/ui/CountrySelect.jsx | 72 ++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/components/ui/CountrySelect.jsx b/src/components/ui/CountrySelect.jsx index adaf09c..6ccd7e7 100644 --- a/src/components/ui/CountrySelect.jsx +++ b/src/components/ui/CountrySelect.jsx @@ -1,31 +1,52 @@ -import { useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { v4 as uuidv4 } from "uuid"; -import { useWordpressCustomData } from "../../services/WordpressFetchData.js"; import { useUser } from "../../hooks/useUser.jsx"; +import CountriesJSON from "../../data/countries/countries.json"; -export default function CountrySelect() { - const availableCountries = useWordpressCustomData("/available-countries"); +export default function CountrySelect({ label }) { const { country, changeCountry } = useUser(); + const { language, screensTranslations } = useUser(); const [isSubmenuOpen, setIsSubmenuOpen] = useState(false); - if (!availableCountries || !country) return
Loading...
; - - function handleChangeCountry(key, value) { - changeCountry({ name: value, iso: key }); + function handleChangeCountry(country) { + changeCountry({ name: country.fr, iso: country.alpha2 }); handleShowHideSubmenu(); } function handleShowHideSubmenu() { setIsSubmenuOpen(!isSubmenuOpen); } - const countryOptions = Object.keys(availableCountries).map((key, value) => ( -
  • handleChangeCountry(key, availableCountries[key])}> - - {availableCountries[key]} + const checkEsc = useCallback((event) => { + if (event.key === "Escape") { + setIsSubmenuOpen(false); + } + if (event.type === "click") { + // !event.target.closest(".country-select") + setIsSubmenuOpen(false); + console.log("click"); + } + }, []); + const checkClick = useCallback((event) => { + if (event.type === "click" && !event.target.closest(".country-select")) { + setIsSubmenuOpen(false); + } + }, []); + + useEffect(() => { + document.addEventListener("keydown", checkEsc, false); + document.addEventListener("click", checkClick, false); + + return () => { + document.removeEventListener("keydown", checkEsc, false); + document.removeEventListener("click", checkClick, false); + }; + }, [checkEsc, checkClick]); + + const countryOptions = CountriesJSON.map((country) => ( +
  • handleChangeCountry(country)}> + {country.fr} + {country[language.toLowerCase()]}
  • )); @@ -33,13 +54,20 @@ export default function CountrySelect() { return (
    - - +

    {label}

    +
    + +
      + {countryOptions} +
    +
    ); }