Skip to content

Commit b9ff2e2

Browse files
Merge remote-tracking branch 'origin/main' into sshin/stripe-3
2 parents 6c42961 + 53ce439 commit b9ff2e2

File tree

91 files changed

+2609
-4080
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+2609
-4080
lines changed

src/App.test.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ const user = {
8484
student: false,
8585
studentCreatedAt: null,
8686
studentUpdatedAt: null,
87-
customerIntent: 'PERSONAL',
8887
},
8988
trackingMetadata: {
9089
service: 'github',
41 KB
Loading

src/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Router } from 'react-router-dom'
1212
import { CompatRouter } from 'react-router-dom-v5-compat'
1313

1414
import ErrorBoundary from 'layouts/shared/ErrorBoundary'
15+
import { initEventTracker } from 'services/events/events'
1516
import { withFeatureFlagProvider } from 'shared/featureFlags'
1617

1718
import App from './App'
@@ -38,6 +39,7 @@ const history = createBrowserHistory()
3839

3940
const TOO_MANY_REQUESTS_ERROR_CODE = 429
4041

42+
initEventTracker()
4143
setupSentry({ history })
4244

4345
const queryClient = new QueryClient({

src/layouts/BaseLayout/BaseLayout.test.tsx

Lines changed: 29 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,7 @@ const mockedUseImpersonate = useImpersonate as Mock
2727
vi.mock('shared/GlobalTopBanners', () => ({
2828
default: () => 'GlobalTopBanners',
2929
}))
30-
vi.mock('./InstallationHelpBanner', () => ({
31-
default: () => 'InstallationHelpBanner',
32-
}))
3330
vi.mock('pages/TermsOfService', () => ({ default: () => 'TermsOfService' }))
34-
vi.mock('pages/DefaultOrgSelector', () => ({
35-
default: () => 'DefaultOrgSelector',
36-
}))
3731
vi.mock('layouts/Header', () => ({ default: () => 'Header' }))
3832
vi.mock('layouts/Footer', () => ({ default: () => 'Footer' }))
3933

@@ -53,7 +47,6 @@ const mockUser = {
5347
student: false,
5448
studentCreatedAt: null,
5549
studentUpdatedAt: null,
56-
customerIntent: 'BUSINESS',
5750
externalId: 'asdf',
5851
owners: [
5952
{
@@ -170,6 +163,22 @@ const mockNavigatorData = {
170163
},
171164
}
172165

166+
const mockOwnerContext = {
167+
owner: {
168+
ownerid: 123,
169+
},
170+
}
171+
172+
const mockRepoContext = {
173+
owner: {
174+
repository: {
175+
__typename: 'Repository',
176+
repoid: 321,
177+
private: false,
178+
},
179+
},
180+
}
181+
173182
const server = setupServer()
174183
const queryClient = new QueryClient({
175184
defaultOptions: {
@@ -288,6 +297,14 @@ describe('BaseLayout', () => {
288297
graphql.query('NavigatorData', () => {
289298
return HttpResponse.json({ data: mockNavigatorData })
290299
}),
300+
graphql.query('OwnerContext', () => {
301+
return HttpResponse.json({ data: mockOwnerContext })
302+
}),
303+
graphql.query('RepoContext', () => {
304+
return HttpResponse.json({
305+
data: mockRepoContext,
306+
})
307+
}),
291308
http.get('/internal/users/current', () => {
292309
return HttpResponse.json({})
293310
})
@@ -306,9 +323,6 @@ describe('BaseLayout', () => {
306323
const hello = screen.getByText('hello')
307324
expect(hello).toBeInTheDocument()
308325

309-
const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
310-
expect(defaultOrg).not.toBeInTheDocument()
311-
312326
const termsOfService = screen.queryByText(/TermsOfService/)
313327
expect(termsOfService).not.toBeInTheDocument()
314328
})
@@ -328,9 +342,6 @@ describe('BaseLayout', () => {
328342
const hello = screen.getByText('hello')
329343
expect(hello).toBeInTheDocument()
330344

331-
const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
332-
expect(defaultOrg).not.toBeInTheDocument()
333-
334345
const termsOfService = screen.queryByText(/TermsOfService/)
335346
expect(termsOfService).not.toBeInTheDocument()
336347
})
@@ -361,68 +372,19 @@ describe('BaseLayout', () => {
361372
const header = screen.queryByText(/Header/)
362373
expect(header).not.toBeInTheDocument()
363374
})
364-
365-
it('renders help banner', async () => {
366-
setup({
367-
currentUser: userNoTermsAgreement,
368-
internalUser: mockUserNoTermsAgreement,
369-
})
370-
371-
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
372-
const helpBanner = await screen.findByText(/InstallationHelpBanner/)
373-
expect(helpBanner).toBeInTheDocument()
374-
})
375375
})
376376

377-
describe('when no default org selected', () => {
378-
it('renders the default org selector', async () => {
379-
setup({
380-
currentUser: loggedInUser,
381-
internalUser: mockUser,
382-
})
383-
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
384-
385-
const defaultOrgSelector = await screen.findByText(/DefaultOrgSelector/)
386-
expect(defaultOrgSelector).toBeInTheDocument()
387-
})
388-
389-
it('does not render the header', async () => {
390-
setup({
391-
currentUser: loggedInUser,
392-
internalUser: mockUser,
393-
})
394-
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
395-
396-
const defaultOrgSelector = await screen.findByText(/DefaultOrgSelector/)
397-
expect(defaultOrgSelector).toBeInTheDocument()
398-
399-
const header = screen.queryByText(/Header/)
400-
expect(header).not.toBeInTheDocument()
401-
})
402-
403-
it('renders help banner', async () => {
404-
setup({
405-
currentUser: loggedInUser,
406-
internalUser: mockUser,
407-
})
408-
409-
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
410-
const helpBanner = await screen.findByText(/InstallationHelpBanner/)
411-
expect(helpBanner).toBeInTheDocument()
412-
})
413-
})
414-
415-
describe('when agreed to TOS and default org selected', () => {
377+
describe('when agreed to TOS', () => {
416378
it('renders children', async () => {
417-
setup({ currentUser: userHasDefaultOrg })
379+
setup({ currentUser: loggedInUser })
418380
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
419381

420382
const children = await screen.findByText(/hello/)
421383
expect(children).toBeInTheDocument()
422384
})
423385

424386
it('renders header', async () => {
425-
setup({ currentUser: userHasDefaultOrg })
387+
setup({ currentUser: loggedInUser })
426388
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
427389

428390
const header = await screen.findByText(/Header/)
@@ -464,9 +426,6 @@ describe('BaseLayout', () => {
464426
const hello = screen.getByText('hello')
465427
expect(hello).toBeInTheDocument()
466428

467-
const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
468-
expect(defaultOrg).not.toBeInTheDocument()
469-
470429
const termsOfService = screen.queryByText(/TermsOfService/)
471430
expect(termsOfService).not.toBeInTheDocument()
472431
})
@@ -486,9 +445,6 @@ describe('BaseLayout', () => {
486445
const hello = screen.getByText('hello')
487446
expect(hello).toBeInTheDocument()
488447

489-
const defaultOrg = screen.queryByText(/DefaultOrgSelector/)
490-
expect(defaultOrg).not.toBeInTheDocument()
491-
492448
const termsOfService = screen.queryByText(/TermsOfService/)
493449
expect(termsOfService).not.toBeInTheDocument()
494450
})
@@ -526,23 +482,20 @@ describe('BaseLayout', () => {
526482

527483
const header = await screen.findByText(/Header/)
528484
expect(header).toBeInTheDocument()
529-
530-
const defaultOrgSelector = screen.queryByText(/DefaultOrgSelector/)
531-
expect(defaultOrgSelector).not.toBeInTheDocument()
532485
})
533486
})
534487

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

540493
const children = await screen.findByText(/hello/)
541494
expect(children).toBeInTheDocument()
542495
})
543496

544497
it('renders header', async () => {
545-
setup({ currentUser: userHasDefaultOrg })
498+
setup({ currentUser: loggedInUser })
546499
render(<BaseLayout>hello</BaseLayout>, { wrapper: wrapper() })
547500

548501
const header = await screen.findByText(/Header/)

src/layouts/BaseLayout/BaseLayout.tsx

Lines changed: 46 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import { EmptyErrorComponent } from 'layouts/shared/ErrorBoundary/ErrorBoundary'
99
import NetworkErrorBoundary from 'layouts/shared/NetworkErrorBoundary'
1010
import SilentNetworkErrorWrapper from 'layouts/shared/SilentNetworkErrorWrapper'
1111
import ToastNotifications from 'layouts/ToastNotifications'
12+
import { OnboardingContainerProvider } from 'pages/OwnerPage/OnboardingContainerContext/context'
1213
import { RepoBreadcrumbProvider } from 'pages/RepoPage/context'
14+
import { useEventContext } from 'services/events/hooks'
1315
import { useImpersonate } from 'services/impersonate'
1416
import { useTracking } from 'services/tracking'
1517
import GlobalBanners from 'shared/GlobalBanners'
@@ -19,8 +21,6 @@ import LoadingLogo from 'ui/LoadingLogo'
1921
import { NavigatorDataQueryOpts } from './hooks/NavigatorDataQueryOpts'
2022
import { useUserAccessGate } from './hooks/useUserAccessGate'
2123

22-
const DefaultOrgSelector = lazy(() => import('pages/DefaultOrgSelector'))
23-
const InstallationHelpBanner = lazy(() => import('./InstallationHelpBanner'))
2424
const TermsOfService = lazy(() => import('pages/TermsOfService'))
2525

2626
const FullPageLoader = () => (
@@ -30,20 +30,16 @@ const FullPageLoader = () => (
3030
)
3131

3232
interface OnboardingOrChildrenProps extends React.PropsWithChildren {
33-
isImpersonating: boolean
3433
isFullExperience: boolean
3534
showAgreeToTerms: boolean
3635
redirectToSyncPage: boolean
37-
showDefaultOrgSelector: boolean
3836
}
3937

4038
function OnboardingOrChildren({
4139
children,
42-
isImpersonating,
4340
isFullExperience,
4441
showAgreeToTerms,
4542
redirectToSyncPage,
46-
showDefaultOrgSelector,
4743
}: OnboardingOrChildrenProps) {
4844
if (showAgreeToTerms && !isFullExperience) {
4945
return (
@@ -57,14 +53,6 @@ function OnboardingOrChildren({
5753
return <Redirect to="/sync" />
5854
}
5955

60-
if (showDefaultOrgSelector && !isFullExperience && !isImpersonating) {
61-
return (
62-
<Suspense fallback={null}>
63-
<DefaultOrgSelector />
64-
</Suspense>
65-
)
66-
}
67-
6856
return <>{children}</>
6957
}
7058

@@ -77,11 +65,11 @@ interface URLParams {
7765
function BaseLayout({ children }: React.PropsWithChildren) {
7866
const { provider, owner, repo } = useParams<URLParams>()
7967
useTracking()
68+
useEventContext()
8069
const { isImpersonating } = useImpersonate()
8170
const {
8271
isFullExperience,
8372
showAgreeToTerms,
84-
showDefaultOrgSelector,
8573
redirectToSyncPage,
8674
isLoading: isUserAccessGateLoading,
8775
} = useUserAccessGate()
@@ -107,53 +95,49 @@ function BaseLayout({ children }: React.PropsWithChildren) {
10795

10896
return (
10997
<>
110-
<RepoBreadcrumbProvider>
111-
{/* Header */}
112-
<Suspense>
113-
<ErrorBoundary errorComponent={<EmptyErrorComponent />}>
114-
<SilentNetworkErrorWrapper>
115-
{isFullExperience || isImpersonating ? (
116-
<>
117-
<GlobalTopBanners />
118-
<Header hasRepoAccess={data?.hasRepoAccess} />
119-
</>
120-
) : (
121-
<>
122-
{showDefaultOrgSelector ? <InstallationHelpBanner /> : null}
123-
</>
124-
)}
125-
</SilentNetworkErrorWrapper>
126-
</ErrorBoundary>
127-
</Suspense>
128-
129-
{/* Main Page Contents */}
130-
<Suspense fallback={<FullPageLoader />}>
131-
<ErrorBoundary sentryScopes={[['layout', 'base']]}>
132-
<NetworkErrorBoundary>
133-
<main className="container mb-8 flex grow flex-col gap-2 md:p-0">
134-
<GlobalBanners />
135-
<OnboardingOrChildren
136-
isFullExperience={isFullExperience}
137-
showAgreeToTerms={showAgreeToTerms}
138-
showDefaultOrgSelector={showDefaultOrgSelector}
139-
redirectToSyncPage={redirectToSyncPage}
140-
isImpersonating={isImpersonating}
141-
>
142-
{children}
143-
</OnboardingOrChildren>
144-
</main>
145-
</NetworkErrorBoundary>
146-
</ErrorBoundary>
147-
</Suspense>
148-
149-
{/* Footer */}
150-
{isFullExperience && (
151-
<>
152-
<Footer />
153-
<ToastNotifications />
154-
</>
155-
)}
156-
</RepoBreadcrumbProvider>
98+
<OnboardingContainerProvider>
99+
<RepoBreadcrumbProvider>
100+
{/* Header */}
101+
<Suspense>
102+
<ErrorBoundary errorComponent={<EmptyErrorComponent />}>
103+
<SilentNetworkErrorWrapper>
104+
{isFullExperience || isImpersonating ? (
105+
<>
106+
<GlobalTopBanners />
107+
<Header hasRepoAccess={data?.hasRepoAccess} />
108+
</>
109+
) : null}
110+
</SilentNetworkErrorWrapper>
111+
</ErrorBoundary>
112+
</Suspense>
113+
114+
{/* Main Page Contents */}
115+
<Suspense fallback={<FullPageLoader />}>
116+
<ErrorBoundary sentryScopes={[['layout', 'base']]}>
117+
<NetworkErrorBoundary>
118+
<main className="container mb-8 flex grow flex-col gap-2 md:p-0">
119+
<GlobalBanners />
120+
<OnboardingOrChildren
121+
isFullExperience={isFullExperience}
122+
showAgreeToTerms={showAgreeToTerms}
123+
redirectToSyncPage={redirectToSyncPage}
124+
>
125+
{children}
126+
</OnboardingOrChildren>
127+
</main>
128+
</NetworkErrorBoundary>
129+
</ErrorBoundary>
130+
</Suspense>
131+
132+
{/* Footer */}
133+
{isFullExperience ? (
134+
<>
135+
<Footer />
136+
<ToastNotifications />
137+
</>
138+
) : null}
139+
</RepoBreadcrumbProvider>
140+
</OnboardingContainerProvider>
157141
</>
158142
)
159143
}

0 commit comments

Comments
 (0)