import React, { useEffect, useState } from 'react'; import { Domain, DomainStatus } from 'gql-client'; import { useNavigate, useOutletContext } from 'react-router-dom'; import { RequestError } from 'octokit'; import { Typography, Chip, Avatar, Tooltip } from '@material-tailwind/react'; import ActivityCard from '../../../../components/projects/project/ActivityCard'; import { relativeTimeMs } from '../../../../utils/time'; import { useOctokit } from '../../../../context/OctokitContext'; import { GitCommitWithBranch, OutletContextType } from '../../../../types'; import { useGQLClient } from '../../../../context/GQLClientContext'; import { formatAddress } from '../../../../utils/format'; import { Button } from 'components/shared/Button'; import { Heading } from 'components/shared/Heading'; const COMMITS_PER_PAGE = 4; const OverviewTabPanel = () => { const { octokit } = useOctokit(); const navigate = useNavigate(); const [activities, setActivities] = useState([]); const [liveDomain, setLiveDomain] = useState(); const client = useGQLClient(); const { project } = useOutletContext(); useEffect(() => { // TODO: Save repo commits in DB and avoid using GitHub API in frontend // TODO: Figure out fetching latest commits for all branches const fetchRepoActivity = async () => { try { const [owner, repo] = project.repository.split('/'); if (!repo) { // Do not fetch branches if repo not available return; } // Get all branches in project repo const result = await octokit.rest.repos.listBranches({ owner, repo, }); // Get first 4 commits from repo branches const commitsByBranchPromises = result.data.map(async (branch) => { const result = await octokit.rest.repos.listCommits({ owner, repo, sha: branch.commit.sha, per_page: COMMITS_PER_PAGE, }); return result.data.map((data) => ({ ...data, branch, })); }); const commitsByBranch = await Promise.all(commitsByBranchPromises); const commitsWithBranch = commitsByBranch.flat(); // Order commits by date and set latest 4 commits in activity section const orderedCommits = commitsWithBranch .sort( (a, b) => new Date(b.commit.author!.date!).getTime() - new Date(a.commit.author!.date!).getTime(), ) .slice(0, COMMITS_PER_PAGE); setActivities(orderedCommits); } catch (err) { if (!(err instanceof RequestError)) { throw err; } // TODO: Show warning in activity section on request error console.log(err.message); } }; fetchRepoActivity(); }, [octokit, project]); useEffect(() => { const fetchLiveProdDomain = async () => { const { domains } = await client.getDomains(project.id, { branch: project.prodBranch, status: DomainStatus.Live, }); if (domains.length === 0) { return; } setLiveDomain(domains[0]); }; fetchLiveProdDomain(); }, [project]); return (
{project.name} {project.subDomain}
^ Domain
{liveDomain ? ( ) : (
)}
{project.deployments.length !== 0 ? ( <>

^ Source

^ {project.deployments[0]?.branch}

^ Deployment

{liveDomain?.name}

^ Created

{relativeTimeMs(project.deployments[0].createdAt)} by ^{' '} {formatAddress(project.deployments[0].createdBy.name ?? '')}

) : (
No current deployment found
)}
Activity
{activities.map((activity, index) => { return ( ); })}
); }; export default OverviewTabPanel;