feat: zod

This commit is contained in:
redglow
2026-06-20 16:56:58 +02:00
parent fb44a1cf95
commit 4e5e537f27
2 changed files with 24 additions and 2 deletions
+2 -1
View File
@@ -25,7 +25,8 @@
"react-dom": "^19.1.0", "react-dom": "^19.1.0",
"tsx": "^4.19.3", "tsx": "^4.19.3",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"vite-express": "*" "vite-express": "*",
"zod": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.5.0", "@biomejs/biome": "2.5.0",
+22 -1
View File
@@ -2,23 +2,44 @@ import { Alert, CircularProgress } from "@mui/material";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { useEffect } from "react"; import { useEffect } from "react";
import z from "zod";
const Announcements = z.array(
z.object({
id: z.number(),
title: z.string(),
text: z.string(),
publication_date: z.iso.datetime().transform((arg) => new Date(arg)),
image: z.string(),
}),
);
export const Route = createFileRoute("/")({ export const Route = createFileRoute("/")({
component: RouteComponent, component: RouteComponent,
}); });
function RouteComponent() { function RouteComponent() {
// the query to retrieve the announcements
const announcementsQuery = useQuery({ const announcementsQuery = useQuery({
queryKey: ["announcements"], queryKey: ["announcements"],
queryFn: () => fetch("/api/announcements").then((x) => x.json()), queryFn: async () => {
const response = await fetch("/api/announcements");
const data = await response.json();
const announcements = Announcements.parse(data);
console.log(announcements);
return announcements;
},
retry: false,
}); });
// log error only if we get one
useEffect(() => { useEffect(() => {
if (announcementsQuery.error) { if (announcementsQuery.error) {
console.log(announcementsQuery.error); console.log(announcementsQuery.error);
} }
}, [announcementsQuery.error]); }, [announcementsQuery.error]);
// handle loading / error / show values
return announcementsQuery.status === "pending" ? ( return announcementsQuery.status === "pending" ? (
<CircularProgress aria-label="Loading…" /> <CircularProgress aria-label="Loading…" />
) : announcementsQuery.status === "error" ? ( ) : announcementsQuery.status === "error" ? (