Skip to content

Commit 596d3de

Browse files
committed
fix: re-implement repopulateFields support
1 parent 99a88c7 commit 596d3de

9 files changed

+56
-18
lines changed

apps/test-app/app/routes/context-hooks.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,13 @@ const DisplayContext = ({
6666
export default function FrontendValidation() {
6767
const actionData = useActionData<typeof action>();
6868

69-
const server = useServerValidationErrors("test-form");
69+
const server = useServerValidationErrors({
70+
formId: "test-form",
71+
defaultValues: { firstName: "defaultFirstName" },
72+
});
7073
// Verify we don't get an infinite loop
7174
const form = useForm({
7275
...server.getFormOpts(),
73-
defaultValues: { firstName: "defaultFirstName" },
7476
validator: withYup(
7577
yup.object({
7678
firstName: yup.string().label("First Name").required(),

apps/test-app/app/routes/custom-server-validation-disable-focus-invalid-field.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ export const action = async (args: DataFunctionArgs) => {
2727
};
2828

2929
export default function CustomServerValidationDisableFocusInvalidField() {
30-
const response = useServerValidationErrors("test-form");
30+
const response = useServerValidationErrors({
31+
formId: "test-form",
32+
defaultValues: {},
33+
});
3134
return (
3235
<ValidatedForm
3336
validator={validator}

apps/test-app/app/routes/custom-server-validation-focus-invalid-field.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ export const action = async (args: DataFunctionArgs) => {
2727
};
2828

2929
export default function CustomServerValidationFocusInvalidField() {
30-
const response = useServerValidationErrors("test-form");
30+
const response = useServerValidationErrors({
31+
formId: "test-form",
32+
defaultValues: {},
33+
});
3134
return (
3235
<ValidatedForm
3336
validator={validator}

apps/test-app/app/routes/custom-server-validation.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ export const action = async (args: DataFunctionArgs) => {
2525
};
2626

2727
export default function CustomServerValidation() {
28-
const response = useServerValidationErrors("test-form");
28+
const response = useServerValidationErrors({
29+
formId: "test-form",
30+
defaultValues: {},
31+
});
2932
const form = useForm({
3033
...response.getFormOpts(),
3134
validator,

apps/test-app/app/routes/form-id.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export const action = async ({ request }: ActionFunctionArgs) => {
1414

1515
export default function FormId() {
1616
const actionData = useActionData<typeof action>();
17-
const server = useServerValidationErrors("form-id-test-form");
17+
const server = useServerValidationErrors({
18+
formId: "form-id-test-form",
19+
defaultValues: {},
20+
});
1821
return (
1922
<ValidatedForm
2023
validator={validator}

apps/test-app/app/routes/submission.aftersubmit._index.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,14 @@ export const action = async ({ request }: DataFunctionArgs) => {
3535

3636
export default function FrontendValidation() {
3737
const inputRef = useRef<HTMLInputElement>(null);
38-
const errors = useServerValidationErrors("aftersubmit-form");
39-
const errors2 = useServerValidationErrors("other-aftersubmit-form");
38+
const errors = useServerValidationErrors({
39+
formId: "aftersubmit-form",
40+
defaultValues: {},
41+
});
42+
const errors2 = useServerValidationErrors({
43+
formId: "other-aftersubmit-form",
44+
defaultValues: {},
45+
});
4046
return (
4147
<>
4248
<ValidatedForm

apps/test-app/app/routes/validation.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ export const action = async ({ request }: DataFunctionArgs) => {
6363

6464
export default function FrontendValidation() {
6565
const actionData = useActionData<typeof action>();
66-
const response = useServerValidationErrors("test-form");
66+
const response = useServerValidationErrors({
67+
formId: "test-form",
68+
defaultValues: { firstName: "" },
69+
});
6770
const form = useForm({
6871
validator,
6972
method: "post",

packages/remix/src/auto-server-hooks.tsx

+20-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { FetcherWithComponents, useActionData } from "@remix-run/react";
2-
import { ValidationErrorResponseData, FORM_ID_FIELD_NAME } from "@rvf/core";
2+
import {
3+
ValidationErrorResponseData,
4+
FORM_ID_FIELD_NAME,
5+
FieldValues,
6+
} from "@rvf/core";
37

48
type ErrorResponseContext = {
59
fetcher?: FetcherWithComponents<unknown>;
@@ -21,23 +25,32 @@ function useErrorResponseForForm({
2125
return actionData.formId === formId ? actionData : null;
2226
}
2327

24-
export const useServerValidationErrors = (
25-
formIdOrFetcher: string | FetcherWithComponents<any>,
28+
export type ServerValidationErrorOpts<DefaultValues> = (
29+
| { formId: string }
30+
| { fetcher: FetcherWithComponents<unknown> }
31+
) & {
32+
defaultValues: DefaultValues;
33+
};
34+
35+
export const useServerValidationErrors = <DefaultValues extends FieldValues>(
36+
opts: ServerValidationErrorOpts<DefaultValues>,
2637
) => {
27-
const formId =
28-
typeof formIdOrFetcher === "string" ? formIdOrFetcher : undefined;
29-
const fetcher =
30-
typeof formIdOrFetcher === "string" ? undefined : formIdOrFetcher;
38+
const { defaultValues } = opts;
39+
const formId = "formId" in opts ? opts.formId : undefined;
40+
const fetcher = "fetcher" in opts ? opts.fetcher : undefined;
41+
3142
const errorsFromServer = useErrorResponseForForm({
3243
fetcher,
3344
formId,
3445
});
46+
const errorDefaultValues = errorsFromServer?.repopulateFields;
3547

3648
return {
3749
getFormOpts: () => ({
3850
serverValidationErrors: errorsFromServer?.fieldErrors,
3951
id: formId,
4052
fetcher,
53+
defaultValues: (errorDefaultValues ?? defaultValues) as DefaultValues,
4154
}),
4255
renderHiddenInput: () => (
4356
<input type="hidden" name={FORM_ID_FIELD_NAME} value={formId} />

packages/remix/src/test/submission.test.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -484,10 +484,12 @@ it("should call onSubmitFailure if the call returns a validation error", async (
484484
{
485485
path: "/",
486486
Component: () => {
487-
const response = useServerValidationErrors("testing");
487+
const response = useServerValidationErrors({
488+
formId: "testing",
489+
defaultValues: { foo: "" },
490+
});
488491
const form = useForm({
489492
...response.getFormOpts(),
490-
defaultValues: { foo: "" },
491493
validator,
492494
method: "post",
493495
onSubmitSuccess: success,

0 commit comments

Comments
 (0)