diff --git a/web/src/app/auth/google/callback/route.ts b/web/src/app/auth/google/callback/route.ts index 71b0e87ff..62696e408 100644 --- a/web/src/app/auth/google/callback/route.ts +++ b/web/src/app/auth/google/callback/route.ts @@ -1,17 +1,16 @@ import { buildUrl } from "@/lib/userSS"; import { NextRequest, NextResponse } from "next/server"; - const getDomain = (request: NextRequest) => { // use env variable if set if (process.env.BASE_URL) { return process.env.BASE_URL; - } + } // next, try and build domain from headers - const requestedHost = request.headers.get('X-Forwarded-Host'); - const requestedPort = request.headers.get('X-Forwarded-Port'); - const requestedProto = request.headers.get('X-Forwarded-Proto'); + const requestedHost = request.headers.get("X-Forwarded-Host"); + const requestedPort = request.headers.get("X-Forwarded-Port"); + const requestedProto = request.headers.get("X-Forwarded-Proto"); if (requestedHost) { const url = request.nextUrl.clone(); url.host = requestedHost; @@ -21,9 +20,8 @@ const getDomain = (request: NextRequest) => { } // finally just use whatever is in the request - return request.nextUrl.origin -} - + return request.nextUrl.origin; +}; export const GET = async (request: NextRequest) => { // Wrapper around the FastAPI endpoint /auth/google/callback, @@ -35,9 +33,7 @@ export const GET = async (request: NextRequest) => { const setCookieHeader = response.headers.get("set-cookie"); if (!setCookieHeader) { - return NextResponse.redirect( - new URL("/auth/error", getDomain(request)) - ); + return NextResponse.redirect(new URL("/auth/error", getDomain(request))); } const redirectResponse = NextResponse.redirect( diff --git a/web/src/components/Header.tsx b/web/src/components/Header.tsx index 38df42598..71574e16f 100644 --- a/web/src/components/Header.tsx +++ b/web/src/components/Header.tsx @@ -2,32 +2,81 @@ import { logout } from "@/lib/user"; import { UserCircle } from "@phosphor-icons/react"; +import Link from "next/link"; import { useRouter } from "next/navigation"; -import React from "react"; +import React, { useEffect, useRef, useState } from "react"; import "tailwindcss/tailwind.css"; export const Header: React.FC = () => { const router = useRouter(); + const [dropdownOpen, setDropdownOpen] = useState(false); + const dropdownRef = useRef(null); + + const handleLogout = () => { + logout().then((isSuccess) => { + if (!isSuccess) { + alert("Failed to logout"); + } + router.push("/auth/login"); + }); + }; + + // When dropdownOpen state changes, it attaches/removes the click listener + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if ( + dropdownRef.current && + !dropdownRef.current.contains(e.target as Node) + ) { + setDropdownOpen(false); + } + }; + + if (dropdownOpen) { + document.addEventListener("click", handleClickOutside); + } else { + document.removeEventListener("click", handleClickOutside); + } + + // Clean up function to remove listener when component unmounts + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, [dropdownOpen]); return (
-

danswer 💃

+ +

danswer 💃

+
- logout().then((isSuccess) => { - if (!isSuccess) { - alert("Failed to logout"); - } - router.push("/auth/login"); - }) - } + className="ml-auto flex items-center cursor-pointer relative" + onClick={() => setDropdownOpen(!dropdownOpen)} + ref={dropdownRef} > - {/* TODO: make this a dropdown with more options */} - - Logout + + {dropdownOpen && ( +
+ +
+ Connectors +
+ +
+ Logout +
+
+ )}