ldc-groupe/resources/ts/back/Components/Layout/AppSettings.tsx

138 lines
5.2 KiB
TypeScript

// * Packages
import { Settings, Moon, Sun } from "lucide-react";
import { route } from "ziggy-js";
import { FormEvent } from "react";
import { useForm, usePage } from "@inertiajs/react";
// * Components shadcn
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
// * Other
import { AppEnv, Theme } from "@/back/types/global";
import { useTheme } from "@/back/providers/ThemeProvider";
import useTrans from "@/hooks/use-translations";
import { cn } from "@/lib/utils";
export default function AppSettings({
className = "",
}: {
className?: string;
}) {
const { locale } = usePage().props.appEnv as AppEnv;
const { setTheme, theme } = useTheme();
const { post, setData } = useForm({
lang: "system",
});
const submit = (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
post(route(`back.lang.set`));
};
const GetTranslation = (name: string) => {
return useTrans(name);
};
const mods = [
{
name: useTrans("back.light"),
theme: "light",
icon: Sun,
},
{
name: useTrans("back.dark"),
theme: "dark",
icon: Moon,
},
];
const languages = [
{
name: useTrans("Français"),
locale: "fr",
flag: "fr",
},
{
name: useTrans("English"),
locale: "en",
flag: "us",
},
];
return (
<div className={cn(className)}>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button className="text-muted-foreground" variant="ghost">
<Settings className="h-[1.2rem] w-[1.2rem]" />
<span>{useTrans("back.settings")}</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent side="bottom" className="w-fit">
<p className="text-center text-muted-foreground text-sm font-medium leading-7">
{useTrans("back.mods")}
</p>
<div className="flex flex-row justify-center items-center gap-1">
{mods.map((mod) => {
return (
<DropdownMenuItem
key={mod.name}
className="p-0"
onSelect={(e) => e.preventDefault()}
>
<Button
className={cn("w-full", {
"bg-secondary": theme === mod.theme,
})}
variant="ghost"
onClick={() =>
setTheme(mod.theme as Theme)
}
>
<mod.icon />
{GetTranslation(mod.name)}
</Button>
</DropdownMenuItem>
);
})}
</div>
<DropdownMenuSeparator />
<p className="text-center text-muted-foreground text-sm font-medium leading-7">
{useTrans("back.languages")}
</p>
<form
className="flex flex-row justify-center items-center gap-1"
onSubmit={submit}
>
{languages.map((language) => {
return (
<DropdownMenuItem
key={language.name}
className="p-0"
onSelect={(e) => e.preventDefault()}
>
<Button
className={cn("w-full", {
"bg-secondary":
locale === language.locale,
})}
variant="ghost"
type="submit"
onClick={() => {
setData("lang", language.locale);
}}
>
<span
className={`fi fi-${language.flag}`}
/>
{language.name}
</Button>
</DropdownMenuItem>
);
})}
</form>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}