import type { Extension } from '@codemirror/state'; import { graphql } from 'cm6-graphql'; import { formatSdl } from 'format-graphql'; import { buildClientSchema, getIntrospectionQuery } from 'graphql/utilities'; import { useEffect, useMemo, useState } from 'react'; import { useUniqueKey } from '../hooks/useUniqueKey'; import type { HttpRequest } from '../lib/models'; import { sendEphemeralRequest } from '../lib/sendEphemeralRequest'; import type { EditorProps } from './core/Editor'; import { Editor } from './core/Editor'; import { Separator } from './core/Separator'; type Props = Pick & { baseRequest: HttpRequest; }; interface GraphQLBody { query: string; variables?: Record; operationName?: string; } export function GraphQLEditor({ defaultValue, onChange, baseRequest, ...extraEditorProps }: Props) { const queryKey = useUniqueKey(); const { query, variables } = useMemo(() => { if (!defaultValue) { return { query: '', variables: {} }; } try { const p = JSON.parse(defaultValue ?? '{}'); const query = p.query ?? ''; const variables = p.variables; const operationName = p.operationName; return { query, variables, operationName }; } catch (err) { return { query: 'failed to parse' }; } }, [defaultValue]); const handleChange = (b: GraphQLBody) => { onChange?.(JSON.stringify(b, null, 2)); }; const handleChangeQuery = (query: string) => { handleChange({ query, variables }); }; const handleChangeVariables = (variables: string) => { try { handleChange({ query, variables: JSON.parse(variables) }); } catch (e) { // Meh, not much we can do here } }; const [graphqlExtension, setGraphqlExtension] = useState(); useEffect(() => { const body = JSON.stringify({ query: getIntrospectionQuery(), operationName: 'IntrospectionQuery', }); const req: HttpRequest = { ...baseRequest, body, id: '' }; sendEphemeralRequest(req).then((response) => { try { const { data } = JSON.parse(response.body); const schema = buildClientSchema(data); setGraphqlExtension(graphql(schema, {})); } catch (err) { console.log('Failed to parse introspection query', err); return; } }); }, [baseRequest.url]); return (

Variables

); }