All files / src/components/organisms/preferencesDialog preferencesDialog.tsx

100% Statements 7/7
50% Branches 2/4
100% Functions 5/5
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95                    6x                               9x   9x                             27x 1x                                             18x           1x                                          
import { isMobile } from "@/utils";
import { languages } from "@/utils/constants";
import ReactCountryFlag from "react-country-flag";
 
import usePreferencesDialog from "@/hooks/usePreferencesDialog";
 
import { Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material";
import CloseIcon from "@mui/icons-material/Close";
import CheckIcon from "@mui/icons-material/Check";
 
export const PreferencesDialog = ({
  onClose,
  openDialog,
}: {
  onClose: () => void;
  openDialog: boolean;
}) => {
  const {
    accentColors,
    t,
    accentColor,
    selectedColor,
    setSelectedColor,
    selectedLanguage,
    setSelectedLanguage,
    handleUpdatePreferences,
  } = usePreferencesDialog(onClose);
 
  return (
    <Dialog fullScreen={isMobile()} onClose={onClose} open={openDialog}>
      <DialogTitle>
        <div className="flex justify-between items-center">
          <span className="text-2xl font-semibold">{t("preferences")}</span>
          <CloseIcon onClick={onClose} sx={{ color: "#5A5A5A", cursor: "pointer" }} />
        </div>
      </DialogTitle>
 
      <DialogContent>
        <section>
          <div className="font-bold text-xl">{t("language")}</div>
 
          <div className="flex flex-col gap-4 mt-2">
            {languages.map((l) => (
              <div
                onClick={() => setSelectedLanguage(l.iso_639_1)}
                className="flex items-center gap-1 border rounded-md shadow-md p-4 cursor-pointer"
              >
                {selectedLanguage === l.iso_639_1 && (
                  <div className="flex justify-center items-center rounded-full h-[20px] w-[20px] border-2 bg-[#172554]">
                    <CheckIcon sx={{ color: "#fff", fontSize: 12 }} />
                  </div>
                )}
 
                <ReactCountryFlag countryCode={l.flag} />
                <span>{l.english_name}</span>
              </div>
            ))}
          </div>
        </section>
 
        <section className="mt-8">
          <div className="font-bold text-xl">{t("personalize")}</div>
          <div className="mt-1">{t("choose_accent_notice")}</div>
          <div className="text-lg mt-5">{t("select_your_color")}</div>
 
          <div className="grid grid-cols-6 mt-2 gap-6">
            {accentColors.map((color, index) => (
              <div
                data-testid={`accent-color-${index}`}
                style={{
                  background: color,
                }}
                className="w-11 h-11 flex items-center justify-center rounded-full cursor-pointer"
                onClick={() => setSelectedColor(color)}
              >
                {color === selectedColor && <CheckIcon sx={{ color: "#fff" }} fontSize="large" />}
              </div>
            ))}
          </div>
        </section>
      </DialogContent>
 
      <DialogActions>
        <button
          onClick={handleUpdatePreferences}
          style={{ background: accentColor }}
          className="rounded-md w-full px-4 py-2 shadow-md text-white"
        >
          {t("apply")}
        </button>
      </DialogActions>
    </Dialog>
  );
};