1+ import { useMemo } from 'react' ;
2+
3+ import { components as SelectComponents } from 'sentry/components/forms/controls/reactSelectWrapper' ;
14import Form from 'sentry/components/forms/form' ;
25import JsonForm from 'sentry/components/forms/jsonForm' ;
36import { t } from 'sentry/locale' ;
@@ -15,9 +18,40 @@ interface Props {
1518 repoWithSettings : RepositoryWithSettings ;
1619}
1720
21+ function ensureOnCommandPhraseTrigger ( triggers : string [ ] | null | undefined ) : string [ ] {
22+ if ( ! triggers || ! Array . isArray ( triggers ) ) {
23+ return [ 'on_command_phrase' ] ;
24+ }
25+ if ( ! triggers . includes ( 'on_command_phrase' ) ) {
26+ return [ 'on_command_phrase' , ...triggers ] ;
27+ }
28+ return triggers ;
29+ }
30+
31+ // Custom MultiValueRemove component that hides the remove button for immutable values
32+ function ImmutableMultiValueRemove (
33+ props : React . ComponentProps < typeof SelectComponents . MultiValueRemove >
34+ ) {
35+ if ( props . data ?. value === 'on_command_phrase' ) {
36+ return null ;
37+ }
38+ return < SelectComponents . MultiValueRemove { ...props } /> ;
39+ }
40+
1841export default function RepoDetailsForm ( { organization, repoWithSettings} : Props ) {
1942 const canWrite = useCanWriteSettings ( ) ;
2043
44+ const codeReviewTriggers = useMemo ( ( ) => {
45+ const triggers =
46+ repoWithSettings ?. settings ?. codeReviewTriggers ??
47+ organization . defaultCodeReviewTriggers ??
48+ DEFAULT_CODE_REVIEW_TRIGGERS ;
49+ return ensureOnCommandPhraseTrigger ( triggers ) ;
50+ } , [
51+ repoWithSettings ?. settings ?. codeReviewTriggers ,
52+ organization . defaultCodeReviewTriggers ,
53+ ] ) ;
54+
2155 return (
2256 < Form
2357 allowUndo
@@ -30,16 +64,19 @@ export default function RepoDetailsForm({organization, repoWithSettings}: Props)
3064 repoWithSettings ?. settings ?. enabledCodeReview ??
3165 organization . autoEnableCodeReview ??
3266 true ,
33- codeReviewTriggers :
34- repoWithSettings ?. settings ?. codeReviewTriggers ??
35- organization . defaultCodeReviewTriggers ??
36- DEFAULT_CODE_REVIEW_TRIGGERS ,
67+ codeReviewTriggers,
3768 repositoryIds : [ repoWithSettings . id ] ,
3869 } satisfies RepositorySettings
3970 }
4071 >
4172 < JsonForm
4273 disabled = { ! canWrite }
74+ additionalFieldProps = { {
75+ components : {
76+ MultiValueRemove : ImmutableMultiValueRemove ,
77+ } ,
78+ isOptionDisabled : ( option : any ) => option . value === 'on_command_phrase' ,
79+ } }
4380 forms = { [
4481 {
4582 title : t ( 'AI Code Review' ) ,
@@ -67,8 +104,13 @@ export default function RepoDetailsForm({organization, repoWithSettings}: Props)
67104 [ 'on_ready_for_review' , t ( 'On Ready for Review' ) ] ,
68105 [ 'on_new_commit' , t ( 'On New Commit' ) ] ,
69106 ] ,
107+ setValue : ( value : string [ ] | null | undefined ) => {
108+ return ensureOnCommandPhraseTrigger ( value ) ;
109+ } ,
70110 getData : data => ( {
71- codeReviewTriggers : data . codeReviewTriggers ,
111+ codeReviewTriggers : ensureOnCommandPhraseTrigger (
112+ data . codeReviewTriggers as string [ ] | null | undefined
113+ ) ,
72114 repositoryIds : [ repoWithSettings . id ] ,
73115 } ) ,
74116 } ,
0 commit comments