MCPcopy Index your code
hub / github.com/coder/coder / useSyncFormParameters

Function useSyncFormParameters

site/src/modules/hooks/useSyncFormParameters.ts:18–72  ·  view source on GitHub ↗
({
	parameters,
	formValues,
	touched,
	setFieldValue,
}: UseSyncFormParametersProps)

Source from the content-addressed store, hash-verified

16};
17
18export 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}

Calls 1

getMethod · 0.80

Tested by

no test coverage detected