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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x | /* * 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 { RouteComponentProps, withRouter } from 'react-router-dom' import { loggerFor } from 'framework/logging/logging' import { ModuleName } from 'framework/types/ModuleName' import { PermissionsContext } from 'framework/rbac/PermissionsContext' import { LicenseStoreContext } from 'framework/LicenseStore/LicenseStoreContext' import { AppStoreContext } from 'framework/AppStore/AppStoreContext' import { PageSpinner } from '@common/components' import RbacButton from '@rbac/components/Button/Button' import RbacMenuItem from '@rbac/components/MenuItem/MenuItem' import { useDocumentTitle } from '@common/hooks/useDocumentTitle' import { NGBreadcrumbs } from '@common/components/NGBreadcrumbs/NGBreadcrumbs' import MonacoEditor from '@common/components/MonacoEditor/MonacoEditor' import MonacoDiffEditor from '@common/components/MonacoDiffEditor/MonacoDiffEditor' import YAMLBuilder from '@common/components/YAMLBuilder/YamlBuilder' import { global401HandlerUtils } from '@common/utils/global401HandlerUtils' import ChildAppError from './ChildAppError' import type { ChildAppProps, Scope } from './index' const logger = loggerFor(ModuleName.FRAMEWORK) export { ChildAppProps } export interface BaseChildAppMounterProps { ChildApp: React.LazyExoticComponent<React.ComponentType<ChildAppProps>> } export type ChildAppMounterProps<T = never> = T extends never ? BaseChildAppMounterProps : T & BaseChildAppMounterProps export interface ChildAppMounterState { hasError: boolean } export class ChildAppMounter<T = never> extends React.Component< ChildAppMounterProps<T> & RouteComponentProps<Scope>, ChildAppMounterState > { state: ChildAppMounterState = { hasError: false } static getDerivedStateFromError(e: Error): ChildAppMounterState { // eslint-disable-next-line @typescript-eslint/no-explicit-any logger.error(e.message, e as any) return { hasError: true } } render(): React.ReactElement { const { ChildApp, match, children, history, ...rest } = this.props // We use routeMatch instead of location because, // we want to pass the mount url and not the actual url const { url, params, path } = match if (this.state.hasError) { return <ChildAppError /> } return ( <React.Suspense fallback={<PageSpinner />}> <ChildApp // eslint-disable-next-line @typescript-eslint/no-explicit-any {...(rest as any)} renderUrl={url} matchPath={path} scope={params} parentContextObj={{ appStoreContext: AppStoreContext, permissionsContext: PermissionsContext, licenseStoreProvider: LicenseStoreContext }} on401={() => { global401HandlerUtils(history) }} components={{ RbacButton, RbacMenuItem, NGBreadcrumbs, MonacoEditor, YAMLBuilder, MonacoDiffEditor }} hooks={{ useDocumentTitle }} /> </React.Suspense> ) } } // eslint-disable-next-line @typescript-eslint/no-explicit-any const ChildAppMounterWithRouter = withRouter(ChildAppMounter as any) // It's impossible to use a HOC with Generics, while using `withRouter` // hence, we need to create a wrapper around it to add support for generics function ChildAppMounterWithRouterWrapper<T = never>(props: ChildAppMounterProps<T>): React.ReactElement { return <ChildAppMounterWithRouter {...props} /> } export default ChildAppMounterWithRouterWrapper |