mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-06-25 23:40:58 +02:00
Add option to hide logout
This commit is contained in:
parent
e4a08c5546
commit
81aada7c0f
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 && (
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user