import { useQuery } from '@tanstack/react-query'; import type { GetHttpAuthenticationSummaryResponse } from '@yaakapp-internal/plugins'; import { atom, useAtomValue } from 'jotai'; import { useState } from 'react'; import { jotaiStore } from '../lib/jotai'; import { invokeCmd } from '../lib/tauri'; import { showErrorToast } from '../lib/toast'; import { usePluginsKey } from './usePlugins'; const httpAuthenticationSummariesAtom = atom([]); const orderedHttpAuthenticationAtom = atom((get) => get(httpAuthenticationSummariesAtom)?.sort((a, b) => a.name.localeCompare(b.name)), ); export function useHttpAuthenticationSummaries() { return useAtomValue(orderedHttpAuthenticationAtom); } export function useSubscribeHttpAuthentication() { const [numResults, setNumResults] = useState(0); const pluginsKey = usePluginsKey(); useQuery({ queryKey: ['http_authentication_summaries', pluginsKey], // Fetch periodically until functions are returned // NOTE: visibilitychange (refetchOnWindowFocus) does not work on Windows, so we'll rely on this logic // to refetch things until that's working again // TODO: Update plugin system to wait for plugins to initialize before sending the first event to them refetchInterval: numResults > 0 ? Number.POSITIVE_INFINITY : 1000, refetchOnMount: true, placeholderData: (prev) => prev, // Keep previous data on refetch queryFn: async () => { try { const result = await invokeCmd( 'cmd_get_http_authentication_summaries', ); setNumResults(result.length); jotaiStore.set(httpAuthenticationSummariesAtom, result); return result; } catch (err) { showErrorToast({ id: 'http-authentication-error', title: 'HTTP Authentication Error', message: err, }); } }, }); }