@@ -23,9 +23,7 @@ import {
23
23
copyToClipboard ,
24
24
CustomInput ,
25
25
ClipboardButton ,
26
- ButtonWithLoader ,
27
26
CodeEditor ,
28
- SelectPicker ,
29
27
TabGroup ,
30
28
ComponentSizeType ,
31
29
ToastVariantType ,
@@ -37,31 +35,23 @@ import {
37
35
ActionTypes ,
38
36
InfoBlock ,
39
37
DocLink ,
38
+ stopPropagation ,
39
+ ButtonStyleType ,
40
+ Icon ,
40
41
} from '@devtron-labs/devtron-fe-common-lib'
41
42
import { useParams } from 'react-router-dom'
42
43
import Tippy from '@tippyjs/react'
43
44
import { ReactComponent as Close } from '../../../assets/icons/ic-close.svg'
44
45
import { ReactComponent as Help } from '../../../assets/icons/ic-help.svg'
45
46
import { ReactComponent as ICHelpOutline } from '../../../assets/icons/ic-help-outline.svg'
46
47
import { ReactComponent as Add } from '../../../assets/icons/ic-add.svg'
47
- import { ReactComponent as PlayButton } from '../../../assets/icons/ic-play.svg'
48
48
import { ReactComponent as Tag } from '../../../assets/icons/ic-tag.svg'
49
49
import './webhookDetails.scss'
50
- import {
51
- getUserRole ,
52
- createOrUpdateUser ,
53
- } from '@Pages/GlobalConfigurations/Authorization/authorization.service'
50
+ import { getUserRole , createOrUpdateUser } from '@Pages/GlobalConfigurations/Authorization/authorization.service'
54
51
import { MODES , SERVER_MODE , WEBHOOK_NO_API_TOKEN_ERROR } from '../../../config'
55
52
import { createGeneratedAPIToken } from '@Pages/GlobalConfigurations/Authorization/APITokens/service'
56
- import {
57
- CURL_PREFIX ,
58
- getWebhookTokenListOptions ,
59
- PLAYGROUND_TAB_LIST ,
60
- REQUEST_BODY_TAB_LIST ,
61
- RESPONSE_TAB_LIST ,
62
- TOKEN_TAB_LIST ,
63
- } from './webhook.utils'
64
- import { SchemaType , TabDetailsType , TokenListOptionsType , WebhookDetailsType , WebhookDetailType } from './types'
53
+ import { CURL_PREFIX , PLAYGROUND_TAB_LIST , REQUEST_BODY_TAB_LIST , RESPONSE_TAB_LIST } from './webhook.utils'
54
+ import { SchemaType , TabDetailsType , WebhookDetailsType , WebhookDetailType } from './types'
65
55
import { executeWebhookAPI , getExternalCIConfig , getWebhookAPITokenList } from './webhook.service'
66
56
import { GENERATE_TOKEN_NAME_VALIDATION } from '../../../config/constantMessaging'
67
57
import { createUserPermissionPayload } from '@Pages/GlobalConfigurations/Authorization/utils'
@@ -82,15 +72,12 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
82
72
const [ loader , setLoader ] = useState ( false )
83
73
const [ webhookExecutionLoader , setWebhookExecutionLoader ] = useState ( false )
84
74
const [ generateTokenLoader , setGenerateTokenLoader ] = useState ( false )
85
- const [ selectedTokenTab , setSelectedTokenTab ] = useState < string > ( TOKEN_TAB_LIST [ 0 ] . key )
86
75
const [ tokenName , setTokenName ] = useState < string > ( '' )
87
76
const [ showTokenNameError , setTokenNameError ] = useState ( false )
88
77
const [ selectedPlaygroundTab , setSelectedPlaygroundTab ] = useState < string > ( PLAYGROUND_TAB_LIST [ 0 ] . key )
89
78
const [ selectedRequestBodyTab , setRequestBodyPlaygroundTab ] = useState < string > ( REQUEST_BODY_TAB_LIST [ 0 ] . key )
90
79
const [ webhookResponse , setWebhookResponse ] = useState < Object > ( null )
91
- const [ selectedToken , setSelectedToken ] = useState < TokenListOptionsType > ( null )
92
80
const [ generatedAPIToken , setGeneratedAPIToken ] = useState < string > ( null )
93
- const [ tokenList , setTokenList ] = useState < TokenListOptionsType [ ] > ( undefined )
94
81
const [ showTokenSection , setShowTokenSection ] = useState ( false )
95
82
const [ isSuperAdmin , setIsSuperAdmin ] = useState ( false )
96
83
const [ samplePayload , setSamplePayload ] = useState < any > ( null )
@@ -203,7 +190,6 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
203
190
. map ( ( tokenData ) => {
204
191
return { label : tokenData . name , value : tokenData . id , ...tokenData }
205
192
} ) || [ ]
206
- setTokenList ( sortedResult )
207
193
}
208
194
setLoader ( false )
209
195
} catch ( error ) {
@@ -379,41 +365,31 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
379
365
)
380
366
}
381
367
382
- const renderSelectedToken = ( titlePrefix : string , token : string ) : JSX . Element => {
383
- return (
384
- < div >
385
- < div className = "cn-7 mt-16 mb-8 fs-13" > { titlePrefix } API token</ div >
386
- < div className = "fs-13 font-roboto flexbox dc__word-break pl-8-imp" data-testid = "generated-api-token" >
387
- { token }
388
- < div className = "flex pl-4" >
389
- < ClipboardButton content = { token } />
390
- </ div >
391
- </ div >
392
- </ div >
393
- )
368
+ const handleCopyToClipboard = async ( { e, token } : { e : React . MouseEvent ; token : string } ) => {
369
+ stopPropagation ( e )
370
+ setCopyToClipboardPromise ( copyToClipboard ( token ) )
394
371
}
395
372
396
- const renderSelectTokenSection = ( ) : JSX . Element => {
397
- const handleSelectedTokenChange = ( selectedToken ) : void => {
398
- setSelectedToken ( selectedToken )
399
- }
400
-
373
+ const renderSelectedToken = ( token : string ) : JSX . Element => {
401
374
return (
402
- < >
403
- < div className = "w-400 h-32 mt-16" >
404
- < SelectPicker
405
- inputId = "select-token"
406
- name = "select-token"
407
- classNamePrefix = "select-token"
408
- placeholder = "Select API token"
409
- isClearable = { false }
410
- options = { getWebhookTokenListOptions ( tokenList ) }
411
- value = { selectedToken }
412
- onChange = { handleSelectedTokenChange }
413
- isSearchable = { false }
414
- />
415
- </ div >
416
- </ >
375
+ < div className = "mt-16" >
376
+ < InfoBlock
377
+ heading = "Copy and store this token safely, you won’t be able to view it again."
378
+ description = {
379
+ < div className = "fs-13 font-roboto flexbox dc__word-break" data-testid = "generated-api-token" >
380
+ { token }
381
+ </ div >
382
+ }
383
+ buttonProps = { {
384
+ text : 'Copy' ,
385
+ startIcon : < ClipboardButton content = { token } copyToClipboardPromise = { copyToClipboardPromise } /> ,
386
+ dataTestId : 'copy-generated-api-token' ,
387
+ variant : ButtonVariantType . text ,
388
+ onClick : ( e ) => handleCopyToClipboard ( { e, token } ) ,
389
+ } }
390
+ variant = "success"
391
+ />
392
+ </ div >
417
393
)
418
394
}
419
395
@@ -427,7 +403,7 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
427
403
const renderGenerateTokenSection = ( ) : JSX . Element => {
428
404
return (
429
405
< div className = "flexbox-col dc__gap-16" >
430
- < div className = "mt-16 " >
406
+ < div className = "mt-8 " >
431
407
< CustomInput
432
408
placeholder = "Enter token name"
433
409
name = "token-name"
@@ -437,8 +413,9 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
437
413
disabled = { ! ! generatedAPIToken }
438
414
error = { showTokenNameError && GENERATE_TOKEN_NAME_VALIDATION }
439
415
helperText = "An API token with the required permissions will be auto-generated."
416
+ required
440
417
/>
441
- { generatedAPIToken && renderSelectedToken ( 'Generated' , generatedAPIToken ) }
418
+ { generatedAPIToken && renderSelectedToken ( generatedAPIToken ) }
442
419
</ div >
443
420
{ ! generatedAPIToken && (
444
421
< Button
@@ -470,13 +447,12 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
470
447
dataTestId = "select-or-generate-token"
471
448
variant = { ButtonVariantType . text }
472
449
onClick = { toggleTokenSection }
473
- text = "Select or auto -generate token with required permissions"
450
+ text = "Auto -generate token with required permissions"
474
451
/>
475
452
) : (
476
- < div >
477
- { generateTabHeader ( TOKEN_TAB_LIST , selectedTokenTab , setSelectedTokenTab ) }
478
- { selectedTokenTab === TOKEN_TAB_LIST [ 0 ] . key && renderSelectTokenSection ( ) }
479
- { selectedTokenTab === TOKEN_TAB_LIST [ 1 ] . key && renderGenerateTokenSection ( ) }
453
+ < div className = "cn-9 fs-13 mb-8" >
454
+ < span className = "fs-13 lh-1-5 fw-6" > Generate token with required permissions</ span >
455
+ { renderGenerateTokenSection ( ) }
480
456
</ div >
481
457
)
482
458
}
@@ -820,19 +796,23 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
820
796
const renderTryoutActionSection = ( ) : JSX . Element => {
821
797
return (
822
798
< div className = "flex left mt-20" >
823
- < ButtonWithLoader
824
- rootClassName = "cta h-28 flex mr-8 "
799
+ < Button
800
+ dataTestId = "execute-token "
825
801
onClick = { executeWebhook }
802
+ text = "Execute"
803
+ startIcon = { < Icon name = "ic-play-outline" color = "N0" size = { 18 } /> }
826
804
isLoading = { webhookExecutionLoader }
827
- >
828
- < PlayButton className = "icon-dim-18 mr-8" />
829
- Execute
830
- </ ButtonWithLoader >
805
+ size = { ComponentSizeType . small }
806
+ />
831
807
{ webhookResponse && (
832
- < button className = "cta cancel h-28 flex" onClick = { clearWebhookResponse } >
833
- < Close className = "icon-dim-18 mr-8" />
834
- Clear
835
- </ button >
808
+ < Button
809
+ dataTestId = "clear-response"
810
+ onClick = { clearWebhookResponse }
811
+ text = "Clear"
812
+ startIcon = { < Icon name = "ic-close-large" color = "N0" size = { 18 } /> }
813
+ size = { ComponentSizeType . small }
814
+ variant = { ButtonVariantType . secondary }
815
+ />
836
816
) }
837
817
</ div >
838
818
)
@@ -869,9 +849,15 @@ export const WebhookDetailsModal = ({ close, isTemplateView }: WebhookDetailType
869
849
return (
870
850
< div className = "flex flex-align-center flex-justify dc__border-bottom bg__primary pt-16 pr-20 pb-16 pl-20" >
871
851
< h2 className = "fs-16 fw-6 lh-1-43 m-0" > Webhook Details</ h2 >
872
- < button type = "button" className = "dc__transparent flex icon-dim-24" onClick = { closeWebhook } >
873
- < Close className = "icon-dim-24" />
874
- </ button >
852
+ < Button
853
+ dataTestId = "close-webhook-details-modal"
854
+ icon = { < Icon name = "ic-close-large" color = { null } /> }
855
+ ariaLabel = "Close"
856
+ showAriaLabelInTippy = { false }
857
+ onClick = { closeWebhook }
858
+ variant = { ButtonVariantType . borderLess }
859
+ style = { ButtonStyleType . negativeGrey }
860
+ />
875
861
</ div >
876
862
)
877
863
}
0 commit comments