Skip to content

Commit

Permalink
feat: Add appless pre-PAT onboarding container (#3629)
Browse files Browse the repository at this point in the history
New onboarding container and install codecov modal
  • Loading branch information
calvin-codecov authored Jan 22, 2025
1 parent 2e32017 commit 80e41a8
Show file tree
Hide file tree
Showing 50 changed files with 545 additions and 3,524 deletions.
1 change: 0 additions & 1 deletion src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ const user = {
student: false,
studentCreatedAt: null,
studentUpdatedAt: null,
customerIntent: 'PERSONAL',
},
trackingMetadata: {
service: 'github',
Expand Down
7 changes: 5 additions & 2 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { ThemeContextProvider } from 'shared/ThemeContext'

import AccountSettings from './pages/AccountSettings'
import AdminSettings from './pages/AdminSettings'
import { OnboardingContainerProvider } from './pages/OwnerPage/OnboardingContainerContext/context'
const AnalyticsPage = lazy(() => import('./pages/AnalyticsPage'))
const CodecovAIPage = lazy(() => import('./pages/CodecovAIPage'))
const CommitDetailPage = lazy(() => import('./pages/CommitDetailPage'))
Expand Down Expand Up @@ -197,8 +198,10 @@ function App() {
<>
<ThemeContextProvider>
<ToastNotificationProvider>
<ReactQueryDevtools initialIsOpen={false} />
<MainAppRoutes />
<OnboardingContainerProvider>
<ReactQueryDevtools initialIsOpen={false} />
<MainAppRoutes />
</OnboardingContainerProvider>
</ToastNotificationProvider>
<Toaster />
</ThemeContextProvider>
Expand Down
Binary file added src/assets/onboarding/org_list_install_app.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
81 changes: 5 additions & 76 deletions src/layouts/BaseLayout/BaseLayout.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,7 @@ const mockedUseImpersonate = useImpersonate as Mock
vi.mock('shared/GlobalTopBanners', () => ({
default: () => 'GlobalTopBanners',
}))
vi.mock('./InstallationHelpBanner', () => ({
default: () => 'InstallationHelpBanner',
}))
vi.mock('pages/TermsOfService', () => ({ default: () => 'TermsOfService' }))
vi.mock('pages/DefaultOrgSelector', () => ({
default: () => 'DefaultOrgSelector',
}))
vi.mock('layouts/Header', () => ({ default: () => 'Header' }))
vi.mock('layouts/Footer', () => ({ default: () => 'Footer' }))

Expand All @@ -53,7 +47,6 @@ const mockUser = {
student: false,
studentCreatedAt: null,
studentUpdatedAt: null,
customerIntent: 'BUSINESS',
externalId: 'asdf',
owners: [
{
Expand Down Expand Up @@ -330,9 +323,6 @@ describe('BaseLayout', () => {
const hello = screen.getByText('hello')
expect(hello).toBeInTheDocument()

const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
expect(defaultOrg).not.toBeInTheDocument()

const termsOfService = screen.queryByText(/TermsOfService/)
expect(termsOfService).not.toBeInTheDocument()
})
Expand All @@ -352,9 +342,6 @@ describe('BaseLayout', () => {
const hello = screen.getByText('hello')
expect(hello).toBeInTheDocument()

const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
expect(defaultOrg).not.toBeInTheDocument()

const termsOfService = screen.queryByText(/TermsOfService/)
expect(termsOfService).not.toBeInTheDocument()
})
Expand Down Expand Up @@ -385,68 +372,19 @@ describe('BaseLayout', () => {
const header = screen.queryByText(/Header/)
expect(header).not.toBeInTheDocument()
})

it('renders help banner', async () => {
setup({
currentUser: userNoTermsAgreement,
internalUser: mockUserNoTermsAgreement,
})

render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
const helpBanner = await screen.findByText(/InstallationHelpBanner/)
expect(helpBanner).toBeInTheDocument()
})
})

describe('when no default org selected', () => {
it('renders the default org selector', async () => {
setup({
currentUser: loggedInUser,
internalUser: mockUser,
})
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const defaultOrgSelector = await screen.findByText(/DefaultOrgSelector/)
expect(defaultOrgSelector).toBeInTheDocument()
})

it('does not render the header', async () => {
setup({
currentUser: loggedInUser,
internalUser: mockUser,
})
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const defaultOrgSelector = await screen.findByText(/DefaultOrgSelector/)
expect(defaultOrgSelector).toBeInTheDocument()

const header = screen.queryByText(/Header/)
expect(header).not.toBeInTheDocument()
})

it('renders help banner', async () => {
setup({
currentUser: loggedInUser,
internalUser: mockUser,
})

render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
const helpBanner = await screen.findByText(/InstallationHelpBanner/)
expect(helpBanner).toBeInTheDocument()
})
})

describe('when agreed to TOS and default org selected', () => {
describe('when agreed to TOS', () => {
it('renders children', async () => {
setup({ currentUser: userHasDefaultOrg })
setup({ currentUser: loggedInUser })
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const children = await screen.findByText(/hello/)
expect(children).toBeInTheDocument()
})

it('renders header', async () => {
setup({ currentUser: userHasDefaultOrg })
setup({ currentUser: loggedInUser })
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const header = await screen.findByText(/Header/)
Expand Down Expand Up @@ -488,9 +426,6 @@ describe('BaseLayout', () => {
const hello = screen.getByText('hello')
expect(hello).toBeInTheDocument()

const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
expect(defaultOrg).not.toBeInTheDocument()

const termsOfService = screen.queryByText(/TermsOfService/)
expect(termsOfService).not.toBeInTheDocument()
})
Expand All @@ -510,9 +445,6 @@ describe('BaseLayout', () => {
const hello = screen.getByText('hello')
expect(hello).toBeInTheDocument()

const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
expect(defaultOrg).not.toBeInTheDocument()

const termsOfService = screen.queryByText(/TermsOfService/)
expect(termsOfService).not.toBeInTheDocument()
})
Expand Down Expand Up @@ -550,23 +482,20 @@ describe('BaseLayout', () => {

const header = await screen.findByText(/Header/)
expect(header).toBeInTheDocument()

const defaultOrgSelector = screen.queryByText(/DefaultOrgSelector/)
expect(defaultOrgSelector).not.toBeInTheDocument()
})
})

describe('when agreed to TOS and default org selected', () => {
it('renders children', async () => {
setup({ currentUser: userHasDefaultOrg })
setup({ currentUser: loggedInUser })
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const children = await screen.findByText(/hello/)
expect(children).toBeInTheDocument()
})

it('renders header', async () => {
setup({ currentUser: userHasDefaultOrg })
setup({ currentUser: loggedInUser })
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })

const header = await screen.findByText(/Header/)
Expand Down
27 changes: 3 additions & 24 deletions src/layouts/BaseLayout/BaseLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import LoadingLogo from 'ui/LoadingLogo'
import { NavigatorDataQueryOpts } from './hooks/NavigatorDataQueryOpts'
import { useUserAccessGate } from './hooks/useUserAccessGate'

const DefaultOrgSelector = lazy(() => import('pages/DefaultOrgSelector'))
const InstallationHelpBanner = lazy(() => import('./InstallationHelpBanner'))
const TermsOfService = lazy(() => import('pages/TermsOfService'))

const FullPageLoader = () => (
Expand All @@ -31,20 +29,16 @@ const FullPageLoader = () => (
)

interface OnboardingOrChildrenProps extends React.PropsWithChildren {
isImpersonating: boolean
isFullExperience: boolean
showAgreeToTerms: boolean
redirectToSyncPage: boolean
showDefaultOrgSelector: boolean
}

function OnboardingOrChildren({
children,
isImpersonating,
isFullExperience,
showAgreeToTerms,
redirectToSyncPage,
showDefaultOrgSelector,
}: OnboardingOrChildrenProps) {
if (showAgreeToTerms && !isFullExperience) {
return (
Expand All @@ -58,14 +52,6 @@ function OnboardingOrChildren({
return <Redirect to="/sync" />
}

if (showDefaultOrgSelector && !isFullExperience && !isImpersonating) {
return (
<Suspense fallback={null}>
<DefaultOrgSelector />
</Suspense>
)
}

return <>{children}</>
}

Expand All @@ -83,7 +69,6 @@ function BaseLayout({ children }: React.PropsWithChildren) {
const {
isFullExperience,
showAgreeToTerms,
showDefaultOrgSelector,
redirectToSyncPage,
isLoading: isUserAccessGateLoading,
} = useUserAccessGate()
Expand Down Expand Up @@ -119,11 +104,7 @@ function BaseLayout({ children }: React.PropsWithChildren) {
<GlobalTopBanners />
<Header hasRepoAccess={data?.hasRepoAccess} />
</>
) : (
<>
{showDefaultOrgSelector ? <InstallationHelpBanner /> : null}
</>
)}
) : null}
</SilentNetworkErrorWrapper>
</ErrorBoundary>
</Suspense>
Expand All @@ -137,9 +118,7 @@ function BaseLayout({ children }: React.PropsWithChildren) {
<OnboardingOrChildren
isFullExperience={isFullExperience}
showAgreeToTerms={showAgreeToTerms}
showDefaultOrgSelector={showDefaultOrgSelector}
redirectToSyncPage={redirectToSyncPage}
isImpersonating={isImpersonating}
>
{children}
</OnboardingOrChildren>
Expand All @@ -149,12 +128,12 @@ function BaseLayout({ children }: React.PropsWithChildren) {
</Suspense>

{/* Footer */}
{isFullExperience && (
{isFullExperience ? (
<>
<Footer />
<ToastNotifications />
</>
)}
) : null}
</RepoBreadcrumbProvider>
</>
)
Expand Down

This file was deleted.

Loading

0 comments on commit 80e41a8

Please sign in to comment.