import { useMutation, useQuery } from '@tanstack/react-query'; import { emit } from '@tauri-apps/api/event'; import type { GrpcConnection, GrpcRequest } from '@yaakapp-internal/models'; import { jotaiStore } from '../lib/jotai'; import { minPromiseMillis } from '../lib/minPromiseMillis'; import { invokeCmd } from '../lib/tauri'; import { activeEnvironmentIdAtom, useActiveEnvironment } from './useActiveEnvironment'; import { useDebouncedValue } from './useDebouncedValue'; export interface ReflectResponseService { name: string; methods: { name: string; schema: string; serverStreaming: boolean; clientStreaming: boolean }[]; } export function useGrpc( req: GrpcRequest | null, conn: GrpcConnection | null, protoFiles: string[], ) { const requestId = req?.id ?? 'n/a'; const environment = useActiveEnvironment(); const go = useMutation({ mutationKey: ['grpc_go', conn?.id], mutationFn: () => invokeCmd('cmd_grpc_go', { requestId, environmentId: environment?.id, protoFiles }), }); const send = useMutation({ mutationKey: ['grpc_send', conn?.id], mutationFn: ({ message }: { message: string }) => emit(`grpc_client_msg_${conn?.id ?? 'none'}`, { Message: message }), }); const cancel = useMutation({ mutationKey: ['grpc_cancel', conn?.id ?? 'n/a'], mutationFn: () => emit(`grpc_client_msg_${conn?.id ?? 'none'}`, 'Cancel'), }); const commit = useMutation({ mutationKey: ['grpc_commit', conn?.id ?? 'n/a'], mutationFn: () => emit(`grpc_client_msg_${conn?.id ?? 'none'}`, 'Commit'), }); const debouncedUrl = useDebouncedValue(req?.url ?? '', 1000); const reflect = useQuery({ enabled: req != null, queryKey: ['grpc_reflect', req?.id ?? 'n/a', debouncedUrl, protoFiles], staleTime: Infinity, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, queryFn: () => { const environmentId = jotaiStore.get(activeEnvironmentIdAtom); return minPromiseMillis( invokeCmd('cmd_grpc_reflect', { requestId, protoFiles, environmentId }), 300, ); }, }); return { go, reflect, cancel, commit, isStreaming: conn != null && conn.state !== 'closed', send, }; }