Files
LibreChat/client/src/components/Sharing/PublicSharingToggle.tsx
Marco Beretta d82a63642d 🖼️ style: Improve Marketplace & Sharing Dialog UI
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
2025-08-13 16:24:24 -04:00

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>
);
}