From 73060235251e66034db79ea31502d96a1a6e0d79 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 18 May 2026 12:02:40 +0530 Subject: [PATCH 1/2] feat: persist auth credentials in sessionStorage Read/write auth scheme, token, and basic auth credentials to sessionStorage keyed by spec name. Pre-fills auth fields when opening playground dialog for the same API spec. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/components/api/playground-dialog.tsx | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/chronicle/src/components/api/playground-dialog.tsx b/packages/chronicle/src/components/api/playground-dialog.tsx index b2d7ec7..01978a3 100644 --- a/packages/chronicle/src/components/api/playground-dialog.tsx +++ b/packages/chronicle/src/components/api/playground-dialog.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState, useCallback, useMemo } from 'react' +import { useState, useCallback, useMemo, useEffect } from 'react' import type { OpenAPIV3 } from 'openapi-types' import { Dialog, Button, Badge, IconButton, Input, CopyButton, Select, Menu } from '@raystack/apsara' import { Cross2Icon, ChevronDownIcon, ChevronUpIcon, PlayIcon, PlusIcon } from '@radix-ui/react-icons' @@ -68,11 +68,21 @@ export function PlaygroundDialog({ const authSchemes = useMemo(() => getAuthSchemes(document, auth), [document, auth]) const defaultScheme = authSchemes.find((s) => s.type !== 'none') ?? authSchemes[0] - - const [selectedScheme, setSelectedScheme] = useState(defaultScheme.name) - const [authToken, setAuthToken] = useState('') - const [basicUser, setBasicUser] = useState('') - const [basicPass, setBasicPass] = useState('') + const storageKey = `chronicle:auth:${specName}` + const savedAuth = useMemo(() => { + try { + const raw = sessionStorage.getItem(storageKey) + return raw ? JSON.parse(raw) : null + } catch { return null } + }, [storageKey]) + + const [selectedScheme, setSelectedScheme] = useState(() => { + if (savedAuth?.scheme && authSchemes.some((s) => s.name === savedAuth.scheme)) return savedAuth.scheme + return defaultScheme.name + }) + const [authToken, setAuthToken] = useState(savedAuth?.token ?? '') + const [basicUser, setBasicUser] = useState(savedAuth?.basicUser ?? '') + const [basicPass, setBasicPass] = useState(savedAuth?.basicPass ?? '') const [headerValues, setHeaderValues] = useState>({}) const [pathValues, setPathValues] = useState>({}) const [queryValues, setQueryValues] = useState>({}) @@ -89,6 +99,17 @@ export function PlaygroundDialog({ }) const [bodyJsonStr, setBodyJsonStr] = useState(() => body ? body.jsonExample : '{}') + useEffect(() => { + try { + sessionStorage.setItem(storageKey, JSON.stringify({ + scheme: selectedScheme, + token: authToken, + basicUser, + basicPass, + })) + } catch { /* ignore */ } + }, [storageKey, selectedScheme, authToken, basicUser, basicPass]) + const [responseData, setResponseData] = useState<{ status: number; statusText: string; body: unknown; headers?: Record; time: number } | null>(null) From df0256998e384df555b1ac67320befc2deadbe69 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 18 May 2026 12:02:48 +0530 Subject: [PATCH 2/2] fix: clear sessionStorage auth on reset Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/chronicle/src/components/api/playground-dialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/chronicle/src/components/api/playground-dialog.tsx b/packages/chronicle/src/components/api/playground-dialog.tsx index 01978a3..e0192df 100644 --- a/packages/chronicle/src/components/api/playground-dialog.tsx +++ b/packages/chronicle/src/components/api/playground-dialog.tsx @@ -140,6 +140,7 @@ export function PlaygroundDialog({ setAuthToken('') setBasicUser('') setBasicPass('') + try { sessionStorage.removeItem(storageKey) } catch { /* ignore */ } setHeaderValues({}) setPathValues({}) setQueryValues({})