Add option to hide logout

This commit is contained in:
Weves 2024-06-02 19:56:51 -07:00 committed by Chris Weaver
parent e4a08c5546
commit 81aada7c0f
8 changed files with 52 additions and 60 deletions

View File

@ -198,6 +198,7 @@ services:
- NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false} - NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false}
- NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT:-}
depends_on: depends_on:
- api_server - api_server
restart: always restart: always

View File

@ -197,6 +197,7 @@ services:
- NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false} - NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false}
- NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT:-}
depends_on: depends_on:
- api_server - api_server
restart: always restart: always

View File

@ -69,6 +69,7 @@ services:
- NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false} - NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false}
- NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT:-}
depends_on: depends_on:
- api_server - api_server
restart: always restart: always

View File

@ -69,6 +69,7 @@ services:
- NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false} - NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA=${NEXT_PUBLIC_NEW_CHAT_DIRECTS_TO_SAME_PERSONA:-false}
- NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-} - NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS:-}
- NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT:-}
depends_on: depends_on:
- api_server - api_server
restart: always restart: always

View File

@ -54,6 +54,9 @@ ENV NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PRED
ARG NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS ARG NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS
ENV NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS} ENV NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS}
ARG NEXT_PUBLIC_DISABLE_LOGOUT
ENV NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT}
RUN npm run build RUN npm run build
# Step 3. Production image, copy all the files and run next # Step 3. Production image, copy all the files and run next
@ -99,6 +102,9 @@ ENV NEXT_PUBLIC_POSITIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_POSITIVE_PRED
ARG NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS ARG NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS
ENV NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS} ENV NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS=${NEXT_PUBLIC_NEGATIVE_PREDEFINED_FEEDBACK_OPTIONS}
ARG NEXT_PUBLIC_DISABLE_LOGOUT
ENV NEXT_PUBLIC_DISABLE_LOGOUT=${NEXT_PUBLIC_DISABLE_LOGOUT}
# Note: Don't expose ports here, Compose will handle that for us if necessary. # Note: Don't expose ports here, Compose will handle that for us if necessary.
# If you want to run this without compose, specify the ports to # If you want to run this without compose, specify the ports to
# expose via cli # expose via cli

View File

@ -1,6 +1,6 @@
"use client"; "use client";
import { useState, useRef } from "react"; import { useState, useRef, useContext } from "react";
import { FiSearch, FiMessageSquare, FiTool, FiLogOut } from "react-icons/fi"; import { FiSearch, FiMessageSquare, FiTool, FiLogOut } from "react-icons/fi";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
@ -9,6 +9,9 @@ import { checkUserIsNoAuthUser, logout } from "@/lib/user";
import { BasicSelectable } from "@/components/BasicClickable"; import { BasicSelectable } from "@/components/BasicClickable";
import { Popover } from "./popover/Popover"; import { Popover } from "./popover/Popover";
import { FaBrain } from "react-icons/fa"; import { FaBrain } from "react-icons/fa";
import { LOGOUT_DISABLED } from "@/lib/constants";
import { Settings } from "@/app/admin/settings/interfaces";
import { SettingsContext } from "./settings/SettingsProvider";
export function UserDropdown({ export function UserDropdown({
user, user,
@ -21,6 +24,12 @@ export function UserDropdown({
const userInfoRef = useRef<HTMLDivElement>(null); const userInfoRef = useRef<HTMLDivElement>(null);
const router = useRouter(); const router = useRouter();
const combinedSettings = useContext(SettingsContext);
if (!combinedSettings) {
return null;
}
const settings = combinedSettings.settings;
const handleLogout = () => { const handleLogout = () => {
logout().then((isSuccess) => { logout().then((isSuccess) => {
if (!isSuccess) { if (!isSuccess) {
@ -31,7 +40,8 @@ export function UserDropdown({
}; };
const showAdminPanel = !user || user.role === "admin"; const showAdminPanel = !user || user.role === "admin";
const showLogout = user && !checkUserIsNoAuthUser(user.id); const showLogout =
user && !checkUserIsNoAuthUser(user.id) && !LOGOUT_DISABLED;
return ( return (
<div className="relative" ref={userInfoRef}> <div className="relative" ref={userInfoRef}>
@ -71,27 +81,33 @@ export function UserDropdown({
> >
{!hideChatAndSearch && ( {!hideChatAndSearch && (
<> <>
<Link {settings.search_page_enabled && (
href="/search" <Link
className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light" href="/search"
> className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light"
<FiSearch className="my-auto mr-2 text-lg" /> >
Danswer Search <FiSearch className="my-auto mr-2 text-lg" />
</Link> Danswer Search
<Link </Link>
href="/chat" )}
className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light" {settings.chat_page_enabled && (
> <>
<FiMessageSquare className="my-auto mr-2 text-lg" /> <Link
Danswer Chat href="/chat"
</Link> className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light"
<Link >
href="/assistants/mine" <FiMessageSquare className="my-auto mr-2 text-lg" />
className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light" Danswer Chat
> </Link>
<FaBrain className="my-auto mr-2 text-lg" /> <Link
My Assistants href="/assistants/mine"
</Link> className="flex py-3 px-4 rounded cursor-pointer hover:bg-hover-light"
>
<FaBrain className="my-auto mr-2 text-lg" />
My Assistants
</Link>
</>
)}
</> </>
)} )}
{showAdminPanel && ( {showAdminPanel && (

View File

@ -17,43 +17,6 @@ interface HeaderProps {
} }
export function Header({ user }: HeaderProps) { export function Header({ user }: HeaderProps) {
const router = useRouter();
const [dropdownOpen, setDropdownOpen] = useState(false);
const dropdownRef = useRef<HTMLDivElement>(null);
const handleLogout = async () => {
const response = await logout();
if (!response.ok) {
alert("Failed to logout");
}
// disable auto-redirect immediately after logging out so the user
// is not immediately re-logged in
router.push("/auth/login?disableAutoRedirect=true");
};
// 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]);
const combinedSettings = useContext(SettingsContext); const combinedSettings = useContext(SettingsContext);
if (!combinedSettings) { if (!combinedSettings) {
return null; return null;

View File

@ -17,6 +17,9 @@ export const SEARCH_TYPE_COOKIE_NAME = "search_type";
export const HEADER_PADDING = "pt-[64px]"; export const HEADER_PADDING = "pt-[64px]";
export const LOGOUT_DISABLED =
process.env.NEXT_PUBLIC_DISABLE_LOGOUT?.toLowerCase() === "true";
// NOTE: since this is a `NEXT_PUBLIC_` variable, it will be set at // NOTE: since this is a `NEXT_PUBLIC_` variable, it will be set at
// build-time // build-time
// TODO: consider moving this to an API call so that the api_server // TODO: consider moving this to an API call so that the api_server