1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import {Component, lazy, Suspense} from 'react';
- import HookStore from 'sentry/stores/hookStore';
- import {HookName, Hooks} from 'sentry/types/hooks';
- type Params<H extends HookName> = {
-
- hookName: H;
-
- defaultComponent?: ReturnType<Hooks[H]>;
-
- defaultComponentPromise?: () => Promise<ReturnType<Hooks[H]>>;
- };
- function HookOrDefault<H extends HookName>({
- hookName,
- defaultComponent,
- defaultComponentPromise,
- }: Params<H>) {
- type Props = React.ComponentProps<ReturnType<Hooks[H]>>;
- type State = {hooks: Hooks[H][]};
- class HookOrDefaultComponent extends Component<Props, State> {
- static displayName = `HookOrDefaultComponent(${hookName})`;
- state: State = {
- hooks: HookStore.get(hookName),
- };
- componentWillUnmount() {
- this.unlistener?.();
- }
- unlistener = HookStore.listen(
- (name: string, hooks: Hooks[HookName][]) =>
- name === hookName && this.setState({hooks}),
- undefined
- );
- get defaultComponent() {
-
- if (defaultComponentPromise) {
- const DefaultComponent = lazy(defaultComponentPromise);
- return (props: Props) => (
- <Suspense fallback={null}>
- <DefaultComponent {...props} />
- </Suspense>
- );
- }
- return defaultComponent;
- }
- render() {
- const hookExists = this.state.hooks && this.state.hooks.length;
- const componentFromHook = this.state.hooks[0]?.();
- const HookComponent =
- hookExists && componentFromHook ? componentFromHook : this.defaultComponent;
- return HookComponent ? <HookComponent {...this.props} /> : null;
- }
- }
- return HookOrDefaultComponent;
- }
- export default HookOrDefault;
|