Browse Source

move upsell hook under header (#80143)

When in the domain view, the insights upsell pages should not take up
the entire screen, instead the header should persist.

This is a big one, there is a lot of lines changed here, but there
actually isn't much going on! This PR does 2 changes
1. Creates a `ModuleBodyUpsellHook` that wraps around all module bodies,
the component renders out the upsell if the module is rendered within a
domain view. (this is why there's so many lines changed)
2. When the user is in a domain view, the `ModuleUpsellHook` is disabled
in the `ModulePageProviders` component so that they don't appear full
screen, and are then rendered by `ModuleBodyUpsellHook`.

Note: The styling looks poor here, we'll have to make some adjustments
to the upsell styling in `getsentry` in an alternate PR.

<img width="1507" alt="image"
src="https://github.com/user-attachments/assets/1354ccc9-0c61-47ad-abae-ef5f543d54ed">
Dominik Buszowiecki 4 months ago
parent
commit
a067f68c89

+ 56 - 53
static/app/views/insights/browser/resources/views/resourceSummaryPage.tsx

@@ -25,6 +25,7 @@ import {useResourceModuleFilters} from 'sentry/views/insights/browser/resources/
 import {HeaderContainer} from 'sentry/views/insights/common/components/headerContainer';
 import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
 import {useSpanMetrics} from 'sentry/views/insights/common/queries/useDiscover';
 import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
@@ -131,63 +132,65 @@ function ResourceSummary() {
         />
       )}
 
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          <ModuleLayout.Layout>
-            <ModuleLayout.Full>
-              <HeaderContainer>
-                <ToolRibbon>
-                  <PageFilterBar condensed>
-                    <ProjectPageFilter />
-                    <EnvironmentPageFilter />
-                    <DatePageFilter />
-                  </PageFilterBar>
-
-                  <RenderBlockingSelector
-                    value={filters[RESOURCE_RENDER_BLOCKING_STATUS] || ''}
+      <ModuleBodyUpsellHook moduleName={ModuleName.RESOURCE}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            <ModuleLayout.Layout>
+              <ModuleLayout.Full>
+                <HeaderContainer>
+                  <ToolRibbon>
+                    <PageFilterBar condensed>
+                      <ProjectPageFilter />
+                      <EnvironmentPageFilter />
+                      <DatePageFilter />
+                    </PageFilterBar>
+
+                    <RenderBlockingSelector
+                      value={filters[RESOURCE_RENDER_BLOCKING_STATUS] || ''}
+                    />
+                    <SubregionSelector />
+                  </ToolRibbon>
+                  <ResourceInfo
+                    isLoading={isPending}
+                    avgContentLength={spanMetrics[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`]}
+                    avgDecodedContentLength={
+                      spanMetrics[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`]
+                    }
+                    avgTransferSize={spanMetrics[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`]}
+                    avgDuration={spanMetrics[`avg(${SPAN_SELF_TIME})`]}
+                    throughput={spanMetrics['spm()']}
+                    timeSpentTotal={spanMetrics[`sum(${SPAN_SELF_TIME})`]}
+                    timeSpentPercentage={spanMetrics[`time_spent_percentage()`]}
                   />
-                  <SubregionSelector />
-                </ToolRibbon>
-                <ResourceInfo
-                  isLoading={isPending}
-                  avgContentLength={spanMetrics[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`]}
-                  avgDecodedContentLength={
-                    spanMetrics[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`]
-                  }
-                  avgTransferSize={spanMetrics[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`]}
-                  avgDuration={spanMetrics[`avg(${SPAN_SELF_TIME})`]}
-                  throughput={spanMetrics['spm()']}
-                  timeSpentTotal={spanMetrics[`sum(${SPAN_SELF_TIME})`]}
-                  timeSpentPercentage={spanMetrics[`time_spent_percentage()`]}
-                />
-              </HeaderContainer>
-            </ModuleLayout.Full>
+                </HeaderContainer>
+              </ModuleLayout.Full>
+
+              {isImage && (
+                <ModuleLayout.Full>
+                  <SampleImages groupId={groupId} projectId={data?.[0]?.['project.id']} />
+                </ModuleLayout.Full>
+              )}
+
+              <ResourceSummaryCharts groupId={groupId} />
 
-            {isImage && (
               <ModuleLayout.Full>
-                <SampleImages groupId={groupId} projectId={data?.[0]?.['project.id']} />
+                <ResourceSummaryTable />
+              </ModuleLayout.Full>
+
+              <ModuleLayout.Full>
+                <SampleList
+                  transactionRoute={webVitalsModuleURL}
+                  subregions={filters[SpanMetricsField.USER_GEO_SUBREGION]}
+                  groupId={groupId}
+                  moduleName={ModuleName.RESOURCE}
+                  transactionName={transaction as string}
+                  referrer={TraceViewSources.ASSETS_MODULE}
+                />
               </ModuleLayout.Full>
-            )}
-
-            <ResourceSummaryCharts groupId={groupId} />
-
-            <ModuleLayout.Full>
-              <ResourceSummaryTable />
-            </ModuleLayout.Full>
-
-            <ModuleLayout.Full>
-              <SampleList
-                transactionRoute={webVitalsModuleURL}
-                subregions={filters[SpanMetricsField.USER_GEO_SUBREGION]}
-                groupId={groupId}
-                moduleName={ModuleName.RESOURCE}
-                transactionName={transaction as string}
-                referrer={TraceViewSources.ASSETS_MODULE}
-              />
-            </ModuleLayout.Full>
-          </ModuleLayout.Layout>
-        </Layout.Main>
-      </Layout.Body>
+            </ModuleLayout.Layout>
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
     </React.Fragment>
   );
 }

+ 32 - 29
static/app/views/insights/browser/resources/views/resourcesLandingPage.tsx

@@ -24,6 +24,7 @@ import {HeaderContainer} from 'sentry/views/insights/common/components/headerCon
 import {ModulePageFilterBar} from 'sentry/views/insights/common/components/modulePageFilterBar';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
 import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
 import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
 import {DomainSelector} from 'sentry/views/insights/common/views/spans/selectors/domainSelector';
@@ -77,35 +78,37 @@ function ResourcesLandingPage() {
             module={ModuleName.RESOURCE}
           />
         )}
-        <Layout.Body>
-          <Layout.Main fullWidth>
-            <PageAlert />
-            <StyledHeaderContainer>
-              <ToolRibbon>
-                <ModulePageFilterBar
-                  moduleName={ModuleName.RESOURCE}
-                  extraFilters={
-                    <Fragment>
-                      <DomainSelector
-                        moduleName={ModuleName.RESOURCE}
-                        emptyOptionLocation="top"
-                        value={filters[SPAN_DOMAIN] || ''}
-                        additionalQuery={[
-                          ...DEFAULT_RESOURCE_FILTERS,
-                          `${SPAN_OP}:[${DEFAULT_RESOURCE_TYPES.join(',')}]`,
-                        ]}
-                      />
-                      <SubregionSelector />
-                    </Fragment>
-                  }
-                />
-              </ToolRibbon>
-            </StyledHeaderContainer>
-            <ModulesOnboarding moduleName={ModuleName.RESOURCE}>
-              <ResourceView />
-            </ModulesOnboarding>
-          </Layout.Main>
-        </Layout.Body>
+        <ModuleBodyUpsellHook moduleName={ModuleName.RESOURCE}>
+          <Layout.Body>
+            <Layout.Main fullWidth>
+              <PageAlert />
+              <StyledHeaderContainer>
+                <ToolRibbon>
+                  <ModulePageFilterBar
+                    moduleName={ModuleName.RESOURCE}
+                    extraFilters={
+                      <Fragment>
+                        <DomainSelector
+                          moduleName={ModuleName.RESOURCE}
+                          emptyOptionLocation="top"
+                          value={filters[SPAN_DOMAIN] || ''}
+                          additionalQuery={[
+                            ...DEFAULT_RESOURCE_FILTERS,
+                            `${SPAN_OP}:[${DEFAULT_RESOURCE_TYPES.join(',')}]`,
+                          ]}
+                        />
+                        <SubregionSelector />
+                      </Fragment>
+                    }
+                  />
+                </ToolRibbon>
+              </StyledHeaderContainer>
+              <ModulesOnboarding moduleName={ModuleName.RESOURCE}>
+                <ResourceView />
+              </ModulesOnboarding>
+            </Layout.Main>
+          </Layout.Body>
+        </ModuleBodyUpsellHook>
       </PageAlertProvider>
     </React.Fragment>
   );

+ 57 - 54
static/app/views/insights/browser/webVitals/views/pageOverview.tsx

@@ -36,6 +36,7 @@ import {useProjectWebVitalsScoresQuery} from 'sentry/views/insights/browser/webV
 import type {WebVitals} from 'sentry/views/insights/browser/webVitals/types';
 import decodeBrowserTypes from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
 import {useModuleURL} from 'sentry/views/insights/common/utils/useModuleURL';
 import {FrontendHeader} from 'sentry/views/insights/pages/frontend/frontendPageHeader';
@@ -228,64 +229,66 @@ export function PageOverview() {
             module={ModuleName.VITAL}
           />
         )}
-        {tab === LandingDisplayField.SPANS ? (
-          <Layout.Body>
-            <Layout.Main fullWidth>
-              {defined(transaction) && <AggregateSpans transaction={transaction} />}
-            </Layout.Main>
-          </Layout.Body>
-        ) : (
-          <Layout.Body>
-            <Layout.Main>
-              <TopMenuContainer>
-                <PageFilterBar condensed>
-                  <ProjectPageFilter />
-                  <EnvironmentPageFilter />
-                  <DatePageFilter />
-                </PageFilterBar>
-                <BrowserTypeSelector />
-              </TopMenuContainer>
-              <Flex>
-                <PerformanceScoreBreakdownChart
+        <ModuleBodyUpsellHook moduleName={ModuleName.VITAL}>
+          {tab === LandingDisplayField.SPANS ? (
+            <Layout.Body>
+              <Layout.Main fullWidth>
+                {defined(transaction) && <AggregateSpans transaction={transaction} />}
+              </Layout.Main>
+            </Layout.Body>
+          ) : (
+            <Layout.Body>
+              <Layout.Main>
+                <TopMenuContainer>
+                  <PageFilterBar condensed>
+                    <ProjectPageFilter />
+                    <EnvironmentPageFilter />
+                    <DatePageFilter />
+                  </PageFilterBar>
+                  <BrowserTypeSelector />
+                </TopMenuContainer>
+                <Flex>
+                  <PerformanceScoreBreakdownChart
+                    transaction={transaction}
+                    browserTypes={browserTypes}
+                    subregions={subregions}
+                  />
+                </Flex>
+                <WebVitalMetersContainer>
+                  <WebVitalMeters
+                    projectData={pageData}
+                    projectScore={projectScore}
+                    onClick={webVital => {
+                      router.replace({
+                        pathname: location.pathname,
+                        query: {...location.query, webVital},
+                      });
+                      setState({...state, webVital});
+                    }}
+                    transaction={transaction}
+                    showTooltip={false}
+                  />
+                </WebVitalMetersContainer>
+                <PageSamplePerformanceTableContainer>
+                  <PageSamplePerformanceTable
+                    transaction={transaction}
+                    limit={15}
+                    search={query}
+                  />
+                </PageSamplePerformanceTableContainer>
+              </Layout.Main>
+              <Layout.Side>
+                <PageOverviewSidebar
+                  projectScore={projectScore}
                   transaction={transaction}
+                  projectScoreIsLoading={isPending}
                   browserTypes={browserTypes}
                   subregions={subregions}
                 />
-              </Flex>
-              <WebVitalMetersContainer>
-                <WebVitalMeters
-                  projectData={pageData}
-                  projectScore={projectScore}
-                  onClick={webVital => {
-                    router.replace({
-                      pathname: location.pathname,
-                      query: {...location.query, webVital},
-                    });
-                    setState({...state, webVital});
-                  }}
-                  transaction={transaction}
-                  showTooltip={false}
-                />
-              </WebVitalMetersContainer>
-              <PageSamplePerformanceTableContainer>
-                <PageSamplePerformanceTable
-                  transaction={transaction}
-                  limit={15}
-                  search={query}
-                />
-              </PageSamplePerformanceTableContainer>
-            </Layout.Main>
-            <Layout.Side>
-              <PageOverviewSidebar
-                projectScore={projectScore}
-                transaction={transaction}
-                projectScoreIsLoading={isPending}
-                browserTypes={browserTypes}
-                subregions={subregions}
-              />
-            </Layout.Side>
-          </Layout.Body>
-        )}
+              </Layout.Side>
+            </Layout.Body>
+          )}
+        </ModuleBodyUpsellHook>
         <PageOverviewWebVitalsDetailPanel
           webVital={state.webVital}
           onClose={() => {

+ 63 - 60
static/app/views/insights/browser/webVitals/views/webVitalsLandingPage.tsx

@@ -34,6 +34,7 @@ import decodeBrowserTypes from 'sentry/views/insights/browser/webVitals/utils/qu
 import {ModulePageFilterBar} from 'sentry/views/insights/common/components/modulePageFilterBar';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
 import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {useModuleBreadcrumbs} from 'sentry/views/insights/common/utils/useModuleBreadcrumbs';
 import {FrontendHeader} from 'sentry/views/insights/pages/frontend/frontendPageHeader';
 import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
@@ -109,68 +110,70 @@ export function WebVitalsLandingPage() {
           module={ModuleName.VITAL}
         />
       )}
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          <TopMenuContainer>
-            <ModulePageFilterBar
-              moduleName={ModuleName.VITAL}
-              extraFilters={
-                <Fragment>
-                  <BrowserTypeSelector />
-                </Fragment>
-              }
-            />
-          </TopMenuContainer>
-          <MainContentContainer>
-            <ModulesOnboarding moduleName={ModuleName.VITAL}>
-              <PerformanceScoreChartContainer>
-                <PerformanceScoreChart
-                  projectScore={projectScore}
-                  isProjectScoreLoading={isPending || isProjectScoresLoading}
-                  webVital={state.webVital}
-                  browserTypes={browserTypes}
-                  subregions={subregions}
-                />
-              </PerformanceScoreChartContainer>
-              <WebVitalMetersContainer>
-                <WebVitalMeters
-                  projectData={projectData}
-                  projectScore={projectScore}
-                  onClick={webVital => setState({...state, webVital})}
-                />
-              </WebVitalMetersContainer>
-              <PagePerformanceTable />
-              <PagesTooltipContainer>
-                <Tooltip
-                  isHoverable
-                  title={
-                    <div>
-                      <div>
-                        {tct(
-                          'If pages you expect to see are missing, your framework is most likely not supported by the SDK, or your traffic is coming from unsupported browsers. Find supported browsers and frameworks [link:here].',
-                          {
-                            link: (
-                              <ExternalLink href="https://docs.sentry.io/product/insights/web-vitals/#prerequisites-and-limitations" />
-                            ),
-                          }
-                        )}
-                      </div>
-                      <br />
+      <ModuleBodyUpsellHook moduleName={ModuleName.VITAL}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            <TopMenuContainer>
+              <ModulePageFilterBar
+                moduleName={ModuleName.VITAL}
+                extraFilters={
+                  <Fragment>
+                    <BrowserTypeSelector />
+                  </Fragment>
+                }
+              />
+            </TopMenuContainer>
+            <MainContentContainer>
+              <ModulesOnboarding moduleName={ModuleName.VITAL}>
+                <PerformanceScoreChartContainer>
+                  <PerformanceScoreChart
+                    projectScore={projectScore}
+                    isProjectScoreLoading={isPending || isProjectScoresLoading}
+                    webVital={state.webVital}
+                    browserTypes={browserTypes}
+                    subregions={subregions}
+                  />
+                </PerformanceScoreChartContainer>
+                <WebVitalMetersContainer>
+                  <WebVitalMeters
+                    projectData={projectData}
+                    projectScore={projectScore}
+                    onClick={webVital => setState({...state, webVital})}
+                  />
+                </WebVitalMetersContainer>
+                <PagePerformanceTable />
+                <PagesTooltipContainer>
+                  <Tooltip
+                    isHoverable
+                    title={
                       <div>
-                        {t(
-                          'Keep your JavaScript SDK updated to the latest version for the best Web Vitals support.'
-                        )}
+                        <div>
+                          {tct(
+                            'If pages you expect to see are missing, your framework is most likely not supported by the SDK, or your traffic is coming from unsupported browsers. Find supported browsers and frameworks [link:here].',
+                            {
+                              link: (
+                                <ExternalLink href="https://docs.sentry.io/product/insights/web-vitals/#prerequisites-and-limitations" />
+                              ),
+                            }
+                          )}
+                        </div>
+                        <br />
+                        <div>
+                          {t(
+                            'Keep your JavaScript SDK updated to the latest version for the best Web Vitals support.'
+                          )}
+                        </div>
                       </div>
-                    </div>
-                  }
-                >
-                  <PagesTooltip>{t('Why are my pages not showing up?')}</PagesTooltip>
-                </Tooltip>
-              </PagesTooltipContainer>
-            </ModulesOnboarding>
-          </MainContentContainer>
-        </Layout.Main>
-      </Layout.Body>
+                    }
+                  >
+                    <PagesTooltip>{t('Why are my pages not showing up?')}</PagesTooltip>
+                  </Tooltip>
+                </PagesTooltipContainer>
+              </ModulesOnboarding>
+            </MainContentContainer>
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
       <WebVitalsDetailPanel
         webVital={state.webVital}
         onClose={() => {

+ 43 - 38
static/app/views/insights/cache/views/cacheLandingPage.tsx

@@ -36,6 +36,7 @@ import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLay
 import {ModulePageFilterBar} from 'sentry/views/insights/common/components/modulePageFilterBar';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
 import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {
   useMetrics,
   useSpanMetrics,
@@ -220,45 +221,49 @@ export function CacheLandingPage() {
         />
       )}
 
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          <PageAlert />
-          <ModuleLayout.Layout>
-            <ModuleLayout.Full>
-              <ModulePageFilterBar moduleName={ModuleName.CACHE} />
-            </ModuleLayout.Full>
-            <ModulesOnboarding moduleName={ModuleName.CACHE}>
-              <ModuleLayout.Half>
-                <CacheHitMissChart
-                  series={{
-                    seriesName: DataTitles[`${CACHE_MISS_RATE}()`],
-                    data: cacheMissRateData[`${CACHE_MISS_RATE}()`]?.data,
-                  }}
-                  isLoading={isCacheMissRateLoading}
-                  error={cacheMissRateError}
-                />
-              </ModuleLayout.Half>
-              <ModuleLayout.Half>
-                <ThroughputChart
-                  series={throughputData['spm()']}
-                  isLoading={isThroughputDataLoading}
-                  error={throughputError}
-                />
-              </ModuleLayout.Half>
+      <ModuleBodyUpsellHook moduleName={ModuleName.CACHE}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            <PageAlert />
+            <ModuleLayout.Layout>
               <ModuleLayout.Full>
-                <TransactionsTable
-                  data={transactionsListWithDuration}
-                  isLoading={isTransactionsListFetching || isTransactionDurationFetching}
-                  sort={sort}
-                  error={transactionsListError || transactionDurationError}
-                  meta={meta}
-                  pageLinks={transactionsListPageLinks}
-                />
+                <ModulePageFilterBar moduleName={ModuleName.CACHE} />
               </ModuleLayout.Full>
-            </ModulesOnboarding>
-          </ModuleLayout.Layout>
-        </Layout.Main>
-      </Layout.Body>
+              <ModulesOnboarding moduleName={ModuleName.CACHE}>
+                <ModuleLayout.Half>
+                  <CacheHitMissChart
+                    series={{
+                      seriesName: DataTitles[`${CACHE_MISS_RATE}()`],
+                      data: cacheMissRateData[`${CACHE_MISS_RATE}()`]?.data,
+                    }}
+                    isLoading={isCacheMissRateLoading}
+                    error={cacheMissRateError}
+                  />
+                </ModuleLayout.Half>
+                <ModuleLayout.Half>
+                  <ThroughputChart
+                    series={throughputData['spm()']}
+                    isLoading={isThroughputDataLoading}
+                    error={throughputError}
+                  />
+                </ModuleLayout.Half>
+                <ModuleLayout.Full>
+                  <TransactionsTable
+                    data={transactionsListWithDuration}
+                    isLoading={
+                      isTransactionsListFetching || isTransactionDurationFetching
+                    }
+                    sort={sort}
+                    error={transactionsListError || transactionDurationError}
+                    meta={meta}
+                    pageLinks={transactionsListPageLinks}
+                  />
+                </ModuleLayout.Full>
+              </ModulesOnboarding>
+            </ModuleLayout.Layout>
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
       <CacheSamplePanel />
     </React.Fragment>
   );
@@ -301,7 +306,7 @@ const combineMeta = (
 
 // TODO - this should come from the backend
 const addCustomMeta = (meta?: EventsMetaType) => {
-  if (meta) {
+  if (meta?.fields) {
     meta.fields[`avg(${CACHE_ITEM_SIZE})`] = 'size';
     meta.units[`avg(${CACHE_ITEM_SIZE})`] = 'byte';
   }

+ 30 - 9
static/app/views/insights/common/components/modulePageProviders.tsx

@@ -11,6 +11,7 @@ import useOrganization from 'sentry/utils/useOrganization';
 import {NoAccess} from 'sentry/views/insights/common/components/noAccess';
 import {useHasDataTrackAnalytics} from 'sentry/views/insights/common/utils/useHasDataTrackAnalytics';
 import {useModuleTitles} from 'sentry/views/insights/common/utils/useModuleTitle';
+import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
 import {INSIGHTS_TITLE} from 'sentry/views/insights/settings';
 import type {ModuleName} from 'sentry/views/insights/types';
 
@@ -34,27 +35,47 @@ export function ModulePageProviders({
 }: Props) {
   const organization = useOrganization();
   const moduleTitles = useModuleTitles();
+  const {isInDomainView} = useDomainViewFilters();
 
   useHasDataTrackAnalytics(moduleName as ModuleName, analyticEventName);
 
   const moduleTitle = moduleTitles[moduleName];
+  const shouldUseUpsellHook = !isInDomainView;
 
   const fullPageTitle = [pageTitle, moduleTitle, INSIGHTS_TITLE]
     .filter(Boolean)
     .join(' — ');
 
-  const defaultBody = (
-    <Layout.Page>
-      <Feature features={features} organization={organization} renderDisabled={NoAccess}>
-        <NoProjectMessage organization={organization}>{children}</NoProjectMessage>
-      </Feature>
-    </Layout.Page>
-  );
-
   return (
     <PageFiltersContainer>
       <SentryDocumentTitle title={fullPageTitle} orgSlug={organization.slug}>
-        <UpsellPageHook moduleName={moduleName}>{defaultBody}</UpsellPageHook>
+        {shouldUseUpsellHook && (
+          <UpsellPageHook moduleName={moduleName}>
+            <Layout.Page>
+              <Feature
+                features={features}
+                organization={organization}
+                renderDisabled={NoAccess}
+              >
+                <NoProjectMessage organization={organization}>
+                  {children}
+                </NoProjectMessage>
+              </Feature>
+            </Layout.Page>
+          </UpsellPageHook>
+        )}
+
+        {!shouldUseUpsellHook && (
+          <Layout.Page>
+            <Feature
+              features={['insights-entry-points']}
+              organization={organization}
+              renderDisabled={NoAccess}
+            >
+              <NoProjectMessage organization={organization}>{children}</NoProjectMessage>
+            </Feature>
+          </Layout.Page>
+        )}
       </SentryDocumentTitle>
     </PageFiltersContainer>
   );

+ 36 - 0
static/app/views/insights/common/components/moduleUpsellHookWrapper.tsx

@@ -0,0 +1,36 @@
+import Feature from 'sentry/components/acl/feature';
+import {NoAccess} from 'sentry/components/noAccess';
+import useOrganization from 'sentry/utils/useOrganization';
+import {
+  type TitleableModuleNames,
+  UpsellPageHook,
+} from 'sentry/views/insights/common/components/modulePageProviders';
+import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
+import {MODULE_FEATURE_MAP} from 'sentry/views/insights/settings';
+
+// TODO - remove, This is only necessary for domain views, where we don't want to show the full upsell page.
+export function ModuleBodyUpsellHook({
+  moduleName,
+  children,
+}: {
+  children: React.ReactNode;
+  moduleName: TitleableModuleNames;
+}) {
+  const {isInDomainView: shouldDisplayUpsell} = useDomainViewFilters();
+  const organization = useOrganization();
+
+  if (shouldDisplayUpsell) {
+    return (
+      <UpsellPageHook moduleName={moduleName}>
+        <Feature
+          features={MODULE_FEATURE_MAP[moduleName]}
+          organization={organization}
+          renderDisabled={NoAccess}
+        >
+          {children}
+        </Feature>
+      </UpsellPageHook>
+    );
+  }
+  return children;
+}

+ 53 - 47
static/app/views/insights/database/views/databaseLandingPage.tsx

@@ -18,6 +18,7 @@ import {useSynchronizeCharts} from 'sentry/views/insights/common/components/char
 import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
 import {ModulesOnboarding} from 'sentry/views/insights/common/components/modulesOnboarding';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {useSpanMetrics} from 'sentry/views/insights/common/queries/useDiscover';
 import {useSpanMetricsSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
 import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
@@ -200,58 +201,63 @@ export function DatabaseLandingPage() {
           module={ModuleName.DB}
         />
       )}
-
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          <ModuleLayout.Layout>
-            {hasModuleData && !onboardingProject && !isCriticalDataLoading && (
-              <NoDataMessage
-                Wrapper={AlertBanner}
-                isDataAvailable={isAnyCriticalDataAvailable}
-              />
-            )}
-
-            <ModuleLayout.Full>
-              <DatabasePageFilters
-                system={system}
-                databaseCommand={spanAction}
-                table={spanDomain}
-              />
-            </ModuleLayout.Full>
-            <ModulesOnboarding moduleName={ModuleName.DB}>
-              <ModuleLayout.Half>
-                <ThroughputChart
-                  series={throughputData['spm()']}
-                  isLoading={isThroughputDataLoading}
-                  error={throughputError}
-                  filters={chartFilters}
+      <ModuleBodyUpsellHook moduleName={ModuleName.DB}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            <ModuleLayout.Layout>
+              {hasModuleData && !onboardingProject && !isCriticalDataLoading && (
+                <NoDataMessage
+                  Wrapper={AlertBanner}
+                  isDataAvailable={isAnyCriticalDataAvailable}
                 />
-              </ModuleLayout.Half>
-
-              <ModuleLayout.Half>
-                <DurationChart
-                  series={[durationData[`${selectedAggregate}(span.self_time)`]]}
-                  isLoading={isDurationDataLoading}
-                  error={durationError}
-                  filters={chartFilters}
-                />
-              </ModuleLayout.Half>
+              )}
 
               <ModuleLayout.Full>
-                <SearchBar
-                  query={spanDescription}
-                  placeholder={t('Search for more queries')}
-                  onSearch={handleSearch}
+                <DatabasePageFilters
+                  system={system}
+                  databaseCommand={spanAction}
+                  table={spanDomain}
                 />
               </ModuleLayout.Full>
-
-              <ModuleLayout.Full>
-                <QueriesTable response={queryListResponse} sort={sort} system={system} />
-              </ModuleLayout.Full>
-            </ModulesOnboarding>
-          </ModuleLayout.Layout>
-        </Layout.Main>
-      </Layout.Body>
+              <ModulesOnboarding moduleName={ModuleName.DB}>
+                <ModuleLayout.Half>
+                  <ThroughputChart
+                    series={throughputData['spm()']}
+                    isLoading={isThroughputDataLoading}
+                    error={throughputError}
+                    filters={chartFilters}
+                  />
+                </ModuleLayout.Half>
+
+                <ModuleLayout.Half>
+                  <DurationChart
+                    series={[durationData[`${selectedAggregate}(span.self_time)`]]}
+                    isLoading={isDurationDataLoading}
+                    error={durationError}
+                    filters={chartFilters}
+                  />
+                </ModuleLayout.Half>
+
+                <ModuleLayout.Full>
+                  <SearchBar
+                    query={spanDescription}
+                    placeholder={t('Search for more queries')}
+                    onSearch={handleSearch}
+                  />
+                </ModuleLayout.Full>
+
+                <ModuleLayout.Full>
+                  <QueriesTable
+                    response={queryListResponse}
+                    sort={sort}
+                    system={system}
+                  />
+                </ModuleLayout.Full>
+              </ModulesOnboarding>
+            </ModuleLayout.Layout>
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
     </React.Fragment>
   );
 }

+ 104 - 101
static/app/views/insights/database/views/databaseSpanSummaryPage.tsx

@@ -22,6 +22,7 @@ import InsightIssuesList from 'sentry/views/insights/common/components/issues';
 import {MetricReadout} from 'sentry/views/insights/common/components/metricReadout';
 import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {ReadoutRibbon, ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
 import {DatabaseSpanDescription} from 'sentry/views/insights/common/components/spanDescription';
 import {getTimeSpentExplanation} from 'sentry/views/insights/common/components/tableCells/timeSpentCell';
@@ -219,116 +220,118 @@ export function DatabaseSpanSummaryPage({params}: Props) {
         />
       )}
 
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          <ModuleLayout.Layout>
-            <ModuleLayout.Full>
-              <HeaderContainer>
-                <ToolRibbon>
-                  <PageFilterBar condensed>
-                    <EnvironmentPageFilter />
-                    <DatePageFilter />
-                  </PageFilterBar>
-                </ToolRibbon>
-
-                <ReadoutRibbon>
-                  <MetricReadout
-                    title={getThroughputTitle('db')}
-                    value={spanMetrics?.[`${SpanFunction.SPM}()`]}
-                    unit={RateUnit.PER_MINUTE}
-                    isLoading={areSpanMetricsLoading}
+      <ModuleBodyUpsellHook moduleName={ModuleName.DB}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            <ModuleLayout.Layout>
+              <ModuleLayout.Full>
+                <HeaderContainer>
+                  <ToolRibbon>
+                    <PageFilterBar condensed>
+                      <EnvironmentPageFilter />
+                      <DatePageFilter />
+                    </PageFilterBar>
+                  </ToolRibbon>
+
+                  <ReadoutRibbon>
+                    <MetricReadout
+                      title={getThroughputTitle('db')}
+                      value={spanMetrics?.[`${SpanFunction.SPM}()`]}
+                      unit={RateUnit.PER_MINUTE}
+                      isLoading={areSpanMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={DataTitles.avg}
+                      value={spanMetrics?.[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]}
+                      unit={DurationUnit.MILLISECOND}
+                      isLoading={areSpanMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={DataTitles.timeSpent}
+                      value={spanMetrics?.['sum(span.self_time)']}
+                      unit={DurationUnit.MILLISECOND}
+                      tooltip={getTimeSpentExplanation(
+                        spanMetrics?.['time_spent_percentage()'],
+                        'db'
+                      )}
+                      isLoading={areSpanMetricsLoading}
+                    />
+                  </ReadoutRibbon>
+                </HeaderContainer>
+              </ModuleLayout.Full>
+
+              {groupId && (
+                <DescriptionContainer>
+                  <DatabaseSpanDescription
+                    groupId={groupId}
+                    preliminaryDescription={spanMetrics?.['span.description']}
                   />
+                </DescriptionContainer>
+              )}
 
-                  <MetricReadout
-                    title={DataTitles.avg}
-                    value={spanMetrics?.[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]}
-                    unit={DurationUnit.MILLISECOND}
-                    isLoading={areSpanMetricsLoading}
+              <Feature features="insights-related-issues-table">
+                {!areIndexedSpansByGroupIdLoading && (
+                  <ModuleLayout.Full>
+                    <InsightIssuesList
+                      issueTypes={[
+                        'performance_slow_db_query',
+                        'performance_n_plus_one_db_queries',
+                      ]}
+                      message={indexedSpansByGroupId[0]?.['span.description']}
+                    />
+                  </ModuleLayout.Full>
+                )}
+              </Feature>
+
+              <ModuleLayout.Full>
+                <ChartContainer>
+                  <ThroughputChart
+                    series={throughputData['spm()']}
+                    isLoading={isThroughputDataLoading}
+                    error={throughputError}
+                    filters={filters}
                   />
 
-                  <MetricReadout
-                    title={DataTitles.timeSpent}
-                    value={spanMetrics?.['sum(span.self_time)']}
-                    unit={DurationUnit.MILLISECOND}
-                    tooltip={getTimeSpentExplanation(
-                      spanMetrics?.['time_spent_percentage()'],
-                      'db'
-                    )}
-                    isLoading={areSpanMetricsLoading}
+                  <DurationChart
+                    series={[
+                      durationData[
+                        `${selectedAggregate}(${SpanMetricsField.SPAN_SELF_TIME})`
+                      ],
+                    ]}
+                    isLoading={isDurationDataLoading}
+                    error={durationError}
+                    filters={filters}
                   />
-                </ReadoutRibbon>
-              </HeaderContainer>
-            </ModuleLayout.Full>
-
-            {groupId && (
-              <DescriptionContainer>
-                <DatabaseSpanDescription
-                  groupId={groupId}
-                  preliminaryDescription={spanMetrics?.['span.description']}
-                />
-              </DescriptionContainer>
-            )}
-
-            <Feature features="insights-related-issues-table">
-              {!areIndexedSpansByGroupIdLoading && (
+                </ChartContainer>
+              </ModuleLayout.Full>
+
+              {span && (
                 <ModuleLayout.Full>
-                  <InsightIssuesList
-                    issueTypes={[
-                      'performance_slow_db_query',
-                      'performance_n_plus_one_db_queries',
-                    ]}
-                    message={indexedSpansByGroupId[0]?.['span.description']}
+                  <QueryTransactionsTable
+                    span={span}
+                    data={transactionsList}
+                    error={transactionsListError}
+                    isLoading={isTransactionsListLoading}
+                    meta={transactionsListMeta}
+                    pageLinks={transactionsListPageLinks}
+                    sort={sort}
                   />
                 </ModuleLayout.Full>
               )}
-            </Feature>
-
-            <ModuleLayout.Full>
-              <ChartContainer>
-                <ThroughputChart
-                  series={throughputData['spm()']}
-                  isLoading={isThroughputDataLoading}
-                  error={throughputError}
-                  filters={filters}
-                />
-
-                <DurationChart
-                  series={[
-                    durationData[
-                      `${selectedAggregate}(${SpanMetricsField.SPAN_SELF_TIME})`
-                    ],
-                  ]}
-                  isLoading={isDurationDataLoading}
-                  error={durationError}
-                  filters={filters}
-                />
-              </ChartContainer>
-            </ModuleLayout.Full>
-
-            {span && (
-              <ModuleLayout.Full>
-                <QueryTransactionsTable
-                  span={span}
-                  data={transactionsList}
-                  error={transactionsListError}
-                  isLoading={isTransactionsListLoading}
-                  meta={transactionsListMeta}
-                  pageLinks={transactionsListPageLinks}
-                  sort={sort}
-                />
-              </ModuleLayout.Full>
-            )}
-          </ModuleLayout.Layout>
-
-          <SampleList
-            groupId={span[SpanMetricsField.SPAN_GROUP]}
-            moduleName={ModuleName.DB}
-            transactionName={transaction}
-            transactionMethod={transactionMethod}
-            referrer={TraceViewSources.QUERIES_MODULE}
-          />
-        </Layout.Main>
-      </Layout.Body>
+            </ModuleLayout.Layout>
+
+            <SampleList
+              groupId={span[SpanMetricsField.SPAN_GROUP]}
+              moduleName={ModuleName.DB}
+              transactionName={transaction}
+              transactionMethod={transactionMethod}
+              referrer={TraceViewSources.QUERIES_MODULE}
+            />
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
     </Fragment>
   );
 }

+ 134 - 129
static/app/views/insights/http/views/httpDomainSummaryPage.tsx

@@ -26,6 +26,7 @@ import {HeaderContainer} from 'sentry/views/insights/common/components/headerCon
 import {MetricReadout} from 'sentry/views/insights/common/components/metricReadout';
 import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
 import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
+import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
 import {ReadoutRibbon, ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
 import {getTimeSpentExplanation} from 'sentry/views/insights/common/components/tableCells/timeSpentCell';
 import {useSpanMetrics} from 'sentry/views/insights/common/queries/useDiscover';
@@ -252,136 +253,140 @@ export function HTTPDomainSummaryPage() {
         />
       )}
 
-      <Layout.Body>
-        <Layout.Main fullWidth>
-          {domain === '' && (
-            <Alert type="info">
-              {tct(
-                '"Unknown Domain" entries can be caused by instrumentation errors. Please refer to our [link] for more information.',
-                {
-                  link: <ExternalLink href={MODULE_DOC_LINK}>documentation</ExternalLink>,
-                }
-              )}
-            </Alert>
-          )}
-
-          <ModuleLayout.Layout>
-            <ModuleLayout.Full>
-              <HeaderContainer>
-                <ToolRibbon>
-                  <PageFilterBar condensed>
-                    <EnvironmentPageFilter />
-                    <DatePageFilter />
-                  </PageFilterBar>
-                  <SubregionSelector />
-                </ToolRibbon>
-
-                <ReadoutRibbon>
-                  <MetricReadout
-                    title={getThroughputTitle('http')}
-                    value={domainMetrics?.[0]?.[`${SpanFunction.SPM}()`]}
-                    unit={RateUnit.PER_MINUTE}
-                    isLoading={areDomainMetricsLoading}
-                  />
-
-                  <MetricReadout
-                    title={DataTitles.avg}
-                    value={
-                      domainMetrics?.[0]?.[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]
-                    }
-                    unit={DurationUnit.MILLISECOND}
-                    isLoading={areDomainMetricsLoading}
-                  />
-
-                  <MetricReadout
-                    title={t('3XXs')}
-                    value={domainMetrics?.[0]?.[`http_response_rate(3)`]}
-                    unit="percentage"
-                    isLoading={areDomainMetricsLoading}
-                  />
-
-                  <MetricReadout
-                    title={t('4XXs')}
-                    value={domainMetrics?.[0]?.[`http_response_rate(4)`]}
-                    unit="percentage"
-                    isLoading={areDomainMetricsLoading}
-                  />
-
-                  <MetricReadout
-                    title={t('5XXs')}
-                    value={domainMetrics?.[0]?.[`http_response_rate(5)`]}
-                    unit="percentage"
-                    isLoading={areDomainMetricsLoading}
-                  />
-
-                  <MetricReadout
-                    title={DataTitles.timeSpent}
-                    value={domainMetrics?.[0]?.['sum(span.self_time)']}
-                    unit={DurationUnit.MILLISECOND}
-                    tooltip={getTimeSpentExplanation(
-                      domainMetrics?.[0]?.['time_spent_percentage()'],
-                      'http'
-                    )}
-                    isLoading={areDomainMetricsLoading}
-                  />
-                </ReadoutRibbon>
-              </HeaderContainer>
-            </ModuleLayout.Full>
-
-            <ModuleLayout.Third>
-              <ThroughputChart
-                series={throughputData['spm()']}
-                isLoading={isThroughputDataLoading}
-                error={throughputError}
-                filters={filters}
-              />
-            </ModuleLayout.Third>
-
-            <ModuleLayout.Third>
-              <DurationChart
-                series={[durationData[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]]}
-                isLoading={isDurationDataLoading}
-                error={durationError}
-                filters={filters}
-              />
-            </ModuleLayout.Third>
-
-            <ModuleLayout.Third>
-              <ResponseRateChart
-                series={[
-                  {
-                    ...responseCodeData[`http_response_rate(3)`],
-                    seriesName: t('3XX'),
-                  },
-                  {
-                    ...responseCodeData[`http_response_rate(4)`],
-                    seriesName: t('4XX'),
-                  },
+      <ModuleBodyUpsellHook moduleName={ModuleName.HTTP}>
+        <Layout.Body>
+          <Layout.Main fullWidth>
+            {domain === '' && (
+              <Alert type="info">
+                {tct(
+                  '"Unknown Domain" entries can be caused by instrumentation errors. Please refer to our [link] for more information.',
                   {
-                    ...responseCodeData[`http_response_rate(5)`],
-                    seriesName: t('5XX'),
-                  },
-                ]}
-                isLoading={isResponseCodeDataLoading}
-                error={responseCodeError}
-                filters={filters}
-              />
-            </ModuleLayout.Third>
-
-            <ModuleLayout.Full>
-              <DomainTransactionsTable
-                domain={domain}
-                data={transactionsList}
-                error={transactionsListError}
-                isLoading={isTransactionsListLoading}
-                meta={transactionsListMeta}
-                pageLinks={transactionsListPageLinks}
-                sort={sort}
-              />
-            </ModuleLayout.Full>
-          </ModuleLayout.Layout>
-        </Layout.Main>
-      </Layout.Body>
+                    link: (
+                      <ExternalLink href={MODULE_DOC_LINK}>documentation</ExternalLink>
+                    ),
+                  }
+                )}
+              </Alert>
+            )}
+
+            <ModuleLayout.Layout>
+              <ModuleLayout.Full>
+                <HeaderContainer>
+                  <ToolRibbon>
+                    <PageFilterBar condensed>
+                      <EnvironmentPageFilter />
+                      <DatePageFilter />
+                    </PageFilterBar>
+                    <SubregionSelector />
+                  </ToolRibbon>
+
+                  <ReadoutRibbon>
+                    <MetricReadout
+                      title={getThroughputTitle('http')}
+                      value={domainMetrics?.[0]?.[`${SpanFunction.SPM}()`]}
+                      unit={RateUnit.PER_MINUTE}
+                      isLoading={areDomainMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={DataTitles.avg}
+                      value={
+                        domainMetrics?.[0]?.[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]
+                      }
+                      unit={DurationUnit.MILLISECOND}
+                      isLoading={areDomainMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={t('3XXs')}
+                      value={domainMetrics?.[0]?.[`http_response_rate(3)`]}
+                      unit="percentage"
+                      isLoading={areDomainMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={t('4XXs')}
+                      value={domainMetrics?.[0]?.[`http_response_rate(4)`]}
+                      unit="percentage"
+                      isLoading={areDomainMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={t('5XXs')}
+                      value={domainMetrics?.[0]?.[`http_response_rate(5)`]}
+                      unit="percentage"
+                      isLoading={areDomainMetricsLoading}
+                    />
+
+                    <MetricReadout
+                      title={DataTitles.timeSpent}
+                      value={domainMetrics?.[0]?.['sum(span.self_time)']}
+                      unit={DurationUnit.MILLISECOND}
+                      tooltip={getTimeSpentExplanation(
+                        domainMetrics?.[0]?.['time_spent_percentage()'],
+                        'http'
+                      )}
+                      isLoading={areDomainMetricsLoading}
+                    />
+                  </ReadoutRibbon>
+                </HeaderContainer>
+              </ModuleLayout.Full>
+
+              <ModuleLayout.Third>
+                <ThroughputChart
+                  series={throughputData['spm()']}
+                  isLoading={isThroughputDataLoading}
+                  error={throughputError}
+                  filters={filters}
+                />
+              </ModuleLayout.Third>
+
+              <ModuleLayout.Third>
+                <DurationChart
+                  series={[durationData[`avg(${SpanMetricsField.SPAN_SELF_TIME})`]]}
+                  isLoading={isDurationDataLoading}
+                  error={durationError}
+                  filters={filters}
+                />
+              </ModuleLayout.Third>
+
+              <ModuleLayout.Third>
+                <ResponseRateChart
+                  series={[
+                    {
+                      ...responseCodeData[`http_response_rate(3)`],
+                      seriesName: t('3XX'),
+                    },
+                    {
+                      ...responseCodeData[`http_response_rate(4)`],
+                      seriesName: t('4XX'),
+                    },
+                    {
+                      ...responseCodeData[`http_response_rate(5)`],
+                      seriesName: t('5XX'),
+                    },
+                  ]}
+                  isLoading={isResponseCodeDataLoading}
+                  error={responseCodeError}
+                  filters={filters}
+                />
+              </ModuleLayout.Third>
+
+              <ModuleLayout.Full>
+                <DomainTransactionsTable
+                  domain={domain}
+                  data={transactionsList}
+                  error={transactionsListError}
+                  isLoading={isTransactionsListLoading}
+                  meta={transactionsListMeta}
+                  pageLinks={transactionsListPageLinks}
+                  sort={sort}
+                />
+              </ModuleLayout.Full>
+            </ModuleLayout.Layout>
+          </Layout.Main>
+        </Layout.Body>
+      </ModuleBodyUpsellHook>
 
       <HTTPSamplesPanel />
     </React.Fragment>

Some files were not shown because too many files changed in this diff