| import React, { createContext, useContext, ReactNode, useMemo } from 'react'; | |
| import { PermissionTypes, Permissions } from 'librechat-data-provider'; | |
| import type { TPromptGroup } from 'librechat-data-provider'; | |
| import type { PromptOption } from '~/common'; | |
| import CategoryIcon from '~/components/Prompts/Groups/CategoryIcon'; | |
| import { usePromptGroupsNav, useHasAccess } from '~/hooks'; | |
| import { useGetAllPromptGroups } from '~/data-provider'; | |
| import { mapPromptGroups } from '~/utils'; | |
| type AllPromptGroupsData = | |
| | { | |
| promptsMap: Record<string, TPromptGroup>; | |
| promptGroups: PromptOption[]; | |
| } | |
| | undefined; | |
| type PromptGroupsContextType = | |
| | (ReturnType<typeof usePromptGroupsNav> & { | |
| allPromptGroups: { | |
| data: AllPromptGroupsData; | |
| isLoading: boolean; | |
| }; | |
| hasAccess: boolean; | |
| }) | |
| | null; | |
| const PromptGroupsContext = createContext<PromptGroupsContextType>(null); | |
| export const PromptGroupsProvider = ({ children }: { children: ReactNode }) => { | |
| const hasAccess = useHasAccess({ | |
| permissionType: PermissionTypes.PROMPTS, | |
| permission: Permissions.USE, | |
| }); | |
| const promptGroupsNav = usePromptGroupsNav(hasAccess); | |
| const { data: allGroupsData, isLoading: isLoadingAll } = useGetAllPromptGroups(undefined, { | |
| enabled: hasAccess, | |
| select: (data) => { | |
| const mappedArray: PromptOption[] = data.map((group) => ({ | |
| id: group._id ?? '', | |
| type: 'prompt', | |
| value: group.command ?? group.name, | |
| label: `${group.command != null && group.command ? `/${group.command} - ` : ''}${ | |
| group.name | |
| }: ${ | |
| (group.oneliner?.length ?? 0) > 0 | |
| ? group.oneliner | |
| : (group.productionPrompt?.prompt ?? '') | |
| }`, | |
| icon: <CategoryIcon category={group.category ?? ''} className="h-5 w-5" />, | |
| })); | |
| const promptsMap = mapPromptGroups(data); | |
| return { | |
| promptsMap, | |
| promptGroups: mappedArray, | |
| }; | |
| }, | |
| }); | |
| const contextValue = useMemo( | |
| () => ({ | |
| ...promptGroupsNav, | |
| allPromptGroups: { | |
| data: hasAccess ? allGroupsData : undefined, | |
| isLoading: hasAccess ? isLoadingAll : false, | |
| }, | |
| hasAccess, | |
| }), | |
| [promptGroupsNav, allGroupsData, isLoadingAll, hasAccess], | |
| ); | |
| return ( | |
| <PromptGroupsContext.Provider value={contextValue}>{children}</PromptGroupsContext.Provider> | |
| ); | |
| }; | |
| export const usePromptGroupsContext = () => { | |
| const context = useContext(PromptGroupsContext); | |
| if (!context) { | |
| throw new Error('usePromptGroupsContext must be used within a PromptGroupsProvider'); | |
| } | |
| return context; | |
| }; | |