Skip to content

Commit e686772

Browse files
committed
fix: properly reset form
1 parent c28c017 commit e686772

File tree

5 files changed

+34
-4
lines changed

5 files changed

+34
-4
lines changed

preview/apitypes/apitypes.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package apitypes
33
import (
44
"time"
55

6+
"github.com/google/uuid"
67
"github.com/hashicorp/hcl/v2"
78

89
"github.com/coder/preview/types"
@@ -64,6 +65,7 @@ type FriendlyDiagnostic = types.FriendlyDiagnostic
6465

6566
type ParameterWithSource struct {
6667
types.Parameter
68+
Uuid uuid.UUID `json:"uuid"`
6769
TypeRange hcl.Range `json:"type_range"`
6870
DefRange hcl.Range `json:"def_range"`
6971
}
@@ -79,6 +81,7 @@ func WithSource(p []types.Parameter) []ParameterWithSource {
7981
src.TypeRange = param.Source.HCLBlock().TypeRange
8082
src.DefRange = param.Source.HCLBlock().DefRange
8183
}
84+
src.Uuid = uuid.New()
8285

8386
result = append(result, src)
8487
}

public/build/preview.wasm

38.3 KB
Binary file not shown.

src/client/App.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ export const App = () => {
9292
}, 100);
9393
};
9494

95+
const onReset = () => {
96+
setParameterValues({});
97+
setParameters((curr) =>
98+
curr.map((p) => {
99+
p.uuid = window.crypto.randomUUID();
100+
return p;
101+
}),
102+
);
103+
};
104+
95105
useEffect(() => {
96106
if (!window.go_preview) {
97107
initWasm().then((loadState) => {
@@ -109,9 +119,22 @@ export const App = () => {
109119
const newParameters = output?.output?.parameters ?? [];
110120

111121
return newParameters.map((p) => {
122+
// Check if the parameter is already in the array and if it is then keep it.
123+
// This allows us to optimize React by not re-rendering parameters that haven't changed.
124+
//
125+
// We unset value because the value may not be in sync with what we have locally,
126+
// and we unset uuid because it's given a new random UUID every time.
112127
const existing = curr.find((currP) => {
113-
const currentParameterOmitValue = { ...currP, value: undefined };
114-
const existingParameterOmitValue = { ...p, value: undefined };
128+
const currentParameterOmitValue = {
129+
...currP,
130+
value: undefined,
131+
uuid: undefined,
132+
};
133+
const existingParameterOmitValue = {
134+
...p,
135+
value: undefined,
136+
uuid: undefined,
137+
};
115138

116139
return isEqual(currentParameterOmitValue, existingParameterOmitValue);
117140
});
@@ -193,6 +216,7 @@ export const App = () => {
193216
parameterValues={parameterValues}
194217
setParameterValues={setParameterValues}
195218
parameters={parameters}
219+
onReset={onReset}
196220
/>
197221
</ResizablePanelGroup>
198222
</main>

src/client/Preview.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type PreviewProps = {
5656
React.SetStateAction<Record<string, string>>
5757
>;
5858
parameters: ParameterWithSource[];
59+
onReset: () => void;
5960
};
6061

6162
export const Preview: FC<PreviewProps> = ({
@@ -65,6 +66,7 @@ export const Preview: FC<PreviewProps> = ({
6566
parameterValues,
6667
setParameterValues,
6768
parameters,
69+
onReset,
6870
}) => {
6971
const $errors = useStore((state) => state.errors);
7072
const [params] = useSearchParams();
@@ -253,7 +255,7 @@ export const Preview: FC<PreviewProps> = ({
253255
<div className="flex w-full justify-between gap-3">
254256
<Button
255257
variant="outline"
256-
onClick={() => setParameterValues({})}
258+
onClick={onReset}
257259
className="w-fit"
258260
>
259261
Reset form
@@ -552,7 +554,7 @@ const Form: FC<FormProps> = ({
552554
.map((p) => {
553555
return (
554556
<FormElement
555-
key={p.name}
557+
key={p.uuid}
556558
parameter={p}
557559
value={parameterValues[p.name]}
558560
setParameterValues={setParameterValues}

src/gen/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export interface ParameterValidation {
100100

101101
// From apitypes/apitypes.go
102102
export interface ParameterWithSource extends Parameter {
103+
uuid: string;
103104
type_range: Range;
104105
def_range: Range;
105106
}

0 commit comments

Comments
 (0)