From 2348641c07748691c478ac5f67032b7e9081f9cb Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Sat, 29 Jul 2023 20:15:13 +0200 Subject: [PATCH] Avoid creating new tabs on header state (#3371) Solves #2825, an old bug where new tabs were created on every refresh the bug occurred when: 1. `shouldPersistHeaders` is not set to true 2. `headers` or `defaultHeaders` are provided as props 3. the user refreshes the browser --- .changeset/sour-maps-ring.md | 12 ++++++++++++ packages/graphiql-react/src/editor/context.tsx | 1 + packages/graphiql-react/src/editor/tabs.ts | 11 ++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/sour-maps-ring.md diff --git a/.changeset/sour-maps-ring.md b/.changeset/sour-maps-ring.md new file mode 100644 index 00000000000..1648d28b07c --- /dev/null +++ b/.changeset/sour-maps-ring.md @@ -0,0 +1,12 @@ +--- +'@graphiql/react': patch +'graphiql': patch +--- + +Solves #2825, an old bug where new tabs were created on every refresh + +the bug occurred when: + +1. `shouldPersistHeaders` is not set to true +2. `headers` or `defaultHeaders` are provided as props +3. the user refreshes the browser diff --git a/packages/graphiql-react/src/editor/context.tsx b/packages/graphiql-react/src/editor/context.tsx index 0168c3285bf..8515cb8c763 100644 --- a/packages/graphiql-react/src/editor/context.tsx +++ b/packages/graphiql-react/src/editor/context.tsx @@ -311,6 +311,7 @@ export function EditorContextProvider(props: EditorContextProviderProps) { defaultQuery: props.defaultQuery || DEFAULT_QUERY, defaultHeaders: props.defaultHeaders, storage, + shouldPersistHeaders, }); storeTabs(tabState); diff --git a/packages/graphiql-react/src/editor/tabs.ts b/packages/graphiql-react/src/editor/tabs.ts index 7622cb0cfc1..b9110dd5135 100644 --- a/packages/graphiql-react/src/editor/tabs.ts +++ b/packages/graphiql-react/src/editor/tabs.ts @@ -72,6 +72,7 @@ export function getDefaultTabState({ query, variables, storage, + shouldPersistHeaders, }: { defaultQuery: string; defaultHeaders?: string; @@ -80,6 +81,7 @@ export function getDefaultTabState({ query: string | null; variables: string | null; storage: StorageAPI | null; + shouldPersistHeaders?: boolean; }) { const storedState = storage?.get(STORAGE_KEY); try { @@ -87,8 +89,15 @@ export function getDefaultTabState({ throw new Error('Storage for tabs is empty'); } const parsed = JSON.parse(storedState); + // if headers are not persisted, do not derive the hash using default headers state + // or else you will get new tabs on every refresh + const headersForHash = shouldPersistHeaders ? headers : undefined; if (isTabsState(parsed)) { - const expectedHash = hashFromTabContents({ query, variables, headers }); + const expectedHash = hashFromTabContents({ + query, + variables, + headers: headersForHash, + }); let matchingTabIndex = -1; for (let index = 0; index < parsed.tabs.length; index++) {