chat / client /src /hooks /Plugins /usePluginInstall.ts
helloya20's picture
Upload 2345 files
f0743f4 verified
// hooks/Plugins/usePluginInstall.ts
import { useCallback } from 'react';
import { useUpdateUserPluginsMutation } from 'librechat-data-provider/react-query';
import type {
TError,
TUser,
TUpdateUserPlugins,
TPlugin,
TPluginAction,
} from 'librechat-data-provider';
import { useSetRecoilState } from 'recoil';
import store from '~/store';
interface PluginStoreHandlers {
onInstallError?: (error: TError) => void;
onUninstallError?: (error: TError) => void;
onInstallSuccess?: (data: TUser, variables: TUpdateUserPlugins, context: unknown) => void;
onUninstallSuccess?: (data: TUser, variables: TUpdateUserPlugins, context: unknown) => void;
}
export default function usePluginInstall(handlers: PluginStoreHandlers = {}) {
const setAvailableTools = useSetRecoilState(store.availableTools);
const { onInstallError, onInstallSuccess, onUninstallError, onUninstallSuccess } = handlers;
const updateUserPlugins = useUpdateUserPluginsMutation();
const installPlugin = useCallback(
(pluginAction: TPluginAction, plugin: TPlugin) => {
updateUserPlugins.mutate(pluginAction, {
onError: (error: unknown) => {
if (onInstallError) {
onInstallError(error as TError);
}
},
onSuccess: (...rest) => {
setAvailableTools((prev) => {
return { ...prev, [plugin.pluginKey]: plugin };
});
if (onInstallSuccess) {
onInstallSuccess(...rest);
}
},
});
},
[updateUserPlugins, onInstallError, onInstallSuccess, setAvailableTools],
);
const uninstallPlugin = useCallback(
(plugin: string) => {
updateUserPlugins.mutate(
{ pluginKey: plugin, action: 'uninstall', auth: null },
{
onError: (error: unknown) => {
if (onUninstallError) {
onUninstallError(error as TError);
}
},
onSuccess: (...rest) => {
setAvailableTools((prev) => {
const newAvailableTools = { ...prev };
delete newAvailableTools[plugin];
return newAvailableTools;
});
if (onUninstallSuccess) {
onUninstallSuccess(...rest);
}
},
},
);
},
[updateUserPlugins, onUninstallError, onUninstallSuccess, setAvailableTools],
);
return {
installPlugin,
uninstallPlugin,
};
}