]> source.dussan.org Git - sonarqube.git/commitdiff
[NO JIRA] Introduce wrappers for react-query
authorViktor Vorona <viktor.vorona@sonarsource.com>
Wed, 24 Jul 2024 07:56:49 +0000 (09:56 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 25 Jul 2024 20:02:50 +0000 (20:02 +0000)
server/sonar-web/src/main/js/queries/common.ts [new file with mode: 0644]
server/sonar-web/src/main/js/queries/groups.ts
server/sonar-web/src/main/js/queries/projects.ts

diff --git a/server/sonar-web/src/main/js/queries/common.ts b/server/sonar-web/src/main/js/queries/common.ts
new file mode 100644 (file)
index 0000000..9bf450a
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+import {
+  InfiniteData,
+  QueryKey,
+  UseInfiniteQueryOptions,
+  UseInfiniteQueryResult,
+  UseQueryOptions,
+  UseQueryResult,
+  useInfiniteQuery,
+  useQuery,
+} from '@tanstack/react-query';
+
+export function createQueryHook<
+  T = unknown,
+  TQueryData = unknown,
+  TError = Error,
+  TData = TQueryData,
+  TQueryKey extends QueryKey = QueryKey,
+>(
+  fn: (data: T) => UseQueryOptions<TQueryData, TError, TData, TQueryKey>,
+): <SelectType = TQueryData>(
+  data: T,
+  options?: Omit<
+    UseQueryOptions<TQueryData, TError, SelectType, TQueryKey>,
+    'queryKey' | 'queryFn'
+  >,
+) => UseQueryResult<SelectType, TError>;
+
+export function createQueryHook(fn: (data: any) => UseQueryOptions) {
+  return (data: any, options?: Omit<UseQueryOptions, 'queryKey' | 'queryFn'>) =>
+    useQuery({ ...fn(data), ...options });
+}
+
+export function createInfiniteQueryHook<
+  T = unknown,
+  TQueryFnData = unknown,
+  TError = Error,
+  TData = InfiniteData<TQueryFnData>,
+  TQueryData = TQueryFnData,
+  TQueryKey extends QueryKey = QueryKey,
+  TPageParam = unknown,
+>(
+  fn: (
+    data: T,
+  ) => UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>,
+): <SelectType = TData>(
+  data: T,
+  options?: Omit<
+    UseInfiniteQueryOptions<TQueryFnData, TError, SelectType, TQueryData, TQueryKey, TPageParam>,
+    'queryKey' | 'queryFn' | 'getNextPageParam' | 'getPreviousPageParam' | 'initialPageParam'
+  >,
+) => UseInfiniteQueryResult<SelectType, TError>;
+
+export function createInfiniteQueryHook(fn: (data: any) => UseInfiniteQueryOptions) {
+  return (
+    data: any,
+    options?: Omit<
+      UseInfiniteQueryOptions,
+      'queryKey' | 'queryFn' | 'getNextPageParam' | 'getPreviousPageParam' | 'initialPageParam'
+    >,
+  ) => useInfiniteQuery({ ...fn(data), ...options });
+}
index e41ea23d85034e87d49fe4acd2e1683d11399a17..5bed2cb38bfab030637555a6dda4921ca3cb13ba 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { useInfiniteQuery, useMutation, useQueryClient } from '@tanstack/react-query';
+import { infiniteQueryOptions, useMutation, useQueryClient } from '@tanstack/react-query';
 import { createGroup, deleteGroup, getUsersGroups, updateGroup } from '../api/user_groups';
 import { getNextPageParam, getPreviousPageParam } from '../helpers/react-query';
+import { createInfiniteQueryHook } from './common';
 
-export function useGroupsQueries(
-  getParams: Omit<Parameters<typeof getUsersGroups>[0], 'pageSize' | 'pageIndex'>,
-{
-  return useInfiniteQuery({
-    queryKey: ['group', 'list', getParams],
-    queryFn: ({ pageParam }) => getUsersGroups({ ...getParams, pageIndex: pageParam }),
-    getNextPageParam,
-    getPreviousPageParam,
-    initialPageParam: 1,
-  });
-}
+export const useGroupsQueries = createInfiniteQueryHook(
+  (getParams: Omit<Parameters<typeof getUsersGroups>[0], 'pageSize' | 'pageIndex'>) => {
+    return infiniteQueryOptions({
+      queryKey: ['group', 'list', getParams],
+      queryFn: ({ pageParam }) => getUsersGroups({ ...getParams, pageIndex: pageParam }),
+      getNextPageParam,
+      getPreviousPageParam,
+      initialPageParam: 1,
+    });
+  },
+);
 
 export function useCreateGroupMutation() {
   const queryClient = useQueryClient();
index 9fe51a5ccd182d6fb2d17c94a1d22ea34b912452..39eab402621fbbbfce12a205559be0e23fd254d3 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { UseQueryOptions, useQuery } from '@tanstack/react-query';
+import { queryOptions } from '@tanstack/react-query';
 import { searchProjects } from '../api/components';
+import { createQueryHook } from './common';
 
-export function useProjectQuery<T = Awaited<ReturnType<typeof searchProjects>>>(
-  key: string,
-  options?: Omit<
-    UseQueryOptions<Awaited<ReturnType<typeof searchProjects>>, Error, T>,
-    'queryKey' | 'queryFn'
-  >,
-) {
-  return useQuery({
+export const useProjectQuery = createQueryHook((key: string) => {
+  return queryOptions({
     queryKey: ['project', key],
     queryFn: ({ queryKey: [, key] }) => searchProjects({ filter: `query=${key}` }),
-    ...options,
   });
-}
+});