| import { useMemo, useEffect } 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 { PromptGroupsProvider } from '~/Providers'; |
| import { useHasAccess } from '~/hooks'; |
| import { cn } from '~/utils'; |
|
|
| export default function PromptsView() { |
| const params = useParams(); |
| const navigate = useNavigate(); |
| const isDetailView = useMemo(() => !!(params.promptId || params['*'] === 'new'), [params]); |
| const hasAccess = useHasAccess({ |
| permissionType: PermissionTypes.PROMPTS, |
| permission: Permissions.USE, |
| }); |
|
|
| useEffect(() => { |
| let timeoutId: ReturnType<typeof setTimeout>; |
| if (!hasAccess) { |
| timeoutId = setTimeout(() => { |
| navigate('/c/new'); |
| }, 1000); |
| } |
| return () => { |
| clearTimeout(timeoutId); |
| }; |
| }, [hasAccess, navigate]); |
|
|
| if (!hasAccess) { |
| return null; |
| } |
|
|
| return ( |
| <PromptGroupsProvider> |
| <div className="flex h-screen w-full flex-col bg-surface-primary p-0 lg:p-2"> |
| <DashBreadcrumb /> |
| <div className="flex w-full flex-grow flex-row divide-x overflow-hidden dark:divide-gray-600"> |
| <GroupSidePanel isDetailView={isDetailView}> |
| <div className="mt-1 flex flex-row items-center justify-between px-2 md:px-2"> |
| <FilterPrompts /> |
| </div> |
| </GroupSidePanel> |
| <div |
| className={cn( |
| 'scrollbar-gutter-stable w-full overflow-y-auto lg:w-3/4 xl:w-3/4', |
| isDetailView ? 'block' : 'hidden md:block', |
| )} |
| > |
| <Outlet /> |
| </div> |
| </div> |
| </div> |
| </PromptGroupsProvider> |
| ); |
| } |
|
|