import classNames from 'classnames'; import type { CSSProperties } from 'react'; import React, { useEffect, useMemo } from 'react'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useGrpc } from '../hooks/useGrpc'; import { useGrpcConnections } from '../hooks/useGrpcConnections'; import { useGrpcMessages } from '../hooks/useGrpcMessages'; import { useUpdateGrpcRequest } from '../hooks/useUpdateGrpcRequest'; import { Banner } from './core/Banner'; import { HotKeyList } from './core/HotKeyList'; import { SplitLayout } from './core/SplitLayout'; import { GrpcConnectionMessagesPane } from './GrpcConnectionMessagesPane'; import { GrpcConnectionSetupPane } from './GrpcConnectionSetupPane'; interface Props { style: CSSProperties; } export function GrpcConnectionLayout({ style }: Props) { const activeRequest = useActiveRequest('grpc_request'); const updateRequest = useUpdateGrpcRequest(activeRequest?.id ?? null); const connections = useGrpcConnections(activeRequest?.id ?? null); const activeConnection = connections[0] ?? null; const messages = useGrpcMessages(activeConnection?.id ?? null); const grpc = useGrpc(activeRequest, activeConnection); const services = grpc.reflect.data ?? null; useEffect(() => { if (services == null || activeRequest == null) return; const s = services.find((s) => s.name === activeRequest.service); if (s == null) { updateRequest.mutate({ service: services[0]?.name ?? null, method: services[0]?.methods[0]?.name ?? null, }); return; } const m = s.methods.find((m) => m.name === activeRequest.method); if (m == null) { updateRequest.mutate({ method: s.methods[0]?.name ?? null }); return; } }, [activeRequest, services, updateRequest]); const activeMethod = useMemo(() => { if (services == null || activeRequest == null) return null; const s = services.find((s) => s.name === activeRequest.service); if (s == null) return null; return s.methods.find((m) => m.name === activeRequest.method); }, [activeRequest, services]); const methodType: | 'unary' | 'server_streaming' | 'client_streaming' | 'streaming' | 'no-schema' | 'no-method' = useMemo(() => { if (services == null) return 'no-schema'; if (activeMethod == null) return 'no-method'; if (activeMethod.clientStreaming && activeMethod.serverStreaming) return 'streaming'; if (activeMethod.clientStreaming) return 'client_streaming'; if (activeMethod.serverStreaming) return 'server_streaming'; return 'unary'; }, [activeMethod, services]); if (activeRequest == null) { return null; } return ( ( )} secondSlot={({ style }) => !grpc.unary.isLoading && (
{grpc.unary.error ? ( {grpc.unary.error} ) : messages.length >= 0 ? ( ) : ( )}
) } /> ); }