All files / modules/10-common/router RouteWithLayout.tsx

100% Statements 21/21
100% Branches 9/9
100% Functions 1/1
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86              11x 11x     11x 11x 11x 11x 11x     11x                 11x 7x 7x     7x                                   7x 3x             4x   4x   4x   1x   2x                       1x       11x      
/*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
 */
 
import React from 'react'
import { Route as RouterRoute } from 'react-router-dom'
import type { RouteProps as RouterRouteprops } from 'react-router-dom'
 
import { ModalProvider } from '@harness/use-modal'
import { DefaultLayout } from '@common/layouts'
import SidebarProvider, { SidebarContext } from '@common/navigation/SidebarProvider'
import { useLicenseStore } from 'framework/LicenseStore/LicenseStoreContext'
import { LICENSE_STATE_VALUES } from 'framework/LicenseStore/licenseStoreUtil'
import type { LicenseRedirectProps } from 'framework/LicenseStore/LicenseStoreContext'
import type { PAGE_NAME } from '@common/pages/pageContext/PageName'
import PageProvider from '@common/pages/pageContext/PageProvider'
 
export interface RouteWithLayoutProps extends RouterRouteprops {
  layout: React.ComponentType
  sidebarProps?: SidebarContext
  licenseRedirectData?: LicenseRedirectProps
  pageName?: PAGE_NAME
}
 
export function RouteWithLayout(props: React.PropsWithChildren<RouteWithLayoutProps>): React.ReactElement {
  const { children, layout: Layout, sidebarProps, licenseRedirectData, pageName, ...rest } = props
  const licenseStore = useLicenseStore()
 
  const childComponent = (
    <RouterRoute {...rest}>
      <ModalProvider>
        <PageProvider pageName={pageName}>
          {sidebarProps ? (
            <SidebarProvider {...sidebarProps}>
              <Layout>{children}</Layout>
            </SidebarProvider>
          ) : (
            <Layout>{children}</Layout>
          )}
        </PageProvider>
      </ModalProvider>
    </RouterRoute>
  )
 
  // For modules with no licenseStateName passed we will always show the child components
  // This allows pages to still render for products like CD and CE which have not gone GA and are still
  // using old licensing mechanisms
  if (!licenseRedirectData) {
    return childComponent
  }
 
  const {
    licenseStateName,
    startTrialRedirect: StartTrialRedirect
    // expiredTrialRedirect: ExpiredTrialRedirect
  } = licenseRedirectData
 
  const licenseValue = licenseStateName && licenseStore[licenseStateName]
 
  switch (licenseValue) {
    case LICENSE_STATE_VALUES.ACTIVE:
      return childComponent
    case LICENSE_STATE_VALUES.NOT_STARTED:
      return (
        <RouterRoute {...rest}>
          <StartTrialRedirect />
        </RouterRoute>
      )
    // case LICENSE_STATE_VALUES.EXPIRED:
    //   return (
    //     <RouterRoute {...rest}>
    //       <ExpiredTrialRedirect />
    //     </RouterRoute>
    //   )
    default:
      return childComponent
  }
}
 
RouteWithLayout.defaultProps = {
  layout: DefaultLayout
}