import type { IWebdavAccountIntegration } from '@rocket.chat/core-typings'; import { useUserId, useEndpoint, useStream } from '@rocket.chat/ui-contexts'; import type { UseQueryOptions } from '@tanstack/react-query'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useEffect, useMemo } from 'react'; type UseWebDAVAccountIntegrationsQueryOptions = Omit< UseQueryOptions, 'queryKey' | 'queryFn' >; export const useWebDAVAccountIntegrationsQuery = ({ enabled = true, ...options }: UseWebDAVAccountIntegrationsQueryOptions = {}) => { const uid = useUserId(); const queryKey = useMemo(() => ['webdav', 'account-integrations'] as const, []); const getMyAccounts = useEndpoint('GET', '/v1/webdav.getMyAccounts'); const integrationsQuery = useQuery({ queryKey, queryFn: async (): Promise => { const { accounts } = await getMyAccounts(); return accounts; }, enabled: !!uid && enabled, staleTime: Infinity, ...options, }); const queryClient = useQueryClient(); const subscribeToNotifyUser = useStream('notify-user'); useEffect(() => { if (!uid || !enabled) { return; } return subscribeToNotifyUser(`${uid}/webdav`, ({ type, account }) => { switch (type) { case 'changed': queryClient.invalidateQueries({ queryKey }); break; case 'removed': queryClient.setQueryData(queryKey, (old = []) => { return old.filter((oldAccount) => oldAccount._id !== account._id); }); break; } }); }, [enabled, queryClient, queryKey, uid, subscribeToNotifyUser]); return integrationsQuery; };