language-selector.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use client";
  2. import { useAction } from "next-safe-action/hooks";
  3. import { Languages } from "lucide-react";
  4. import { useChangeLocale, languages, useI18n } from "locales/client";
  5. import { updateUserAction } from "@/entities/user/model/update-user.action";
  6. const languageFlags: Record<string, string> = {
  7. en: "🇬🇧",
  8. fr: "🇫🇷",
  9. };
  10. export function LanguageSelector() {
  11. const action = useAction(updateUserAction);
  12. const changeLocale = useChangeLocale();
  13. const t = useI18n();
  14. const handleLanguageChange = async (newLocale: string) => {
  15. await action.execute({ locale: newLocale });
  16. changeLocale(newLocale as "en" | "fr");
  17. };
  18. return (
  19. <div className="dropdown dropdown-end">
  20. <div className="tooltip tooltip-bottom" data-tip={t("commons.change_language")}>
  21. <div
  22. className="btn btn-ghost btn-circle h-8 w-8 p-0 text-xl flex items-center justify-center hover:bg-slate-200 border-none dark:hover:bg-gray-800 rounded-full"
  23. role="button"
  24. tabIndex={0}
  25. >
  26. <Languages className="w-5 h-5 text-blue-500 dark:text-blue-400" />
  27. </div>
  28. </div>
  29. <ul
  30. className="mt-3 z-[1] p-2 shadow menu menu-sm dropdown-content bg-base-100 dark:bg-black dark:text-gray-200 rounded-box border border-slate-200 dark:border-gray-800"
  31. tabIndex={0}
  32. >
  33. {languages.map((language) => (
  34. <li className="" key={language}>
  35. <button
  36. className="flex items-center gap-2 text-base hover:bg-slate-200 dark:hover:bg-gray-800 rounded-lg px-3 py-2 transition-colors"
  37. onClick={() => handleLanguageChange(language)}
  38. >
  39. <span className="text-lg">{languageFlags[language]}</span>
  40. <span className="text-base">{language === "en" ? "English" : "Français"}</span>
  41. </button>
  42. </li>
  43. ))}
  44. </ul>
  45. </div>
  46. );
  47. }