1// @flow
2import * as React from 'react';
3import createContext, { type Context } from '@hypnosphi/create-react-context';
4export const ManagerReferenceNodeContext: Context<?HTMLElement> = createContext();
5export const ManagerReferenceNodeSetterContext: Context<
6  void | ((?HTMLElement) => void)
7> = createContext();
8
9export type ManagerProps = {
10  children: React.Node,
11};
12
13export default class Manager extends React.Component<ManagerProps> {
14  referenceNode: ?HTMLElement;
15
16  setReferenceNode = (newReferenceNode: ?HTMLElement) => {
17    if (newReferenceNode && this.referenceNode !== newReferenceNode) {
18      this.referenceNode = newReferenceNode;
19      this.forceUpdate();
20    }
21  };
22
23  componentWillUnmount() {
24    this.referenceNode = null;
25  }
26
27  render() {
28    return (
29      <ManagerReferenceNodeContext.Provider value={this.referenceNode}>
30        <ManagerReferenceNodeSetterContext.Provider
31          value={this.setReferenceNode}
32        >
33          {this.props.children}
34        </ManagerReferenceNodeSetterContext.Provider>
35      </ManagerReferenceNodeContext.Provider>
36    );
37  }
38}
39