import {Fragment} from 'react'; import styled from '@emotion/styled'; /* TODO: replace with I/O when finished */ import img from 'sentry-images/spot/hair-on-fire.svg'; import Button from 'app/components/button'; import ButtonBar from 'app/components/buttonBar'; import PageHeading from 'app/components/pageHeading'; import {t} from 'app/locale'; import ConfigStore from 'app/stores/configStore'; import space from 'app/styles/space'; import {Organization, Project} from 'app/types'; import withProjects from 'app/utils/withProjects'; type Props = React.PropsWithChildren<{ organization: Organization; projects: Project[]; loadingProjects: boolean; superuserNeedsToBeProjectMember?: boolean; }>; function NoProjectMessage({ children, organization, projects, loadingProjects, superuserNeedsToBeProjectMember, }: Props) { const orgSlug = organization.slug; const canCreateProject = organization.access.includes('project:write'); const canJoinTeam = organization.access.includes('team:read'); const {isSuperuser} = ConfigStore.get('user'); const orgHasProjects = !!projects?.length; const hasProjectAccess = isSuperuser && !superuserNeedsToBeProjectMember ? !!projects?.some(p => p.hasAccess) : !!projects?.some(p => p.isMember && p.hasAccess); if (hasProjectAccess || loadingProjects) { return {children}; } // If the organization has some projects, but the user doesn't have access to // those projects, the primary action is to Join a Team. Otherwise the primary // action is to create a project. const joinTeamAction = ( ); const createProjectAction = ( ); return ( {t('Nothing {t('Remain Calm')} {t('You need at least one project to use this view')} {!orgHasProjects ? ( createProjectAction ) : ( {joinTeamAction} {createProjectAction} )} ); } const StyledPageHeading = styled(PageHeading)` font-size: 28px; margin-bottom: ${space(1.5)}; `; const HelpMessage = styled('div')` margin-bottom: ${space(2)}; `; const Flex = styled('div')` display: flex; `; const Wrapper = styled(Flex)` flex: 1; align-items: center; justify-content: center; `; const HeightWrapper = styled(Flex)` height: 350px; `; const Content = styled(Flex)` flex-direction: column; justify-content: center; margin-left: 40px; `; const Actions = styled(ButtonBar)` width: fit-content; `; export default withProjects(NoProjectMessage);