import type { RemoteData } from './RemoteData.tsx'; import { Box, IconButton, ListItem, ListItemButton, Typography, styled, } from '@mui/material'; import { ProjectIcon } from '../common/ProjectIcon/ProjectIcon.tsx'; import LinkIcon from '@mui/icons-material/ArrowForward'; import { ProjectSetupComplete } from './ProjectSetupComplete.tsx'; import { ConnectSDK, CreateFlag, ExistingFlag } from './ConnectSDK.tsx'; import { LatestProjectEvents } from './LatestProjectEvents.tsx'; import { RoleAndOwnerInfo } from './RoleAndOwnerInfo.tsx'; import { type ReactNode, useEffect, useRef, type FC } from 'react'; import type { PersonalDashboardProjectDetailsSchema, PersonalDashboardProjectDetailsSchemaRolesItem, PersonalDashboardSchemaAdminsItem, PersonalDashboardSchemaProjectOwnersItem, PersonalDashboardSchemaProjectsItem, } from 'openapi'; import { ContentGridContainer, EmptyGridItem, ListItemBox, listItemStyle, ProjectGrid, GridItem, SpacedGridItem, StyledList, StyledCardTitle, } from './SharedComponents.tsx'; import { ContactAdmins, DataError } from './ProjectDetailsError.tsx'; import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import { Link } from 'react-router-dom'; import { ActionBox } from './ActionBox.tsx'; import useLoading from 'hooks/useLoading'; import { NoProjectsContactAdmin } from './NoProjectsContactAdmin.tsx'; import { AskOwnerToAddYouToTheirProject } from './AskOwnerToAddYouToTheirProject.tsx'; import { useFlag } from '@unleash/proxy-client-react'; const ActiveProjectDetails: FC<{ project: PersonalDashboardSchemaProjectsItem; }> = ({ project }) => { const healthToTechDebtEnabled = useFlag('healthToTechDebt'); const techicalDebt = 100 - project.health; // TODO: health to technical debt from backend return ( {project.featureCount} flags {project.memberCount} members {healthToTechDebtEnabled ? techicalDebt : project.health}% {healthToTechDebtEnabled ? 'technical debt' : 'health'} ); }; const SkeletonDiv = styled('div')({ height: '80%', }); const ProjectListItem: FC<{ project: PersonalDashboardSchemaProjectsItem; selected: boolean; onClick: () => void; }> = ({ project, selected, onClick }) => { const activeProjectRef = useRef(null); const { trackEvent } = usePlausibleTracker(); useEffect(() => { if (activeProjectRef.current) { activeProjectRef.current.scrollIntoView({ block: 'start', inline: 'start', }); window.scrollTo({ top: 0 }); } }, []); return ( {project.name} { trackEvent('personal-dashboard', { props: { eventType: `Go to project from list`, }, }); }} > {selected ? : null} ); }; export const MyProjects: React.FC<{ projects: PersonalDashboardSchemaProjectsItem[]; personalDashboardProjectDetails: RemoteData; activeProject: string; setActiveProject: (project: string) => void; admins: PersonalDashboardSchemaAdminsItem[]; owners: PersonalDashboardSchemaProjectOwnersItem[]; }> = ({ projects, personalDashboardProjectDetails, setActiveProject, activeProject, admins, owners, }) => { const ref = useLoading(personalDashboardProjectDetails.state === 'loading'); const getGridContents = (): { list: ReactNode; box1: ReactNode; box2: ReactNode; } => { if (projects.length === 0) { return { list: ( You don't currently have access to any projects in the system. To get started, you can{' '} create your own project . Alternatively, you can review the available projects in the system and ask the owner for access. ), box1: , box2: , }; } const list = ( {projects.map((project) => ( setActiveProject(project.id)} /> ))} ); const [box1, box2] = (() => { switch (personalDashboardProjectDetails.state) { case 'success': { const activeProjectStage = personalDashboardProjectDetails.data.onboardingStatus .status ?? 'loading'; const onboardingStarted = activeProjectStage === 'onboarding-started'; if (activeProjectStage === 'onboarded') { return [ , , ]; } else if (onboardingStarted) { return [ , , ]; } else { return [ , , ]; } } case 'error': return [ , , ]; default: // loading return [ , , ]; } })(); return { list, box1, box2 }; }; const { list, box1, box2 } = getGridContents(); return ( {list} {box1} {box2} role.name, ) : [] } owners={ personalDashboardProjectDetails.state === 'success' ? personalDashboardProjectDetails.data.owners : [{ ownerType: 'user', name: '?' }] } /> ); };