Zodios React
React hooks for zodios backed by react-query
Install
> npm install @zodios/react
or
> yarn add @zodios/react
Usage
Zodios comes with a Query and Mutation hook helper.
It's a thin wrapper around React-Query but with zodios auto completion.
Zodios query hook also returns an invalidation helper to allow you to reset react query cache easily
import { QueryClient, QueryClientProvider } from 'react-query';
import { Zodios } from "@zodios/core";
import { ZodiosHooks } from "@zodios/react";
import { z } from "zod";
const userSchema = z
.object({
id: z.number(),
name: z.string(),
});
const usersSchema = z.array(userSchema);
type User = z.infer<typeof userSchema>;
type Users = z.infer<typeof usersSchema>;
const api = [
{
method: "get",
path: "/users",
description: "Get all users",
response: usersSchema,
},
{
method: "post",
path: "/users",
description: "Create a user",
parameters: [
{
name: "body",
type: "Body",
schema: userSchema,
},
],
response: userSchema,
},
] as const;
const baseUrl = "https://jsonplaceholder.typicode.com";
const zodios = new Zodios(baseUrl, api);
const zodiosHooks = new ZodiosHooks("jsonplaceholder", zodios);
const Users = () => {
const {
data: users,
isLoading,
error,
invalidate: invalidateUsers,
} = zodiosHooks.useQuery("/users");
const { mutate } = zodiosHooks.useMutation("post", "/users", {
onSuccess: () => invalidateUsers(),
});
return (
<div>
<h1>Users</h1>
<button onClick={() => mutate({ data: { id: 10, name: "john doe" } })}>
add user
</button>
{isLoading && <div>Loading...</div>}
{error && <div>Error: {(error as Error).message}</div>}
{users && (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)}
</div>
);
};
const queryClient = new QueryClient();
export const App = () => {
return (
<QueryClientProvider client={queryClient}>
<Users />
</QueryClientProvider>
);
};