new-query
Scaffold TanStack Query useQuery and/or useMutation hooks for a feature, calling a backend server action
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Scaffold TanStack Query useQuery and/or useMutation hooks for a feature, calling a backend server action
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Generate a semver-compliant release note from git history; on user confirmation, bump version, update CHANGELOG, create git tag, and publish a GitHub Release with gh
Scaffold a new backend server action with auth check, Zod input validation, repository call, and error handling
Scaffold a typed React client component with props interface, Tailwind styling, and shadcn/ui primitives
Scaffold a React Hook Form with Zod validation, useMutation, and toast notifications
Create a Zod input schema file in src/backend/services/inputs/ for a domain entity
Scaffold a Next.js App Router page with optional server-side session check, metadata, and layout
| name | new-query |
| description | Scaffold TanStack Query useQuery and/or useMutation hooks for a feature, calling a backend server action |
Create TanStack Query hooks for a feature component in techdiary.dev.
["<resource>", param1, param2]enabled option when the query depends on a condition (e.g. Boolean(resource_id))refetchOnWindowFocus: false is already the global default — don't repeat ituseQueryClient() only when you need optimistic updates or manual invalidationtoast() from sonner"use client";
import { useQuery } from "@tanstack/react-query";
import * as <domain>Actions from "@/backend/services/<domain>.action";
const <resource>Query = useQuery({
queryKey: ["<resource>", param],
queryFn: () => <domain>Actions.<actionName>({ param }),
enabled: Boolean(param),
});
// Access: <resource>Query.data, <resource>Query.isLoading, <resource>Query.error
"use client";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import * as <domain>Actions from "@/backend/services/<domain>.action";
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (payload: <PayloadType>) => <domain>Actions.<actionName>(payload),
onSuccess: () => {
toast("Success message");
queryClient.invalidateQueries({ queryKey: ["<resource>"] });
},
onError: (error) => {
toast.error(error.message ?? "Something went wrong");
},
});
const mutation = useMutation({
mutationFn: (payload) => <domain>Actions.<actionName>(payload),
async onMutate(payload) {
await queryClient.cancelQueries({ queryKey: ["<resource>", id] });
const previous = queryClient.getQueryData(["<resource>", id]);
queryClient.setQueryData(["<resource>", id], (old: <Type>) => ({
...old,
// apply optimistic change
}));
return { previous };
},
onError: (_err, _payload, context) => {
queryClient.setQueryData(["<resource>", id], context?.previous);
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["<resource>", id] });
},
});
const feedQuery = useInfiniteQuery({
queryKey: ["<resource>-feed", filter],
queryFn: ({ pageParam }) =>
<domain>Actions.<listAction>({ page: pageParam, limit: 10 }),
initialPageParam: 1,
getNextPageParam: (lastPage) =>
lastPage?.meta.hasNextPage ? lastPage.meta.currentPage + 1 : undefined,
});
// Access: feedQuery.data?.pages.flatMap(p => p?.nodes)
src/hooks/.