import { Button } from "@/components/ui/button"; import { Card, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { useUserContext } from "@/context/user-context"; import { useMutation } from "@tanstack/react-query"; import axios from "axios"; import { useEffect, useRef } from "react"; import { Trans, useTranslation } from "react-i18next"; import { Navigate } from "react-router"; import { toast } from "sonner"; import { type UseMutationResult } from "@tanstack/react-query"; import { type AxiosResponse } from "axios"; export const LogoutPage = () => { const { auth, oauth, tailscale } = useUserContext(); const { t } = useTranslation(); const redirectTimer = useRef(null); 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"); }, 500); }, onError: () => { toast.error(t("logoutFailTitle"), { description: t("logoutFailSubtitle"), }); }, }); useEffect(() => { return () => { if (redirectTimer.current) { clearTimeout(redirectTimer.current); } }; }, [redirectTimer]); if (!auth.authenticated) { return ; } if (oauth.active) { return ( , }} values={{ username: auth.email, provider: oauth.displayName, }} shouldUnescape={true} /> ); } if (auth.providerId === "tailscale") { return ( You are currently logged in with the Tailscale integration identified by the {tailscale.nodeName} node. Click the button below to log out. ); } return ( , }} values={{ username: auth.username, }} shouldUnescape={true} /> ); }; interface LogoutLayoutProps { children: React.ReactNode; logoutMutation: UseMutationResult< //eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-empty-object-type AxiosResponse, Error, void, unknown >; } function LogoutLayout({ children, logoutMutation }: LogoutLayoutProps) { const { t } = useTranslation(); return ( {t("logoutTitle")} {children} ); }