// @flow
import * as React from 'react';
import createContext, { type Context } from 'create-react-context';

export const ManagerReferenceNodeContext: Context<?HTMLElement> = createContext();
export const ManagerReferenceNodeSetterContext: Context<
  void | ((?HTMLElement) => void)
> = createContext();

export type ManagerProps = {
  children: React.Node,
};

export default class Manager extends React.Component<ManagerProps> {
  referenceNode: ?HTMLElement;

  setReferenceNode = (newReferenceNode: ?HTMLElement) => {
    if (newReferenceNode && this.referenceNode !== newReferenceNode) {
      this.referenceNode = newReferenceNode;
      this.forceUpdate();
    }
  };

  componentWillUnmount() {
    this.referenceNode = null;
  }

  render() {
    return (
      <ManagerReferenceNodeContext.Provider value={this.referenceNode}>
        <ManagerReferenceNodeSetterContext.Provider
          value={this.setReferenceNode}
        >
          {this.props.children}
        </ManagerReferenceNodeSetterContext.Provider>
      </ManagerReferenceNodeContext.Provider>
    );
  }
}