feat: zod
This commit is contained in:
+2
-1
@@ -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",
|
||||||
|
|||||||
@@ -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" ? (
|
||||||
|
|||||||
Reference in New Issue
Block a user