Skip to content

Commit

Permalink
feat: add defaultHeaders prop
Browse files Browse the repository at this point in the history
  • Loading branch information
dimaMachina authored and acao committed Nov 10, 2022
1 parent 3659448 commit 2ba2f62
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 3 deletions.
6 changes: 6 additions & 0 deletions .changeset/sweet-papayas-run.md
@@ -0,0 +1,6 @@
---
'graphiql': patch
'@graphiql/react': patch
---

feat: add `defaultHeaders` prop
13 changes: 11 additions & 2 deletions packages/graphiql-react/src/editor/context.tsx
Expand Up @@ -234,6 +234,11 @@ export type EditorContextProviderProps = {
* typing in the editor.
*/
variables?: string;

/**
* Headers to be set when opening a new tab
*/
defaultHeaders?: string;
};

export function EditorContextProvider(props: EditorContextProviderProps) {
Expand Down Expand Up @@ -275,6 +280,7 @@ export function EditorContextProvider(props: EditorContextProviderProps) {
headers,
initialTabs: props.initialTabs,
defaultQuery: props.defaultQuery || DEFAULT_QUERY,
defaultHeaders: props.defaultHeaders,
storage,
});
storeTabs(tabState);
Expand All @@ -285,7 +291,7 @@ export function EditorContextProvider(props: EditorContextProviderProps) {
(tabState.activeTabIndex === 0 ? tabState.tabs[0].query : null) ??
'',
variables: variables ?? '',
headers: headers ?? '',
headers: headers ?? props.defaultHeaders ?? '',
response,
tabState,
};
Expand All @@ -312,7 +318,10 @@ export function EditorContextProvider(props: EditorContextProviderProps) {
// Make sure the current tab stores the latest values
const updatedValues = synchronizeActiveTabValues(current);
const updated = {
tabs: [...updatedValues.tabs, createTab()],
tabs: [
...updatedValues.tabs,
createTab({ headers: props.defaultHeaders }),
],
activeTabIndex: updatedValues.tabs.length,
};
storeTabs(updated);
Expand Down
10 changes: 9 additions & 1 deletion packages/graphiql-react/src/editor/tabs.ts
Expand Up @@ -66,13 +66,15 @@ export type TabsState = {

export function getDefaultTabState({
defaultQuery,
defaultHeaders,
headers,
initialTabs,
query,
variables,
storage,
}: {
defaultQuery: string;
defaultHeaders?: string;
headers: string | null;
initialTabs?: TabDefinition[];
query: string | null;
Expand Down Expand Up @@ -126,7 +128,13 @@ export function getDefaultTabState({
return {
activeTabIndex: 0,
tabs: (
initialTabs || [{ query: query ?? defaultQuery, variables, headers }]
initialTabs || [
{
query: query ?? defaultQuery,
variables,
headers: headers ?? defaultHeaders,
},
]
).map(createTab),
};
}
Expand Down
2 changes: 2 additions & 0 deletions packages/graphiql-react/src/provider.tsx
Expand Up @@ -24,6 +24,7 @@ export function GraphiQLProvider({
children,
dangerouslyAssumeSchemaIsValid,
defaultQuery,
defaultHeaders,
externalFragments,
fetcher,
getDefaultFieldNames,
Expand Down Expand Up @@ -53,6 +54,7 @@ export function GraphiQLProvider({
<HistoryContextProvider maxHistoryLength={maxHistoryLength}>
<EditorContextProvider
defaultQuery={defaultQuery}
defaultHeaders={defaultHeaders}
externalFragments={externalFragments}
headers={headers}
initialTabs={initialTabs}
Expand Down
26 changes: 26 additions & 0 deletions packages/graphiql/cypress/integration/headers.spec.ts
@@ -0,0 +1,26 @@
const DEFAULT_HEADERS = '{"foo":2}';

describe('Headers', () => {
describe('`defaultHeaders`', () => {
it('should have default headers while open new tabs', () => {
cy.visit(`/?query={test}&defaultHeaders=${DEFAULT_HEADERS}`);
cy.assertHasValues({ query: '{test}', headersString: DEFAULT_HEADERS });
cy.get('.graphiql-add-tab-wrapper').click();
cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });
cy.get('.graphiql-tab-add').click();
cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });
});

it('in case `headers` and `defaultHeaders` are set, `headers` should be on 1st tab and `defaultHeaders` for other opened tabs', () => {
const HEADERS = '{"bar":true}';
cy.visit(
`/?query={test}&defaultHeaders=${DEFAULT_HEADERS}&headers=${HEADERS}`,
);
cy.assertHasValues({ query: '{test}', headersString: HEADERS });
cy.get('.graphiql-add-tab-wrapper').click();
cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });
cy.get('.graphiql-tab-add').click();
cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });
});
});
});
1 change: 1 addition & 0 deletions packages/graphiql/resources/renderExample.js
Expand Up @@ -97,6 +97,7 @@ ReactDOM.render(
query: parameters.query,
variables: parameters.variables,
headers: parameters.headers,
defaultHeaders: parameters.defaultHeaders,
onEditQuery: onEditQuery,
onEditVariables: onEditVariables,
onEditHeaders: onEditHeaders,
Expand Down
2 changes: 2 additions & 0 deletions packages/graphiql/src/components/GraphiQL.tsx
Expand Up @@ -117,6 +117,7 @@ export function GraphiQL({
validationRules,
variables,
visiblePlugin,
defaultHeaders,
...props
}: GraphiQLProps) {
// Ensure props are correct
Expand All @@ -131,6 +132,7 @@ export function GraphiQL({
getDefaultFieldNames={getDefaultFieldNames}
dangerouslyAssumeSchemaIsValid={dangerouslyAssumeSchemaIsValid}
defaultQuery={defaultQuery}
defaultHeaders={defaultHeaders}
externalFragments={externalFragments}
fetcher={fetcher}
headers={headers}
Expand Down

0 comments on commit 2ba2f62

Please sign in to comment.