diff --git a/apps/console/src/layouts/MainLayout.tsx b/apps/console/src/layouts/MainLayout.tsx index 02a5f4dc4..e0b979909 100644 --- a/apps/console/src/layouts/MainLayout.tsx +++ b/apps/console/src/layouts/MainLayout.tsx @@ -30,6 +30,7 @@ import { graphql } from "relay-runtime"; import { useLazyLoadQuery } from "react-relay"; import type { MainLayoutQuery as MainLayoutQueryType } from "./__generated__/MainLayoutQuery.graphql"; import { Suspense } from "react"; +import { useToast } from "@probo/ui"; import { ErrorBoundary } from "react-error-boundary"; import { PageError } from "/components/PageError"; @@ -146,8 +147,39 @@ export function MainLayout() { function UserDropdown() { const { __ } = useTranslate(); + const { toast } = useToast(); const user = useLazyLoadQuery(MainLayoutQuery, {}).viewer .user; + + const handleLogout: React.MouseEventHandler = async ( + e + ) => { + e.preventDefault(); + + fetch(import.meta.env.VITE_API_URL + "/api/console/v1/auth/logout", { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({}), + }) + .then(async (res) => { + if (!res.ok) { + const error = await res.json(); + throw new Error(error.message || __("Failed to login")); + } + + window.location.reload(); + }) + .catch((e) => { + toast({ + title: __("Error"), + description: e.message as string, + variant: "error", + }); + }); + }; + return ( ); diff --git a/packages/ui/src/Molecules/UserDropdown/UserDropdown.tsx b/packages/ui/src/Molecules/UserDropdown/UserDropdown.tsx index 04dc7a3ba..2e677d113 100644 --- a/packages/ui/src/Molecules/UserDropdown/UserDropdown.tsx +++ b/packages/ui/src/Molecules/UserDropdown/UserDropdown.tsx @@ -44,15 +44,17 @@ export function UserDropdownItem({ icon: IconComponent, label, variant = "tertiary", + onClick, }: { to: string; icon: FC; label: string; variant?: "tertiary" | "danger"; + onClick?: React.MouseEventHandler; }) { return ( - + {IconComponent && } {label}