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