diff --git a/client/babel.config.cjs b/client/babel.config.cjs index 44b0501a61..270f18f1a0 100644 --- a/client/babel.config.cjs +++ b/client/babel.config.cjs @@ -14,6 +14,7 @@ module.exports = { */ plugins: [ '@babel/plugin-transform-runtime', + './test/babel-plugin-transform-import-meta-hot.cjs', 'babel-plugin-transform-import-meta', 'babel-plugin-transform-vite-meta-env', 'babel-plugin-replace-ts-export-assignment', diff --git a/client/src/Providers/BadgeRowContext.tsx b/client/src/Providers/BadgeRowContext.tsx index dce1c38a78..1bedcec66f 100644 --- a/client/src/Providers/BadgeRowContext.tsx +++ b/client/src/Providers/BadgeRowContext.tsx @@ -29,11 +29,7 @@ interface BadgeRowContextType { const BadgeRowContext = createContext(undefined); export function useBadgeRowContext() { - const context = useContext(BadgeRowContext); - if (context === undefined) { - throw new Error('useBadgeRowContext must be used within a BadgeRowProvider'); - } - return context; + return useContext(BadgeRowContext); } interface BadgeRowProviderProps { diff --git a/client/src/Providers/DashboardContext.tsx b/client/src/Providers/DashboardContext.tsx deleted file mode 100644 index f33a240d00..0000000000 --- a/client/src/Providers/DashboardContext.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { createContext, useContext } from 'react'; -type TDashboardContext = { - prevLocationPath: string; -}; - -export const DashboardContext = createContext({} as TDashboardContext); -export const useDashboardContext = () => useContext(DashboardContext); diff --git a/client/src/Providers/DragDropContext.tsx b/client/src/Providers/DragDropContext.tsx index b519c0171f..ed4dddb58f 100644 --- a/client/src/Providers/DragDropContext.tsx +++ b/client/src/Providers/DragDropContext.tsx @@ -83,10 +83,14 @@ export function DragDropProvider({ children }: { children: React.ReactNode }) { return {children}; } +const defaultDragDropValue: DragDropContextValue = { + conversationId: undefined, + agentId: undefined, + endpoint: undefined, + endpointType: undefined, + useResponsesApi: undefined, +}; + export function useDragDropContext() { - const context = useContext(DragDropContext); - if (!context) { - throw new Error('useDragDropContext must be used within DragDropProvider'); - } - return context; + return useContext(DragDropContext) ?? defaultDragDropValue; } diff --git a/client/src/Providers/PromptGroupsContext.tsx b/client/src/Providers/PromptGroupsContext.tsx index 3df373b165..147d2bc336 100644 --- a/client/src/Providers/PromptGroupsContext.tsx +++ b/client/src/Providers/PromptGroupsContext.tsx @@ -77,9 +77,5 @@ export const PromptGroupsProvider = ({ children }: { children: ReactNode }) => { }; export const usePromptGroupsContext = () => { - const context = useContext(PromptGroupsContext); - if (!context) { - throw new Error('usePromptGroupsContext must be used within a PromptGroupsProvider'); - } - return context; + return useContext(PromptGroupsContext); }; diff --git a/client/src/Providers/index.ts b/client/src/Providers/index.ts index 3ae90e189c..aac5fccc21 100644 --- a/client/src/Providers/index.ts +++ b/client/src/Providers/index.ts @@ -10,7 +10,6 @@ export * from './EditorContext'; export * from './ChatFormContext'; export * from './BookmarkContext'; export * from './MessageContext'; -export * from './DashboardContext'; export * from './AssistantsContext'; export * from './AgentsContext'; export * from './AssistantsMapContext'; diff --git a/client/src/components/Agents/Marketplace.tsx b/client/src/components/Agents/Marketplace.tsx index 816705a0db..adf406f7b0 100644 --- a/client/src/components/Agents/Marketplace.tsx +++ b/client/src/components/Agents/Marketplace.tsx @@ -1,11 +1,12 @@ import React, { useState, useEffect, useMemo, useRef, useCallback } from 'react'; -import { useSearchParams, useParams, useNavigate } from 'react-router-dom'; import { useMediaQuery } from '@librechat/client'; import { PermissionTypes, Permissions } from 'librechat-data-provider'; +import { useSearchParams, useParams, useNavigate } from 'react-router-dom'; import type t from 'librechat-data-provider'; import { useDocumentTitle, useHasAccess, useLocalize, TranslationKeys } from '~/hooks'; import { useGetEndpointsQuery, useGetAgentCategoriesQuery } from '~/data-provider'; import MarketplaceAdminSettings from './MarketplaceAdminSettings'; +import OpenSidebar from '~/components/Chat/Menus/OpenSidebar'; import { SidePanelGroup } from '~/components/SidePanel'; import CategoryTabs from './CategoryTabs'; import SearchBar from './SearchBar'; @@ -215,14 +216,19 @@ const AgentMarketplace: React.FC = ({ className = '' }) = )} {/* Sticky wrapper for search bar and categories */} -
+
+
+ + +
{/* Search bar */}
{/* TODO: Remove this once we have a better way to handle admin settings */} - {/* Admin Settings */} - +
+ +
{/* Category tabs */} diff --git a/client/src/components/Agents/MarketplaceAdminSettings.tsx b/client/src/components/Agents/MarketplaceAdminSettings.tsx index c3d7dedda3..be62064aaf 100644 --- a/client/src/components/Agents/MarketplaceAdminSettings.tsx +++ b/client/src/components/Agents/MarketplaceAdminSettings.tsx @@ -10,7 +10,7 @@ const permissions: PermissionConfig[] = [ { permission: Permissions.USE, labelKey: 'com_ui_marketplace_allow_use' }, ]; -const MarketplaceAdminSettings = () => { +const MarketplaceAdminSettings = ({ compact = false }: { compact?: boolean }) => { const localize = useLocalize(); const { showToast } = useToastContext(); @@ -23,7 +23,16 @@ const MarketplaceAdminSettings = () => { }, }); - const trigger = ( + const trigger = compact ? ( + + ) : (
))} +
+ +
); diff --git a/client/src/components/Prompts/buttons/AdminSettings.tsx b/client/src/components/Prompts/buttons/AdminSettings.tsx index 25e6df05a8..7168217694 100644 --- a/client/src/components/Prompts/buttons/AdminSettings.tsx +++ b/client/src/components/Prompts/buttons/AdminSettings.tsx @@ -1,7 +1,6 @@ import { useState } from 'react'; -import { ShieldEllipsis } from 'lucide-react'; import { Permissions, PermissionTypes } from 'librechat-data-provider'; -import { OGDialog, OGDialogTemplate, Button, useToastContext } from '@librechat/client'; +import { OGDialog, OGDialogTemplate, useToastContext } from '@librechat/client'; import type { PermissionConfig } from '~/components/ui'; import { useUpdatePromptPermissionsMutation } from '~/data-provider'; import { AdminSettingsDialog } from '~/components/ui'; @@ -39,18 +38,6 @@ const AdminSettings = () => { setConfirmAdminUseChange({ newValue, callback: onChange }); }; - const trigger = ( - - ); - const confirmDialog = ( { permissions={permissions} menuId="prompt-role-dropdown" mutation={mutation} - trigger={trigger} onPermissionConfirm={handlePermissionConfirm} confirmPermissions={[Permissions.USE]} extraContent={confirmDialog} diff --git a/client/src/components/Prompts/buttons/AdvancedSwitch.tsx b/client/src/components/Prompts/buttons/AdvancedSwitch.tsx deleted file mode 100644 index 9941c78e66..0000000000 --- a/client/src/components/Prompts/buttons/AdvancedSwitch.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { useCallback, useMemo } from 'react'; -import { Sparkles, Layers } from 'lucide-react'; -import { useRecoilState, useSetRecoilState } from 'recoil'; -import { PromptsEditorMode } from '~/common'; -import { Radio } from '@librechat/client'; -import { useLocalize } from '~/hooks'; -import store from '~/store'; - -const { promptsEditorMode, alwaysMakeProd } = store; - -const AdvancedSwitch = () => { - const localize = useLocalize(); - const [mode, setMode] = useRecoilState(promptsEditorMode); - const setAlwaysMakeProd = useSetRecoilState(alwaysMakeProd); - - const options = useMemo( - () => [ - { - value: PromptsEditorMode.SIMPLE, - label: localize('com_ui_simple'), - icon: , - }, - { - value: PromptsEditorMode.ADVANCED, - label: localize('com_ui_advanced'), - icon: , - }, - ], - [localize], - ); - - const handleChange = useCallback( - (value: string) => { - if (value === PromptsEditorMode.SIMPLE) { - setAlwaysMakeProd(true); - } - setMode(value as PromptsEditorMode); - }, - [setMode, setAlwaysMakeProd], - ); - - return ( - - ); -}; - -export default AdvancedSwitch; diff --git a/client/src/components/Prompts/buttons/AutoSendPrompt.tsx b/client/src/components/Prompts/buttons/AutoSendPrompt.tsx index c2ebee70c5..759c33739e 100644 --- a/client/src/components/Prompts/buttons/AutoSendPrompt.tsx +++ b/client/src/components/Prompts/buttons/AutoSendPrompt.tsx @@ -25,13 +25,13 @@ export default function AutoSendPrompt({ onClick={() => handleCheckedChange(!autoSendPrompts)} aria-label={localize('com_nav_auto_send_prompts')} aria-pressed={autoSendPrompts} - className={autoSendPrompts ? 'bg-surface-hover hover:bg-surface-hover' : ''} + className={`relative h-9 w-full gap-2 rounded-lg border-border-light font-medium ${autoSendPrompts ? 'bg-surface-hover hover:bg-surface-hover' : ''}`} >