@graphiql/react
Version:
[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphiql-react/CHANGELOG.md) | [API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html) | [NPM](https://www.npmjs.com/package/@graphiql/react)
156 lines (116 loc) • 6.78 kB
Markdown
[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphiql-react/CHANGELOG.md)
|
[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html)
| [NPM](https://www.npmjs.com/package/@graphiql/react)
# `/react`
A React SDK for building integrated GraphQL developer experiences for the web.
## Purpose
This package contains a set of building blocks that allow its users to build
GraphQL IDEs with ease. It's the set of components that make up Graph*i*QL, the
first and official GraphQL IDE, owned and maintained by the GraphQL Foundation.
There are two kinds of building blocks that this package provides: Stateful
context providers for state management and simple UI components.
## Getting started
All the state for your GraphQL IDE lives in multiple contexts. The easiest way
to get started is by using the `GraphiQLProvider` component that renders all the
individual providers.
There is one required prop called `fetcher`. This is a function that performs
GraphQL request against a given endpoint. You can easily create a fetcher using
the method `createGraphiQLFetcher` from the `/toolkit` package.
```jsx
import { GraphiQLProvider } from '/react';
import { createGraphiQLFetcher } from '/toolkit';
const fetcher = createGraphiQLFetcher({
url: 'https://my.graphql.api/graphql',
});
function MyGraphQLIDE() {
return (
<GraphiQLProvider fetcher={fetcher}>
<div className="graphiql-container">Hello GraphQL</div>
</GraphiQLProvider>
);
}
```
Inside the provider you can now use any UI component provided by
`/react`. For example, you can render an operation editor like this:
```jsx
import { QueryEditor } from '/react';
function MyGraphQLIDE() {
return (
<GraphiQLProvider fetcher={fetcher}>
<div className="graphiql-container">
<QueryEditor />
</div>
</GraphiQLProvider>
);
}
```
The package also ships the necessary CSS that all its UI components need. You
can import them from `/react/style.css`.
> **Note**: In order for these styles to apply, the UI components need to be
> rendered inside an element that has a class name `graphiql-container`.
By default, the UI components will try to use the
[Roboto](https://fonts.google.com/specimen/Roboto) font for regular text and the
[Fira Code](https://fonts.google.com/specimen/Fira+Code) font for mono-space
text. If you want to use the default fonts you can load them using these files:
- `/react/font/roboto.css`
- `/react/font/fira-code.css`.
You can, of course, use any other method to load these fonts (for example, loading
them from Google Fonts).
Further details on how to use `/react` can be found in the reference
implementation of a GraphQL IDE - Graph*i*QL - in the
[`graphiql` package](https://github.com/graphql/graphiql/blob/main/packages/graphiql/src/components/GraphiQL.tsx).
## Available Stores
GraphiQL uses a set of state management stores, each responsible for a specific part of the IDE's
behavior. These stores contain all logic related to state management and can be accessed via custom
React hooks.
### Core Hooks
- **`useMonaco`**: Access `monaco-editor` exports and the `monaco-graphql` instance. Designed for safe use in SSR environments.
- **`useGraphiQL`**: Access the current state.
- **`useGraphiQLActions`**: Trigger actions that mutate the state. This hook **never** rerenders.
The `useGraphiQLActions` hook **exposes all actions** across store slices.
The `useGraphiQL` hook **provides access to the following store slices**:
| Store Slice | Responsibilities |
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| [`storage`](./src/stores/storage.ts) | Provides a storage API that can be used to persist state in the browser (by default using `localStorage`) |
| [`editor`](./src/stores/editor.ts) | Manages **query**, **variables**, **headers**, and **response** editors and tabs |
| [`execution`](./src/stores/execution.ts) | Handles the execution of GraphQL requests |
| [`plugin`](./src/stores/plugin.ts) | Manages plugins and the currently active plugin |
| [`schema`](./src/stores/schema.ts) | Fetches, validates, and stores the GraphQL schema |
| [`theme`](./src/stores/theme.ts) | Manages the current theme and provides a method to update it |
### Usage Example
```js
import { useGraphiQL, useGraphiQLActions } from '/react';
// Get an action to fetch the schema and an action to change theme
const { introspect, setTheme } = useGraphiQLActions();
// Use a selector to access specific parts of the state like current schema and theme
const { schema, theme } = useGraphiQL(state => ({
schema: state.schema,
theme: state.theme,
}));
```
All store properties are documented using TSDoc comments. If you're using an
IDE like VSCode for development, these descriptions will show up in auto-complete
tooltips. All these descriptions can also be found in the
[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html).
## Theming
All the components from `/react` have been designed with customization
in mind. We achieve this using CSS variables.
All variables that are available for customization can be found in the
[`root.css` file](https://github.com/graphql/graphiql/blob/main/packages/graphiql-react/src/style/root.css).
### Colors
Colors are defined using the
[HSL format](https://en.wikipedia.org/wiki/HSL_and_HSV). All CSS variables for
colors are defined as a list of the three values that make up HSL (hue,
saturation and lightness).
This approach allows `/react` to use transparent colors by passing the
value of the CSS variable in the `hsla` function. This enables us to provide
truly reusable UI elements where good contrasts are preserved regardless of the
elements background.
## Development
If you want to develop with `/react` locally - in particular when
working on the `graphiql` package - all you need to do is run `yarn dev` in the
package folder in a separate terminal. This will build the package using Vite.
When using it in combination with `yarn dev:graphiql` (running in the repo
root) this will give you auto-reloading when working on `graphiql` and
`/react` simultaneously.