Skip to content

Commit

Permalink
Merge pull request #31 from bholmesdev/fix/async-validation-on-submit
Browse files Browse the repository at this point in the history
Fix: client-side async validation still submits on error
  • Loading branch information
bholmesdev authored Jan 10, 2024
2 parents 791a262 + 0d489e5 commit 53a6059
Show file tree
Hide file tree
Showing 10 changed files with 49 additions and 19 deletions.
5 changes: 5 additions & 0 deletions .changeset/tasty-ears-do.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"simple-stack-form": patch
---

Async validation would cause the form to submit even when form errors are present. This fix updates all form templates to call Astro's submit method manually.
13 changes: 10 additions & 3 deletions examples/playground/src/components/preact/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@

// Generated by simple:form

import { navigate } from "astro:transitions/client";
import { type ComponentProps, createContext } from "preact";
import { useContext, useState } from "preact/hooks";
import {
type FieldErrors,
type FormState,
type FormValidator,
formNameInputProps,
getInitialFormState,
toSetValidationErrors,
toTrackAstroSubmitStatus,
toValidateField,
validateForm,
formNameInputProps,
} from "simple:form";

export function useCreateFormContext(
Expand Down Expand Up @@ -65,6 +66,8 @@ export function Form({
{...formProps}
method="POST"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -73,11 +76,15 @@ export function Form({
}));
const parsed = await validateForm({ formData, validator });
if (parsed.data) {
const action =
typeof formProps.action === "string"
? formProps.action
: // Check for Preact signals
formProps.action?.value ?? "";
navigate(action, { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
8 changes: 5 additions & 3 deletions examples/playground/src/components/react/Form.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Generated by simple:form

import { navigate } from "astro:transitions/client";
import {
type ComponentProps,
createContext,
Expand All @@ -10,12 +11,12 @@ import {
type FieldErrors,
type FormState,
type FormValidator,
formNameInputProps,
getInitialFormState,
toSetValidationErrors,
toTrackAstroSubmitStatus,
toValidateField,
validateForm,
formNameInputProps,
} from "simple:form";

export function useCreateFormContext(
Expand Down Expand Up @@ -67,6 +68,8 @@ export function Form({
{...formProps}
method="POST"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -75,11 +78,10 @@ export function Form({
}));
const parsed = await validateForm({ formData, validator });
if (parsed.data) {
navigate(formProps.action ?? "", { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
16 changes: 9 additions & 7 deletions examples/playground/src/components/solid-js/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,25 @@
// Generated by simple:form

import {
createSignal,
createContext,
useContext,
type ComponentProps,
Show,
For,
Show,
createContext,
createSignal,
useContext,
} from "solid-js";
import {
type FieldErrors,
type FormState,
type FormValidator,
formNameInputProps,
getInitialFormState,
toSetValidationErrors,
toTrackAstroSubmitStatus,
toValidateField,
validateForm,
formNameInputProps,
} from "simple:form";
import { navigate } from "astro:transitions/client";

export function useCreateFormContext(
validator: FormValidator,
Expand Down Expand Up @@ -67,6 +68,8 @@ export function Form(
{...props}
method="post"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -78,11 +81,10 @@ export function Form(
validator: props.validator,
});
if (parsed.data) {
navigate(props.action?.toString() ?? "", { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
11 changes: 9 additions & 2 deletions packages/form/templates/preact/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { type ComponentProps, createContext } from "preact";
import { useContext, useState } from "preact/hooks";
import { navigate } from "astro:transitions/client";
import {
type FieldErrors,
type FormState,
Expand Down Expand Up @@ -63,6 +64,8 @@ export function Form({
{...formProps}
method="POST"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -71,11 +74,15 @@ export function Form({
}));
const parsed = await validateForm({ formData, validator });
if (parsed.data) {
const action =
typeof formProps.action === "string"
? formProps.action
: // Check for Preact signals
formProps.action?.value ?? "";
navigate(action, { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
1 change: 1 addition & 0 deletions packages/form/templates/preact/env.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/// <reference path="../../types.d.ts" />
/// <reference types="astro/client" />
6 changes: 4 additions & 2 deletions packages/form/templates/react/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
useContext,
useState,
} from "react";
import { navigate } from "astro:transitions/client";
import {
type FieldErrors,
type FormState,
Expand Down Expand Up @@ -67,6 +68,8 @@ export function Form({
{...formProps}
method="POST"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -75,11 +78,10 @@ export function Form({
}));
const parsed = await validateForm({ formData, validator });
if (parsed.data) {
navigate(formProps.action ?? "", { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
1 change: 1 addition & 0 deletions packages/form/templates/react/env.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/// <reference path="../../types.d.ts" />
/// <reference types="astro/client" />
6 changes: 4 additions & 2 deletions packages/form/templates/solid-js/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
createSignal,
useContext,
} from "solid-js";
import { navigate } from "astro:transitions/client";
import {
type FieldErrors,
type FormState,
Expand Down Expand Up @@ -65,6 +66,8 @@ export function Form(
{...props}
method="post"
onSubmit={async (e) => {
e.preventDefault();
e.stopPropagation();
const formData = new FormData(e.currentTarget);
formContext.set((formState) => ({
...formState,
Expand All @@ -76,11 +79,10 @@ export function Form(
validator: props.validator,
});
if (parsed.data) {
navigate(props.action?.toString() ?? "", { formData });
return formContext.trackAstroSubmitStatus();
}

e.preventDefault();
e.stopPropagation();
formContext.setValidationErrors(parsed.fieldErrors);
}}
>
Expand Down
1 change: 1 addition & 0 deletions packages/form/templates/solid-js/env.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/// <reference path="../../types.d.ts" />
/// <reference types="astro/client" />

0 comments on commit 53a6059

Please sign in to comment.