mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-26 05:08:50 +01:00
🔒 feat: View/Delete Shared Agent Files (#8419)
* 🔧 fix: Add localized message for delete operation not allowed
* refactor: improve file deletion operations ux
* feat: agent-based file access control and enhance file retrieval logic
* feat: implement agent-specific file retrieval
* feat: enhance agent file retrieval logic for authors and shared access
* ci: include userId and agentId in mockGetFiles call for OCR file retrieval
This commit is contained in:
parent
6aa4bb5a4a
commit
f1b29ffb45
22 changed files with 1216 additions and 35 deletions
|
|
@ -1,2 +1,2 @@
|
|||
export * from './queries';
|
||||
export * from './mutations';
|
||||
export * from './queries';
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ import {
|
|||
} from 'librechat-data-provider';
|
||||
import type * as t from 'librechat-data-provider';
|
||||
import type { UseMutationResult } from '@tanstack/react-query';
|
||||
import { useToastContext } from '~/Providers';
|
||||
import { useLocalize } from '~/hooks';
|
||||
|
||||
export const useUploadFileMutation = (
|
||||
_options?: t.UploadMutationOptions,
|
||||
|
|
@ -145,10 +147,24 @@ export const useDeleteFilesMutation = (
|
|||
unknown // context
|
||||
> => {
|
||||
const queryClient = useQueryClient();
|
||||
const { onSuccess, ...options } = _options || {};
|
||||
const { showToast } = useToastContext();
|
||||
const localize = useLocalize();
|
||||
const { onSuccess, onError, ...options } = _options || {};
|
||||
return useMutation([MutationKeys.fileDelete], {
|
||||
mutationFn: (body: t.DeleteFilesBody) => dataService.deleteFiles(body),
|
||||
...options,
|
||||
onError: (error, vars, context) => {
|
||||
if (error && typeof error === 'object' && 'response' in error) {
|
||||
const errorWithResponse = error as { response?: { status?: number } };
|
||||
if (errorWithResponse.response?.status === 403) {
|
||||
showToast({
|
||||
message: localize('com_ui_delete_not_allowed'),
|
||||
status: 'error',
|
||||
});
|
||||
}
|
||||
}
|
||||
onError?.(error, vars, context);
|
||||
},
|
||||
onSuccess: (data, vars, context) => {
|
||||
queryClient.setQueryData<t.TFile[] | undefined>([QueryKeys.files], (cachefiles) => {
|
||||
const { files: filesDeleted } = vars;
|
||||
|
|
@ -160,6 +176,12 @@ export const useDeleteFilesMutation = (
|
|||
|
||||
return (cachefiles ?? []).filter((file) => !fileMap.has(file.file_id));
|
||||
});
|
||||
|
||||
showToast({
|
||||
message: localize('com_ui_delete_success'),
|
||||
status: 'success',
|
||||
});
|
||||
|
||||
onSuccess?.(data, vars, context);
|
||||
if (vars.agent_id != null && vars.agent_id) {
|
||||
queryClient.refetchQueries([QueryKeys.agent, vars.agent_id]);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { useRecoilValue } from 'recoil';
|
||||
import { QueryKeys, dataService } from 'librechat-data-provider';
|
||||
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
import { QueryKeys, DynamicQueryKeys, dataService } from 'librechat-data-provider';
|
||||
import type { QueryObserverResult, UseQueryOptions } from '@tanstack/react-query';
|
||||
import type t from 'librechat-data-provider';
|
||||
import { addFileToCache } from '~/utils';
|
||||
|
|
@ -19,6 +19,24 @@ export const useGetFiles = <TData = t.TFile[] | boolean>(
|
|||
});
|
||||
};
|
||||
|
||||
export const useGetAgentFiles = <TData = t.TFile[]>(
|
||||
agentId: string | undefined,
|
||||
config?: UseQueryOptions<t.TFile[], unknown, TData>,
|
||||
): QueryObserverResult<TData, unknown> => {
|
||||
const queriesEnabled = useRecoilValue<boolean>(store.queriesEnabled);
|
||||
return useQuery<t.TFile[], unknown, TData>(
|
||||
DynamicQueryKeys.agentFiles(agentId ?? ''),
|
||||
() => (agentId ? dataService.getAgentFiles(agentId) : Promise.resolve([])),
|
||||
{
|
||||
refetchOnWindowFocus: false,
|
||||
refetchOnReconnect: false,
|
||||
refetchOnMount: false,
|
||||
...config,
|
||||
enabled: (config?.enabled ?? true) === true && queriesEnabled && !!agentId,
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const useGetFileConfig = <TData = t.FileConfig>(
|
||||
config?: UseQueryOptions<t.FileConfig, unknown, TData>,
|
||||
): QueryObserverResult<TData, unknown> => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue