You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					39 lines
				
				1.0 KiB
			
		
		
			
		
	
	
					39 lines
				
				1.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								// @flow strict
							 | 
						||
| 
								 | 
							
								import * as React from 'react';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export const ManagerReferenceNodeContext: React.Context<?Element>  = React.createContext();
							 | 
						||
| 
								 | 
							
								export const ManagerReferenceNodeSetterContext: React.Context<
							 | 
						||
| 
								 | 
							
								  void | ((?Element) => void)
							 | 
						||
| 
								 | 
							
								> = React.createContext();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export type ManagerProps = $ReadOnly<{
							 | 
						||
| 
								 | 
							
								  children: React.Node,
							 | 
						||
| 
								 | 
							
								}>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function Manager({ children }: ManagerProps): React.Node {
							 | 
						||
| 
								 | 
							
								  const [referenceNode, setReferenceNode] = React.useState<?Element>(null);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const hasUnmounted = React.useRef(false);
							 | 
						||
| 
								 | 
							
								  React.useEffect(() => {
							 | 
						||
| 
								 | 
							
								    return () => {
							 | 
						||
| 
								 | 
							
								      hasUnmounted.current = true;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }, []);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const handleSetReferenceNode = React.useCallback((node) => {
							 | 
						||
| 
								 | 
							
								    if (!hasUnmounted.current) {
							 | 
						||
| 
								 | 
							
								      setReferenceNode(node);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, []);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (
							 | 
						||
| 
								 | 
							
								    <ManagerReferenceNodeContext.Provider value={referenceNode}>
							 | 
						||
| 
								 | 
							
								      <ManagerReferenceNodeSetterContext.Provider
							 | 
						||
| 
								 | 
							
								        value={handleSetReferenceNode}
							 | 
						||
| 
								 | 
							
								      >
							 | 
						||
| 
								 | 
							
								        {children}
							 | 
						||
| 
								 | 
							
								      </ManagerReferenceNodeSetterContext.Provider>
							 | 
						||
| 
								 | 
							
								    </ManagerReferenceNodeContext.Provider>
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								}
							 |