mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
* ✨ feat: Enhance Spinner component with customizable properties and improved animation * 🔧 fix: Replace Loader with Spinner in RunCode component and update FilePreview to use Spinner for progress indication * ✨ feat: Refactor icons in CodeProgress and CancelledIcon components; enhance animation and styling in ExecuteCode and ProgressText components * ✨ feat: Refactor attachment handling in ExecuteCode component; replace individual attachment rendering with AttachmentGroup for improved structure * ✨ feat: Refactor dialog components for improved accessibility and styling; integrate Skeleton loading state in Image component * ✨ feat: Refactor ToolCall component to use ToolCallInfo for better structure; replace ToolPopover with AttachmentGroup; enhance ProgressText with error handling and improved UI elements * 🔧 fix: Remove unnecessary whitespace in ProgressText * 🔧 fix: Remove unnecessary margin from AgentFooter and AgentPanel components; clean up SidePanel imports * ✨ feat: Enhance ToolCall and ToolCallInfo components with improved styling; update translations and add warning text color to Tailwind config * 🔧 fix: Update import statement for useLocalize in ToolCallInfo component; fix: chatform transition * ✨ feat: Refactor ToolCall and ToolCallInfo components for improved structure and styling; add optimized code block for better output display * ✨ feat: Implement OpenAI image generation component; add progress tracking and localization for user feedback * 🔧 fix: Adjust base duration values for image generation; optimize timing for quality settings * chore: remove unnecessary space * ✨ feat: Enhance OpenAI image generation with editing capabilities; update localization for progress feedback * ✨ feat: Add download functionality to images; enhance DialogImage component with download button * ✨ feat: Enhance image resizing functionality; support custom percentage and pixel dimensions in resizeImageBuffer
88 lines
3 KiB
TypeScript
88 lines
3 KiB
TypeScript
import React from 'react';
|
|
import { useWatch, useFormContext } from 'react-hook-form';
|
|
import { SystemRoles, Permissions, PermissionTypes } from 'librechat-data-provider';
|
|
import type { AgentForm, AgentPanelProps } from '~/common';
|
|
import { useLocalize, useAuthContext, useHasAccess } from '~/hooks';
|
|
import { useUpdateAgentMutation } from '~/data-provider';
|
|
import AdvancedButton from './Advanced/AdvancedButton';
|
|
import DuplicateAgent from './DuplicateAgent';
|
|
import AdminSettings from './AdminSettings';
|
|
import DeleteButton from './DeleteButton';
|
|
import { Spinner } from '~/components';
|
|
import ShareAgent from './ShareAgent';
|
|
import { Panel } from '~/common';
|
|
|
|
export default function AgentFooter({
|
|
activePanel,
|
|
createMutation,
|
|
updateMutation,
|
|
setActivePanel,
|
|
setCurrentAgentId,
|
|
}: Pick<
|
|
AgentPanelProps,
|
|
'setCurrentAgentId' | 'createMutation' | 'activePanel' | 'setActivePanel'
|
|
> & {
|
|
updateMutation: ReturnType<typeof useUpdateAgentMutation>;
|
|
}) {
|
|
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.SHARED_GLOBAL,
|
|
});
|
|
|
|
const renderSaveButton = () => {
|
|
if (createMutation.isLoading || updateMutation.isLoading) {
|
|
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} />}
|
|
{user?.role === SystemRoles.ADMIN && showButtons && <AdminSettings />}
|
|
{/* Context Button */}
|
|
<div className="flex items-center justify-end gap-2">
|
|
<DeleteButton
|
|
agent_id={agent_id}
|
|
setCurrentAgentId={setCurrentAgentId}
|
|
createMutation={createMutation}
|
|
/>
|
|
{(agent?.author === user?.id || user?.role === SystemRoles.ADMIN) &&
|
|
hasAccessToShareAgents && (
|
|
<ShareAgent
|
|
agent_id={agent_id}
|
|
agentName={agent?.name ?? ''}
|
|
projectIds={agent?.projectIds ?? []}
|
|
isCollaborative={agent?.isCollaborative}
|
|
/>
|
|
)}
|
|
{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={createMutation.isLoading || updateMutation.isLoading}
|
|
aria-busy={createMutation.isLoading || updateMutation.isLoading}
|
|
>
|
|
{renderSaveButton()}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|