| import { useRecoilValue } from 'recoil'; | |
| 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 { isEphemeralAgent } from '~/common'; | |
| import { addFileToCache } from '~/utils'; | |
| import store from '~/store'; | |
| export const useGetFiles = <TData = t.TFile[] | boolean>( | |
| config?: UseQueryOptions<t.TFile[], unknown, TData>, | |
| ): QueryObserverResult<TData, unknown> => { | |
| const queriesEnabled = useRecoilValue<boolean>(store.queriesEnabled); | |
| return useQuery<t.TFile[], unknown, TData>([QueryKeys.files], () => dataService.getFiles(), { | |
| refetchOnWindowFocus: false, | |
| refetchOnReconnect: false, | |
| refetchOnMount: false, | |
| ...config, | |
| enabled: (config?.enabled ?? true) === true && queriesEnabled, | |
| }); | |
| }; | |
| 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 && !isEphemeralAgent(agentId), | |
| }, | |
| ); | |
| }; | |
| export const useGetFileConfig = <TData = t.FileConfig>( | |
| config?: UseQueryOptions<t.FileConfig, unknown, TData>, | |
| ): QueryObserverResult<TData, unknown> => { | |
| return useQuery<t.FileConfig, unknown, TData>( | |
| [QueryKeys.fileConfig], | |
| () => dataService.getFileConfig(), | |
| { | |
| refetchOnWindowFocus: false, | |
| refetchOnReconnect: false, | |
| refetchOnMount: false, | |
| ...config, | |
| }, | |
| ); | |
| }; | |
| export const useFileDownload = (userId?: string, file_id?: string): QueryObserverResult<string> => { | |
| const queryClient = useQueryClient(); | |
| return useQuery( | |
| [QueryKeys.fileDownload, file_id], | |
| async () => { | |
| if (!userId || !file_id) { | |
| console.warn('No user ID provided for file download'); | |
| return; | |
| } | |
| const response = await dataService.getFileDownload(userId, file_id); | |
| const blob = response.data; | |
| const downloadURL = window.URL.createObjectURL(blob); | |
| try { | |
| const metadata: t.TFile | undefined = JSON.parse(response.headers['x-file-metadata']); | |
| if (!metadata) { | |
| console.warn('No metadata found for file download', response.headers); | |
| return downloadURL; | |
| } | |
| addFileToCache(queryClient, metadata); | |
| } catch (e) { | |
| console.error('Error parsing file metadata, skipped updating file query cache', e); | |
| } | |
| return downloadURL; | |
| }, | |
| { | |
| enabled: false, | |
| retry: false, | |
| }, | |
| ); | |
| }; | |
| export const useCodeOutputDownload = (url = ''): QueryObserverResult<string> => { | |
| return useQuery( | |
| [QueryKeys.fileDownload, url], | |
| async () => { | |
| if (!url) { | |
| console.warn('No user ID provided for file download'); | |
| return; | |
| } | |
| const response = await dataService.getCodeOutputDownload(url); | |
| const blob = response.data; | |
| const downloadURL = window.URL.createObjectURL(blob); | |
| return downloadURL; | |
| }, | |
| { | |
| enabled: false, | |
| retry: false, | |
| }, | |
| ); | |
| }; | |