diff --git a/src/common/Interfaces.ts b/src/common/Interfaces.ts index 5d981e508..4790f0e9e 100644 --- a/src/common/Interfaces.ts +++ b/src/common/Interfaces.ts @@ -64,6 +64,7 @@ export abstract class App { export abstract class UserInterface { abstract setMainView(element: React.ReactElement): void; + abstract setContextWrapper(contextWrapper: ((rootView: React.ReactElement) => React.ReactElement)): void; abstract registerRootView(viewKey: string, getComponentFunc: Function): void; abstract useCustomScrollbars(enable?: boolean): void; diff --git a/src/native-common/MainViewStore.ts b/src/native-common/MainViewStore.ts index 038351058..96b281915 100644 --- a/src/native-common/MainViewStore.ts +++ b/src/native-common/MainViewStore.ts @@ -13,6 +13,8 @@ import SubscribableEvent from 'subscribableevent'; export class MainViewStore extends SubscribableEvent<() => void> { private _mainView: React.ReactElement | undefined; + private _contextWrapper: ((rootView: React.ReactElement) => React.ReactElement) | undefined; + getMainView(): React.ReactElement | undefined { return this._mainView; @@ -22,6 +24,15 @@ export class MainViewStore extends SubscribableEvent<() => void> { this._mainView = view; this.fire(); } + + getContextWrapper(): ((rootView: React.ReactElement) => React.ReactElement) | undefined { + return this._contextWrapper; + } + + setContextWrapper(contextWrapper: ((rootView: React.ReactElement) => React.ReactElement)): void { + this._contextWrapper = contextWrapper; + this.fire(); + } } export default new MainViewStore(); diff --git a/src/native-common/RootView.tsx b/src/native-common/RootView.tsx index 096acbb16..b459d8556 100644 --- a/src/native-common/RootView.tsx +++ b/src/native-common/RootView.tsx @@ -35,6 +35,7 @@ interface RootViewPropsWithMainViewType extends BaseRootViewProps { interface RootViewState { mainView?: any; + contextWrapper?: (rootView: React.ReactElement) => React.ReactElement; announcementText?: string; } @@ -144,7 +145,12 @@ abstract class BaseRootView

extends React.Component ); - return this.renderTopView(content); + const maybeContextWrappedContent = + this.state.contextWrapper === undefined + ? content + : this.state.contextWrapper(content); + + return this.renderTopView(maybeContextWrappedContent); } protected _renderAnnouncerView(): JSX.Element { @@ -193,13 +199,15 @@ class RootViewUsingStore extends BaseRootView { private _getStateFromStore(): RootViewState { let mainView = MainViewStore.getMainView(); + let contextWrapper = MainViewStore.getContextWrapper(); if (mainView && !isEqual(mainView.props, this._mainViewProps)) { mainView = React.cloneElement(mainView, this._mainViewProps); } return { - mainView: mainView, + mainView: mainView, + contextWrapper: contextWrapper, }; } diff --git a/src/native-common/UserInterface.tsx b/src/native-common/UserInterface.tsx index 2d9f17983..b77b8ae42 100644 --- a/src/native-common/UserInterface.tsx +++ b/src/native-common/UserInterface.tsx @@ -137,6 +137,10 @@ export class UserInterface extends RX.UserInterface { MainViewStore.setMainView(element); } + setContextWrapper(contextWrapper: ((rootView: React.ReactElement) => React.ReactElement)): void { + MainViewStore.setContextWrapper(contextWrapper); + } + registerRootViewUsingPropsFactory(factory: RN.ComponentProvider) { this._rootViewUsingPropsFactory = factory; } diff --git a/src/web/FrontLayerViewManager.tsx b/src/web/FrontLayerViewManager.tsx index d233d6f99..991d7369d 100644 --- a/src/web/FrontLayerViewManager.tsx +++ b/src/web/FrontLayerViewManager.tsx @@ -37,11 +37,17 @@ export class FrontLayerViewManager { private _isRtlAllowed = true; private _isRtlForced = false; + private _contextWrapper: ((rootView: React.ReactElement) => React.ReactElement) | undefined; + setMainView(element: React.ReactElement): void { this._mainView = element; this._renderRootView(); } + setContextWrapper(contextWrapper: ((rootView: React.ReactElement) => React.ReactElement)): void { + this._contextWrapper = contextWrapper; + } + isModalDisplayed(modalId?: string): boolean { if (modalId) { return this._modalStack.some(d => d.id === modalId); @@ -205,7 +211,12 @@ export class FrontLayerViewManager { const container = document.getElementsByClassName('app-container')[0]; - ReactDOM.render(rootView, container); + const maybeContextWrappedRootView = + this._contextWrapper === undefined + ? rootView + : this._contextWrapper(rootView); + + ReactDOM.render(maybeContextWrappedRootView, container); } isPopupDisplayed(popupId?: string): boolean { diff --git a/src/web/UserInterface.ts b/src/web/UserInterface.ts index 8929db7a3..d628b6844 100644 --- a/src/web/UserInterface.ts +++ b/src/web/UserInterface.ts @@ -114,6 +114,10 @@ export class UserInterface extends RX.UserInterface { FrontLayerViewManager.setMainView(element); } + setContextWrapper(contextWrapper: ((rootView: React.ReactElement) => React.ReactElement)): void { + FrontLayerViewManager.setContextWrapper(contextWrapper); + } + registerRootView(viewKey: string, getComponentFunc: Function): void { // Nothing to do }