"use client"; import * as React from "react"; import { baseUrl } from "../../api/baseUrl"; import { cn } from "@/lib/utils"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import ActivityIndicator from "@/components/indicators/activity-indicator"; import axios, { AxiosError } from "axios"; import { Toaster } from "@/components/ui/sonner"; import { toast } from "sonner"; import { Form, FormControl, FormField, FormItem, FormLabel, } from "@/components/ui/form"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { AuthContext } from "@/context/auth-context"; import { useTranslation } from "react-i18next"; interface UserAuthFormProps extends React.HTMLAttributes {} export function UserAuthForm({ className, ...props }: UserAuthFormProps) { const { t } = useTranslation(["components/auth"]); const [isLoading, setIsLoading] = React.useState(false); const { login } = React.useContext(AuthContext); const formSchema = z.object({ user: z.string().min(1, t("form.errors.usernameRequired")), password: z.string().min(1, t("form.errors.passwordRequired")), }); const form = useForm>({ resolver: zodResolver(formSchema), mode: "onChange", defaultValues: { user: "", password: "" }, }); const onSubmit = async (values: z.infer) => { setIsLoading(true); try { await axios.post( "/login", { user: values.user, password: values.password, }, { headers: { "X-CSRF-TOKEN": 1 }, }, ); const profileRes = await axios.get("/profile", { withCredentials: true }); login({ username: profileRes.data.username, role: profileRes.data.role || "viewer", }); window.location.href = baseUrl; } catch (error) { if (axios.isAxiosError(error)) { const err = error as AxiosError; if (err.response?.status === 429) { toast.error(t("form.errors.rateLimit"), { position: "top-center", }); } else if (err.response?.status === 401) { toast.error(t("form.errors.loginFailed"), { position: "top-center", }); } else { toast.error(t("form.errors.unknownError"), { position: "top-center", }); } } else { toast.error(t("form.errors.webUnknownError"), { position: "top-center", }); } setIsLoading(false); } }; return (
( {t("form.user")} )} /> ( {t("form.password")} )} />
); }