Skip to content
This repository has been archived by the owner on Mar 11, 2024. It is now read-only.

pilcrowonpaper/astro-form-actions

Repository files navigation

Astro form actions

Use progressive form enhancement and handle form submissions in Astro. This library only uses native Web APIs and can be used in any runtime.

npm i astro-form-actions
pnpm add astro-form-actions
yarn add astro-form-actions

Documentation: https://github.com/pilcrowOnPaper/astro-form-actions/wiki

Demo: https://astro-form-actions.vercel.app

Need a library to parse your forms? Check out my other project Adria!

Features

  • Simple
  • Type inference
  • Supports multipart form data
  • Framework agnostic

Overview

This library is made up of 2 parts: server side and client side.

Server side

handleFormSubmission will handle all POST requests to the page.

// inside .astro page
import {
	handleFormSubmission,
	reject,
	resolve,
	redirect
} from "astro-form-actions";

const { response, error, inputValues, body } = await handleFormSubmission(
	Astro,
	async (formData) => {
		const message = formData.get("message");
		if (typeof notes !== "string")
			return reject(400, {
				message: "bad input"
			});
		// do some stuff
		return resolve({
			success: true
		});
	}
);
if (response) return response;

Client side

You can use a regular HTML form:

<form method="post">
	<input name="message" />
	<input type="submit" />
</form>

Or, by using component frameworks like Solid (or just even vanilla JS), you can use submitForm to make the submission.

import { submitForm } from "astro-form-actions/client";

export default () => {
	return (
		<form
			method="post"
			onSubmit={(e) => {
				e.preventDefault();
				const { error } = await submitForm<
					{
						success: boolean;
					},
					{
						message: string;
					}
				>(e.currentTarget);
			}}
		>
			<input name="message" />
			<input type="submit" />
		</form>
	);
};

Other

Parts of the library is from https://github.com/nachomazzara/parse-multipart-data.

Releases

No releases published

Packages

No packages published