1+ import { Button , Form } from 'antd' ;
2+
13import _ from 'lodash' ;
24
5+ import { TargetType } from '@models/ui' ;
6+
37import { FormCard } from '@components/FormComponents' ;
48
5- import { TargetForm } from './TargetForm' ;
9+ import Mocking from './Targets/Mocking' ;
10+ import Redirect from './Targets/Redirect' ;
11+ import Upstream from './Targets/Upstream' ;
612
713import * as S from './styled' ;
814
@@ -13,6 +19,23 @@ interface IProps {
1319}
1420
1521const Targets = ( { xKusk, onFinish, onCancel} : IProps ) => {
22+ const [ form ] = Form . useForm ( ) ;
23+
24+ const routingType : TargetType = xKusk ?. mocking
25+ ? 'mocked'
26+ : xKusk ?. redirect
27+ ? 'redirect'
28+ : xKusk ?. upstream ?. host
29+ ? 'host'
30+ : 'service' ;
31+
32+ const targetSelection = Form . useWatch < TargetType > ( 'type' , form ) ;
33+
34+ const xKuskForm = _ . set ( _ . cloneDeep ( xKusk ) , 'upstream.rewrite.rewrite_regex' , {
35+ pattern : xKusk ?. upstream ?. rewrite ?. pattern ,
36+ substitution : xKusk ?. upstream ?. rewrite ?. substitution ,
37+ } ) ;
38+
1639 const onSaveClickHandler = ( values : any ) => {
1740 let { redirect = null , upstream : { service = null , host = null , rewrite = null } = { } , mocking = null } = values ;
1841 if ( rewrite ) {
@@ -31,23 +54,108 @@ const Targets = ({xKusk, onFinish, onCancel}: IProps) => {
3154
3255 onFinish ( edits ) ;
3356 } ;
34- const xKuskForm = _ . set ( _ . cloneDeep ( xKusk ) , 'upstream.rewrite.rewrite_regex' , {
35- pattern : xKusk ?. upstream ?. rewrite ?. pattern ,
36- substitution : xKusk ?. upstream ?. rewrite ?. substitution ,
37- } ) ;
57+
58+ const changeRoutingType = ( type : TargetType ) => {
59+ if ( type === 'mocked' ) {
60+ return {
61+ type,
62+ 'x-kusk' : {
63+ upstream : null ,
64+ redirect : null ,
65+ mocking : {
66+ enabled : true ,
67+ } ,
68+ } ,
69+ } ;
70+ }
71+ if ( type === 'redirect' ) {
72+ return {
73+ type,
74+ 'x-kusk' : {
75+ upstream : null ,
76+ mocking : null ,
77+ redirect : xKusk ?. redirect ,
78+ } ,
79+ } ;
80+ }
81+
82+ if ( type === 'host' ) {
83+ return {
84+ type,
85+ 'x-kusk' : {
86+ upstream : { service : null , host : xKusk ?. upstream ?. host } ,
87+ mocking : null ,
88+ redirect : null ,
89+ } ,
90+ } ;
91+ }
92+ if ( type === 'service' ) {
93+ return {
94+ type,
95+ 'x-kusk' : {
96+ upstream : { host : null , service : xKusk ?. upstream ?. service } ,
97+ mocking : null ,
98+ redirect : null ,
99+ } ,
100+ } ;
101+ }
102+ } ;
38103
39104 return (
40105 < FormCard
41106 enableCancelButton
42- enableSaveButton
43107 heading = "Routing"
44108 subHeading = "Define the the upstreams or redirects your API is routing the requests to."
45109 helpTopic = "Routing"
46110 helpLink = "https://docs.kusk.io/guides/routing"
47- formProps = { { onFinish : onSaveClickHandler , layout : 'vertical' , initialValues : xKuskForm } }
111+ formProps = { {
112+ form,
113+ onFinish : onSaveClickHandler ,
114+ layout : 'vertical' ,
115+ initialValues : { type : routingType , ...xKuskForm } ,
116+ } }
48117 cancelEditMode = { onCancel }
49118 >
50- < TargetForm />
119+ < Form . Item label = "Type" name = "type" >
120+ < Button . Group >
121+ < Button
122+ type = { targetSelection === 'service' ? 'primary' : undefined }
123+ onClick = { ( ) => {
124+ form . setFieldsValue ( changeRoutingType ( 'service' ) ) ;
125+ } }
126+ value = "Upstream service"
127+ >
128+ Upstream service
129+ </ Button >
130+ < Button
131+ type = { targetSelection === 'host' ? 'primary' : undefined }
132+ onClick = { ( ) => form . setFieldsValue ( changeRoutingType ( 'host' ) ) }
133+ value = "Upstream host"
134+ >
135+ Upstream host
136+ </ Button >
137+ < Button
138+ type = { targetSelection === 'redirect' ? 'primary' : undefined }
139+ onClick = { ( ) => form . setFieldsValue ( changeRoutingType ( 'redirect' ) ) }
140+ value = "Redirect"
141+ >
142+ Redirect
143+ </ Button >
144+ < Button
145+ type = { targetSelection === 'mocked' ? 'primary' : undefined }
146+ onClick = { ( ) => form . setFieldsValue ( changeRoutingType ( 'mocked' ) ) }
147+ value = "Mocking"
148+ >
149+ Mock
150+ </ Button >
151+ </ Button . Group >
152+ </ Form . Item >
153+ { ( targetSelection === 'service' || targetSelection === 'host' ) && (
154+ < Upstream reference = { targetSelection === 'service' ? 'service' : 'host' } isRequiredFields />
155+ ) }
156+ { targetSelection === 'redirect' && < Redirect isRequiredFields /> }
157+ { targetSelection === 'mocked' && < Mocking /> }
158+
51159 < S . Divider />
52160 </ FormCard >
53161 ) ;
0 commit comments