aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx')
-rw-r--r--server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx102
1 files changed, 102 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx b/server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx
new file mode 100644
index 00000000000..d8a8fe536a1
--- /dev/null
+++ b/server/sonar-web/src/main/js/apps/create/project/useRepositorySearch.tsx
@@ -0,0 +1,102 @@
+/*
+ * 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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { AlmKeys } from '../../../types/alm-settings';
+import { DopSetting } from '../../../types/dop-translation';
+import { REPOSITORY_SEARCH_DEBOUNCE_TIME } from './constants';
+
+export function useRepositorySearch(
+ almKey: AlmKeys,
+ fetchRepositories: (
+ organizationKey?: string,
+ query?: string,
+ pageIndex?: number,
+ more?: boolean,
+ ) => Promise<void>,
+ isInitialized: boolean,
+ selectedDopSetting: DopSetting | undefined,
+ selectedOrganizationKey: string | undefined,
+ setSearchQuery: (query: string) => void,
+ showPersonalAccessTokenForm = false,
+) {
+ const repositorySearchDebounceId = useRef<NodeJS.Timeout | undefined>();
+ const [isSearching, setIsSearching] = useState<boolean>(false);
+
+ const orgValid = useMemo(
+ () =>
+ almKey !== AlmKeys.GitHub ||
+ (almKey === AlmKeys.GitHub && selectedOrganizationKey !== undefined),
+ [almKey, selectedOrganizationKey],
+ );
+
+ useEffect(() => {
+ if (selectedDopSetting && !showPersonalAccessTokenForm && orgValid) {
+ if (almKey === AlmKeys.GitHub) {
+ fetchRepositories(selectedOrganizationKey);
+ } else if (!isInitialized) {
+ fetchRepositories();
+ }
+ }
+ }, [
+ almKey,
+ fetchRepositories,
+ isInitialized,
+ orgValid,
+ selectedDopSetting,
+ selectedOrganizationKey,
+ showPersonalAccessTokenForm,
+ ]);
+
+ const onSearch = useCallback(
+ (query: string) => {
+ setSearchQuery(query);
+ if (!isInitialized || !orgValid) {
+ return;
+ }
+
+ clearTimeout(repositorySearchDebounceId.current);
+ repositorySearchDebounceId.current = setTimeout(() => {
+ setIsSearching(true);
+ fetchRepositories(
+ almKey === AlmKeys.GitHub ? selectedOrganizationKey : undefined,
+ query,
+ ).then(
+ () => setIsSearching(false),
+ () => setIsSearching(false),
+ );
+ }, REPOSITORY_SEARCH_DEBOUNCE_TIME);
+ },
+ [
+ almKey,
+ fetchRepositories,
+ isInitialized,
+ orgValid,
+ repositorySearchDebounceId,
+ selectedOrganizationKey,
+ setIsSearching,
+ setSearchQuery,
+ ],
+ );
+
+ return {
+ isSearching,
+ onSearch,
+ };
+}