feat: Enhance CategoryTabs and Marketplace components for better responsiveness and navigation feat: Refactor AgentCard and AgentGrid components for improved layout and accessibility feat: Implement animated category transitions in AgentMarketplace and update NewChat component layout feat: Refactor UI components for improved styling and accessibility in sharing dialogs refactor: remove GenericManagePermissionsDialog and GrantAccessDialog components - Deleted GenericManagePermissionsDialog and GrantAccessDialog components to streamline sharing functionality. - Updated ManagePermissionsDialog to utilize AccessRolesPicker directly. - Introduced UnifiedPeopleSearch for improved people selection experience. - Enhanced PublicSharingToggle with InfoHoverCard for better user guidance. - Adjusted AgentPanel to change error status to warning for duplicate agent versions. - Updated translations to include new keys for search and access management. feat: Add responsive design for SelectedPrincipalsList and improve layout in GenericGrantAccessDialog feat: Enhance styling in SelectedPrincipalsList and SearchPicker components for improved UI consistency feat: Improve PublicSharingToggle component with enhanced styling and accessibility features feat: Introduce InfoHoverCard component and refactor enums for better organization feat: Implement infinite scroll for agent grids and enhance performance - Added `useInfiniteScroll` hook to manage infinite scrolling behavior in agent grids. - Integrated infinite scroll functionality into `AgentGrid` and `VirtualizedAgentGrid` components. - Updated `AgentMarketplace` to pass the scroll container to the agent grid components. - Refactored loading indicators to show a spinner instead of a "Load More" button. - Created `VirtualizedAgentGrid` component for optimized rendering of agent cards using virtualization. - Added performance tests for `VirtualizedAgentGrid` to ensure efficient handling of large datasets. - Updated translations to include new messages for end-of-results scenarios. chore: Remove unused permission-related UI localization keys ci: Update Agent model tests to handle duplicate support_contact updates - Modified tests to ensure that updating an agent with the same support_contact does not create a new version and returns successfully. - Enhanced verification for partial changes in support_contact, confirming no new version is created when content remains the same. chore: Address ESLint, clean up unused imports and improve prop definitions in various components ci: fix tests ci: update tests chore: remove unused search localization keys
120 lines
3.9 KiB
TypeScript
120 lines
3.9 KiB
TypeScript
import React from 'react';
|
|
import { Globe, Shield } from 'lucide-react';
|
|
import { ResourceType } from 'librechat-data-provider';
|
|
import { Switch, InfoHoverCard, ESide, Label } from '@librechat/client';
|
|
import type { AccessRoleIds } from 'librechat-data-provider';
|
|
import AccessRolesPicker from './AccessRolesPicker';
|
|
import { useLocalize } from '~/hooks';
|
|
import { cn } from '~/utils';
|
|
|
|
interface PublicSharingToggleProps {
|
|
isPublic: boolean;
|
|
publicRole?: AccessRoleIds;
|
|
onPublicToggle: (isPublic: boolean) => void;
|
|
onPublicRoleChange: (role: AccessRoleIds) => void;
|
|
resourceType?: ResourceType;
|
|
className?: string;
|
|
}
|
|
|
|
export default function PublicSharingToggle({
|
|
isPublic,
|
|
publicRole,
|
|
onPublicToggle,
|
|
onPublicRoleChange,
|
|
resourceType = ResourceType.AGENT,
|
|
className,
|
|
}: PublicSharingToggleProps) {
|
|
const localize = useLocalize();
|
|
|
|
const handleToggle = React.useCallback(
|
|
(checked: boolean) => {
|
|
onPublicToggle(checked);
|
|
},
|
|
[onPublicToggle],
|
|
);
|
|
|
|
return (
|
|
<div className={cn('space-y-4', className)}>
|
|
{/* Main toggle section */}
|
|
<div className="group relative rounded-lg">
|
|
<div className="flex items-center justify-between">
|
|
<div className="flex items-center gap-3">
|
|
<div
|
|
className={cn(
|
|
'transition-colors duration-200',
|
|
isPublic ? 'text-blue-600 dark:text-blue-500' : 'text-text-secondary',
|
|
)}
|
|
>
|
|
<Globe className="size-5" />
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<Label
|
|
htmlFor="public-access-toggle"
|
|
className="cursor-pointer text-sm font-medium text-text-primary"
|
|
>
|
|
{localize('com_ui_public_access')}
|
|
</Label>
|
|
<InfoHoverCard side={ESide.Top} text={localize('com_ui_public_access_description')} />
|
|
</div>
|
|
</div>
|
|
<Switch
|
|
id="public-access-toggle"
|
|
checked={isPublic}
|
|
onCheckedChange={handleToggle}
|
|
aria-label={localize('com_ui_public_access')}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Permission level section with smooth animation */}
|
|
<div
|
|
className={cn(
|
|
'transition-all duration-300 ease-in-out',
|
|
isPublic ? 'max-h-32 opacity-100' : 'max-h-0 opacity-0',
|
|
)}
|
|
style={{ overflow: isPublic ? 'visible' : 'hidden' }}
|
|
>
|
|
<div
|
|
className={cn(
|
|
'rounded-lg transition-all duration-300',
|
|
isPublic ? 'bg-surface-secondary/50 translate-y-0' : '-translate-y-2',
|
|
)}
|
|
>
|
|
<div className="flex items-center justify-between">
|
|
<div className="flex items-center gap-3">
|
|
<div
|
|
className={cn(
|
|
'transition-all duration-300',
|
|
isPublic
|
|
? 'scale-100 text-blue-600 dark:text-blue-500'
|
|
: 'scale-95 text-text-secondary',
|
|
)}
|
|
>
|
|
<Shield className="size-5" />
|
|
</div>
|
|
<div className="flex flex-col gap-0.5">
|
|
<Label htmlFor="permission-level" className="text-sm font-medium text-text-primary">
|
|
{localize('com_ui_public_permission_level')}
|
|
</Label>
|
|
</div>
|
|
</div>
|
|
<div
|
|
className={cn(
|
|
'relative z-50 transition-all duration-300',
|
|
isPublic ? 'scale-100 opacity-100' : 'scale-95 opacity-0',
|
|
)}
|
|
>
|
|
<AccessRolesPicker
|
|
id="permission-level"
|
|
resourceType={resourceType}
|
|
selectedRoleId={publicRole}
|
|
onRoleChange={onPublicRoleChange}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|