Skip to content

Commit

Permalink
Memoize data derived from useExtensions
Browse files Browse the repository at this point in the history
  • Loading branch information
vojtechszocs committed Mar 16, 2020
1 parent 3e61f17 commit 82add1d
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 41 deletions.
5 changes: 0 additions & 5 deletions frontend/packages/console-plugin-sdk/src/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import {
isReduxReducer,
isResourceDetailsPage,
isResourceListPage,
isResourceTabPage,
isRoutePage,
isYAMLTemplate,
} from './typings';
Expand Down Expand Up @@ -87,10 +86,6 @@ export class ExtensionRegistry {
return this.extensions.filter(isRoutePage);
}

public getResourceTabPages() {
return this.extensions.filter(isResourceTabPage);
}

public getPerspectives() {
return this.extensions.filter(isPerspective);
}
Expand Down
51 changes: 29 additions & 22 deletions frontend/public/components/factory/details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,30 +25,37 @@ import { breadcrumbsForDetailsPage } from '../utils/breadcrumbs';

export const DetailsPage = withFallback<DetailsPageProps>(({ pages = [], ...props }) => {
const resourceKeys = _.map(props.resources, 'prop');

const renderAsyncComponent = (page: ResourceTabPage, pageProps: DetailsPageProps) => (
<AsyncComponent
loader={page.properties.loader}
namespace={pageProps.namespace}
name={pageProps.name}
kind={pageProps.kind}
match={pageProps.match}
/>
);

const resourcePageExtensions = useExtensions<ResourceTabPage>(isResourceTabPage);
let allPages = [
...pages,
...resourcePageExtensions
.filter(
(p) =>
referenceForModel(p.properties.model) ===
(props.kindObj ? referenceFor(props.kindObj) : props.kind),
)
.map((p) => ({
href: p.properties.href,
name: p.properties.name,
component: () => (
<AsyncComponent
loader={p.properties.loader}
namespace={props.namespace}
name={props.name}
kind={props.kind}
match={props.match}
/>
),
})),
];
const pluginPages = React.useMemo(
() =>
resourcePageExtensions
.filter(
(p) =>
referenceForModel(p.properties.model) ===
(props.kindObj ? referenceFor(props.kindObj) : props.kind),
)
.map((p) => ({
href: p.properties.href,
name: p.properties.name,
component: () => renderAsyncComponent(p, props),
})),
[resourcePageExtensions, props],
);

let allPages = [...pages, ...pluginPages];
allPages = allPages.length ? allPages : null;

return (
<Firehose
resources={[
Expand Down
9 changes: 6 additions & 3 deletions frontend/public/components/nav/perspective-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ type StateProps = {
};

const PerspectiveNav: React.FC<StateProps> = ({ perspective }) => {
const navItemExtensions = useExtensions<NavItem>(isNavItem).filter(
(item) => item.properties.perspective === perspective,
const navItemExtensions = useExtensions<NavItem>(isNavItem);

const matchingNavItems = React.useMemo(
() => navItemExtensions.filter((item) => item.properties.perspective === perspective),
[navItemExtensions, perspective],
);

// Until admin perspective is contributed through extensions, simply render static `AdminNav`
Expand All @@ -28,7 +31,7 @@ const PerspectiveNav: React.FC<StateProps> = ({ perspective }) => {
return (
<>
{_.compact(
navItemExtensions.map((item) => {
matchingNavItems.map((item) => {
const { section } = item.properties;
if (section) {
if (renderedSections.includes(section)) {
Expand Down
27 changes: 16 additions & 11 deletions frontend/public/components/utils/horizontal-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -206,19 +206,24 @@ export const HorizontalNav = React.memo((props: HorizontalNavProps) => {
{},
);

const navTabExtensions = useExtensions<HorizontalNavTab>(isHorizontalNavTab).filter(
(tab) =>
props.obj?.data && referenceForModel(tab.properties.model) === referenceFor(props.obj.data),
);
const pages = (props.pages || props.pagesFor(props.obj?.data)).concat(
navTabExtensions.map((tab) => ({
...tab.properties.page,
component: (params: PageComponentProps) => (
<AsyncComponent {...params} loader={tab.properties.loader} />
),
})),
const objReference = props.obj?.data ? referenceFor(props.obj.data) : '';
const navTabExtensions = useExtensions<HorizontalNavTab>(isHorizontalNavTab);

const pluginPages = React.useMemo(
() =>
navTabExtensions
.filter((tab) => referenceForModel(tab.properties.model) === objReference)
.map((tab) => ({
...tab.properties.page,
component: (params: PageComponentProps) => (
<AsyncComponent {...params} loader={tab.properties.loader} />
),
})),
[navTabExtensions, objReference],
);

const pages = (props.pages || props.pagesFor(props.obj?.data)).concat(pluginPages);

const routes = pages.map((p) => {
const path = `${props.match.url}/${p.path || p.href}`;
const render = (params) => {
Expand Down

0 comments on commit 82add1d

Please sign in to comment.