import * as React from "react"; import { Form, json, redirect, useActionData } from "remix"; import type { ActionFunction } from "remix"; import Alert from "@reach/alert"; import { createNote } from "~/models/note.server"; import { requireUserId } from "~/session.server"; type ActionData = { errors?: { title?: string; body?: string; }; }; export const action: ActionFunction = async ({ request }) => { const userId = await requireUserId(request); const formData = await request.formData(); const title = formData.get("title"); const body = formData.get("body"); if (typeof title !== "string" || title.length === 0) { return json( { errors: { title: "Title is required" } }, { status: 400 } ); } if (typeof body !== "string" || body.length === 0) { return json( { errors: { body: "Body is required" } }, { status: 400 } ); } const note = await createNote({ title, body, userId }); return redirect(`/notes/${note.id}`); }; export default function NewNotePage() { const actionData = useActionData() as ActionData; const titleRef = React.useRef(null); const bodyRef = React.useRef(null); React.useEffect(() => { if (actionData?.errors?.title) { titleRef.current?.focus(); } else if (actionData?.errors?.body) { bodyRef.current?.focus(); } }, [actionData]); return (
{actionData?.errors?.title && ( {actionData.errors.title} )}