import React, { useCallback, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { Spinner } from '@snowballtools/material-tailwind-react-fork'; import { relativeTimeISO } from 'utils/time'; import { GitRepositoryDetails } from '../../../../types/types'; import { useGQLClient } from 'context/GQLClientContext'; import { ArrowRightCircleIcon, GithubIcon, LockIcon, } from 'components/shared/CustomIcon'; import { Button } from 'components/shared/Button'; import { useToast } from 'components/shared/Toast'; interface ProjectRepoCardProps { repository: GitRepositoryDetails; } export const ProjectRepoCard: React.FC = ({ repository, }) => { const client = useGQLClient(); const navigate = useNavigate(); const [isLoading, setIsLoading] = useState(false); const { orgSlug } = useParams(); const { toast, dismiss } = useToast(); const createProject = useCallback(async () => { if (!repository || !orgSlug) { return toast({ id: 'missing-repository-or-org-slug', title: 'Repository or organization slug is missing', variant: 'error', onDismiss: dismiss, }); } try { setIsLoading(true); const { addProject } = await client.addProject(orgSlug, { name: `${repository.owner?.login}-${repository.name}`, prodBranch: repository.default_branch as string, repository: repository.full_name, // TODO: Compute template from repo template: 'webapp', }); if (addProject) { navigate(`import?projectId=${addProject.id}`); } else { toast({ id: 'failed-to-create-project', title: 'Failed to create project', variant: 'error', onDismiss: dismiss, }); } } catch (error) { console.error((error as Error).message); toast({ id: 'failed-to-create-project', title: 'Failed to create project', variant: 'error', onDismiss: dismiss, }); } finally { setIsLoading(false); } }, [client, repository, orgSlug, setIsLoading, navigate, toast]); return (
{/* Icon container */}
{/* Content */}

{repository.full_name}

{repository.updated_at && relativeTimeISO(repository.updated_at)}

{repository.visibility === 'private' && (
Private
)}
{/* Right action */} {isLoading ? ( ) : ( )}
); };