mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-27 04:44:10 +01:00
* 🔧 refactor: permission handling for public sharing - Updated permission keys from SHARED_GLOBAL to SHARE across various files for consistency. - Added public access configuration in librechat.example.yaml. - Adjusted related tests and components to reflect the new permission structure. * chore: Update default SHARE permission to false * fix: Update SHARE permissions in tests and implementation - Added SHARE permission handling for user and admin roles in permissions.spec.ts and permissions.ts. - Updated expected permissions in tests to reflect new SHARE permission values for various permission types. * fix: Handle undefined values in PeoplePickerAdminSettings component - Updated the checked and value props of the Switch component to handle undefined values gracefully by defaulting to false. This ensures consistent behavior when the field value is not set. * feat: Add CREATE permission handling for prompts and agents - Introduced CREATE permission for user and admin roles in permissions.spec.ts and permissions.ts. - Updated expected permissions in tests to include CREATE permission for various permission types. * 🔧 refactor: Enhance permission handling for sharing dialog usability * refactor: public sharing permissions for resources - Added middleware to check SHARE_PUBLIC permissions for agents, prompts, and MCP servers. - Updated interface configuration in librechat.example.yaml to include public sharing options. - Enhanced components and hooks to support public sharing functionality. - Adjusted tests to validate new permission handling for public sharing across various resource types. * refactor: update Share2Icon styling in GenericGrantAccessDialog * refactor: update Share2Icon size in GenericGrantAccessDialog for consistency * refactor: improve layout and styling of Share2Icon in GenericGrantAccessDialog * refactor: update Share2Icon size in GenericGrantAccessDialog for improved consistency * chore: remove redundant public sharing option from People Picker * refactor: add SHARE_PUBLIC permission handling in updateInterfacePermissions tests
107 lines
3.7 KiB
TypeScript
107 lines
3.7 KiB
TypeScript
import { Spinner } from '@librechat/client';
|
|
import { useWatch, useFormContext } from 'react-hook-form';
|
|
import {
|
|
SystemRoles,
|
|
Permissions,
|
|
ResourceType,
|
|
PermissionBits,
|
|
PermissionTypes,
|
|
} from 'librechat-data-provider';
|
|
import type { AgentForm, AgentPanelProps } from '~/common';
|
|
import { useLocalize, useAuthContext, useHasAccess, useResourcePermissions } from '~/hooks';
|
|
import { GenericGrantAccessDialog } from '~/components/Sharing';
|
|
import { useUpdateAgentMutation } from '~/data-provider';
|
|
import AdvancedButton from './Advanced/AdvancedButton';
|
|
import VersionButton from './Version/VersionButton';
|
|
import DuplicateAgent from './DuplicateAgent';
|
|
import AdminSettings from './AdminSettings';
|
|
import DeleteButton from './DeleteButton';
|
|
import { Panel } from '~/common';
|
|
|
|
export default function AgentFooter({
|
|
activePanel,
|
|
createMutation,
|
|
updateMutation,
|
|
setActivePanel,
|
|
setCurrentAgentId,
|
|
isAvatarUploading = false,
|
|
}: Pick<
|
|
AgentPanelProps,
|
|
'setCurrentAgentId' | 'createMutation' | 'activePanel' | 'setActivePanel'
|
|
> & {
|
|
updateMutation: ReturnType<typeof useUpdateAgentMutation>;
|
|
isAvatarUploading?: boolean;
|
|
}) {
|
|
const localize = useLocalize();
|
|
const { user } = useAuthContext();
|
|
|
|
const methods = useFormContext<AgentForm>();
|
|
|
|
const { control } = methods;
|
|
const agent = useWatch({ control, name: 'agent' });
|
|
const agent_id = useWatch({ control, name: 'id' });
|
|
const hasAccessToShareAgents = useHasAccess({
|
|
permissionType: PermissionTypes.AGENTS,
|
|
permission: Permissions.SHARE,
|
|
});
|
|
const { hasPermission, isLoading: permissionsLoading } = useResourcePermissions(
|
|
ResourceType.AGENT,
|
|
agent?._id || '',
|
|
);
|
|
|
|
const canShareThisAgent = hasPermission(PermissionBits.SHARE);
|
|
const canDeleteThisAgent = hasPermission(PermissionBits.DELETE);
|
|
const isSaving = createMutation.isLoading || updateMutation.isLoading || isAvatarUploading;
|
|
const renderSaveButton = () => {
|
|
if (isSaving) {
|
|
return <Spinner className="icon-md" aria-hidden="true" />;
|
|
}
|
|
|
|
if (agent_id) {
|
|
return localize('com_ui_save');
|
|
}
|
|
|
|
return localize('com_ui_create');
|
|
};
|
|
|
|
const showButtons = activePanel === Panel.builder;
|
|
|
|
return (
|
|
<div className="mb-1 flex w-full flex-col gap-2">
|
|
{showButtons && <AdvancedButton setActivePanel={setActivePanel} />}
|
|
{showButtons && agent_id && <VersionButton setActivePanel={setActivePanel} />}
|
|
{user?.role === SystemRoles.ADMIN && showButtons && <AdminSettings />}
|
|
{/* Context Button */}
|
|
<div className="flex items-center justify-end gap-2">
|
|
{(agent?.author === user?.id || user?.role === SystemRoles.ADMIN || canDeleteThisAgent) &&
|
|
!permissionsLoading && (
|
|
<DeleteButton
|
|
agent_id={agent_id}
|
|
setCurrentAgentId={setCurrentAgentId}
|
|
createMutation={createMutation}
|
|
/>
|
|
)}
|
|
{(agent?.author === user?.id || user?.role === SystemRoles.ADMIN || canShareThisAgent) &&
|
|
hasAccessToShareAgents &&
|
|
!permissionsLoading && (
|
|
<GenericGrantAccessDialog
|
|
resourceDbId={agent?._id}
|
|
resourceId={agent_id}
|
|
resourceName={agent?.name ?? ''}
|
|
resourceType={ResourceType.AGENT}
|
|
/>
|
|
)}
|
|
{agent && agent.author === user?.id && <DuplicateAgent agent_id={agent_id} />}
|
|
{/* Submit Button */}
|
|
<button
|
|
className="btn btn-primary focus:shadow-outline flex h-9 w-full items-center justify-center px-4 py-2 font-semibold text-white hover:bg-green-600 focus:border-green-500"
|
|
type="submit"
|
|
disabled={isSaving}
|
|
aria-busy={isSaving}
|
|
>
|
|
{renderSaveButton()}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|