chore: initialized repository

This commit is contained in:
Lukas Wölfer
2026-04-16 22:00:50 +02:00
parent 0a74a9a7ef
commit 74c94b05f9
12 changed files with 354 additions and 53 deletions

View File

@@ -2,59 +2,36 @@ import { database } from "~/database/context";
import * as schema from "~/database/schema";
import type { Route } from "./+types/home";
import { Welcome } from "../welcome/welcome";
import { CastrationTracker } from "../components/castration-tracker";
export function meta({}: Route.MetaArgs) {
return [
{ title: "New React Router App" },
{ name: "description", content: "Welcome to React Router!" },
{ title: "Castration Tracker" },
{ name: "description", content: "Track animal castrations" },
];
}
export async function action({ request }: Route.ActionArgs) {
const formData = await request.formData();
let name = formData.get("name");
let email = formData.get("email");
if (typeof name !== "string" || typeof email !== "string") {
return { guestBookError: "Name and email are required" };
}
name = name.trim();
email = email.trim();
if (!name || !email) {
return { guestBookError: "Name and email are required" };
}
const db = database();
try {
await db.insert(schema.guestBook).values({ name, email });
} catch (error) {
return { guestBookError: "Error adding to guest book" };
}
}
export async function loader({ context }: Route.LoaderArgs) {
const db = database();
const guestBook = await db.query.guestBook.findMany({
columns: {
id: true,
name: true,
},
const castrations = await db.query.castrations.findMany({
orderBy: (castrations, { desc }) => [desc(castrations.timestamp)],
});
const totalCount = castrations.length;
return {
guestBook,
castrations,
totalCount,
message: context.VALUE_FROM_EXPRESS,
};
}
export default function Home({ actionData, loaderData }: Route.ComponentProps) {
export default function Home({ loaderData }: Route.ComponentProps) {
return (
<Welcome
guestBook={loaderData.guestBook}
guestBookError={actionData?.guestBookError}
message={loaderData.message}
<CastrationTracker
castrations={loaderData.castrations}
totalCount={loaderData.totalCount}
/>
);
}