import React from "react"; import { useRouter } from "next/router"; import useSWRInfinite from "swr/infinite"; // services import { ProjectService } from "services/project"; // ui import { CustomSearchSelect } from "@plane/ui"; // helpers import { truncateText } from "helpers/string.helper"; // types import { IWorkspaceIntegration } from "types"; type Props = { integration: IWorkspaceIntegration; value: any; label: string | JSX.Element; onChange: (repo: any) => void; characterLimit?: number; }; const projectService = new ProjectService(); export const SelectRepository: React.FC = (props) => { const { integration, value, label, onChange, characterLimit = 25 } = props; // router const router = useRouter(); const { workspaceSlug } = router.query; const getKey = (pageIndex: number) => { if (!workspaceSlug || !integration) return; return `${process.env.NEXT_PUBLIC_API_BASE_URL}/api/workspaces/${workspaceSlug}/workspace-integrations/${ integration.id }/github-repositories/?page=${++pageIndex}`; }; const fetchGithubRepos = async (url: string) => { const data = await projectService.getGithubRepositories(url); return data; }; const { data: paginatedData, size, setSize, isValidating } = useSWRInfinite(getKey, fetchGithubRepos); let userRepositories = (paginatedData ?? []).map((data) => data.repositories).flat(); userRepositories = userRepositories.filter((data) => data?.id); const totalCount = paginatedData && paginatedData.length > 0 ? paginatedData[0].total_count : 0; const options = userRepositories.map((repo) => ({ value: repo.id, query: repo.full_name, content:

{truncateText(repo.full_name, characterLimit)}

, })) ?? []; if (userRepositories.length < 1) return null; return ( { const repo = userRepositories.find((repo) => repo.id === val); onChange(repo); }} label={label} footerOption={ <> {userRepositories && options.length < totalCount && ( )} } optionsClassName="w-full" /> ); };