convex-helpers 0.1.82 → 0.1.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convex-helpers",
3
- "version": "0.1.82",
3
+ "version": "0.1.83",
4
4
  "description": "A collection of useful code to complement the official convex package.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,6 +20,7 @@ import type { FunctionArgs, FunctionReference, FunctionReturnType } from "convex
20
20
  import { ConvexReactClient, type ConvexReactClientOptions, type MutationOptions } from "convex/react";
21
21
  import type { SessionId } from "../server/sessions.js";
22
22
  import type { EmptyObject, BetterOmit } from "../index.js";
23
+ import type { OptimisticUpdate } from "convex/browser";
23
24
  export declare const DEFAULT_STORAGE_KEY = "convex-session-id";
24
25
  export type UseStorage<T> = (key: string, initialValue: T) => readonly [T, (value: T) => void] | readonly [T, (value: T) => void, () => void];
25
26
  export type RefreshSessionFn = (beforeUpdate?: (newSessionId: SessionId) => any | Promise<any>) => Promise<SessionId>;
@@ -66,6 +67,10 @@ export declare const SessionProvider: React.FC<{
66
67
  * second render.
67
68
  */
68
69
  export declare function useSessionQuery<Query extends SessionFunction<"query">>(query: Query, ...args: SessionQueryArgsArray<Query>): FunctionReturnType<Query> | undefined;
70
+ type SessionMutation<Mutation extends FunctionReference<"mutation">> = (...args: SessionArgsArray<Mutation>) => Promise<FunctionReturnType<Mutation>>;
71
+ interface ReactSessionMutation<Mutation extends FunctionReference<"mutation">> extends SessionMutation<Mutation> {
72
+ withOptimisticUpdate(optimisticUpdate: OptimisticUpdate<FunctionArgs<Mutation>>): SessionMutation<Mutation>;
73
+ }
69
74
  /**
70
75
  * Use this in place of {@link useMutation} to run a mutation with a sessionId.
71
76
  *
@@ -75,7 +80,7 @@ export declare function useSessionQuery<Query extends SessionFunction<"query">>(
75
80
  * @returns A mutation result. For SSR, it will wait until the client has a
76
81
  * valid sessionId.
77
82
  */
78
- export declare function useSessionMutation<Mutation extends SessionFunction<"mutation">>(name: Mutation): (...args: SessionArgsArray<Mutation>) => Promise<FunctionReturnType<Mutation>>;
83
+ export declare function useSessionMutation<Mutation extends SessionFunction<"mutation">>(name: Mutation): ReactSessionMutation<Mutation>;
79
84
  /**
80
85
  * Use this in place of {@link useAction} to run an action with a sessionId.
81
86
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["sessions.ts"],"names":[],"mappings":"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"}
package/react/sessions.js CHANGED
@@ -126,13 +126,22 @@ export function useSessionQuery(query, ...args) {
126
126
  export function useSessionMutation(name) {
127
127
  const [sessionId, _, sessionIdPromise] = useSessionId();
128
128
  const originalMutation = useMutation(name);
129
- return useCallback(async (...args) => {
130
- const newArgs = {
131
- ...(args[0] ?? {}),
132
- sessionId: sessionId || (await sessionIdPromise),
129
+ return useMemo(() => {
130
+ function createMutation(originalMutation) {
131
+ return async (...args) => {
132
+ const newArgs = {
133
+ ...(args[0] ?? {}),
134
+ sessionId: sessionId || (await sessionIdPromise),
135
+ };
136
+ return originalMutation(...[newArgs]);
137
+ };
138
+ }
139
+ const mutation = createMutation(originalMutation);
140
+ mutation.withOptimisticUpdate = (optimisticUpdate) => {
141
+ return createMutation(originalMutation.withOptimisticUpdate(optimisticUpdate));
133
142
  };
134
- return originalMutation(...[newArgs]);
135
- }, [sessionId, originalMutation]);
143
+ return mutation;
144
+ }, [sessionId, sessionIdPromise, originalMutation]);
136
145
  }
137
146
  /**
138
147
  * Use this in place of {@link useAction} to run an action with a sessionId.
package/react/sessions.ts CHANGED
@@ -37,9 +37,11 @@ import {
37
37
  type ConvexReactClientOptions,
38
38
  type MutationOptions,
39
39
  useConvex,
40
+ type ReactMutation,
40
41
  } from "convex/react";
41
42
  import type { SessionId } from "../server/sessions.js";
42
43
  import type { EmptyObject, BetterOmit } from "../index.js";
44
+ import type { OptimisticUpdate } from "convex/browser";
43
45
 
44
46
  export const DEFAULT_STORAGE_KEY = "convex-session-id";
45
47
 
@@ -201,6 +203,18 @@ export function useSessionQuery<Query extends SessionFunction<"query">>(
201
203
  return useQuery(query, ...([newArgs] as OptionalRestArgs<Query>));
202
204
  }
203
205
 
206
+ type SessionMutation<Mutation extends FunctionReference<"mutation">> = (
207
+ ...args: SessionArgsArray<Mutation>
208
+ ) => Promise<FunctionReturnType<Mutation>>;
209
+
210
+ // Similar to ReactMutation, but with a sessionId parameter.
211
+ interface ReactSessionMutation<Mutation extends FunctionReference<"mutation">>
212
+ extends SessionMutation<Mutation> {
213
+ withOptimisticUpdate(
214
+ optimisticUpdate: OptimisticUpdate<FunctionArgs<Mutation>>,
215
+ ): SessionMutation<Mutation>;
216
+ }
217
+
204
218
  /**
205
219
  * Use this in place of {@link useMutation} to run a mutation with a sessionId.
206
220
  *
@@ -212,23 +226,32 @@ export function useSessionQuery<Query extends SessionFunction<"query">>(
212
226
  */
213
227
  export function useSessionMutation<
214
228
  Mutation extends SessionFunction<"mutation">,
215
- >(name: Mutation) {
229
+ >(name: Mutation): ReactSessionMutation<Mutation> {
216
230
  const [sessionId, _, sessionIdPromise] = useSessionId();
217
231
  const originalMutation = useMutation(name);
218
232
 
219
- return useCallback(
220
- async (
221
- ...args: SessionArgsArray<Mutation>
222
- ): Promise<FunctionReturnType<Mutation>> => {
223
- const newArgs = {
224
- ...(args[0] ?? {}),
225
- sessionId: sessionId || (await sessionIdPromise),
226
- } as FunctionArgs<Mutation>;
227
-
228
- return originalMutation(...([newArgs] as OptionalRestArgs<Mutation>));
229
- },
230
- [sessionId, originalMutation],
231
- );
233
+ return useMemo(() => {
234
+ function createMutation(
235
+ originalMutation: ReactMutation<Mutation>,
236
+ ): SessionMutation<Mutation> {
237
+ return async (...args) => {
238
+ const newArgs: FunctionArgs<Mutation> = {
239
+ ...(args[0] ?? {}),
240
+ sessionId: sessionId || (await sessionIdPromise),
241
+ };
242
+ return originalMutation(...[newArgs]);
243
+ };
244
+ }
245
+ const mutation = createMutation(
246
+ originalMutation,
247
+ ) as ReactSessionMutation<Mutation>;
248
+ mutation.withOptimisticUpdate = (optimisticUpdate) => {
249
+ return createMutation(
250
+ originalMutation.withOptimisticUpdate(optimisticUpdate),
251
+ );
252
+ };
253
+ return mutation;
254
+ }, [sessionId, sessionIdPromise, originalMutation]);
232
255
  }
233
256
 
234
257
  /**