diff --git a/packages/graphiql-react/src/editor/completion.ts b/packages/graphiql-react/src/editor/completion.ts index 4855f15dcec..1dc399388a4 100644 --- a/packages/graphiql-react/src/editor/completion.ts +++ b/packages/graphiql-react/src/editor/completion.ts @@ -1,6 +1,12 @@ import type { Editor, EditorChange } from 'codemirror'; import type { IHint } from 'codemirror-graphql/hint'; -import { GraphQLSchema, GraphQLType, isListType, isNonNullType } from 'graphql'; +import { + GraphQLNamedType, + GraphQLSchema, + GraphQLType, + isListType, + isNonNullType, +} from 'graphql'; import { ExplorerContextType } from '../explorer'; import { markdown } from '../markdown'; @@ -15,6 +21,7 @@ export function onHasCompletion( data: EditorChange | undefined, schema: GraphQLSchema | null | undefined, explorer: ExplorerContextType | null, + callback?: (type: GraphQLNamedType) => void, ) { importCodeMirror([], { useCommonAddons: false }).then(CodeMirror => { let information: HTMLDivElement | null; @@ -232,6 +239,7 @@ export function onHasCompletion( if (type) { explorer.show(); explorer.push({ name: type.name, def: type }); + callback?.(type); } } } diff --git a/packages/graphiql-react/src/editor/header-editor.tsx b/packages/graphiql-react/src/editor/header-editor.tsx index cca8624c437..f25dde8fa93 100644 --- a/packages/graphiql-react/src/editor/header-editor.tsx +++ b/packages/graphiql-react/src/editor/header-editor.tsx @@ -11,7 +11,6 @@ import { useEditorContext } from './context'; import { EditCallback, useChangeHandler, - useCompletion, useKeyMap, useMergeQuery, usePrettifyEditors, @@ -21,9 +20,9 @@ import { KeyMap } from './types'; export type UseHeaderEditorArgs = { editorTheme?: string; + keyMap?: KeyMap; onEdit?: EditCallback; readOnly?: boolean; - keyMap?: KeyMap; }; export function useHeaderEditor( @@ -126,8 +125,6 @@ export function useHeaderEditor( useHeaderEditor, ); - useCompletion(headerEditor, useHeaderEditor); - useKeyMap(headerEditor, ['Cmd-Enter', 'Ctrl-Enter'], executionContext?.run); useKeyMap(headerEditor, ['Shift-Ctrl-P'], prettify); useKeyMap(headerEditor, ['Shift-Ctrl-M'], merge); diff --git a/packages/graphiql-react/src/editor/hooks.ts b/packages/graphiql-react/src/editor/hooks.ts index acaf16958ed..954eb204c09 100644 --- a/packages/graphiql-react/src/editor/hooks.ts +++ b/packages/graphiql-react/src/editor/hooks.ts @@ -1,5 +1,6 @@ import { fillLeafs, GetDefaultFieldNamesFn, mergeAst } from '@graphiql/toolkit'; import type { EditorChange, EditorConfiguration } from 'codemirror'; +import type { SchemaReference } from 'codemirror-graphql/utils/SchemaReference'; import copyToClipboard from 'copy-to-clipboard'; import { parse, print } from 'graphql'; import { useCallback, useEffect } from 'react'; @@ -90,8 +91,11 @@ export function useChangeHandler( ]); } +export type OnClickReference = (reference: SchemaReference) => void; + export function useCompletion( editor: CodeMirrorEditor | null, + callback: OnClickReference | null, caller: Function, ) { const { schema } = useSchemaContext({ nonNull: true, caller }); @@ -105,7 +109,9 @@ export function useCompletion( instance: CodeMirrorEditor, changeObj?: EditorChange, ) => { - onHasCompletion(instance, changeObj, schema, explorer); + onHasCompletion(instance, changeObj, schema, explorer, type => { + callback?.({ kind: 'Type', type, schema: schema || undefined }); + }); }; editor.on( // @ts-expect-error @TODO additional args for hasCompletion event @@ -118,7 +124,7 @@ export function useCompletion( 'hasCompletion', handleCompletion, ); - }, [editor, explorer, schema]); + }, [callback, editor, explorer, schema]); } type EmptyCallback = () => void; diff --git a/packages/graphiql-react/src/editor/query-editor.tsx b/packages/graphiql-react/src/editor/query-editor.tsx index 2abfe27d7dc..0abf5239bf3 100644 --- a/packages/graphiql-react/src/editor/query-editor.tsx +++ b/packages/graphiql-react/src/editor/query-editor.tsx @@ -33,6 +33,7 @@ import { } from './context'; import { CopyQueryCallback, + OnClickReference, useCompletion, useCopyQuery, useKeyMap, @@ -43,8 +44,6 @@ import { import { CodeMirrorEditor, CodeMirrorType, KeyMap } from './types'; import { normalizeWhitespace } from './whitespace'; -type OnClickReference = (reference: SchemaReference) => void; - export type UseQueryEditorArgs = { editorTheme?: string; onClickReference?: OnClickReference; @@ -335,7 +334,7 @@ export function useQueryEditor( codeMirrorRef, ); - useCompletion(queryEditor, useQueryEditor); + useCompletion(queryEditor, onClickReference || null, useQueryEditor); const run = executionContext?.run; const runAtCursor = useCallback(() => { diff --git a/packages/graphiql-react/src/editor/variable-editor.tsx b/packages/graphiql-react/src/editor/variable-editor.tsx index 52424d7d480..8db1111d4cb 100644 --- a/packages/graphiql-react/src/editor/variable-editor.tsx +++ b/packages/graphiql-react/src/editor/variable-editor.tsx @@ -10,6 +10,7 @@ import { import { useEditorContext } from './context'; import { EditCallback, + OnClickReference, useChangeHandler, useCompletion, useKeyMap, @@ -21,15 +22,17 @@ import { CodeMirrorType, KeyMap } from './types'; export type UseVariableEditorArgs = { editorTheme?: string; + keyMap?: KeyMap; + onClickReference?: OnClickReference; onEdit?: EditCallback; readOnly?: boolean; - keyMap?: KeyMap; }; export function useVariableEditor( { editorTheme = DEFAULT_EDITOR_THEME, keyMap = DEFAULT_KEY_MAP, + onClickReference, onEdit, readOnly = false, }: UseVariableEditorArgs = {}, @@ -137,7 +140,7 @@ export function useVariableEditor( useVariableEditor, ); - useCompletion(variableEditor, useVariableEditor); + useCompletion(variableEditor, onClickReference || null, useVariableEditor); useKeyMap(variableEditor, ['Cmd-Enter', 'Ctrl-Enter'], executionContext?.run); useKeyMap(variableEditor, ['Shift-Ctrl-P'], prettify); diff --git a/packages/graphiql/src/components/GraphiQL.tsx b/packages/graphiql/src/components/GraphiQL.tsx index 201d6bd6015..a821e5e701e 100644 --- a/packages/graphiql/src/components/GraphiQL.tsx +++ b/packages/graphiql/src/components/GraphiQL.tsx @@ -708,6 +708,12 @@ class GraphiQLWithContext extends React.Component< const headerEditorEnabled = this.props.headerEditorEnabled ?? true; + const onClickReference = () => { + if (this.props.pluginResize.hiddenElement === 'first') { + this.props.pluginResize.setHiddenElement(null); + } + }; + return (
@@ -868,14 +874,7 @@ class GraphiQLWithContext extends React.Component< { - if ( - this.props.pluginResize.hiddenElement === - 'first' - ) { - this.props.pluginResize.setHiddenElement(null); - } - }} + onClickReference={onClickReference} onCopyQuery={this.props.onCopyQuery} onEdit={this.props.onEditQuery} readOnly={this.props.readOnly} @@ -970,23 +969,24 @@ class GraphiQLWithContext extends React.Component< } > {headerEditorEnabled && ( )}