-
Notifications
You must be signed in to change notification settings - Fork 2
/
BackstageManager.tsx
88 lines (76 loc) · 2.42 KB
/
BackstageManager.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Backstage
*/
import * as React from "react";
import type { IconSpec } from "@itwin/core-react";
import { UiFramework } from "../UiFramework";
import type {
BackstageToggledArgs,
FrameworkBackstage,
} from "../framework/FrameworkBackstage";
import { InternalBackstageManager } from "./InternalBackstageManager";
/** Controls backstage.
* @public
*/
export class BackstageManager {
private internal = new InternalBackstageManager();
/**
* Override internal implementation for a mock
* @internal For tests only.
*/
public mockInternal(internal: InternalBackstageManager) {
this.internal = internal;
}
/** Event raised when backstage is opened or closed. */
public get onToggled() {
return this.internal.onToggled;
}
public get isOpen() {
return this.internal.isOpen;
}
public open() {
return this.internal.open();
}
public close() {
return this.internal.close();
}
public toggle() {
return this.internal.toggle();
}
public getBackstageToggleCommand(overrideIconSpec?: IconSpec) {
return this.internal.getBackstageToggleCommand(overrideIconSpec);
}
/** Get CommandItemDef that will toggle display of Backstage and allow iconSpec to be overridden
*/
public static getBackstageToggleCommand(overrideIconSpec?: IconSpec) {
return UiFramework.backstage.getBackstageToggleCommand(overrideIconSpec);
}
}
/** Hook that returns isOpen flag of the backstage.
* @public
*/
export const useIsBackstageOpen = (manager: FrameworkBackstage) => {
const [isOpen, setIsOpen] = React.useState(manager.isOpen);
React.useEffect(() => {
const handleToggled = (args: BackstageToggledArgs) => {
setIsOpen(args.isOpen);
};
setIsOpen(manager.isOpen);
manager.onToggled.addListener(handleToggled);
return () => {
manager.onToggled.removeListener(handleToggled);
};
}, [manager]);
return isOpen;
};
/** Hook that returns backstage manager.
* @public
*/
export const useBackstageManager = () => {
const [manager] = React.useState(UiFramework.backstage);
return manager;
};