import { languages, SupportedLanguage } from "@/lib/i18n/locales"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { useState } from "react"; import i18n from "@/lib/i18n/i18n"; import { useUserContext } from "@/context/user-context"; import { ScrollArea } from "../ui/scroll-area"; import { useTheme } from "../providers/theme-provider"; import { Check, DoorOpenIcon, Languages, Monitor, Moon, Palette, Settings, Sun, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useLocation } from "react-router"; import { useRef } from "react"; import { useScreenParams, recompileScreenParams, } from "@/lib/hooks/screen-params"; import { useMutation } from "@tanstack/react-query"; import axios from "axios"; import { toast } from "sonner"; import { useEffect } from "react"; function Avatar({ initial }: { initial: string }) { return ( {initial} ); } export const QuickActions = () => { const { auth } = useUserContext(); const { theme, setTheme } = useTheme(); const { t } = useTranslation(); const { search } = useLocation(); const [language, setLanguage] = useState( i18n.language as SupportedLanguage, ); const redirectTimer = useRef(null); const searchParams = new URLSearchParams(search); const screenParams = useScreenParams(searchParams); const compiledParams = recompileScreenParams(screenParams); const logoutMutation = useMutation({ mutationFn: () => axios.post("/api/user/logout"), mutationKey: ["logout"], onSuccess: () => { toast.success(t("logoutSuccessTitle"), { description: t("logoutSuccessSubtitle"), }); redirectTimer.current = window.setTimeout(() => { window.location.replace(`/login${compiledParams}`); }, 500); }, onError: () => { toast.error(t("logoutFailTitle"), { description: t("logoutFailSubtitle"), }); }, }); useEffect(() => { return () => { if (redirectTimer.current) { clearTimeout(redirectTimer.current); } }; }, [redirectTimer]); const initial = auth.authenticated ? (auth.name[0] || "U").toUpperCase() : null; const handleSelect = (option: string) => { setLanguage(option as SupportedLanguage); i18n.changeLanguage(option as SupportedLanguage); }; const themes = [ { key: "light", label: t("quickActionsThemeLight"), icon: Sun }, { key: "dark", label: t("quickActionsThemeDark"), icon: Moon }, { key: "system", label: t("quickActionsThemeSystem"), icon: Monitor }, ] as const; return ( {auth.authenticated && ( <>
{initial}
{auth.name} {auth.email}
)} {t("quickActionsLanguage")} {Object.entries(languages).map(([key, value]) => ( handleSelect(key)} > {value} {language === key && } ))} {t("quickActionsTheme")} {themes.map(({ key, label, icon: Icon }) => ( setTheme(key)}> {label} {theme === key && } ))} {auth.authenticated && ( <> logoutMutation.mutate()} className="text-destructive" > {t("quickActionsLogout")} )}
); };