@@ -5,12 +5,13 @@ import {
55    useMutation , 
66    useQuery , 
77    useQueryClient , 
8+     type  QueryKey , 
89    type  UseInfiniteQueryOptions , 
910    type  UseMutationOptions , 
1011    type  UseQueryOptions , 
1112}  from  '@tanstack/vue-query' ; 
1213import  type  {  ModelMeta  }  from  '@zenstackhq/runtime/cross' ; 
13- import  {  inject ,  provide  }  from  'vue' ; 
14+ import  {  computed ,   inject ,  provide ,   toValue ,   type   ComputedRef ,   type   MaybeRefOrGetter  }  from  'vue' ; 
1415import  { 
1516    APIContext , 
1617    DEFAULT_QUERY_ENDPOINT , 
@@ -60,17 +61,25 @@ export function getHooksContext() {
6061export  function  useModelQuery < TQueryFnData ,  TData ,  TError > ( 
6162    model : string , 
6263    url : string , 
63-     args ?: unknown , 
64-     options ?: Omit < UseQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > , 
64+     args ?: MaybeRefOrGetter < unknown >  |  ComputedRef < unknown > , 
65+     options ?:
66+         |  MaybeRefOrGetter < Omit < UseQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > > 
67+         |  ComputedRef < Omit < UseQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > > , 
6568    fetch ?: FetchFn , 
6669    optimisticUpdate  =  false 
6770)  { 
68-     const  reqUrl  =  makeUrl ( url ,  args ) ; 
69-     return  useQuery < TQueryFnData ,  TError ,  TData > ( { 
70-         queryKey : getQueryKey ( model ,  url ,  args ,  false ,  optimisticUpdate ) , 
71-         queryFn : ( )  =>  fetcher < TQueryFnData ,  false > ( reqUrl ,  undefined ,  fetch ,  false ) , 
72-         ...options , 
71+     const  queryOptions  =  computed ( ( )  =>  { 
72+         return  { 
73+             queryKey : getQueryKey ( model ,  url ,  toValue ( args ) ,  false ,  optimisticUpdate ) , 
74+             queryFn : ( {  queryKey } : {  queryKey : QueryKey  } )  =>  { 
75+                 const  [ _prefix ,  _model ,  _op ,  args ]  =  queryKey ; 
76+                 const  reqUrl  =  makeUrl ( url ,  toValue ( args ) ) ; 
77+                 return  fetcher < TQueryFnData ,  false > ( reqUrl ,  undefined ,  fetch ,  false ) ; 
78+             } , 
79+             ...toValue ( options ) , 
80+         } ; 
7381    } ) ; 
82+     return  useQuery < TQueryFnData ,  TError ,  TData > ( queryOptions ) ; 
7483} 
7584
7685/** 
@@ -86,17 +95,24 @@ export function useModelQuery<TQueryFnData, TData, TError>(
8695export  function  useInfiniteModelQuery < TQueryFnData ,  TData ,  TError > ( 
8796    model : string , 
8897    url : string , 
89-     args ?: unknown , 
90-     options ?: Omit < UseInfiniteQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > , 
98+     args ?: MaybeRefOrGetter < unknown >  |  ComputedRef < unknown > , 
99+     options ?:
100+         |  MaybeRefOrGetter < Omit < UseInfiniteQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > > 
101+         |  ComputedRef < Omit < UseInfiniteQueryOptions < TQueryFnData ,  TError ,  TData > ,  'queryKey' > > , 
91102    fetch ?: FetchFn 
92103)  { 
93-     return  useInfiniteQuery < TQueryFnData ,  TError ,  TData > ( { 
94-         queryKey : getQueryKey ( model ,  url ,  args ,  true ) , 
95-         queryFn : ( {  pageParam } )  =>  { 
96-             return  fetcher < TQueryFnData ,  false > ( makeUrl ( url ,  pageParam  ??  args ) ,  undefined ,  fetch ,  false ) ; 
104+     // CHECKME: vue-query's `useInfiniteQuery`'s input typing seems wrong 
105+     const  queryOptions : any  =  computed ( ( )  =>  ( { 
106+         queryKey : getQueryKey ( model ,  url ,  toValue ( args ) ,  true ) , 
107+         queryFn : ( {  queryKey,  pageParam } : {  queryKey : QueryKey ;  pageParam ?: unknown  } )  =>  { 
108+             const  [ _prefix ,  _model ,  _op ,  args ]  =  queryKey ; 
109+             const  reqUrl  =  makeUrl ( url ,  pageParam  ??  toValue ( args ) ) ; 
110+             return  fetcher < TQueryFnData ,  false > ( reqUrl ,  undefined ,  fetch ,  false ) ; 
97111        } , 
98-         ...options , 
99-     } ) ; 
112+         ...toValue ( options ) , 
113+     } ) ) ; 
114+ 
115+     return  useInfiniteQuery < TQueryFnData ,  TError ,  TData > ( queryOptions ) ; 
100116} 
101117
102118/** 
@@ -124,7 +140,9 @@ export function useModelMutation<
124140    method : 'POST'  |  'PUT'  |  'DELETE' , 
125141    url : string , 
126142    modelMeta : ModelMeta , 
127-     options ?: Omit < UseMutationOptions < Result ,  TError ,  TArgs ,  unknown > ,  'mutationFn' > , 
143+     options ?:
144+         |  MaybeRefOrGetter < Omit < UseMutationOptions < Result ,  TError ,  TArgs ,  unknown > ,  'mutationFn' > > 
145+         |  ComputedRef < Omit < UseMutationOptions < Result ,  TError ,  TArgs ,  unknown > ,  'mutationFn' > > , 
128146    fetch ?: FetchFn , 
129147    invalidateQueries  =  true , 
130148    checkReadBack ?: C , 
@@ -146,7 +164,7 @@ export function useModelMutation<
146164    } ; 
147165
148166    // TODO: figure out the typing problem 
149-     const  finalOptions : any  =  {  ...options ,  mutationFn } ; 
167+     const  finalOptions : any  =  computed ( ( )   =>   ( {  ...toValue ( options ) ,  mutationFn } ) ) ; 
150168    const  operation  =  url . split ( '/' ) . pop ( ) ; 
151169    if  ( operation )  { 
152170        const  {  logging }  =  getHooksContext ( ) ; 
@@ -155,7 +173,7 @@ export function useModelMutation<
155173                model , 
156174                operation , 
157175                modelMeta , 
158-                 finalOptions , 
176+                 toValue ( finalOptions ) , 
159177                ( predicate )  =>  queryClient . invalidateQueries ( {  predicate } ) , 
160178                logging 
161179            ) ; 
@@ -166,7 +184,7 @@ export function useModelMutation<
166184                model , 
167185                operation , 
168186                modelMeta , 
169-                 finalOptions , 
187+                 toValue ( finalOptions ) , 
170188                queryClient . getQueryCache ( ) . getAll ( ) , 
171189                ( queryKey ,  data )  =>  queryClient . setQueryData < unknown > ( queryKey ,  data ) , 
172190                invalidateQueries  ? ( predicate )  =>  queryClient . invalidateQueries ( {  predicate } )  : undefined , 
0 commit comments