Skip to content

Commit f6e3cc5

Browse files
committed
refactor(ui): adopt react-hook-form for the SignUp form
1 parent 78608f7 commit f6e3cc5

11 files changed

Lines changed: 1027 additions & 112 deletions

File tree

ui/apps/console/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"axios": "^1.18.1",
3636
"font-logos": "^1.3.0",
3737
"node-rsa": "^1.1.1",
38+
"react-hook-form": "^7.0.0",
3839
"react-router-dom": "^7.17.0",
3940
"sshpk": "^1.18.0",
4041
"zustand": "^5.0.14"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useController, type Control, type FieldValues, type Path } from "react-hook-form";
2+
import CheckboxField from "@/components/common/fields/CheckboxField";
3+
import type { ComponentProps } from "react";
4+
5+
type CheckboxFieldProps = Omit<
6+
ComponentProps<typeof CheckboxField>,
7+
"checked" | "onChange"
8+
>;
9+
10+
type Props<T extends FieldValues> = CheckboxFieldProps & {
11+
name: Path<T>;
12+
control: Control<T>;
13+
/** Called on every value change, in addition to RHF's internal onChange. */
14+
onValueChange?: (value: boolean) => void;
15+
};
16+
17+
export default function FormCheckboxField<T extends FieldValues>({
18+
name,
19+
control,
20+
error: errorOverride,
21+
onValueChange,
22+
...rest
23+
}: Props<T>) {
24+
const {
25+
field,
26+
fieldState: { error: fieldError },
27+
} = useController({ name, control });
28+
29+
const resolvedError = errorOverride ?? fieldError?.message;
30+
31+
return (
32+
<CheckboxField
33+
{...rest}
34+
checked={field.value}
35+
onChange={(v) => {
36+
field.onChange(v);
37+
onValueChange?.(v);
38+
}}
39+
onBlur={field.onBlur}
40+
error={resolvedError}
41+
/>
42+
);
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useController, type Control, type FieldValues, type Path } from "react-hook-form";
2+
import InputField from "@/components/common/fields/InputField";
3+
import type { ComponentProps } from "react";
4+
5+
type InputFieldProps = Omit<
6+
ComponentProps<typeof InputField>,
7+
"value" | "onChange"
8+
>;
9+
10+
type Props<T extends FieldValues> = InputFieldProps & {
11+
name: Path<T>;
12+
control: Control<T>;
13+
/** Called on every value change, in addition to RHF's internal onChange. */
14+
onValueChange?: (value: string) => void;
15+
};
16+
17+
export default function FormInputField<T extends FieldValues>({
18+
name,
19+
control,
20+
error: errorOverride,
21+
onValueChange,
22+
...rest
23+
}: Props<T>) {
24+
const {
25+
field,
26+
fieldState: { error: fieldError },
27+
} = useController({ name, control });
28+
29+
const resolvedError = errorOverride ?? fieldError?.message;
30+
31+
return (
32+
<InputField
33+
{...rest}
34+
value={field.value}
35+
onChange={(v) => {
36+
field.onChange(v);
37+
onValueChange?.(v);
38+
}}
39+
onBlur={field.onBlur}
40+
error={resolvedError}
41+
/>
42+
);
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useController, type Control, type FieldValues, type Path } from "react-hook-form";
2+
import PasswordField from "@/components/common/fields/PasswordField";
3+
import type { ComponentProps } from "react";
4+
5+
type PasswordFieldProps = Omit<
6+
ComponentProps<typeof PasswordField>,
7+
"value" | "onChange"
8+
>;
9+
10+
type Props<T extends FieldValues> = PasswordFieldProps & {
11+
name: Path<T>;
12+
control: Control<T>;
13+
/** Called on every value change, in addition to RHF's internal onChange. */
14+
onValueChange?: (value: string) => void;
15+
};
16+
17+
export default function FormPasswordField<T extends FieldValues>({
18+
name,
19+
control,
20+
error: errorOverride,
21+
onValueChange,
22+
...rest
23+
}: Props<T>) {
24+
const {
25+
field,
26+
fieldState: { error: fieldError },
27+
} = useController({ name, control });
28+
29+
const resolvedError = errorOverride ?? fieldError?.message;
30+
31+
return (
32+
<PasswordField
33+
{...rest}
34+
value={field.value}
35+
onChange={(v) => {
36+
field.onChange(v);
37+
onValueChange?.(v);
38+
}}
39+
onBlur={field.onBlur}
40+
error={resolvedError}
41+
/>
42+
);
43+
}

0 commit comments

Comments
 (0)