@@ -4,25 +4,34 @@ import * as React from 'react';
4
4
import { useRouter } from 'next/navigation' ;
5
5
import { OpenAPIClientContext } from './types' ;
6
6
import { OpenAPIV3 } from 'openapi-types' ;
7
- import { useApiClientModal } from '@scalar/api-client-react ' ;
7
+ import { ServerSelector } from './ServerSelector ' ;
8
8
9
9
export function ServerURLForm ( props : {
10
10
children : React . ReactNode ;
11
11
context : OpenAPIClientContext ;
12
- server : OpenAPIV3 . ServerObject ;
12
+ servers : OpenAPIV3 . ServerObject [ ] ;
13
+ serverIndex : number ;
13
14
} ) {
14
- const { children, context, server } = props ;
15
+ const { children, context, servers , serverIndex } = props ;
15
16
const router = useRouter ( ) ;
16
- const client = useApiClientModal ( ) ;
17
17
const [ isPending , startTransition ] = React . useTransition ( ) ;
18
+
19
+ const server = servers [ serverIndex ] ;
20
+ const formRef = React . useRef < HTMLFormElement > ( null ) ;
18
21
19
- function updateServerUrl ( formData : FormData ) {
22
+ function switchServer ( index : number ) {
20
23
startTransition ( ( ) => {
21
- if ( ! server . variables ) {
22
- return ;
24
+ if ( index !== serverIndex ) {
25
+ let params = new URLSearchParams ( `block=${ context . blockKey } &server=${ index ?? '0' } ` ) ;
26
+ router . push ( `?${ params } ` , { scroll : false } ) ;
23
27
}
24
- let params = new URLSearchParams ( `block=${ context . blockKey } ` ) ;
25
- const variableKeys = Object . keys ( server . variables ) ;
28
+ } ) ;
29
+ }
30
+
31
+ function updateServerVariables ( formData : FormData ) {
32
+ startTransition ( ( ) => {
33
+ let params = new URLSearchParams ( `block=${ context . blockKey } &server=${ formData . get ( 'server' ) ?? '0' } ` ) ;
34
+ const variableKeys = Object . keys ( server . variables ?? { } ) ;
26
35
for ( const pair of formData . entries ( ) ) {
27
36
if ( variableKeys . includes ( pair [ 0 ] ) && ! isNaN ( Number ( pair [ 1 ] ) ) ) {
28
37
params . set ( pair [ 0 ] , `${ pair [ 1 ] } ` ) ;
@@ -33,10 +42,11 @@ export function ServerURLForm(props: {
33
42
}
34
43
35
44
return (
36
- < form action = { updateServerUrl } className = "contents" >
45
+ < form ref = { formRef } action = { updateServerVariables } className = "contents" >
37
46
< fieldset disabled = { isPending } className = "contents" >
38
47
< input type = "hidden" name = "block" value = { context . blockKey } />
39
- < span > { children } </ span >
48
+ { children }
49
+ { servers . length > 1 ? < ServerSelector servers = { servers } currentIndex = { serverIndex } onChange = { switchServer } /> : null }
40
50
</ fieldset >
41
51
</ form >
42
52
) ;
0 commit comments