import { Menu, MenuHandler, MenuItem, MenuList, } from '@snowballtools/material-tailwind-react-fork'; import { ComponentPropsWithoutRef, MouseEvent, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Project } from 'gql-client'; import { Avatar } from 'components/shared/Avatar'; import { Button } from 'components/shared/Button'; import { BranchIcon, ClockIcon, GithubLogoIcon, HorizontalDotIcon, WarningDiamondIcon, } from 'components/shared/CustomIcon'; import { Tooltip } from 'components/shared/Tooltip'; import { WavyBorder } from 'components/shared/WavyBorder'; import { relativeTimeMs } from 'utils/time'; import { getInitials } from 'utils/geInitials'; import { ProjectCardTheme, projectCardTheme } from './ProjectCard.theme'; export interface ProjectCardProps extends ComponentPropsWithoutRef<'div'>, ProjectCardTheme { project: Project; } // TODO: Update the whole component to use `Link` from `react-router-dom` and remove the `useNavigate` hook, // currently it's not possible to use `Link` because the dot menu is not a direct child of the `Link` component export const ProjectCard = ({ className, project, status = 'failure', ...props }: ProjectCardProps) => { const theme = projectCardTheme(); const hasDeployment = project.deployments.length > 0; // TODO: Update this to use the actual status from the API const hasError = status === 'failure'; const navigate = useNavigate(); const handleOptionsClick = ( e: MouseEvent, ) => { e.stopPropagation(); }; const handleClick = useCallback(() => { navigate(`projects/${project.id}`); }, [project.id, navigate]); const navigateToSettingsOnClick = useCallback( ( e: React.MouseEvent | React.MouseEvent, ) => { e.stopPropagation(); navigate(`projects/${project.id}/settings`); }, [project.id, navigate], ); return (
{/* Upper content */}
{/* Icon container */} {/* Title and website */}

{project.name}

{project.deployments[0]?.domain?.name ?? 'No domain'}

{/* Icons */}
{hasError && } Project settings Delete project
{/* Wave */} {/* Lower content */}
{/* Latest deployment */}
{/* Dot icon */}

{hasDeployment ? project.deployments[0]?.commitMessage : 'No production deployment'}

{/* Deployment and branch name */}
{hasDeployment ? ( <> {relativeTimeMs(project.deployments[0].createdAt)} on {project.deployments[0].branch} ) : ( <> Created {relativeTimeMs(project.createdAt)} )}
); };