Skip to content

Commit 999102d

Browse files
committed
react-query: fix cache logic
1 parent e310a75 commit 999102d

File tree

2 files changed

+69
-29
lines changed

2 files changed

+69
-29
lines changed

libs/injective-react/src/react-query.ts

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77

8-
import { getRpcClient } from './extern'
8+
import { getRpcClient } from './extern'
99
import {
1010
isRpc,
1111
Rpc,
@@ -99,6 +99,14 @@ export interface UseQueryBuilderOptions<TReq, TRes> {
9999
queryKeyPrefix: string,
100100
}
101101

102+
const getRpcClientFromCache = (
103+
queryClient: ReturnType<typeof useQueryClient>,
104+
key: string,
105+
rpcEndpoint?: string | HttpEndpoint
106+
): Rpc | undefined => {
107+
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
108+
return queryClient.getQueryData<Rpc>(queryKey);
109+
};
102110

103111
export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRes>) {
104112
return <TData = TRes>({
@@ -115,16 +123,17 @@ export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRe
115123

116124
if(isRpc(clientResolver)) {
117125
rpcResolver = clientResolver;
118-
} else if(isCacheResolver(clientResolver)) {
119-
const key = clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY;
120-
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
121-
rpcResolver = queryClient.getQueryData<Rpc>(queryKey);
122-
123-
if(!rpcResolver && clientResolver.rpcEndpoint) {
124-
rpcResolver = clientResolver.rpcEndpoint;
125-
}
126126
} else {
127-
rpcResolver = clientResolver;
127+
const key = isCacheResolver(clientResolver)
128+
? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY
129+
: DEFAULT_RPC_CLIENT_QUERY_KEY;
130+
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
131+
132+
const cachedClient = getRpcClientFromCache(queryClient, key, endpoint);
133+
// For CacheResolver with endpoint, use endpoint as fallback if no cached client
134+
rpcResolver = cachedClient ||
135+
(isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint :
136+
(!isCacheResolver(clientResolver) ? clientResolver : undefined));
128137
}
129138

130139
const queryFn = opts.builderQueryFn(rpcResolver);
@@ -153,6 +162,14 @@ export interface UseMutationBuilderOptions<TMsg> {
153162
) => Promise<DeliverTxResponse>,
154163
}
155164

165+
const getSigningClientFromCache = (
166+
queryClient: ReturnType<typeof useQueryClient>,
167+
key: string,
168+
rpcEndpoint?: string | HttpEndpoint
169+
): ISigningClient | undefined => {
170+
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
171+
return queryClient.getQueryData<ISigningClient>(queryKey);
172+
};
156173

157174
export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<TMsg>) {
158175
return ({
@@ -167,12 +184,15 @@ export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<T
167184

168185
if(isISigningClient(clientResolver)) {
169186
signingClientResolver = clientResolver;
170-
} else if(isCacheResolver(clientResolver)) {
171-
const key = clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY;
172-
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
173-
signingClientResolver = queryClient.getQueryData<ISigningClient>(queryKey);
174187
} else {
175-
clientResolver = clientResolver;
188+
// For both CacheResolver and other cases, try to get from cache first
189+
const key = isCacheResolver(clientResolver)
190+
? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY
191+
: DEFAULT_SIGNING_CLIENT_QUERY_KEY;
192+
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
193+
194+
const cachedClient = getSigningClientFromCache(queryClient, key, endpoint);
195+
signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined);
176196
}
177197

178198
const mutationFn = opts.builderMutationFn(signingClientResolver);

libs/interchain-react/src/react-query.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ export interface UseQueryBuilderOptions<TReq, TRes> {
9999
queryKeyPrefix: string,
100100
}
101101

102+
const getRpcClientFromCache = (
103+
queryClient: ReturnType<typeof useQueryClient>,
104+
key: string,
105+
rpcEndpoint?: string | HttpEndpoint
106+
): Rpc | undefined => {
107+
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
108+
return queryClient.getQueryData<Rpc>(queryKey);
109+
};
102110

103111
export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRes>) {
104112
return <TData = TRes>({
@@ -115,16 +123,17 @@ export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRe
115123

116124
if(isRpc(clientResolver)) {
117125
rpcResolver = clientResolver;
118-
} else if(isCacheResolver(clientResolver)) {
119-
const key = clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY;
120-
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
121-
rpcResolver = queryClient.getQueryData<Rpc>(queryKey);
122-
123-
if(!rpcResolver && clientResolver.rpcEndpoint) {
124-
rpcResolver = clientResolver.rpcEndpoint;
125-
}
126126
} else {
127-
rpcResolver = clientResolver;
127+
const key = isCacheResolver(clientResolver)
128+
? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY
129+
: DEFAULT_RPC_CLIENT_QUERY_KEY;
130+
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
131+
132+
const cachedClient = getRpcClientFromCache(queryClient, key, endpoint);
133+
// For CacheResolver with endpoint, use endpoint as fallback if no cached client
134+
rpcResolver = cachedClient ||
135+
(isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint :
136+
(!isCacheResolver(clientResolver) ? clientResolver : undefined));
128137
}
129138

130139
const queryFn = opts.builderQueryFn(rpcResolver);
@@ -153,6 +162,14 @@ export interface UseMutationBuilderOptions<TMsg> {
153162
) => Promise<DeliverTxResponse>,
154163
}
155164

165+
const getSigningClientFromCache = (
166+
queryClient: ReturnType<typeof useQueryClient>,
167+
key: string,
168+
rpcEndpoint?: string | HttpEndpoint
169+
): ISigningClient | undefined => {
170+
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
171+
return queryClient.getQueryData<ISigningClient>(queryKey);
172+
};
156173

157174
export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<TMsg>) {
158175
return ({
@@ -167,12 +184,15 @@ export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<T
167184

168185
if(isISigningClient(clientResolver)) {
169186
signingClientResolver = clientResolver;
170-
} else if(isCacheResolver(clientResolver)) {
171-
const key = clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY;
172-
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
173-
signingClientResolver = queryClient.getQueryData<ISigningClient>(queryKey);
174187
} else {
175-
clientResolver = clientResolver;
188+
// For both CacheResolver and other cases, try to get from cache first
189+
const key = isCacheResolver(clientResolver)
190+
? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY
191+
: DEFAULT_SIGNING_CLIENT_QUERY_KEY;
192+
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
193+
194+
const cachedClient = getSigningClientFromCache(queryClient, key, endpoint);
195+
signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined);
176196
}
177197

178198
const mutationFn = opts.builderMutationFn(signingClientResolver);

0 commit comments

Comments
 (0)