import { useMemo, useEffect, useState, useCallback, useRef } from 'react'; import { Outlet, useParams, useNavigate } from 'react-router-dom'; import { PermissionTypes, Permissions } from 'librechat-data-provider'; import FilterPrompts from '~/components/Prompts/Groups/FilterPrompts'; import DashBreadcrumb from '~/routes/Layouts/DashBreadcrumb'; import GroupSidePanel from './Groups/GroupSidePanel'; import { useHasAccess, useLocalize } from '~/hooks'; import { PromptGroupsProvider } from '~/Providers'; import { useMediaQuery } from '@librechat/client'; import { cn } from '~/utils'; export default function PromptsView() { const params = useParams(); const navigate = useNavigate(); const isDetailView = useMemo(() => !!(params.promptId || params['*'] === 'new'), [params]); const isSmallerScreen = useMediaQuery('(max-width: 768px)'); const [panelVisible, setPanelVisible] = useState(!isSmallerScreen); const openPanelRef = useRef(null); const closePanelRef = useRef(null); const localize = useLocalize(); const hasAccess = useHasAccess({ permissionType: PermissionTypes.PROMPTS, permission: Permissions.USE, }); useEffect(() => { let timeoutId: ReturnType; if (!hasAccess) { timeoutId = setTimeout(() => { navigate('/c/new'); }, 1000); } return () => { clearTimeout(timeoutId); }; }, [hasAccess, navigate]); const togglePanel = useCallback(() => { setPanelVisible((prev) => { const newValue = !prev; requestAnimationFrame(() => { if (newValue) { closePanelRef?.current?.focus(); } else { openPanelRef?.current?.focus(); } }); return newValue; }); }, []); useEffect(() => { if (isSmallerScreen && isDetailView) { setPanelVisible(false); } }, [isSmallerScreen, isDetailView]); if (!hasAccess) { return null; } return (
{isSmallerScreen && panelVisible && isDetailView && (
)} {(!isSmallerScreen || !isDetailView || panelVisible) && (
)}
); }