@@ -100,7 +100,9 @@ export interface CustomField<TName extends FieldPath<FormValues>, Info> {
100100 } ) => ReactElement ;
101101}
102102
103- export interface ClientProps extends HTMLAttributes < HTMLFormElement > {
103+ export interface ClientProps
104+ extends HTMLAttributes < HTMLFormElement > ,
105+ PlaygroundClientOptions {
104106 route : string ;
105107 method : string ;
106108 parameters ?: ParameterField [ ] ;
@@ -115,26 +117,32 @@ export interface ClientProps extends HTMLAttributes<HTMLFormElement> {
115117 references : Record < string , RequestSchema > ;
116118 proxyUrl ?: string ;
117119
118- /**
119- * Request timeout in seconds (default: 10s)
120- */
121- requestTimeout ?: number ;
120+ // TODO: redesign `fields`
122121 fields ?: {
123122 parameter ?: CustomField <
124123 `${ParameterField [ 'in' ] } .${string } `,
125124 ParameterField
126125 > ;
127- auth ?: CustomField < FieldPath < FormValues > , RequestSchema > ;
128126 body ?: CustomField < 'body' , RequestSchema > ;
129127 } ;
128+ }
129+
130+ export interface PlaygroundClientOptions {
131+ /**
132+ * transform fields for auth-specific parameters (e.g. header)
133+ */
134+ transformAuthInputs ?: ( fields : AuthField [ ] ) => AuthField [ ] ;
135+
136+ /**
137+ * Request timeout in seconds (default: 10s)
138+ */
139+ requestTimeout ?: number ;
130140
131141 components ?: Partial < {
132142 ResultDisplay : FC < { data : FetchResult } > ;
133143 } > ;
134144}
135145
136- const AuthPrefix = '__fumadocs_auth' ;
137-
138146const OauthDialog = lazy ( ( ) =>
139147 import ( './components/oauth-dialog' ) . then ( ( mod ) => ( {
140148 default : mod . OauthDialog ,
@@ -157,6 +165,7 @@ export default function Client({
157165 proxyUrl,
158166 components : { ResultDisplay = DefaultResultDisplay } = { } ,
159167 requestTimeout = 10 ,
168+ transformAuthInputs,
160169 ...rest
161170} : ClientProps ) {
162171 const { server } = useServerSelectContext ( ) ;
@@ -165,7 +174,10 @@ export default function Client({
165174 const fieldInfoMap = useMemo ( ( ) => new Map < string , FieldInfo > ( ) , [ ] ) ;
166175 const { mediaAdapters } = useApiContext ( ) ;
167176 const [ securityId , setSecurityId ] = useState ( 0 ) ;
168- const { inputs, mapInputs } = useAuthInputs ( securities [ securityId ] ) ;
177+ const { inputs, mapInputs } = useAuthInputs (
178+ securities [ securityId ] ,
179+ transformAuthInputs ,
180+ ) ;
169181
170182 const defaultValues : FormValues = useMemo (
171183 ( ) => ( {
@@ -214,7 +226,7 @@ export default function Client({
214226
215227 if ( value ) {
216228 localStorage . setItem (
217- AuthPrefix + item . original . id ,
229+ getAuthFieldStorageKey ( item ) ,
218230 JSON . stringify ( value ) ,
219231 ) ;
220232 }
@@ -521,17 +533,20 @@ function BodyInput({ field: _field }: { field: RequestSchema }) {
521533 ) ;
522534}
523535
524- interface AuthField {
536+ export interface AuthField {
525537 fieldName : string ;
526538 defaultValue : unknown ;
527539
528- original : SecurityEntry ;
540+ original ? : SecurityEntry ;
529541 children : ReactNode ;
530542
531543 mapOutput ?: ( values : unknown ) => unknown ;
532544}
533545
534- function useAuthInputs ( securities ?: SecurityEntry [ ] ) {
546+ function useAuthInputs (
547+ securities ?: SecurityEntry [ ] ,
548+ transform ?: ( fields : AuthField [ ] ) => AuthField [ ] ,
549+ ) {
535550 const inputs = useMemo ( ( ) => {
536551 const result : AuthField [ ] = [ ] ;
537552 if ( ! securities ) return result ;
@@ -672,8 +687,8 @@ function useAuthInputs(securities?: SecurityEntry[]) {
672687 }
673688 }
674689
675- return result ;
676- } , [ securities ] ) ;
690+ return transform ? transform ( result ) : result ;
691+ } , [ securities , transform ] ) ;
677692
678693 const mapInputs = ( values : FormValues ) => {
679694 const cloned = structuredClone ( values ) ;
@@ -690,9 +705,13 @@ function useAuthInputs(securities?: SecurityEntry[]) {
690705 return { inputs, mapInputs } ;
691706}
692707
708+ function getAuthFieldStorageKey ( field : AuthField ) {
709+ return '__fumadocs_auth' + ( field . original ?. id ?? field . fieldName ) ;
710+ }
711+
693712function initAuthValues ( values : FormValues , inputs : AuthField [ ] ) {
694713 for ( const item of inputs ) {
695- const stored = localStorage . getItem ( AuthPrefix + item . original . id ) ;
714+ const stored = localStorage . getItem ( getAuthFieldStorageKey ( item ) ) ;
696715
697716 if ( stored ) {
698717 const parsed = JSON . parse ( stored ) ;
0 commit comments