|
import React from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { I18nKey } from "#/i18n/declaration";
|
|
import { SuggestionBox } from "#/components/features/suggestions/suggestion-box";
|
|
import GitHubLogo from "#/assets/branding/github-logo.svg?react";
|
|
import { GitHubRepositorySelector } from "./github-repo-selector";
|
|
import { ModalButton } from "#/components/shared/buttons/modal-button";
|
|
import { ConnectToGitHubModal } from "#/components/shared/modals/connect-to-github-modal";
|
|
import { ModalBackdrop } from "#/components/shared/modals/modal-backdrop";
|
|
import { isGitHubErrorReponse } from "#/api/github-axios-instance";
|
|
import { useAppRepositories } from "#/hooks/query/use-app-repositories";
|
|
import { useSearchRepositories } from "#/hooks/query/use-search-repositories";
|
|
import { useUserRepositories } from "#/hooks/query/use-user-repositories";
|
|
import { sanitizeQuery } from "#/utils/sanitize-query";
|
|
import { useDebounce } from "#/hooks/use-debounce";
|
|
|
|
interface GitHubRepositoriesSuggestionBoxProps {
|
|
handleSubmit: () => void;
|
|
gitHubAuthUrl: string | null;
|
|
user: GitHubErrorReponse | GitHubUser | null;
|
|
}
|
|
|
|
export function GitHubRepositoriesSuggestionBox({
|
|
handleSubmit,
|
|
gitHubAuthUrl,
|
|
user,
|
|
}: GitHubRepositoriesSuggestionBoxProps) {
|
|
const { t } = useTranslation();
|
|
const [connectToGitHubModalOpen, setConnectToGitHubModalOpen] =
|
|
React.useState(false);
|
|
const [searchQuery, setSearchQuery] = React.useState<string>("");
|
|
const debouncedSearchQuery = useDebounce(searchQuery, 300);
|
|
|
|
|
|
const { data: appRepositories } = useAppRepositories();
|
|
const { data: userRepositories } = useUserRepositories();
|
|
const { data: searchedRepos } = useSearchRepositories(
|
|
sanitizeQuery(debouncedSearchQuery),
|
|
);
|
|
|
|
const repositories =
|
|
userRepositories?.pages.flatMap((page) => page.data) ||
|
|
appRepositories?.pages.flatMap((page) => page.data) ||
|
|
[];
|
|
|
|
const handleConnectToGitHub = () => {
|
|
if (gitHubAuthUrl) {
|
|
window.location.href = gitHubAuthUrl;
|
|
} else {
|
|
setConnectToGitHubModalOpen(true);
|
|
}
|
|
};
|
|
|
|
const isLoggedIn = !!user && !isGitHubErrorReponse(user);
|
|
|
|
return (
|
|
<>
|
|
<SuggestionBox
|
|
title={t(I18nKey.LANDING$OPEN_REPO)}
|
|
content={
|
|
isLoggedIn ? (
|
|
<GitHubRepositorySelector
|
|
onInputChange={setSearchQuery}
|
|
onSelect={handleSubmit}
|
|
publicRepositories={searchedRepos || []}
|
|
userRepositories={repositories}
|
|
/>
|
|
) : (
|
|
<ModalButton
|
|
text={t(I18nKey.GITHUB$CONNECT)}
|
|
icon={<GitHubLogo width={20} height={20} />}
|
|
className="bg-[#791B80] w-full"
|
|
onClick={handleConnectToGitHub}
|
|
/>
|
|
)
|
|
}
|
|
/>
|
|
{connectToGitHubModalOpen && (
|
|
<ModalBackdrop onClose={() => setConnectToGitHubModalOpen(false)}>
|
|
<ConnectToGitHubModal
|
|
onClose={() => setConnectToGitHubModalOpen(false)}
|
|
/>
|
|
</ModalBackdrop>
|
|
)}
|
|
</>
|
|
);
|
|
}
|
|
|