Skip to content

Commit efd16a0

Browse files
committed
Remove generated UI legacy hook shorthand
1 parent 4ac3367 commit efd16a0

2 files changed

Lines changed: 44 additions & 114 deletions

File tree

packages/plugins/dynamic-ui/src/shell/hooks.ts

Lines changed: 15 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import {
88
useMutation as useTanStackMutation,
99
useQuery as useTanStackQuery,
1010
useQueryClient as useTanStackQueryClient,
11-
type MutationKey,
1211
type QueryClient as QueryClientType,
13-
type QueryKey,
1412
type UseMutationOptions,
1513
type UseMutationResult,
1614
type UseQueryOptions,
@@ -19,30 +17,8 @@ import {
1917

2018
export { QueryClient, QueryClientProvider, mutationOptions, queryOptions, skipToken };
2119

22-
let legacyQueryId = 0;
23-
let legacyMutationId = 0;
2420
const invalidationScopes: Array<Array<Promise<unknown>>> = [];
2521

26-
type RefetchableQuery = {
27-
refetch: () => unknown;
28-
};
29-
30-
type LegacyMutationOptions<TData, TError, TVariables, TContext> = UseMutationOptions<
31-
TData,
32-
TError,
33-
TVariables,
34-
TContext
35-
> & {
36-
invalidates?: readonly RefetchableQuery[];
37-
};
38-
39-
const nextLegacyQueryKey = (): QueryKey => ["executor", "legacy-query", ++legacyQueryId];
40-
const nextLegacyMutationKey = (): MutationKey => [
41-
"executor",
42-
"legacy-mutation",
43-
++legacyMutationId,
44-
];
45-
4622
const trackInvalidation = (promise: Promise<unknown>) => {
4723
for (const scope of invalidationScopes) {
4824
scope.push(promise);
@@ -105,88 +81,34 @@ const wrapMutationOptions = <TData, TError, TVariables, TContext>(
10581
: undefined,
10682
});
10783

108-
/**
109-
* TanStack Query's `useQuery`, plus compatibility for the original generated
110-
* UI shorthand: `useQuery(() => tools.namespace.tool(args))`.
111-
*/
112-
export function useQuery<TData>(fn: () => Promise<TData>): UseQueryResult<TData, Error>;
11384
export function useQuery<
11485
TQueryFnData,
11586
TError = Error,
11687
TData = TQueryFnData,
117-
TQueryKey extends QueryKey = QueryKey,
88+
TQueryKey extends readonly unknown[] = readonly unknown[],
11889
>(
11990
options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
12091
queryClient?: QueryClientType,
12192
): UseQueryResult<TData, TError>;
122-
export function useQuery(
123-
optionsOrFn: unknown,
93+
export function useQuery<
94+
TQueryFnData,
95+
TError = Error,
96+
TData = TQueryFnData,
97+
TQueryKey extends readonly unknown[] = readonly unknown[],
98+
>(
99+
options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
124100
queryClient?: QueryClientType,
125-
): UseQueryResult<unknown, Error> {
126-
const legacyFnRef = useRef<(() => Promise<unknown>) | null>(null);
127-
const legacyQueryKeyRef = useRef<QueryKey | null>(null);
128-
129-
if (typeof optionsOrFn === "function") {
130-
legacyFnRef.current = optionsOrFn as () => Promise<unknown>;
131-
legacyQueryKeyRef.current ??= nextLegacyQueryKey();
132-
return useTanStackQuery(
133-
{
134-
queryKey: legacyQueryKeyRef.current,
135-
queryFn: () => {
136-
const current = legacyFnRef.current;
137-
if (!current) throw new Error("Missing legacy query function.");
138-
return current();
139-
},
140-
},
141-
queryClient,
142-
);
143-
}
144-
145-
return useTanStackQuery(
146-
optionsOrFn as UseQueryOptions<unknown, Error, unknown, QueryKey>,
147-
queryClient,
148-
);
101+
): UseQueryResult<TData, TError> {
102+
return useTanStackQuery(options, queryClient);
149103
}
150104

151-
/**
152-
* TanStack Query's `useMutation`, plus compatibility for the original generated
153-
* UI shorthand: `useMutation((input) => tools.namespace.tool(input), opts)`.
154-
*/
155-
export function useMutation<TVariables, TData = unknown, TContext = unknown>(
156-
fn: (input: TVariables) => Promise<TData>,
157-
options?: LegacyMutationOptions<TData, Error, TVariables, TContext>,
158-
): UseMutationResult<TData, Error, TVariables, TContext>;
159105
export function useMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(
160106
options: UseMutationOptions<TData, TError, TVariables, TContext>,
161107
queryClient?: QueryClientType,
162108
): UseMutationResult<TData, TError, TVariables, TContext>;
163-
export function useMutation(
164-
optionsOrFn: unknown,
165-
optionsOrQueryClient?: unknown,
166-
): UseMutationResult<unknown, Error, unknown, unknown> {
167-
const legacyMutationKeyRef = useRef<MutationKey | null>(null);
168-
legacyMutationKeyRef.current ??= nextLegacyMutationKey();
169-
170-
if (typeof optionsOrFn === "function") {
171-
const legacyOptions =
172-
(optionsOrQueryClient as
173-
| LegacyMutationOptions<unknown, Error, unknown, unknown>
174-
| undefined) ?? {};
175-
const { invalidates, onSuccess, ...tanstackOptions } = legacyOptions;
176-
177-
return useTanStackMutation({
178-
mutationKey: legacyOptions.mutationKey ?? legacyMutationKeyRef.current,
179-
...tanstackOptions,
180-
mutationFn: optionsOrFn as (input: unknown) => Promise<unknown>,
181-
onSuccess: async (data, variables, context, mutationContext) => {
182-
await trackMutationCallback(() => onSuccess?.(data, variables, context, mutationContext));
183-
await Promise.all(invalidates?.map((query) => query.refetch()) ?? []);
184-
},
185-
});
186-
}
187-
188-
return useTanStackMutation(
189-
wrapMutationOptions(optionsOrFn as UseMutationOptions<unknown, Error, unknown, unknown>),
190-
optionsOrQueryClient as QueryClientType | undefined,
191-
);
109+
export function useMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(
110+
options: UseMutationOptions<TData, TError, TVariables, TContext>,
111+
queryClient?: QueryClientType,
112+
): UseMutationResult<TData, TError, TVariables, TContext> {
113+
return useTanStackMutation(wrapMutationOptions(options), queryClient);
192114
}

packages/plugins/dynamic-ui/src/shell/mcp-app.browser.test.ts

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,9 @@ const blockedMessages = primitiveNames.map((name) => {
172172
});
173173
174174
function App() {
175-
const { data, error, isLoading } = useQuery(() => tools.inventory.items.listItems({}));
175+
const { data, error, isLoading } = useQuery(
176+
tools.inventory.items.listItems.queryOptions({})
177+
);
176178
const items = data?.ok ? data.data : data;
177179
return (
178180
<Card>
@@ -200,13 +202,15 @@ function App() {
200202
const generatedApprovalCode = `
201203
function App() {
202204
const [status, setStatus] = useState("idle");
203-
const createItem = useMutation((input) => tools.inventory.items.createItem(input), {
204-
onSuccess: (result) => {
205-
const created = result?.ok ? result.data : result;
206-
setStatus(created.name + ":" + created.created);
207-
},
208-
onError: (error) => setStatus(error.message),
209-
});
205+
const createItem = useMutation(
206+
tools.inventory.items.createItem.mutationOptions({
207+
onSuccess: (result) => {
208+
const created = result?.ok ? result.data : result;
209+
setStatus(created.name + ":" + created.created);
210+
},
211+
onError: (error) => setStatus(error.message),
212+
})
213+
);
210214
const ask = async () => {
211215
setStatus("pending");
212216
await createItem.mutateAsync({ body: { name: "Approved Widget" } });
@@ -227,13 +231,15 @@ function App() {
227231
const generatedAutoMutationCode = `
228232
function App() {
229233
const [status, setStatus] = useState("idle");
230-
const createItem = useMutation((input) => tools.inventory.items.createItem(input), {
231-
onSuccess: (result) => {
232-
const created = result?.ok ? result.data : result;
233-
setStatus(created.name + ":" + created.created);
234-
},
235-
onError: (error) => setStatus(error.message),
236-
});
234+
const createItem = useMutation(
235+
tools.inventory.items.createItem.mutationOptions({
236+
onSuccess: (result) => {
237+
const created = result?.ok ? result.data : result;
238+
setStatus(created.name + ":" + created.created);
239+
},
240+
onError: (error) => setStatus(error.message),
241+
})
242+
);
237243
238244
useEffect(() => {
239245
createItem.mutate({ body: { name: "Mount Widget" } });
@@ -293,12 +299,14 @@ function App() {
293299
const generatedSchemaApprovalCode = `
294300
function App() {
295301
const [status, setStatus] = useState("idle");
296-
const requestDetails = useMutation((input) => tools.profile.submit(input), {
297-
onSuccess: (result) => {
298-
setStatus(JSON.stringify(result));
299-
},
300-
onError: (error) => setStatus(error.message),
301-
});
302+
const requestDetails = useMutation(
303+
tools.profile.submit.mutationOptions({
304+
onSuccess: (result) => {
305+
setStatus(JSON.stringify(result));
306+
},
307+
onError: (error) => setStatus(error.message),
308+
})
309+
);
302310
303311
return (
304312
<Card>

0 commit comments

Comments
 (0)