< Summary

Information
Class: locations.new.tsx
Assembly: app.routes
File(s): /home/runner/work/ClutterStock/ClutterStock/frontend/app/routes/locations.new.tsx
Tag: 58_25416222083
Line coverage
0%
Covered lines: 0
Uncovered lines: 17
Coverable lines: 17
Total lines: 55
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/ClutterStock/ClutterStock/frontend/app/routes/locations.new.tsx

#LineLine coverage
 1import { redirect } from "react-router";
 2import type { Route } from "./+types/locations.new";
 3import { routes } from "~/constants/routes";
 4import { createLocation } from "~/api/client";
 5import { LocationForm } from "~/features/locations";
 6import { tryApi } from "~/lib/action-helpers.server";
 7import { useToastFromActionData } from "~/lib/toasts";
 8import { pushFlash } from "~/lib/toasts.server";
 9
 010export async function action({ request }: Route.ActionArgs) {
 011  const formData = await request.formData();
 012  const name = formData.get("name");
 013  const description = formData.get("description");
 014  if (typeof name !== "string" || !name.trim()) {
 015    return { ok: false as const, error: "Name is required" };
 16  }
 017  const result = await tryApi(() =>
 18    createLocation(
 19      {
 20        name: name.trim(),
 21        description:
 22          typeof description === "string" && description.trim()
 23            ? description.trim()
 24            : undefined,
 25      },
 26      request,
 27    ),
 28  );
 029  if (!result.ok) return result;
 030  await pushFlash(request, {
 31    kind: "success",
 32    message: `Location "${result.data.name}" created`,
 33  });
 034  return redirect(routes.locations.list());
 35}
 36
 037export function meta(_args: Route.MetaArgs) {
 038  return [{ title: "Add location | ClutterStock" }];
 39}
 40
 041export default function LocationNew({ actionData }: Route.ComponentProps) {
 042  useToastFromActionData(actionData);
 43  const error =
 044    actionData && "error" in actionData ? actionData.error : undefined;
 45  const fieldErrors =
 046    actionData && "fieldErrors" in actionData ? actionData.fieldErrors : undefined;
 047  return (
 48    <LocationForm
 49      title="Add location"
 50      submitLabel="Create"
 51      error={error}
 52      fieldErrors={fieldErrors}
 53    />
 54  );
 55}