import React, { useEffect, useRef, useState } from "react"; import paths from "@/utils/paths"; import useLogo from "@/hooks/useLogo"; import { House, List, Robot, Flask, Gear, UserCircleGear, PencilSimpleLine, Nut, Toolbox, Globe, } from "@phosphor-icons/react"; import useUser from "@/hooks/useUser"; import { isMobile } from "react-device-detect"; import Footer from "../Footer"; import { Link } from "react-router-dom"; import { useTranslation } from "react-i18next"; import showToast from "@/utils/toast"; import System from "@/models/system"; import Option from "./MenuOption"; import { CanViewChatHistoryProvider } from "../CanViewChatHistory"; import useAppVersion from "@/hooks/useAppVersion"; export default function SettingsSidebar() { const { t } = useTranslation(); const { logo } = useLogo(); const { user } = useUser(); const sidebarRef = useRef(null); const [showSidebar, setShowSidebar] = useState(false); const [showBgOverlay, setShowBgOverlay] = useState(false); useEffect(() => { function handleBg() { if (showSidebar) { setTimeout(() => { setShowBgOverlay(true); }, 300); } else { setShowBgOverlay(false); } } handleBg(); }, [showSidebar]); if (isMobile) { return ( <>
Logo
setShowSidebar(false)} />
{/* Header Information */}
Logo
{/* Primary Body */}
{t("settings.privacy")}
); } return ( <>
Logo
{t("settings.title")}
{t("settings.privacy")}
); } function SupportEmail() { const [supportEmail, setSupportEmail] = useState(paths.mailToMintplex()); const { t } = useTranslation(); useEffect(() => { const fetchSupportEmail = async () => { const supportEmail = await System.fetchSupportEmail(); setSupportEmail( supportEmail?.email ? `mailto:${supportEmail.email}` : paths.mailToMintplex() ); }; fetchSupportEmail(); }, []); return ( {t("settings.contact")} ); } const SidebarOptions = ({ user = null, t }) => ( {({ viewable: canViewChatHistory }) => ( <> ); function HoldToReveal({ children, holdForMs = 3_000 }) { let timeout = null; const [showing, setShowing] = useState( window.localStorage.getItem( "anythingllm_experimental_feature_preview_unlocked" ) ); useEffect(() => { const onPress = (e) => { if (!["Control", "Meta"].includes(e.key) || timeout !== null) return; timeout = setTimeout(() => { setShowing(true); // Setting toastId prevents hook spam from holding control too many times or the event not detaching showToast("Experimental feature previews unlocked!"); window.localStorage.setItem( "anythingllm_experimental_feature_preview_unlocked", "enabled" ); window.removeEventListener("keypress", onPress); window.removeEventListener("keyup", onRelease); clearTimeout(timeout); }, holdForMs); }; const onRelease = (e) => { if (!["Control", "Meta"].includes(e.key)) return; if (showing) { window.removeEventListener("keypress", onPress); window.removeEventListener("keyup", onRelease); clearTimeout(timeout); return; } clearTimeout(timeout); }; if (!showing) { window.addEventListener("keydown", onPress); window.addEventListener("keyup", onRelease); } return () => { window.removeEventListener("keydown", onPress); window.removeEventListener("keyup", onRelease); }; }, []); if (!showing) return null; return children; } function AppVersion() { const { version, isLoading } = useAppVersion(); if (isLoading) return null; return ( v{version} ); }