1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import {Component} from 'react';
- import HookStore from 'sentry/stores/hookStore';
- import {HookName, Hooks} from 'sentry/types/hooks';
- type Props<H extends HookName> = {
-
- name: H;
-
- children?: (opts: {hooks: Array<Hooks[H]>}) => React.ReactNode;
- } & Omit<Parameters<Hooks[H]>[0], 'name'>;
- type HookState<H extends HookName> = {
- hooks: Array<Hooks[H]>;
- };
- function Hook<H extends HookName>({name, ...props}: Props<H>) {
- class HookComponent extends Component<{}, HookState<H>> {
- static displayName = `Hook(${name})`;
- state = {
- hooks: HookStore.get(name).map(cb => cb(props)),
- };
- componentWillUnmount() {
- this.unsubscribe();
- }
- handleHooks(hookName: HookName, hooks: Array<Hooks[H]>) {
-
- if (hookName !== name) {
- return;
- }
- this.setState({hooks: hooks.map(cb => cb(props))});
- }
- unsubscribe = HookStore.listen(
- (hookName: HookName, hooks: Array<Hooks[H]>) => this.handleHooks(hookName, hooks),
- undefined
- );
- render() {
- const {children} = props;
- if (!this.state.hooks || !this.state.hooks.length) {
- return null;
- }
- if (typeof children === 'function') {
- return children({hooks: this.state.hooks});
- }
- return this.state.hooks;
- }
- }
- return <HookComponent />;
- }
- export default Hook;
|