import React, { useEffect, useMemo } from 'react'; import { Share2Icon } from 'lucide-react'; import { useForm, Controller } from 'react-hook-form'; import { Permissions } from 'librechat-data-provider'; import { useGetStartupConfig } from 'librechat-data-provider/react-query'; import type { TStartupConfig, AgentUpdateParams } from 'librechat-data-provider'; import { Switch, OGDialog, OGDialogTitle, OGDialogClose, OGDialogContent, OGDialogTrigger, } from '~/components/ui'; import { useUpdateAgentMutation } from '~/data-provider'; import { cn, removeFocusOutlines } from '~/utils'; import { useToastContext } from '~/Providers'; import { useLocalize } from '~/hooks'; type FormValues = { [Permissions.SHARED_GLOBAL]: boolean; [Permissions.UPDATE]: boolean; }; export default function ShareAgent({ agent_id = '', agentName, projectIds = [], isCollaborative = false, }: { agent_id?: string; agentName?: string; projectIds?: string[]; isCollaborative?: boolean; }) { const localize = useLocalize(); const { showToast } = useToastContext(); const { data: startupConfig = {} as TStartupConfig, isFetching } = useGetStartupConfig(); const { instanceProjectId } = startupConfig; const agentIsGlobal = useMemo( () => !!projectIds.includes(instanceProjectId), [projectIds, instanceProjectId], ); const { watch, control, setValue, getValues, handleSubmit, formState: { isSubmitting }, } = useForm({ mode: 'onChange', defaultValues: { [Permissions.SHARED_GLOBAL]: agentIsGlobal, [Permissions.UPDATE]: isCollaborative, }, }); const sharedGlobalValue = watch(Permissions.SHARED_GLOBAL); useEffect(() => { if (!sharedGlobalValue) { setValue(Permissions.UPDATE, false); } }, [sharedGlobalValue, setValue]); useEffect(() => { setValue(Permissions.SHARED_GLOBAL, agentIsGlobal); setValue(Permissions.UPDATE, isCollaborative); }, [agentIsGlobal, isCollaborative, setValue]); const updateAgent = useUpdateAgentMutation({ onSuccess: (data) => { showToast({ message: `${localize('com_assistants_update_success')} ${ data.name ?? localize('com_ui_agent') }`, status: 'success', }); }, onError: (err) => { const error = err as Error; showToast({ message: `${localize('com_agents_update_error')}${ error.message ? ` ${localize('com_ui_error')}: ${error.message}` : '' }`, status: 'error', }); }, }); if (!agent_id || !instanceProjectId) { return null; } const onSubmit = (data: FormValues) => { if (!agent_id || !instanceProjectId) { return; } const payload = {} as AgentUpdateParams; if (data[Permissions.UPDATE] !== isCollaborative) { payload.isCollaborative = data[Permissions.UPDATE]; } if (data[Permissions.SHARED_GLOBAL] !== agentIsGlobal) { if (data[Permissions.SHARED_GLOBAL]) { payload.projectIds = [startupConfig.instanceProjectId]; } else { payload.removeProjectIds = [startupConfig.instanceProjectId]; payload.isCollaborative = false; } } if (Object.keys(payload).length > 0) { updateAgent.mutate({ agent_id, data: payload, }); } else { showToast({ message: localize('com_ui_no_changes'), status: 'info', }); } }; return ( {localize( 'com_ui_share_var', agentName != null && agentName !== '' ? `"${agentName}"` : localize('com_ui_agent'), )}
{ e.preventDefault(); e.stopPropagation(); handleSubmit(onSubmit)(e); }} >
( )} />
{/* */}
( )} />
); }