import type { ActionArgs } from '@remix-run/node' import { json, redirect } from '@remix-run/node' import { Form, useActionData } from '@remix-run/react' import * as React from 'react' import z from 'zod' import { createTimeEntry } from '~/models/timeEntry.server' import { requireUserId } from '~/session.server' export async function action({ request }: ActionArgs) { const userId = await requireUserId(request) const formData = await request.formData() const description = formData.get('description') const projectId = formData.get('projectId') let startTime = formData.get('startTime') let endTime = formData.get('endTime') if (typeof description !== 'string' || description.length === 0) { return json({ errors: { description: 'Description is required' } }, { status: 400 }) } if (typeof projectId !== 'string' || projectId.length === 0) { return json({ errors: { projectId: 'projectId is required' } }, { status: 400 }) } if (typeof startTime !== 'string' || startTime.length === 0) { return json({ errors: { startTime: 'startTime is required' } }, { status: 400 }) } if (startTime && typeof startTime === 'string' && Number.isNaN(Date.parse(startTime))) { return json({ errors: { startTime: 'startTime is invalid' } }, { status: 422 }) } if (endTime && typeof endTime === 'string' && Number.isNaN(Date.parse(endTime))) { return json({ errors: { endTime: 'endTime is invalid' } }, { status: 422 }) } if ( startTime && endTime && typeof startTime === 'string' && typeof endTime === 'string' && new Date(startTime) > new Date(endTime) ) { return json({ errors: { endTime: 'startTime must be before endTime' } }, { status: 422 }) } const timeEntry = await createTimeEntry({ description, startTime: new Date(startTime), endTime: typeof endTime === 'string' ? new Date(endTime) : null, userId, projectId }) return redirect(`/time-entries/${timeEntry.id}`) } export default function NewNotePage() { const actionData = useActionData() 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}
)}