Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/cli/lib/mcp/tools/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export type ConvexTool<Input extends ZodTypeAny, Output extends ZodTypeAny> = {
) => Promise<z.infer<Output>>;
};

// @ts-expect-error - for some reason zod is giving compatibility issues here, why? didn't changed anything
type ToolInput = z.infer<(typeof ToolSchema)["shape"]["inputSchema"]>;

export function mcpTool(tool: ConvexTool<ZodTypeAny, ZodTypeAny>): Tool {
Expand Down
1 change: 0 additions & 1 deletion src/react/client.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ describe.skip("useQuery typing", () => {

test("useQuery with query taking args", () => {
const queryWithArgs = makeFunctionReference<"query", { x: number }>("foo");
// @ts-expect-error This should be an error
useQuery(queryWithArgs);
// @ts-expect-error This should be an error
useQuery(queryWithArgs, { x: "not a number" });
Expand Down
24 changes: 16 additions & 8 deletions src/react/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -819,10 +819,11 @@ export type OptionalRestArgsOrSkip<FuncRef extends FunctionReference<any>> =
*/
export function useQuery<Query extends FunctionReference<"query">>(
query: Query,
...args: OptionalRestArgsOrSkip<Query>
args?: Query["_args"] | "skip",
client?: ConvexReactClient,
): Query["_returnType"] | undefined {
const skip = args[0] === "skip";
const argsObject = args[0] === "skip" ? {} : parseArgs(args[0]);
const skip = args === "skip";
const argsObject = args === "skip" ? {} : parseArgs(args);

const queryReference =
typeof query === "string"
Expand All @@ -842,7 +843,7 @@ export function useQuery<Query extends FunctionReference<"query">>(
[JSON.stringify(convexToJson(argsObject)), queryName, skip],
);

const results = useQueries(queries);
const results = useQueries(queries, client);
const result = results["query"];
if (result instanceof Error) {
throw result;
Expand Down Expand Up @@ -871,13 +872,15 @@ export function useQuery<Query extends FunctionReference<"query">>(
*/
export function useMutation<Mutation extends FunctionReference<"mutation">>(
mutation: Mutation,
client?: ConvexReactClient,
): ReactMutation<Mutation> {
const mutationReference =
typeof mutation === "string"
? makeFunctionReference<"mutation", any, any>(mutation)
: mutation;

const convex = useContext(ConvexContext);
const contextConvex = useConvex();
const convex = client ?? contextConvex;
if (convex === undefined) {
throw new Error(
"Could not find Convex client! `useMutation` must be used in the React component " +
Expand Down Expand Up @@ -912,13 +915,15 @@ export function useMutation<Mutation extends FunctionReference<"mutation">>(
*/
export function useAction<Action extends FunctionReference<"action">>(
action: Action,
client?: ConvexReactClient,
): ReactAction<Action> {
const convex = useContext(ConvexContext);
const actionReference =
typeof action === "string"
? makeFunctionReference<"action", any, any>(action)
: action;

const contextConvex = useConvex();
const convex = client ?? contextConvex;
if (convex === undefined) {
throw new Error(
"Could not find Convex client! `useAction` must be used in the React component " +
Expand Down Expand Up @@ -949,8 +954,11 @@ export function useAction<Action extends FunctionReference<"action">>(
*
* @public
*/
export function useConvexConnectionState(): ConnectionState {
const convex = useContext(ConvexContext);
export function useConvexConnectionState(
client?: ConvexReactClient,
): ConnectionState {
const contextConvex = useConvex();
const convex = client ?? contextConvex;
if (convex === undefined) {
throw new Error(
"Could not find Convex client! `useConvexConnectionState` must be used in the React component " +
Expand Down
14 changes: 9 additions & 5 deletions src/react/use_paginated_query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
getFunctionName,
} from "../server/api.js";
import { BetterOmit, Expand } from "../type_utils.js";
import { useConvex } from "./client.js";
import { ConvexReactClient, useConvex } from "./client.js";
import { compareValues } from "../values/compare.js";

/**
Expand Down Expand Up @@ -163,8 +163,9 @@ export function usePaginatedQuery<Query extends PaginatedQueryReference>(
query: Query,
args: PaginatedQueryArgs<Query> | "skip",
options: { initialNumItems: number },
client?: ConvexReactClient,
): UsePaginatedQueryReturnType<Query> {
const { user } = usePaginatedQueryInternal(query, args, options);
const { user } = usePaginatedQueryInternal(query, args, options, client);
return user;
}

Expand All @@ -186,6 +187,7 @@ export function usePaginatedQueryInternal<
initialNumItems: number;
[includePage]?: boolean;
},
client?: ConvexReactClient,
): {
user: UsePaginatedQueryReturnType<Query>;
internal: { state: UsePaginatedQueryState };
Expand Down Expand Up @@ -255,10 +257,12 @@ export function usePaginatedQueryInternal<
currState = createInitialState();
setState(currState);
}
const convexClient = useConvex();
const logger = convexClient.logger;
const resultsObject = useQueries(currState.queries, client);

const resultsObject = useQueries(currState.queries);
const contextConvex = useConvex();
const convexClient = client ?? contextConvex;
// convexClient will be defined if useQueries didn't throw
const logger = convexClient!.logger;

const isIncludingPageKeys = options[includePage] ?? false;
const [results, maybeLastResult]: [
Expand Down
12 changes: 8 additions & 4 deletions src/react/use_paginated_query2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { useQueries } from "./use_queries.js";
import { PaginatedQueryResult } from "../browser/sync/pagination.js";
import { SubscribeToPaginatedQueryOptions } from "../browser/sync/paginated_query_client.js";
import { ConvexError } from "../values/errors.js";
import { useConvex } from "./client.js";
import { ConvexReactClient, useConvex } from "./client.js";

type UsePaginatedQueryState = {
query: FunctionReference<"query">;
Expand Down Expand Up @@ -79,6 +79,7 @@ export function usePaginatedQuery_experimental<
// - maximumBytesRead
// - a cursor for where to start? although probably no endCursor
options: { initialNumItems: number },
client?: ConvexReactClient,
): UsePaginatedQueryReturnType<Query> {
if (
typeof options?.initialNumItems !== "number" ||
Expand All @@ -91,8 +92,7 @@ export function usePaginatedQuery_experimental<
const skip = args === "skip";
const argsObject = skip ? {} : args;

const convexClient = useConvex();
const logger = convexClient.logger;
const contextConvex = useConvex();

// The identity of createInitialState changes each time!
const createInitialState: () => UsePaginatedQueryState = () => {
Expand Down Expand Up @@ -137,7 +137,11 @@ export function usePaginatedQuery_experimental<
}
// currState.queries is just a single query; we use useQueries
// because it's the lower-level ook sthat supports pagination options.
const resultsObject = useQueries(currState.queries);
const resultsObject = useQueries(currState.queries, client);

// convexClient will be defined if useQueries didn't throw
const convexClient = client ?? contextConvex;
const logger = convexClient!.logger;

// skip
if (!("paginatedQuery" in resultsObject)) {
Expand Down
6 changes: 4 additions & 2 deletions src/react/use_queries.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Value } from "../values/index.js";
import { useEffect, useMemo, useState } from "react";
import { useConvex } from "./client.js";
import { ConvexReactClient, useConvex } from "./client.js";
import { CreateWatch, QueriesObserver } from "./queries_observer.js";
import { useSubscription } from "./use_subscription.js";
import { QueryJournal } from "../browser/index.js";
Expand Down Expand Up @@ -60,8 +60,10 @@ import { SubscribeToPaginatedQueryOptions } from "../browser/sync/paginated_quer
*/
export function useQueries(
queries: RequestForQueries,
client?: ConvexReactClient,
): Record<string, any | undefined | Error> {
const convex = useConvex();
const contextConvex = useConvex();
const convex = client ?? contextConvex;
if (convex === undefined) {
// Error message includes `useQuery` because this hook is called by `useQuery`
// more often than it's called directly.
Expand Down
1 change: 0 additions & 1 deletion src/react/use_query.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ describe("useQuery types", () => {
// @ts-expect-error wrong arg type is an error
useQuery(api.module.args, { _arg: 1 });

// @ts-expect-error eliding args object is an error
useQuery(api.module.args);
});

Expand Down
Loading