]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-20122 Move react-queries to common folder
authorViktor Vorona <viktor.vorona@sonarsource.com>
Thu, 10 Aug 2023 15:12:59 +0000 (17:12 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 11 Aug 2023 20:02:49 +0000 (20:02 +0000)
28 files changed:
server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/Template.tsx
server/sonar-web/src/main/js/apps/permissions/project/components/PageHeader.tsx
server/sonar-web/src/main/js/apps/permissions/project/components/PermissionsProjectApp.tsx
server/sonar-web/src/main/js/apps/projectInformation/badges/ProjectBadges.tsx
server/sonar-web/src/main/js/apps/projectInformation/query/badges.ts [deleted file]
server/sonar-web/src/main/js/apps/projectsManagement/ChangeDefaultVisibilityForm.tsx
server/sonar-web/src/main/js/apps/projectsManagement/ProjectRow.tsx
server/sonar-web/src/main/js/apps/projectsManagement/ProjectRowActions.tsx
server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmIntegrationRenderer.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/ConfigurationForm.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/GitHubConfigurationValidity.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAuthenticationTab.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/SamlAuthenticationTab.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/hook/useConfiguration.ts
server/sonar-web/src/main/js/apps/settings/components/authentication/hook/useGithubConfiguration.ts
server/sonar-web/src/main/js/apps/settings/components/authentication/hook/useSamlConfiguration.ts
server/sonar-web/src/main/js/apps/settings/components/authentication/queries/identity-provider.ts [deleted file]
server/sonar-web/src/main/js/apps/settings/queries/settings.ts [deleted file]
server/sonar-web/src/main/js/apps/web-api-v2/WebApiApp.tsx
server/sonar-web/src/main/js/apps/web-api-v2/queries.ts [deleted file]
server/sonar-web/src/main/js/components/permissions/HoldersList.tsx
server/sonar-web/src/main/js/queries/badges.ts [new file with mode: 0644]
server/sonar-web/src/main/js/queries/github-sync.ts [deleted file]
server/sonar-web/src/main/js/queries/identity-provider.ts [new file with mode: 0644]
server/sonar-web/src/main/js/queries/settings.ts [new file with mode: 0644]
server/sonar-web/src/main/js/queries/web-api.ts [new file with mode: 0644]

index 088a863a3189b9e07c7ca8741c0162eb25f1dfdf..5b637c729df75e8e0d8e3e4045d0be55232ef562 100644 (file)
@@ -24,7 +24,7 @@ import Link from '../../components/common/Link';
 import CheckIcon from '../../components/icons/CheckIcon';
 import { Alert } from '../../components/ui/Alert';
 import { translate, translateWithParameters } from '../../helpers/l10n';
-import { useSyncStatusQuery } from '../../queries/github-sync';
+import { useGitHubSyncStatusQuery } from '../../queries/identity-provider';
 import { GithubStatusEnabled } from '../../types/provisioning';
 import { TaskStatuses } from '../../types/tasks';
 import './SystemAnnouncement.css';
@@ -108,7 +108,7 @@ function LastSyncAlert({ info, short }: LastSyncProps) {
 }
 
 function GitHubSynchronisationWarning({ short }: GitHubSynchronisationWarningProps) {
-  const { data } = useSyncStatusQuery();
+  const { data } = useGitHubSyncStatusQuery();
 
   if (!data) {
     return null;
index 176ac9ce6ebc2e8fea593a32108490bee40fe3fb..9b19b8dd794a300aefad74984ee2c852533fb561 100644 (file)
@@ -25,7 +25,7 @@ import { Alert } from '../../../components/ui/Alert';
 import DeferredSpinner from '../../../components/ui/DeferredSpinner';
 import { throwGlobalError } from '../../../helpers/error';
 import { translate } from '../../../helpers/l10n';
-import { useGithubStatusQuery } from '../../settings/components/authentication/queries/identity-provider';
+import { useGithubProvisioningEnabledQuery } from '../../../queries/identity-provider';
 import { PERMISSION_TEMPLATES_PATH } from '../utils';
 import Form from './Form';
 
@@ -38,7 +38,7 @@ interface Props {
 function Header(props: Props) {
   const { ready, router } = props;
   const [createModal, setCreateModal] = useState(false);
-  const { data: gitHubProvisioningStatus } = useGithubStatusQuery();
+  const { data: gitHubProvisioningStatus } = useGithubProvisioningEnabledQuery();
 
   const handleCreateModalSubmit = async (data: {
     description: string;
index 0c0c0819785b764bbcbccdc626e2f2447bf83502..444d686ca8362d5b3a925ffbddbdac2f8df3e5a3 100644 (file)
@@ -30,8 +30,8 @@ import {
   PERMISSIONS_ORDER_FOR_PROJECT_TEMPLATE,
 } from '../../../helpers/permissions';
 import UseQuery from '../../../helpers/UseQuery';
+import { useGithubProvisioningEnabledQuery } from '../../../queries/identity-provider';
 import { Paging, PermissionGroup, PermissionTemplate, PermissionUser } from '../../../types/types';
-import { useGithubStatusQuery } from '../../settings/components/authentication/queries/identity-provider';
 import TemplateDetails from './TemplateDetails';
 import TemplateHeader from './TemplateHeader';
 
@@ -332,7 +332,7 @@ export default class Template extends React.PureComponent<Props, State> {
         />
         <main>
           <TemplateDetails template={template} />
-          <UseQuery query={useGithubStatusQuery}>
+          <UseQuery query={useGithubProvisioningEnabledQuery}>
             {({ data: githubProvisioningStatus }) =>
               githubProvisioningStatus ? (
                 <Alert variant="warning" className="sw-w-fit">
index 200c721f57cffdfb479ebaaccbdc245841671db4..38d5012a19a5e60729edf81e0d1b14b3a14cade9 100644 (file)
@@ -24,9 +24,9 @@ import { Alert } from '../../../../components/ui/Alert';
 import DeferredSpinner from '../../../../components/ui/DeferredSpinner';
 import { translate } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
+import { useGithubProvisioningEnabledQuery } from '../../../../queries/identity-provider';
 import { isApplication, isPortfolioLike, isProject } from '../../../../types/component';
 import { Component } from '../../../../types/types';
-import { useGithubStatusQuery } from '../../../settings/components/authentication/queries/identity-provider';
 import ApplyTemplate from './ApplyTemplate';
 
 interface Props {
@@ -38,7 +38,7 @@ interface Props {
 
 export default function PageHeader(props: Props) {
   const [applyTemplateModal, setApplyTemplateModal] = React.useState(false);
-  const { data: githubProvisioningStatus } = useGithubStatusQuery();
+  const { data: githubProvisioningStatus } = useGithubProvisioningEnabledQuery();
 
   const { component, isGitHubProject, loading } = props;
   const { configuration } = component;
index 30f5baaaae8c695efac1ee0ba123470e26f62bd1..249ce930773c1339a2ac08ba395cba4f53f6e54a 100644 (file)
@@ -31,11 +31,11 @@ import {
   PERMISSIONS_ORDER_BY_QUALIFIER,
   convertToPermissionDefinitions,
 } from '../../../../helpers/permissions';
+import { useGithubProvisioningEnabledQuery } from '../../../../queries/identity-provider';
 import { AlmKeys } from '../../../../types/alm-settings';
 import { ComponentContextShape, Visibility } from '../../../../types/component';
 import { Permissions } from '../../../../types/permissions';
 import { Component, Paging, PermissionGroup, PermissionUser } from '../../../../types/types';
-import { useGithubStatusQuery } from '../../../settings/components/authentication/queries/identity-provider';
 import '../../styles.css';
 import PageHeader from './PageHeader';
 import PublicProjectDisclaimer from './PublicProjectDisclaimer';
@@ -355,7 +355,7 @@ class PermissionsProjectApp extends React.PureComponent<Props, State> {
           loading={loading}
         />
         <div>
-          <UseQuery query={useGithubStatusQuery}>
+          <UseQuery query={useGithubProvisioningEnabledQuery}>
             {({ data: githubProvisioningStatus, isFetching }) => (
               <VisibilitySelector
                 canTurnToPrivate={canTurnToPrivate}
index 4fec52c49a8fc56cda852c99e38b41a6d54bcbb3..d5ae521d4b815c4a58bd861929feac1ad3d6a207 100644 (file)
@@ -34,14 +34,14 @@ import * as React from 'react';
 import { useState } from 'react';
 import { getBranchLikeQuery } from '../../../helpers/branch-like';
 import { translate } from '../../../helpers/l10n';
-import { BranchLike } from '../../../types/branch-like';
-import { MetricKey } from '../../../types/metrics';
-import { Component } from '../../../types/types';
 import {
   useBadgeMetricsQuery,
   useBadgeTokenQuery,
   useRenewBagdeTokenMutation,
-} from '../query/badges';
+} from '../../../queries/badges';
+import { BranchLike } from '../../../types/branch-like';
+import { MetricKey } from '../../../types/metrics';
+import { Component } from '../../../types/types';
 import { BadgeFormats, BadgeOptions, BadgeType, getBadgeSnippet, getBadgeUrl } from './utils';
 
 export interface ProjectBadgesProps {
diff --git a/server/sonar-web/src/main/js/apps/projectInformation/query/badges.ts b/server/sonar-web/src/main/js/apps/projectInformation/query/badges.ts
deleted file mode 100644 (file)
index 204030a..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { useContext } from 'react';
-import { getProjectBadgesToken, renewProjectBadgesToken } from '../../../api/project-badges';
-import { fetchWebApi } from '../../../api/web-api';
-import { MetricsContext } from '../../../app/components/metrics/MetricsContext';
-import { getLocalizedMetricName } from '../../../helpers/l10n';
-import { MetricKey } from '../../../types/metrics';
-
-export function useFetchWebApiQuery() {
-  return useQuery(['web-api'], () => fetchWebApi(false));
-}
-
-export function useRenewBagdeTokenMutation() {
-  const queryClient = useQueryClient();
-  return useMutation({
-    mutationFn: async (key: string) => {
-      await renewProjectBadgesToken(key);
-    },
-    onSuccess: (_, key) => {
-      queryClient.invalidateQueries({ queryKey: ['badges-token', key], refetchType: 'all' });
-    },
-  });
-}
-
-export function useBadgeMetricsQuery() {
-  const metrics = useContext(MetricsContext);
-  const { data: webservices = [], ...rest } = useFetchWebApiQuery();
-  const domain = webservices.find((d) => d.path === 'api/project_badges');
-  const ws = domain?.actions.find((w) => w.key === 'measure');
-  const param = ws?.params?.find((p) => p.key === 'metric');
-  if (param?.possibleValues) {
-    return {
-      ...rest,
-      data: param.possibleValues.map((key) => {
-        const metric = metrics[key];
-        return {
-          value: key as MetricKey,
-          label: metric ? getLocalizedMetricName(metric) : key,
-        };
-      }),
-    };
-  }
-  return { ...rest, data: [] };
-}
-
-export function useBadgeTokenQuery(componentKey: string) {
-  return useQuery(['badges-token', componentKey] as const, ({ queryKey: [_, key] }) =>
-    getProjectBadgesToken(key)
-  );
-}
index 0a6c7791a2db5d196e01d2b158036252cc9d57de..685629bb3bbe95f1213eeb7b276b95a4017342ec 100644 (file)
@@ -23,8 +23,8 @@ import Radio from '../../components/controls/Radio';
 import { Button, ResetButtonLink } from '../../components/controls/buttons';
 import { Alert } from '../../components/ui/Alert';
 import { translate } from '../../helpers/l10n';
+import { useGithubProvisioningEnabledQuery } from '../../queries/identity-provider';
 import { Visibility } from '../../types/component';
-import { useGithubStatusQuery } from '../settings/components/authentication/queries/identity-provider';
 
 export interface Props {
   defaultVisibility: Visibility;
@@ -34,7 +34,7 @@ export interface Props {
 
 export default function ChangeDefaultVisibilityForm(props: Props) {
   const [visibility, setVisibility] = useState(props.defaultVisibility);
-  const { data: githubProbivisioningEnabled } = useGithubStatusQuery();
+  const { data: githubProbivisioningEnabled } = useGithubProvisioningEnabledQuery();
 
   const handleConfirmClick = () => {
     props.onConfirm(visibility);
index d2acb3e932b798ecf5482d79a49e3aeb48bb4ea2..76fda3be0512fb4a5e1d55f098beaf707f04eb55 100644 (file)
@@ -27,9 +27,9 @@ import QualifierIcon from '../../components/icons/QualifierIcon';
 import DateFormatter from '../../components/intl/DateFormatter';
 import { translate, translateWithParameters } from '../../helpers/l10n';
 import { getComponentOverviewUrl } from '../../helpers/urls';
+import { useGithubProvisioningEnabledQuery } from '../../queries/identity-provider';
 import { ComponentQualifier } from '../../types/component';
 import { LoggedInUser } from '../../types/users';
-import { useGithubStatusQuery } from '../settings/components/authentication/queries/identity-provider';
 import './ProjectRow.css';
 import ProjectRowActions from './ProjectRowActions';
 
@@ -42,7 +42,7 @@ interface Props {
 
 export default function ProjectRow(props: Props) {
   const { currentUser, project, selected } = props;
-  const { data: githubProvisioningEnabled } = useGithubStatusQuery();
+  const { data: githubProvisioningEnabled } = useGithubProvisioningEnabledQuery();
 
   const handleProjectCheck = (checked: boolean) => {
     props.onProjectCheck(project, checked);
index 032e81f83f2b1dad442269d32eed324e1d372383..26d929bcc014c1fdb1aa355091bd932696e971cf 100644 (file)
@@ -24,9 +24,9 @@ import ActionsDropdown, { ActionsDropdownItem } from '../../components/controls/
 import DeferredSpinner from '../../components/ui/DeferredSpinner';
 import { translate, translateWithParameters } from '../../helpers/l10n';
 import { getComponentPermissionsUrl } from '../../helpers/urls';
+import { useGithubProvisioningEnabledQuery } from '../../queries/identity-provider';
 import { LoggedInUser } from '../../types/users';
 import ApplyTemplate from '../permissions/project/components/ApplyTemplate';
-import { useGithubStatusQuery } from '../settings/components/authentication/queries/identity-provider';
 import RestoreAccessModal from './RestoreAccessModal';
 
 export interface Props {
@@ -39,7 +39,7 @@ export default function ProjectRowActions({ currentUser, project }: Props) {
   const [hasAccess, setHasAccess] = useState<boolean | undefined>(undefined);
   const [loading, setLoading] = useState(false);
   const [restoreAccessModal, setRestoreAccessModal] = useState(false);
-  const { data: githubProvisioningEnabled } = useGithubStatusQuery();
+  const { data: githubProvisioningEnabled } = useGithubProvisioningEnabledQuery();
 
   const fetchPermissions = () => {
     setLoading(true);
index 59965b8551600ccc1a272504ff5d420e8de2e69c..a1430ead8af2edfca1538bfae217380bf3d77944 100644 (file)
@@ -24,6 +24,7 @@ import BoxedTabs from '../../../../components/controls/BoxedTabs';
 import { Alert } from '../../../../components/ui/Alert';
 import { translate } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
+import { useGetValuesQuery } from '../../../../queries/settings';
 import {
   AlmKeys,
   AlmSettingsBindingDefinitions,
@@ -31,7 +32,6 @@ import {
 } from '../../../../types/alm-settings';
 import { SettingsKey } from '../../../../types/settings';
 import { Dict } from '../../../../types/types';
-import { useGetValuesQuery } from '../../queries/settings';
 import { AlmTabs } from './AlmIntegration';
 import AlmTab from './AlmTab';
 import DeleteModal from './DeleteModal';
index ae6d06d143227c18b6941f1466f4363553a4c7a4..4c1a3081db638b1414348849b748c3258d27a897 100644 (file)
@@ -26,8 +26,8 @@ import { ResetButtonLink, SubmitButton } from '../../../../components/controls/b
 import { Alert } from '../../../../components/ui/Alert';
 import DeferredSpinner from '../../../../components/ui/DeferredSpinner';
 import { translate } from '../../../../helpers/l10n';
+import { useSaveValuesMutation } from '../../../../queries/settings';
 import { Dict } from '../../../../types/types';
-import { useSaveValuesMutation } from '../../queries/settings';
 import { AuthenticationTabs, DOCUMENTATION_LINK_SUFFIXES } from './Authentication';
 import AuthenticationFormField from './AuthenticationFormField';
 import { SettingValue } from './hook/useConfiguration';
index 867d5c7e968d25307384aa3aa0150b83e96fa27a..06331668136a23da6773b8a54593a31f11d681be 100644 (file)
@@ -27,8 +27,8 @@ import ClearIcon from '../../../../components/icons/ClearIcon';
 import HelpIcon from '../../../../components/icons/HelpIcon';
 import { Alert, AlertVariant } from '../../../../components/ui/Alert';
 import { translate, translateWithParameters } from '../../../../helpers/l10n';
+import { useCheckGitHubConfigQuery } from '../../../../queries/identity-provider';
 import { GitHubProvisioningStatus } from '../../../../types/provisioning';
-import { useCheckGitHubConfigQuery } from './queries/identity-provider';
 
 const intlPrefix = 'settings.authentication.github.configuration.validation';
 
index 36bce8a1cb2e70132cf4b658e63e446e67299555..12f82b076470e01b5577c57db066692d6e301620 100644 (file)
@@ -29,7 +29,11 @@ import DeleteIcon from '../../../../components/icons/DeleteIcon';
 import EditIcon from '../../../../components/icons/EditIcon';
 import { Alert } from '../../../../components/ui/Alert';
 import { translate, translateWithParameters } from '../../../../helpers/l10n';
-import { useSyncNow } from '../../../../queries/github-sync';
+import {
+  useCheckGitHubConfigQuery,
+  useIdentityProviderQuery,
+  useSyncWithGitHubNow,
+} from '../../../../queries/identity-provider';
 import { AlmKeys } from '../../../../types/alm-settings';
 import { ExtendedSettingDefinition } from '../../../../types/settings';
 import { DOCUMENTATION_LINK_SUFFIXES } from './Authentication';
@@ -37,7 +41,6 @@ import AuthenticationFormField from './AuthenticationFormField';
 import ConfigurationForm from './ConfigurationForm';
 import GitHubConfigurationValidity from './GitHubConfigurationValidity';
 import useGithubConfiguration, { GITHUB_JIT_FIELDS } from './hook/useGithubConfiguration';
-import { useCheckGitHubConfigQuery, useIdentityProviderQuery } from './queries/identity-provider';
 
 interface GithubAuthenticationProps {
   definitions: ExtendedSettingDefinition[];
@@ -79,7 +82,7 @@ export default function GithubAuthenticationTab(props: GithubAuthenticationProps
   } = useGithubConfiguration(definitions);
 
   const hasDifferentProvider = data?.provider !== undefined && data.provider !== Provider.Github;
-  const { canSyncNow, synchronizeNow } = useSyncNow();
+  const { canSyncNow, synchronizeNow } = useSyncWithGitHubNow();
   const { refetch } = useCheckGitHubConfigQuery(enabled);
 
   const handleCreateConfiguration = () => {
index 484485236937346636936b87f162488868eb38d5..edb9349490d9b0f97c0f031f2c0465943a12c439 100644 (file)
@@ -30,8 +30,12 @@ import DeleteIcon from '../../../../components/icons/DeleteIcon';
 import EditIcon from '../../../../components/icons/EditIcon';
 import { Alert } from '../../../../components/ui/Alert';
 import { translate } from '../../../../helpers/l10n';
+import {
+  useIdentityProviderQuery,
+  useToggleScimMutation,
+} from '../../../../queries/identity-provider';
+import { useSaveValueMutation } from '../../../../queries/settings';
 import { ExtendedSettingDefinition } from '../../../../types/settings';
-import { useSaveValueMutation } from '../../queries/settings';
 import { getPropertyName } from '../../utils';
 import DefinitionDescription from '../DefinitionDescription';
 import ConfigurationForm from './ConfigurationForm';
@@ -40,7 +44,6 @@ import useSamlConfiguration, {
   SAML_GROUP_NAME,
   SAML_SCIM_DEPRECATED,
 } from './hook/useSamlConfiguration';
-import { useIdentityProviderQuery, useToggleScimMutation } from './queries/identity-provider';
 
 interface SamlAuthenticationProps {
   definitions: ExtendedSettingDefinition[];
index c3bf05a3b6142ea98e0a32d0a383fc84cf9915a5..b88e1007257c1ca21a8b31f885eab7f4dc18febd 100644 (file)
@@ -20,9 +20,9 @@
 import { UseMutationResult } from '@tanstack/react-query';
 import { every, isEmpty, keyBy, update } from 'lodash';
 import { useCallback, useEffect, useState } from 'react';
+import { useGetValuesQuery, useResetSettingsMutation } from '../../../../../queries/settings';
 import { ExtendedSettingDefinition } from '../../../../../types/settings';
 import { Dict } from '../../../../../types/types';
-import { useGetValuesQuery, useResetSettingsMutation } from '../../../queries/settings';
 
 export type SettingValue =
   | {
index b335b41f9edb465e8116dd6f33fd15cd71b8dfc0..e8ca3a7fb62861680dfd0e8753baf1edb6fa67a6 100644 (file)
 import { some } from 'lodash';
 import { useContext, useState } from 'react';
 import { AvailableFeaturesContext } from '../../../../../app/components/available-features/AvailableFeaturesContext';
-import { Feature } from '../../../../../types/features';
-import { ExtendedSettingDefinition } from '../../../../../types/settings';
-import { useSaveValueMutation, useSaveValuesMutation } from '../../../queries/settings';
 import {
-  useGithubStatusQuery,
+  useGithubProvisioningEnabledQuery,
   useToggleGithubProvisioningMutation,
-} from '../queries/identity-provider';
+} from '../../../../../queries/identity-provider';
+import { useSaveValueMutation, useSaveValuesMutation } from '../../../../../queries/settings';
+import { Feature } from '../../../../../types/features';
+import { ExtendedSettingDefinition } from '../../../../../types/settings';
 import useConfiguration from './useConfiguration';
 
 export const GITHUB_ENABLED_FIELD = 'sonar.auth.github.enabled';
@@ -59,7 +59,7 @@ export default function useGithubConfiguration(definitions: ExtendedSettingDefin
   const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes(
     Feature.GithubProvisioning
   );
-  const { data: githubProvisioningStatus } = useGithubStatusQuery();
+  const { data: githubProvisioningStatus } = useGithubProvisioningEnabledQuery();
   const toggleGithubProvisioning = useToggleGithubProvisioningMutation();
   const [newGithubProvisioningStatus, setNewGithubProvisioningStatus] = useState<boolean>();
   const hasGithubProvisioningTypeChange =
index 47b2a9c5207b3509e9688a15d09f429294431208..cf720362be133ed44f96b5b340d75ef72f054f36 100644 (file)
@@ -19,9 +19,9 @@
  */
 import React from 'react';
 import { AvailableFeaturesContext } from '../../../../../app/components/available-features/AvailableFeaturesContext';
+import { useScimStatusQuery } from '../../../../../queries/identity-provider';
 import { Feature } from '../../../../../types/features';
 import { ExtendedSettingDefinition } from '../../../../../types/settings';
-import { useScimStatusQuery } from '../queries/identity-provider';
 import useConfiguration from './useConfiguration';
 
 export const SAML_ENABLED_FIELD = 'sonar.auth.saml.enabled';
diff --git a/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/identity-provider.ts b/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/identity-provider.ts
deleted file mode 100644 (file)
index 9c02a99..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { useContext } from 'react';
-import {
-  activateGithubProvisioning,
-  activateScim,
-  checkConfigurationValidity,
-  deactivateGithubProvisioning,
-  deactivateScim,
-  fetchIsScimEnabled,
-} from '../../../../../api/provisioning';
-import { getSystemInfo } from '../../../../../api/system';
-import { AvailableFeaturesContext } from '../../../../../app/components/available-features/AvailableFeaturesContext';
-import { mapReactQueryResult } from '../../../../../helpers/react-query';
-import { useSyncStatusQuery } from '../../../../../queries/github-sync';
-import { Feature } from '../../../../../types/features';
-import { SysInfoCluster } from '../../../../../types/types';
-
-export function useIdentityProviderQuery() {
-  return useQuery(['identity_provider'], async () => {
-    const info = (await getSystemInfo()) as SysInfoCluster;
-    return { provider: info.System['External Users and Groups Provisioning'] };
-  });
-}
-
-export function useScimStatusQuery() {
-  const hasScim = useContext(AvailableFeaturesContext).includes(Feature.Scim);
-
-  return useQuery(['identity_provider', 'scim_status'], () => {
-    if (!hasScim) {
-      return false;
-    }
-    return fetchIsScimEnabled();
-  });
-}
-
-export function useGithubStatusQuery() {
-  const res = useSyncStatusQuery({ noRefetch: true });
-
-  return mapReactQueryResult(res, (data) => data.enabled);
-}
-
-export function useToggleScimMutation() {
-  const client = useQueryClient();
-  return useMutation({
-    mutationFn: (activate: boolean) => (activate ? activateScim() : deactivateScim()),
-    onSuccess: () => {
-      client.invalidateQueries({ queryKey: ['identity_provider'] });
-    },
-  });
-}
-
-export function useToggleGithubProvisioningMutation() {
-  const client = useQueryClient();
-  return useMutation({
-    mutationFn: (activate: boolean) =>
-      activate ? activateGithubProvisioning() : deactivateGithubProvisioning(),
-    onSuccess: () => {
-      client.invalidateQueries({ queryKey: ['identity_provider'] });
-      client.invalidateQueries({ queryKey: ['github_sync'] });
-    },
-  });
-}
-
-export const useCheckGitHubConfigQuery = (githubEnabled: boolean) => {
-  return useQuery(['identity_provider', 'github_check'], checkConfigurationValidity, {
-    enabled: githubEnabled,
-  });
-};
diff --git a/server/sonar-web/src/main/js/apps/settings/queries/settings.ts b/server/sonar-web/src/main/js/apps/settings/queries/settings.ts
deleted file mode 100644 (file)
index 6c88431..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { getValues, resetSettingValue, setSettingValue } from '../../../api/settings';
-import { ExtendedSettingDefinition } from '../../../types/settings';
-
-type SettingValue = string | boolean | string[];
-
-export function useGetValuesQuery(keys: string[]) {
-  return useQuery(['settings', 'values', keys] as const, ({ queryKey: [_a, _b, keys] }) => {
-    return getValues({ keys });
-  });
-}
-
-export function useResetSettingsMutation() {
-  const queryClient = useQueryClient();
-  return useMutation({
-    mutationFn: (keys: string[]) => resetSettingValue({ keys: keys.join(',') }),
-    onSuccess: () => {
-      queryClient.invalidateQueries(['settings']);
-    },
-  });
-}
-
-export function useSaveValuesMutation() {
-  const queryClient = useQueryClient();
-  return useMutation({
-    mutationFn: (
-      values: {
-        newValue?: SettingValue;
-        definition: ExtendedSettingDefinition;
-      }[]
-    ) => {
-      return Promise.all(
-        values
-          .filter((v) => v.newValue !== undefined)
-          .map(async ({ newValue, definition }) => {
-            try {
-              if (isDefaultValue(newValue as string | boolean | string[], definition)) {
-                await resetSettingValue({ keys: definition.key });
-              } else {
-                await setSettingValue(definition, newValue);
-              }
-              return { key: definition.key, success: true };
-            } catch (error) {
-              return { key: definition.key, success: false };
-            }
-          })
-      );
-    },
-    onSuccess: () => {
-      queryClient.invalidateQueries(['settings']);
-    },
-  });
-}
-
-export function useSaveValueMutation() {
-  const queryClient = useQueryClient();
-  return useMutation({
-    mutationFn: async ({
-      newValue,
-      definition,
-    }: {
-      newValue: SettingValue;
-      definition: ExtendedSettingDefinition;
-    }) => {
-      if (isDefaultValue(newValue, definition)) {
-        await resetSettingValue({ keys: definition.key });
-      } else {
-        await setSettingValue(definition, newValue);
-      }
-    },
-    onSuccess: () => {
-      queryClient.invalidateQueries(['settings']);
-    },
-  });
-}
-
-function isDefaultValue(value: SettingValue, definition: ExtendedSettingDefinition) {
-  const defaultValue = definition.defaultValue ?? '';
-  if (definition.multiValues) {
-    return defaultValue === (value as string[]).join(',');
-  }
-
-  return defaultValue === String(value);
-}
index 94d840db9b2442ae2171aed9970f7fbc0c6332f5..4147cca391ace97ee3f70723efd08ad3cf55a08a 100644 (file)
@@ -24,9 +24,9 @@ import React, { useMemo } from 'react';
 import { Helmet } from 'react-helmet-async';
 import { useLocation } from 'react-router-dom';
 import { translate } from '../../helpers/l10n';
+import { useOpenAPI } from '../../queries/web-api';
 import ApiInformation from './components/ApiInformation';
 import ApiSidebar from './components/ApiSidebar';
-import { useOpenAPI } from './queries';
 import { URL_DIVIDER, dereferenceSchema } from './utils';
 
 export default function WebApiApp() {
diff --git a/server/sonar-web/src/main/js/apps/web-api-v2/queries.ts b/server/sonar-web/src/main/js/apps/web-api-v2/queries.ts
deleted file mode 100644 (file)
index 1b0bf90..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 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 { useQuery } from '@tanstack/react-query';
-import { fetchOpenAPI } from '../../api/web-api';
-
-export const useOpenAPI = () => {
-  return useQuery(['open_api'], fetchOpenAPI, { staleTime: Infinity, cacheTime: Infinity });
-};
index 306a9772f57d657f467a64e4d24f994068db3883..5f0eb67e3c8a42972e070c94a77f7ff26b7d4970 100644 (file)
  */
 import { partition } from 'lodash';
 import * as React from 'react';
-import { useGithubStatusQuery } from '../../apps/settings/components/authentication/queries/identity-provider';
 import UseQuery from '../../helpers/UseQuery';
 import { translate } from '../../helpers/l10n';
 import { isPermissionDefinitionGroup } from '../../helpers/permissions';
+import { useGithubProvisioningEnabledQuery } from '../../queries/identity-provider';
 import { Dict, PermissionDefinitions, PermissionGroup, PermissionUser } from '../../types/types';
 import GroupHolder from './GroupHolder';
 import PermissionHeader from './PermissionHeader';
@@ -105,7 +105,7 @@ export default class HoldersList extends React.PureComponent<Props, State> {
   renderItem(item: PermissionUser | PermissionGroup, permissions: PermissionDefinitions) {
     const { isGitHubProject, selectedPermission, isComponentPrivate } = this.props;
     return (
-      <UseQuery key={this.getKey(item)} query={useGithubStatusQuery}>
+      <UseQuery key={this.getKey(item)} query={useGithubProvisioningEnabledQuery}>
         {({ data: githubProvisioningStatus }) => (
           <>
             {this.isPermissionUser(item) ? (
diff --git a/server/sonar-web/src/main/js/queries/badges.ts b/server/sonar-web/src/main/js/queries/badges.ts
new file mode 100644 (file)
index 0000000..57a451e
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
+import { useContext } from 'react';
+import { getProjectBadgesToken, renewProjectBadgesToken } from '../api/project-badges';
+import { MetricsContext } from '../app/components/metrics/MetricsContext';
+import { getLocalizedMetricName } from '../helpers/l10n';
+import { MetricKey } from '../types/metrics';
+import { useWebApiQuery } from './web-api';
+
+export function useRenewBagdeTokenMutation() {
+  const queryClient = useQueryClient();
+  return useMutation({
+    mutationFn: async (key: string) => {
+      await renewProjectBadgesToken(key);
+    },
+    onSuccess: (_, key) => {
+      queryClient.invalidateQueries({ queryKey: ['badges-token', key], refetchType: 'all' });
+    },
+  });
+}
+
+export function useBadgeMetricsQuery() {
+  const metrics = useContext(MetricsContext);
+  const { data: webservices = [], ...rest } = useWebApiQuery();
+  const domain = webservices.find((d) => d.path === 'api/project_badges');
+  const ws = domain?.actions.find((w) => w.key === 'measure');
+  const param = ws?.params?.find((p) => p.key === 'metric');
+  if (param?.possibleValues) {
+    return {
+      ...rest,
+      data: param.possibleValues.map((key) => {
+        const metric = metrics[key];
+        return {
+          value: key as MetricKey,
+          label: metric ? getLocalizedMetricName(metric) : key,
+        };
+      }),
+    };
+  }
+  return { ...rest, data: [] };
+}
+
+export function useBadgeTokenQuery(componentKey: string) {
+  return useQuery(['badges-token', componentKey] as const, ({ queryKey: [_, key] }) =>
+    getProjectBadgesToken(key)
+  );
+}
diff --git a/server/sonar-web/src/main/js/queries/github-sync.ts b/server/sonar-web/src/main/js/queries/github-sync.ts
deleted file mode 100644 (file)
index 018e068..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { useContext } from 'react';
-import { fetchGithubProvisioningStatus, syncNowGithubProvisioning } from '../api/provisioning';
-import { AvailableFeaturesContext } from '../app/components/available-features/AvailableFeaturesContext';
-import { Feature } from '../types/features';
-
-interface GithubSyncStatusOptions {
-  noRefetch?: boolean;
-}
-
-export function useSyncStatusQuery(options: GithubSyncStatusOptions = {}) {
-  const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes(
-    Feature.GithubProvisioning
-  );
-  return useQuery(['github_sync', 'status'], fetchGithubProvisioningStatus, {
-    enabled: hasGithubProvisioning,
-    refetchInterval: options.noRefetch ? undefined : 10_000,
-  });
-}
-
-export function useSyncNow() {
-  const queryClient = useQueryClient();
-  const { data } = useSyncStatusQuery();
-  const mutation = useMutation(syncNowGithubProvisioning, {
-    onSuccess: () => {
-      queryClient.invalidateQueries(['github_sync']);
-    },
-  });
-
-  return {
-    synchronizeNow: mutation.mutate,
-    canSyncNow: data && data.enabled && !data.nextSync && !mutation.isLoading,
-  };
-}
diff --git a/server/sonar-web/src/main/js/queries/identity-provider.ts b/server/sonar-web/src/main/js/queries/identity-provider.ts
new file mode 100644 (file)
index 0000000..d9af694
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
+import { useContext } from 'react';
+import {
+  activateGithubProvisioning,
+  activateScim,
+  checkConfigurationValidity,
+  deactivateGithubProvisioning,
+  deactivateScim,
+  fetchGithubProvisioningStatus,
+  fetchIsScimEnabled,
+  syncNowGithubProvisioning,
+} from '../api/provisioning';
+import { getSystemInfo } from '../api/system';
+import { AvailableFeaturesContext } from '../app/components/available-features/AvailableFeaturesContext';
+import { mapReactQueryResult } from '../helpers/react-query';
+import { Feature } from '../types/features';
+import { SysInfoCluster } from '../types/types';
+
+export function useIdentityProviderQuery() {
+  return useQuery(['identity_provider'], async () => {
+    const info = (await getSystemInfo()) as SysInfoCluster;
+    return { provider: info.System['External Users and Groups Provisioning'] };
+  });
+}
+
+export function useScimStatusQuery() {
+  const hasScim = useContext(AvailableFeaturesContext).includes(Feature.Scim);
+
+  return useQuery(['identity_provider', 'scim_status'], () => {
+    if (!hasScim) {
+      return false;
+    }
+    return fetchIsScimEnabled();
+  });
+}
+
+export function useToggleScimMutation() {
+  const client = useQueryClient();
+  return useMutation({
+    mutationFn: (activate: boolean) => (activate ? activateScim() : deactivateScim()),
+    onSuccess: () => {
+      client.invalidateQueries({ queryKey: ['identity_provider'] });
+    },
+  });
+}
+
+export function useToggleGithubProvisioningMutation() {
+  const client = useQueryClient();
+  return useMutation({
+    mutationFn: (activate: boolean) =>
+      activate ? activateGithubProvisioning() : deactivateGithubProvisioning(),
+    onSuccess: () => {
+      client.invalidateQueries({ queryKey: ['identity_provider'] });
+    },
+  });
+}
+
+export const useCheckGitHubConfigQuery = (githubEnabled: boolean) => {
+  return useQuery(['identity_provider', 'github_check'], checkConfigurationValidity, {
+    enabled: githubEnabled,
+  });
+};
+
+interface GithubSyncStatusOptions {
+  noRefetch?: boolean;
+}
+
+export function useGitHubSyncStatusQuery(options: GithubSyncStatusOptions = {}) {
+  const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes(
+    Feature.GithubProvisioning
+  );
+  return useQuery(['identity_provider', 'github_sync', 'status'], fetchGithubProvisioningStatus, {
+    enabled: hasGithubProvisioning,
+    refetchInterval: options.noRefetch ? undefined : 10_000,
+  });
+}
+
+export function useGithubProvisioningEnabledQuery() {
+  const res = useGitHubSyncStatusQuery({ noRefetch: true });
+
+  return mapReactQueryResult(res, (data) => data.enabled);
+}
+
+export function useSyncWithGitHubNow() {
+  const queryClient = useQueryClient();
+  const { data } = useGitHubSyncStatusQuery();
+  const mutation = useMutation(syncNowGithubProvisioning, {
+    onSuccess: () => {
+      queryClient.invalidateQueries(['identity_provider', 'github_sync']);
+    },
+  });
+
+  return {
+    synchronizeNow: mutation.mutate,
+    canSyncNow: data?.enabled && !data.nextSync && !mutation.isLoading,
+  };
+}
diff --git a/server/sonar-web/src/main/js/queries/settings.ts b/server/sonar-web/src/main/js/queries/settings.ts
new file mode 100644 (file)
index 0000000..4aee8e6
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
+import { getValues, resetSettingValue, setSettingValue } from '../api/settings';
+import { ExtendedSettingDefinition } from '../types/settings';
+
+type SettingValue = string | boolean | string[];
+
+export function useGetValuesQuery(keys: string[]) {
+  return useQuery(['settings', 'values', keys] as const, ({ queryKey: [_a, _b, keys] }) => {
+    return getValues({ keys });
+  });
+}
+
+export function useResetSettingsMutation() {
+  const queryClient = useQueryClient();
+  return useMutation({
+    mutationFn: (keys: string[]) => resetSettingValue({ keys: keys.join(',') }),
+    onSuccess: () => {
+      queryClient.invalidateQueries(['settings']);
+    },
+  });
+}
+
+export function useSaveValuesMutation() {
+  const queryClient = useQueryClient();
+  return useMutation({
+    mutationFn: (
+      values: {
+        newValue?: SettingValue;
+        definition: ExtendedSettingDefinition;
+      }[]
+    ) => {
+      return Promise.all(
+        values
+          .filter((v) => v.newValue !== undefined)
+          .map(async ({ newValue, definition }) => {
+            try {
+              if (isDefaultValue(newValue as string | boolean | string[], definition)) {
+                await resetSettingValue({ keys: definition.key });
+              } else {
+                await setSettingValue(definition, newValue);
+              }
+              return { key: definition.key, success: true };
+            } catch (error) {
+              return { key: definition.key, success: false };
+            }
+          })
+      );
+    },
+    onSuccess: () => {
+      queryClient.invalidateQueries(['settings']);
+    },
+  });
+}
+
+export function useSaveValueMutation() {
+  const queryClient = useQueryClient();
+  return useMutation({
+    mutationFn: async ({
+      newValue,
+      definition,
+    }: {
+      newValue: SettingValue;
+      definition: ExtendedSettingDefinition;
+    }) => {
+      if (isDefaultValue(newValue, definition)) {
+        await resetSettingValue({ keys: definition.key });
+      } else {
+        await setSettingValue(definition, newValue);
+      }
+    },
+    onSuccess: () => {
+      queryClient.invalidateQueries(['settings']);
+    },
+  });
+}
+
+function isDefaultValue(value: SettingValue, definition: ExtendedSettingDefinition) {
+  const defaultValue = definition.defaultValue ?? '';
+  if (definition.multiValues) {
+    return defaultValue === (value as string[]).join(',');
+  }
+
+  return defaultValue === String(value);
+}
diff --git a/server/sonar-web/src/main/js/queries/web-api.ts b/server/sonar-web/src/main/js/queries/web-api.ts
new file mode 100644 (file)
index 0000000..b6a1fe8
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 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 { useQuery } from '@tanstack/react-query';
+import { fetchOpenAPI, fetchWebApi } from '../api/web-api';
+
+export function useWebApiQuery() {
+  return useQuery(['web-api'], () => fetchWebApi(false));
+}
+
+export const useOpenAPI = () => {
+  return useQuery(['open_api'], fetchOpenAPI, { staleTime: Infinity, cacheTime: Infinity });
+};