@@ -24,16 +24,20 @@ import { readProjectIds, writeProjectIds } from "../jira";
2424import { WrappableComponentProps } from "./ErrorWrapper" ;
2525
2626type ProjectSettingsFormProps = WrappableComponentProps & {
27- projectIds : string [ ] ;
27+ savedProjectIds : string [ ] ;
2828 saveProjectIds : ( projectIds : string [ ] ) => Promise < void > ;
2929} ;
3030
31- const ProjectSettingsForm = ( { setError, saveProjectIds, ...props } : ProjectSettingsFormProps ) => {
31+ const ProjectSettingsForm = ( {
32+ setError,
33+ saveProjectIds,
34+ savedProjectIds,
35+ } : ProjectSettingsFormProps ) => {
3236 // set form state from props
33- const [ projectIds , setProjectIds ] = useState < string [ ] > ( props . projectIds ) ;
37+ const [ projectIds , setProjectIds ] = useState < string [ ] > ( savedProjectIds ) ;
3438 useEffect ( ( ) => {
35- setProjectIds ( props . projectIds ) ;
36- } , [ props . projectIds ] ) ;
39+ setProjectIds ( savedProjectIds ) ;
40+ } , [ savedProjectIds ] ) ;
3741
3842 // get projects from Flagsmith API
3943 const [ projects ] = usePromise (
@@ -55,9 +59,12 @@ const ProjectSettingsForm = ({ setError, saveProjectIds, ...props }: ProjectSett
5559 setError ,
5660 ) ;
5761
58- const currentProjects = projects ?. filter ( ( each ) => projectIds . includes ( String ( each . id ) ) ) ;
62+ const currentProjects = projects ?. filter ( ( each ) => savedProjectIds . includes ( String ( each . id ) ) ) ;
5963 const validProjectIds = new Set ( projects ?. map ( ( project ) => String ( project . id ) ) ?? [ ] ) ;
6064 const allSelectedValid = projectIds . every ( ( id ) => validProjectIds . has ( id ) ) ;
65+ const hasChanges =
66+ projectIds . length !== savedProjectIds . length ||
67+ ! projectIds . every ( ( id ) => savedProjectIds . includes ( id ) ) ;
6168
6269 const projectInputId = useId ( ) ;
6370 const projectOptions = useMemo (
@@ -79,8 +86,8 @@ const ProjectSettingsForm = ({ setError, saveProjectIds, ...props }: ProjectSett
7986 // get features for current project from Flagsmith API
8087 const [ features ] = usePromise ( async ( ) => {
8188 try {
82- if ( props . projectIds . length > 0 ) {
83- return await readFeatures ( { projectIds : props . projectIds } ) ;
89+ if ( savedProjectIds . length > 0 ) {
90+ return await readFeatures ( { projectIds : savedProjectIds } ) ;
8491 } else {
8592 return undefined ;
8693 }
@@ -89,7 +96,7 @@ const ProjectSettingsForm = ({ setError, saveProjectIds, ...props }: ProjectSett
8996 console . error ( error ) ;
9097 return [ ] ;
9198 }
92- } , [ props . projectIds ] ) ;
99+ } , [ savedProjectIds ] ) ;
93100
94101 if ( projects === undefined ) {
95102 return < Spinner label = "Loading projects" /> ;
@@ -113,18 +120,17 @@ const ProjectSettingsForm = ({ setError, saveProjectIds, ...props }: ProjectSett
113120 < Box xcss = { { marginBottom : "space.300" } } >
114121 < Inline space = "space.050" alignBlock = "center" >
115122 < Strong > Project(s):</ Strong >
116- { /* Need to put this in a list */ }
117123 { ( currentProjects ?. length ?? 0 ) > 0 && (
118124 < Text > { currentProjects ! . map ( ( project ) => project . name ) . join ( ", " ) } </ Text >
119125 ) }
120- { currentProjects ?. length === 0 && projects ?. length > 0 && ! connected && (
126+ { currentProjects ?. length === 0 && projects ?. length > 0 && ! connected && ! hasChanges && (
121127 < Lozenge appearance = "moved" > Not connected</ Lozenge >
122128 ) }
123129 { projects ?. length === 0 && < Lozenge appearance = "removed" > No projects to connect</ Lozenge > }
124- { ( currentProjects ?? [ ] ) . length > 0 && ! ! features && ! connected && (
130+ { ( currentProjects ?? [ ] ) . length > 0 && ! ! features && ! connected && ! hasChanges && (
125131 < Lozenge appearance = "removed" > No features to connect</ Lozenge >
126132 ) }
127- { connected && < Lozenge appearance = "success" > Connected</ Lozenge > }
133+ { connected && ! hasChanges && < Lozenge appearance = "success" > Connected</ Lozenge > }
128134 </ Inline >
129135 </ Box >
130136 { ! ! projectOptions && (
@@ -149,7 +155,7 @@ const ProjectSettingsForm = ({ setError, saveProjectIds, ...props }: ProjectSett
149155 < Button
150156 onClick = { onSave }
151157 appearance = "primary"
152- isDisabled = { ! projectIds . length || ! allSelectedValid }
158+ isDisabled = { ! projectIds . length || ! allSelectedValid || ! hasChanges }
153159 >
154160 Save
155161 </ Button >
@@ -201,7 +207,7 @@ const ProjectSettingsPage = ({ setError }: WrappableComponentProps): JSX.Element
201207 return ready ? (
202208 < ProjectSettingsForm
203209 setError = { setError }
204- projectIds = { projectIds }
210+ savedProjectIds = { projectIds }
205211 saveProjectIds = { saveProjectIds }
206212 />
207213 ) : (
0 commit comments