Skip to content

[graphiql] useKeyMap() hook does not unregister previous keys #3778

@isomx

Description

@isomx

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

In graphiql-react package, the useKeyMap hook accepts an editor, keys and a callback. When keys change, it calls editor.removeKeyMap(key) for each key in keys.

It then creates an Object representing the new keyMap, and calls editor.addKeyMap(keyMap).

But this results in CodeMirror.state.keyMaps to grow unbounded, because the keys are registered using an Object, but removed using a string which won't match the previous keyMap.

Further, useQueryEditor() does not memoize the keys Array for some of the commands, causing the keys to be re-registered on every render, further populating CodeMirror.state.keyMaps with duplicate entries.

Expected Behavior

Proper removal of previous keyMap before adding a new one, so that CodeMirror.state.keyMaps isn't an Array with 1000s of entries that all represent the same hooks. And also not adding/removing keys in keysMap on every render by properly memoizing keys before calling useKeyMap() in useQueryEditor().

Steps To Reproduce

Any usage of , including

Environment

  • GraphiQL Version: 3.7.1
  • OS: Windows 10
  • Browser: Chrome v128.0.6613.138
  • Bundler: Webpack 4
  • react Version: 17.0.2
  • graphql Version: 16.9.0

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions