/
PortalTargetContext.tsx
43 lines (37 loc) · 1.35 KB
/
PortalTargetContext.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Core
*/
import { createContext, PropsWithChildren, useContext } from "react";
/**
* Props for [[PortalTargetContextProvider]]
* @beta
*/
export interface PortalTargetContextProviderProps {
portalTarget: HTMLElement | null;
}
/**
* Provides a portal target for components.
* @beta
*/
export function PortalTargetContextProvider({ portalTarget, children }: PropsWithChildren<PortalTargetContextProviderProps>) {
return <portalTargetContext.Provider value={{ portalTarget }}>{children}</portalTargetContext.Provider>;
}
/**
* Context that stores a portal target. It will be used to portal popovers opened by presentation components.
* @internal
*/
export interface PortalTargetContext {
portalTarget: HTMLElement | null;
}
const portalTargetContext = createContext<PortalTargetContext>({ portalTarget: null });
/**
* Returns context provided by [[PortalTargetContextProvider]].
* @internal
*/
export function usePortalTargetContext() {
return useContext(portalTargetContext);
}