Skip to content

Commit

Permalink
feat: add a fetch and prefetch function to the solid package
Browse files Browse the repository at this point in the history
  • Loading branch information
johann-crabnebula committed Jun 24, 2024
1 parent f250409 commit edd6713
Showing 1 changed file with 98 additions and 1 deletion.
99 changes: 98 additions & 1 deletion packages/solid/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { JSX, createContext, useContext as _useContext } from "solid-js";
import {
JSX,
createContext,
useContext as _useContext,
type ResourceReturn,
createResource,
} from "solid-js";
import {
Client,
inferInfiniteQueries,
Expand All @@ -17,6 +23,7 @@ import {
import {
QueryClient,
CreateQueryOptions,
FetchQueryOptions,
CreateQueryResult,
createQuery as __createQuery,
createInfiniteQuery as __createInfiniteQuery,
Expand Down Expand Up @@ -64,6 +71,94 @@ export function createSolidQueryHooks<TProceduresLike extends ProceduresDef>() {
return ctx;
}

function prefetchQuery<
K extends TProcedures["queries"]["key"] & string,
TQueryFnData = inferQueryResult<TProcedures, K>,
TData = inferQueryResult<TProcedures, K>
>(
opts?: FunctionedParams<
{
queryKey: [
key: K,
...input: _inferProcedureHandlerInput<TProcedures, "queries", K>
];
} & Omit<
FetchQueryOptions<
TQueryFnData,
RSPCError,
TData,
[K, inferQueryInput<TProcedures, K>]
>,
"queryKey" | "queryFn"
> &
TBaseOptions
>
): ResourceReturn<void, unknown> {
return createResource(() => {
const { rspc, queryKey, ...rawOpts } = opts?.() ?? {};

const context = useContext();

let client = rspc?.client;
const queryClient = context.queryClient;
if (!client) {
client = context.client;
}

return queryClient.prefetchQuery({
queryKey: queryKey,
queryFn: async () => {
return client.query(queryKey as any);
},
...(rawOpts as any),
});
});
}

function fetchQuery<
K extends TProcedures["queries"]["key"] & string,
TQueryFnData = inferQueryResult<TProcedures, K>,
TData = inferQueryResult<TProcedures, K>
>(
opts?: FunctionedParams<
{
queryKey: [
key: K,
...input: _inferProcedureHandlerInput<TProcedures, "queries", K>
];
} & Omit<
FetchQueryOptions<
TQueryFnData,
RSPCError,
TData,
[K, inferQueryInput<TProcedures, K>]
>,
"queryKey" | "queryFn"
> &
TBaseOptions
>
): ResourceReturn<TData, RSPCError> {
return createResource(() => {
const { rspc, queryKey, ...rawOpts } = opts?.() ?? {};

const context = useContext();

let client = rspc?.client;
const queryClient = context.queryClient;
if (!client) {
client = context.client;
}

return queryClient.fetchQuery({
queryKey: queryKey,
queryFn: async () => {
return client.query(queryKey as any);
},
...(rawOpts as any),
});
});
}

function createQuery<
K extends TProcedures["queries"]["key"] & string,
TQueryFnData = inferQueryResult<TProcedures, K>,
Expand Down Expand Up @@ -266,6 +361,8 @@ export function createSolidQueryHooks<TProceduresLike extends ProceduresDef>() {
) as any;
},
useContext,
fetchQuery,
prefetchQuery,
createQuery,
// createInfiniteQuery,
createMutation,
Expand Down

0 comments on commit edd6713

Please sign in to comment.