import React, { useEffect, useState } from 'react'; import { Domain, DomainStatus } from 'gql-client'; import { Link, useNavigate, useOutletContext } from 'react-router-dom'; import { RequestError } from 'octokit'; import { useOctokit } from '../../../../context/OctokitContext'; import { GitCommitWithBranch, OutletContextType } from '../../../../types'; import { useGQLClient } from '../../../../context/GQLClientContext'; import { Button } from 'components/shared/Button'; import { Heading } from 'components/shared/Heading'; import { Avatar } from 'components/shared/Avatar'; import { getInitials } from 'utils/geInitials'; import { BranchStrokeIcon, CheckRoundFilledIcon, ClockIcon, CursorBoxIcon, GithubStrokeIcon, GlobeIcon, LinkIcon, StorageIcon, } from 'components/shared/CustomIcon'; import { Tag } from 'components/shared/Tag'; import { Activity } from 'components/projects/project/overview/Activity'; import { OverviewInfo } from 'components/projects/project/overview/OverviewInfo'; import { CalendarDaysIcon } from 'components/shared/CustomIcon/CalendarDaysIcon'; import { relativeTimeMs } from 'utils/time'; 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}
}> {liveDomain ? ( }> Connected ) : (
}> Not connected
)}
{project.deployments.length !== 0 ? ( <> {/* SOURCE */} }>
{project.deployments[0]?.branch}
{/* DATABASE */} }>
{/* // TODO: add db name dbname */}
{/* DEPLOYMENT */} }>
{liveDomain?.name}{' '}
{/* DEPLOYMENT DATE */} }>
{relativeTimeMs(project.deployments[0].createdAt)} by {project.deployments[0]?.createdBy?.name}
) : (

No current deployment found.

)}
); }; export default OverviewTabPanel;