({
parameters,
formValues,
touched,
setFieldValue,
}: UseSyncFormParametersProps)
| 16 | }; |
| 17 | |
| 18 | export function useSyncFormParameters({ |
| 19 | parameters, |
| 20 | formValues, |
| 21 | touched, |
| 22 | setFieldValue, |
| 23 | }: UseSyncFormParametersProps) { |
| 24 | // Form values only needs to be updated when parameters change |
| 25 | // Keep track of form values in a ref to avoid unnecessary updates to rich_parameter_values |
| 26 | const formValuesRef = useRef(formValues); |
| 27 | |
| 28 | formValuesRef.current = formValues; |
| 29 | |
| 30 | useEffect(() => { |
| 31 | if (!parameters) return; |
| 32 | const currentFormValues = formValuesRef.current; |
| 33 | const currentFormValuesMap = new Map( |
| 34 | currentFormValues.map((value) => [value.name, value.value]), |
| 35 | ); |
| 36 | |
| 37 | const newParameterValues = parameters.map((param) => { |
| 38 | // Do not mess with values the user has changed (or were auto-filled). |
| 39 | // Otherwise based on timing web socket responses can undo changes, and it |
| 40 | // seems bad to change a user's inputs from under them anyway. |
| 41 | if ( |
| 42 | touched[ |
| 43 | param.name as keyof { |
| 44 | rich_parameter_values?: readonly TypesGen.WorkspaceBuildParameter[]; |
| 45 | } |
| 46 | ] |
| 47 | ) { |
| 48 | const existingValue = currentFormValuesMap.get(param.name); |
| 49 | if (existingValue !== undefined) { |
| 50 | return { name: param.name, value: existingValue }; |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | return { |
| 55 | name: param.name, |
| 56 | value: param.value.valid ? param.value.value : "", |
| 57 | }; |
| 58 | }); |
| 59 | |
| 60 | const isChanged = |
| 61 | currentFormValues.length !== newParameterValues.length || |
| 62 | newParameterValues.some( |
| 63 | (p) => |
| 64 | !currentFormValuesMap.has(p.name) || |
| 65 | currentFormValuesMap.get(p.name) !== p.value, |
| 66 | ); |
| 67 | |
| 68 | if (isChanged) { |
| 69 | setFieldValue("rich_parameter_values", newParameterValues); |
| 70 | } |
| 71 | }, [parameters, touched, setFieldValue]); |
| 72 | } |
no test coverage detected