import { $templateCache } from 'ngimport'; import type { FunctionComponent } from 'react'; import React from 'react'; import { LoadBalancerDetailsContent } from './LoadBalancerDetails'; import type { Application } from '../../application'; import { CloudProviderRegistry } from '../../cloudProvider'; import type { ILoadBalancer } from '../../domain'; import type { ILoadBalancerStateParams } from '../loadBalancer.states'; import type { IOverridableProps } from '../../overrideRegistry'; import { overridableComponent } from '../../overrideRegistry'; import { useData } from '../../presentation'; import { AngularJSAdapter } from '../../reactShims'; export interface ILoadBalancerDetailsWrapperProps extends IOverridableProps { app: Application; loadBalancer: ILoadBalancerStateParams; } export interface UseDetailsResult { data: T | undefined; loading: boolean; error: string | null; refetch: () => Promise; } export interface IUseDetailsHookProps { app: Application; loadBalancerParams: ILoadBalancerStateParams; autoClose: () => void; } export type UseDetailsHook = (props: IUseDetailsHookProps) => UseDetailsResult; export interface ILoadBalancerDetailsSectionProps { app: Application; loadBalancer: ILoadBalancer; } export interface ILoadBalancerActionsProps { app: Application; loadBalancer: ILoadBalancer; } export interface ILoadBalancerDetailsProps extends ILoadBalancerDetailsWrapperProps { useDetails: UseDetailsHook; Actions: FunctionComponent; sections: Array>; } interface IDetailsTemplateState { detailsTemplateUrl?: string; detailsController?: string; useDetailsHook?: UseDetailsHook; detailsActions?: FunctionComponent; detailsSections?: Array>; } const getDetailsTemplate = (provider: string): Promise => Promise.all([ CloudProviderRegistry.getValue(provider, 'loadBalancer.useDetailsHook'), CloudProviderRegistry.getValue(provider, 'loadBalancer.detailsActions'), CloudProviderRegistry.getValue(provider, 'loadBalancer.detailsSections'), CloudProviderRegistry.getValue(provider, 'loadBalancer.detailsTemplateUrl'), CloudProviderRegistry.getValue(provider, 'loadBalancer.detailsController'), ]).then(([useDetailsHook, detailsActions, detailsSections, templateUrl, detailsController]) => { const detailsTemplateUrl = templateUrl ? $templateCache.get(templateUrl) : undefined; return { useDetailsHook, detailsActions, detailsSections, detailsTemplateUrl, detailsController, }; }); function LoadBalancerDetailsWrapper({ app, loadBalancer }: ILoadBalancerDetailsWrapperProps) { const { provider } = loadBalancer; const { result: detailsTemplate } = useData(() => getDetailsTemplate(provider), {}, [ provider, ]); const { useDetailsHook, detailsActions: DetailsActions, detailsSections, detailsTemplateUrl, detailsController, } = detailsTemplate; if (useDetailsHook && DetailsActions && detailsSections) { // React rendering return ( ); } if (detailsTemplateUrl && detailsController) { // Angular rendering return ( ); } return null; } export const LoadBalancerDetails = overridableComponent(LoadBalancerDetailsWrapper, 'loadBalancer.details');