-
-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Labels
Description
Ideas for vike-react-telefunc
Right now, to integrate telefunc
and @tanstack/react-query
, we need to write some boilerplate for query invalidation:
// fruits.telefunc.ts
const db = [
{
id: 1,
name: "Apple",
},
{
id: 2,
name: "Orange",
},
];
export async function addFruit(fruit: { id: number; name: string }) {
db.push(fruit);
}
export async function updateFruit(input: { id: number; name: string }) {
const fruit = db.find((fruit) => fruit.id === input.id);
if (fruit) {
fruit.name = input.name;
}
return fruit;
}
export async function getFruit(id: number) {
return db.find((fruit) => fruit.id === id);
}
export async function getFruits() {
return db;
}
// +Page.tsx
import {
useSuspenseQuery,
useMutation,
useQueryClient,
} from "@tanstack/react-query";
import { getFruits, getFruit, addFruit, updateFruit } from "./fruits.telefunc";
const useFruits = () =>
useSuspenseQuery({
queryFn: getFruits,
queryKey: ["fruits"],
});
const useFruit = (id: number) =>
useSuspenseQuery({
queryFn: () => getFruit(id),
queryKey: ["fruits", id],
});
const useAddFruit = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: addFruit,
onSettled() {
queryClient.invalidateQueries({ queryKey: ["fruits"] });
},
});
};
const useUpdateFruit = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: updateFruit,
onSettled() {
queryClient.invalidateQueries({ queryKey: ["fruits"] });
},
});
};
It would be nice, if this integration could be simplified, for example:
// fruits.telefunc.ts
import { invalidates } from "vike-react-telefunc"
const db = [
{
id: 1,
name: "Apple",
},
{
id: 2,
name: "Orange",
},
];
invalidates(getFruits);
invalidates(getFruit); // invalidates all getFruit queries
export async function addFruit(fruit: { id: number; name: string }) {
db.push(fruit);
}
invalidates((input) => [getFruit, input.id]); // invalidates a single getFruit query
export async function updateFruit(input: { id: number; name: string }) {
const fruit = db.find((fruit) => fruit.id === input.id);
if (fruit) {
fruit.name = input.name;
}
return fruit;
}
// queryKey: ['/src/pages/index/fruits.telefunc.ts:getFruit', id]
export async function getFruit(id: number) {
return db.find((fruit) => fruit.id === id);
}
// queryKey: ['/src/pages/index/fruits.telefunc.ts:getFruits']
export async function getFruits() {
return db;
}
//+Page.tsx
import { useQuery, useMutation } from "vike-react-telefunc";
import { getFruits, getFruit, addFruit, updateFruit } from "./fruits.telefunc";
const useFruits = () => useQuery(getFruits);
const useFruit = (id: number) => useQuery(getFruit, id);
const useAddFruit = () => useMutation(addFruit);
const useUpdateFruit = () => useMutation(updateFruit);
What do you think?