@nascentdigital/funnel-editor-contentful 5.0.2 → 5.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EditorApp.js +2 -2
- package/dist/EditorPageRouter.js +3 -9
- package/dist/EditorPageRoutes.d.ts +1 -0
- package/dist/EditorPageRoutes.js +16 -0
- package/dist/EntryEditor.js +1 -1
- package/dist/EntrySidebar.js +26 -5
- package/dist/NotFound.d.ts +1 -0
- package/dist/NotFound.js +18 -0
- package/dist/asset/repository/AssetRepository.d.ts +11 -3
- package/dist/asset/repository/AssetRepository.js +6 -5
- package/dist/collection/domain/Collection.js +2 -1
- package/dist/collection/repository/CollectionRepository.d.ts +3 -3
- package/dist/collection/repository/CollectionRepository.js +19 -6
- package/dist/core/bridge/AppBridge.d.ts +31 -0
- package/dist/core/bridge/AppBridge.js +160 -0
- package/dist/core/bridge/AppBridgeContainer.d.ts +3 -3
- package/dist/core/bridge/AppBridgeContainer.js +8 -44
- package/dist/core/bridge/AppBridgeContext.d.ts +7 -8
- package/dist/core/bridge/AppBridgeContext.js +1 -6
- package/dist/core/bridge/BridgeLifecycleMessage.d.ts +7 -0
- package/dist/core/bridge/BridgeLifecycleMessage.js +12 -0
- package/dist/core/bridge/IAppBridgeMessage.d.ts +16 -0
- package/dist/core/bridge/IAppBridgeMessage.js +12 -0
- package/dist/core/bridge/index.d.ts +2 -1
- package/dist/core/bridge/index.js +2 -1
- package/dist/core/bridge/useAppBridge.d.ts +2 -8
- package/dist/core/bridge/useAppBridge.js +24 -15
- package/dist/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -2
- package/dist/explore/components/header/Header.d.ts +14 -0
- package/dist/explore/components/{Header.js → header/Header.js} +10 -8
- package/dist/explore/components/header/HeaderActions.d.ts +8 -0
- package/dist/explore/components/header/HeaderActions.js +37 -0
- package/dist/explore/components/header/HeaderContainer.d.ts +2 -0
- package/dist/explore/components/header/HeaderContainer.js +15 -0
- package/dist/explore/components/header/HeaderContext.d.ts +7 -0
- package/dist/explore/components/header/HeaderContext.js +6 -0
- package/dist/explore/components/header/HeaderController.d.ts +39 -0
- package/dist/explore/components/header/HeaderController.js +100 -0
- package/dist/explore/components/header/HeaderOptions.d.ts +10 -0
- package/dist/explore/components/header/HeaderOptions.js +26 -0
- package/dist/explore/components/header/index.d.ts +5 -0
- package/dist/{core/contentful → explore/components/header}/index.js +5 -5
- package/dist/explore/components/header/useHeader.d.ts +2 -0
- package/dist/explore/components/header/useHeader.js +30 -0
- package/dist/explore/components/index.d.ts +2 -1
- package/dist/explore/components/index.js +2 -1
- package/dist/explore/components/pages/PagesExplorerLayout.d.ts +4 -0
- package/dist/explore/components/pages/PagesExplorerLayout.js +28 -0
- package/dist/explore/components/pages/index.d.ts +1 -0
- package/dist/{core/repository → explore/components/pages}/index.js +1 -4
- package/dist/explore/index.d.ts +1 -0
- package/dist/explore/index.js +1 -0
- package/dist/explore/screens/Dashboard.d.ts +3 -0
- package/dist/explore/screens/Dashboard.js +34 -1
- package/dist/explore/screens/PageExplorer.d.ts +10 -0
- package/dist/explore/screens/PageExplorer.js +121 -1
- package/dist/explore/screens/PagesExplorer.d.ts +7 -0
- package/dist/explore/screens/PagesExplorer.js +98 -0
- package/dist/explore/screens/index.d.ts +1 -1
- package/dist/explore/screens/index.js +1 -1
- package/dist/page/bridge/BlockChangedMessage.d.ts +25 -0
- package/dist/page/bridge/BlockChangedMessage.js +18 -0
- package/dist/page/bridge/PageBridgeHub.d.ts +8 -0
- package/dist/page/bridge/PageBridgeHub.js +51 -0
- package/dist/page/bridge/index.d.ts +2 -0
- package/dist/page/bridge/index.js +18 -0
- package/dist/page/domain/Page.d.ts +2 -2
- package/dist/page/domain/Page.js +2 -1
- package/dist/page/index.d.ts +1 -0
- package/dist/page/index.js +1 -0
- package/dist/page/repository/PageRepository.d.ts +3 -3
- package/dist/page/repository/PageRepository.js +25 -8
- package/dist/page/screens/PageEditor.js +14 -6
- package/package.json +5 -5
- package/dist/core/bridge/AppMessage.d.ts +0 -19
- package/dist/core/bridge/AppMessage.js +0 -19
- package/dist/core/contentful/Contentful.d.ts +0 -33
- package/dist/core/contentful/Contentful.js +0 -67
- package/dist/core/contentful/ContentfulAsset.d.ts +0 -23
- package/dist/core/contentful/ContentfulAsset.js +0 -89
- package/dist/core/contentful/ContentfulCollection.d.ts +0 -29
- package/dist/core/contentful/ContentfulCollection.js +0 -97
- package/dist/core/contentful/ContentfulPage.d.ts +0 -31
- package/dist/core/contentful/ContentfulPage.js +0 -84
- package/dist/core/contentful/ContentfulRefs.d.ts +0 -16
- package/dist/core/contentful/ContentfulRefs.js +0 -152
- package/dist/core/contentful/index.d.ts +0 -5
- package/dist/core/repository/CollectionSerializer.d.ts +0 -9
- package/dist/core/repository/CollectionSerializer.js +0 -41
- package/dist/core/repository/LocalCollectionRepository.d.ts +0 -27
- package/dist/core/repository/LocalCollectionRepository.js +0 -143
- package/dist/core/repository/LocalPageRepository.d.ts +0 -16
- package/dist/core/repository/LocalPageRepository.js +0 -153
- package/dist/core/repository/PageSerializer.d.ts +0 -9
- package/dist/core/repository/PageSerializer.js +0 -48
- package/dist/core/repository/RemoteCollectionRepository.d.ts +0 -19
- package/dist/core/repository/RemoteCollectionRepository.js +0 -236
- package/dist/core/repository/RemotePageRepository.d.ts +0 -14
- package/dist/core/repository/RemotePageRepository.js +0 -113
- package/dist/core/repository/index.d.ts +0 -4
- package/dist/explore/components/Header.d.ts +0 -26
- package/dist/explore/screens/SiteExplorer.d.ts +0 -1
- package/dist/explore/screens/SiteExplorer.js +0 -24
package/dist/EditorApp.js
CHANGED
|
@@ -19,11 +19,11 @@ function EditorApp() {
|
|
|
19
19
|
}
|
|
20
20
|
// entry
|
|
21
21
|
else if (sdk.location.is(app_sdk_1.locations.LOCATION_ENTRY_EDITOR)) {
|
|
22
|
-
return ((0, jsx_runtime_1.jsx)(components_1.AppStateContainer, { children: (0, jsx_runtime_1.jsx)(core_1.AppBridgeContainer, { children: (0, jsx_runtime_1.jsx)(core_1.ContentfulClientContainer, { sdk: sdk, children: (0, jsx_runtime_1.jsx)(EntryEditor_1.EntryEditor, {}) }) }) }));
|
|
22
|
+
return ((0, jsx_runtime_1.jsx)(components_1.AppStateContainer, { children: (0, jsx_runtime_1.jsx)(core_1.AppBridgeContainer, { role: "hub", children: (0, jsx_runtime_1.jsx)(core_1.ContentfulClientContainer, { sdk: sdk, children: (0, jsx_runtime_1.jsx)(EntryEditor_1.EntryEditor, {}) }) }) }));
|
|
23
23
|
}
|
|
24
24
|
// entry sidebar
|
|
25
25
|
else if (sdk.location.is(app_sdk_1.locations.LOCATION_ENTRY_SIDEBAR)) {
|
|
26
|
-
return ((0, jsx_runtime_1.jsx)(components_1.AppStateContainer, { children: (0, jsx_runtime_1.jsx)(core_1.AppBridgeContainer, { children: (0, jsx_runtime_1.jsx)(EntrySidebar_1.EntrySidebar, {}) }) }));
|
|
26
|
+
return ((0, jsx_runtime_1.jsx)(components_1.AppStateContainer, { children: (0, jsx_runtime_1.jsx)(core_1.AppBridgeContainer, { role: "client", children: (0, jsx_runtime_1.jsx)(EntrySidebar_1.EntrySidebar, {}) }) }));
|
|
27
27
|
}
|
|
28
28
|
// fallback
|
|
29
29
|
else {
|
package/dist/EditorPageRouter.js
CHANGED
|
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EditorPageRouter = EditorPageRouter;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_apps_toolkit_1 = require("@contentful/react-apps-toolkit");
|
|
6
|
-
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
7
6
|
const components_1 = require("@nascentdigital/funnel-editor/components");
|
|
8
7
|
const react_1 = require("react");
|
|
9
8
|
const react_router_1 = require("react-router");
|
|
10
9
|
const asset_1 = require("./asset");
|
|
11
10
|
const collection_1 = require("./collection");
|
|
12
11
|
const core_1 = require("./core");
|
|
12
|
+
const EditorPageRoutes_1 = require("./EditorPageRoutes");
|
|
13
13
|
const explore_1 = require("./explore");
|
|
14
14
|
const page_1 = require("./page");
|
|
15
15
|
// router
|
|
@@ -18,23 +18,17 @@ function EditorPageRouter() {
|
|
|
18
18
|
const sdk = (0, react_apps_toolkit_1.useSDK)();
|
|
19
19
|
const contentfulClient = (0, core_1.useContentfulClient)();
|
|
20
20
|
const appState = (0, components_1.useAppState)();
|
|
21
|
-
const { regionalization } = funnel_core_1.AppConfig.brandConfig();
|
|
22
|
-
const region = funnel_core_1.RegionsConfig.getDefaultRegion(regionalization);
|
|
23
21
|
// create repositories
|
|
24
22
|
const { assetRepository, collectionRepository, pageRepository } = (0, react_1.useMemo)(() => ({
|
|
25
|
-
assetRepository: new asset_1.AssetRepository(sdk),
|
|
23
|
+
assetRepository: new asset_1.AssetRepository({ sdk, contentfulClient }),
|
|
26
24
|
collectionRepository: new collection_1.CollectionRepository({ sdk, contentfulClient }),
|
|
27
25
|
pageRepository: new page_1.PageRepository({ sdk, contentfulClient })
|
|
28
26
|
}), [sdk, contentfulClient]);
|
|
29
27
|
// create contexts
|
|
30
|
-
const siteContext = (0, react_1.useMemo)(() => {
|
|
31
|
-
const site = new components_1.Site({ appState, repository: pageRepository, region });
|
|
32
|
-
return { site };
|
|
33
|
-
}, [appState, pageRepository, region]);
|
|
34
28
|
const collectionsContext = (0, react_1.useMemo)(() => {
|
|
35
29
|
const collections = new components_1.Collections({ appState, repository: collectionRepository });
|
|
36
30
|
return { collections };
|
|
37
31
|
}, [appState, collectionRepository]);
|
|
38
32
|
// render
|
|
39
|
-
return ((0, jsx_runtime_1.jsx)(react_router_1.BrowserRouter, {
|
|
33
|
+
return ((0, jsx_runtime_1.jsx)(react_router_1.BrowserRouter, { basename: "/contentful", useTransitions: false, children: (0, jsx_runtime_1.jsx)(components_1.AssetRepositoryContext.Provider, { value: assetRepository, children: (0, jsx_runtime_1.jsx)(components_1.CollectionRepositoryContext.Provider, { value: collectionRepository, children: (0, jsx_runtime_1.jsx)(components_1.PageRepositoryContext.Provider, { value: pageRepository, children: (0, jsx_runtime_1.jsx)(components_1.CollectionsContext.Provider, { value: collectionsContext, children: (0, jsx_runtime_1.jsx)(components_1.DialogContainer, { children: (0, jsx_runtime_1.jsx)(components_1.CenterSheetContainer, { children: (0, jsx_runtime_1.jsx)(components_1.SplashContainer, { message: "Initializing...", children: (0, jsx_runtime_1.jsx)(explore_1.HeaderContainer, { children: (0, jsx_runtime_1.jsxs)("div", { className: "w-dvw h-dvh flex flex-col", children: [(0, jsx_runtime_1.jsx)(explore_1.Header, {}), (0, jsx_runtime_1.jsx)(EditorPageRoutes_1.EditorPageRoutes, {})] }) }) }) }) }) }) }) }) }) }));
|
|
40
34
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function EditorPageRoutes(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EditorPageRoutes = EditorPageRoutes;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("motion/react");
|
|
6
|
+
const react_router_1 = require("react-router");
|
|
7
|
+
const explore_1 = require("./explore");
|
|
8
|
+
const NotFound_1 = require("./NotFound");
|
|
9
|
+
// router
|
|
10
|
+
function EditorPageRoutes() {
|
|
11
|
+
// bind props + hooks
|
|
12
|
+
const location = (0, react_router_1.useLocation)();
|
|
13
|
+
console.debug('[EditorPageRoutes] render location', location);
|
|
14
|
+
// render
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)(react_1.AnimatePresence, { children: (0, jsx_runtime_1.jsxs)(react_router_1.Routes, { children: [(0, jsx_runtime_1.jsx)(react_router_1.Route, { index: true, element: (0, jsx_runtime_1.jsx)(explore_1.Dashboard, {}) }), (0, jsx_runtime_1.jsxs)(react_router_1.Route, { path: "pages/:region?", element: (0, jsx_runtime_1.jsx)(explore_1.PagesExplorerLayout, {}), children: [(0, jsx_runtime_1.jsx)(react_router_1.Route, { index: true, element: (0, jsx_runtime_1.jsx)(explore_1.PagesExplorer, {}) }), (0, jsx_runtime_1.jsx)(react_router_1.Route, { path: "page/:pageType", element: (0, jsx_runtime_1.jsx)(explore_1.PageExplorer, {}) })] }), (0, jsx_runtime_1.jsx)(react_router_1.Route, { path: "*", element: (0, jsx_runtime_1.jsx)(NotFound_1.NotFound, {}) })] }) }));
|
|
16
|
+
}
|
package/dist/EntryEditor.js
CHANGED
|
@@ -21,7 +21,7 @@ function EntryEditor() {
|
|
|
21
21
|
let region = funnel_core_1.RegionsConfig.getDefaultRegion(regionalization);
|
|
22
22
|
// create repositories
|
|
23
23
|
const { assetRepository, collectionRepository, pageRepository } = (0, react_1.useMemo)(() => ({
|
|
24
|
-
assetRepository: new asset_1.AssetRepository(sdk),
|
|
24
|
+
assetRepository: new asset_1.AssetRepository({ sdk, contentfulClient }),
|
|
25
25
|
collectionRepository: new collection_1.CollectionRepository({ sdk, contentfulClient }),
|
|
26
26
|
pageRepository: new page_1.PageRepository({ sdk, contentfulClient })
|
|
27
27
|
}), [sdk, contentfulClient]);
|
package/dist/EntrySidebar.js
CHANGED
|
@@ -2,23 +2,44 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EntrySidebar = EntrySidebar;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_apps_toolkit_1 = require("@contentful/react-apps-toolkit");
|
|
6
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
7
|
+
const components_1 = require("@nascentdigital/funnel-editor/components");
|
|
5
8
|
const react_1 = require("react");
|
|
6
9
|
const rxjs_1 = require("rxjs");
|
|
7
10
|
const core_1 = require("./core");
|
|
11
|
+
const page_1 = require("./page");
|
|
8
12
|
// component
|
|
9
13
|
function EntrySidebar() {
|
|
14
|
+
var _a;
|
|
10
15
|
// setup hooks
|
|
16
|
+
const id = (0, react_1.useId)();
|
|
17
|
+
const sdk = (0, react_apps_toolkit_1.useSDK)();
|
|
11
18
|
const bridge = (0, core_1.useAppBridge)();
|
|
12
|
-
const [
|
|
19
|
+
const [block, setBlock] = (0, react_1.useState)();
|
|
20
|
+
// setup ui
|
|
21
|
+
(0, react_1.useEffect)(() => {
|
|
22
|
+
var _a;
|
|
23
|
+
// setup styling for auto-resize
|
|
24
|
+
(_a = funnel_core_1.Browser.getHtml()) === null || _a === void 0 ? void 0 : _a.classList.add('Editor-widget');
|
|
25
|
+
// start auto-resize
|
|
26
|
+
sdk.window.startAutoResizer();
|
|
27
|
+
}, [sdk]);
|
|
13
28
|
// listen to bridge events
|
|
14
29
|
(0, react_1.useEffect)(() => {
|
|
15
30
|
// subscribe to block nav messages
|
|
16
31
|
const subscription = bridge.messages$
|
|
17
|
-
.pipe((0, rxjs_1.filter)(
|
|
18
|
-
.subscribe(message =>
|
|
32
|
+
.pipe((0, rxjs_1.filter)(page_1.BlockChangedMessage.filter))
|
|
33
|
+
.subscribe(message => setBlock(message.block));
|
|
19
34
|
// unsubscribe on unmount
|
|
20
35
|
return () => subscription.unsubscribe();
|
|
21
|
-
});
|
|
36
|
+
}, [bridge, sdk]);
|
|
22
37
|
// render
|
|
23
|
-
return ((0, jsx_runtime_1.
|
|
38
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "w-full flex flex-col gap-l8 py-l8", children: [(0, jsx_runtime_1.jsxs)("h3", { children: ["Active Block: ", (_a = block === null || block === void 0 ? void 0 : block.name) !== null && _a !== void 0 ? _a : 'N/A'] }), sdk.entry.getSys().contentType.sys.id === 'page' && (block === null || block === void 0 ? void 0 : block.layout) && (block === null || block === void 0 ? void 0 : block.scope) &&
|
|
39
|
+
(0, jsx_runtime_1.jsx)(components_1.FadeIn, { children: (0, jsx_runtime_1.jsxs)("div", { className: "h-full flex flex-col gap-l6 py-l7 bg-surface1 rounded-xxl interpolate-all", children: [(0, jsx_runtime_1.jsx)(components_1.Tabs, { className: "mx-l7", variant: "highlighted", size: "sm", items: blockScopes, selectedItem: block.scope, onSelect: scope => console.debug('changing scope', scope) }), (0, jsx_runtime_1.jsx)(components_1.BlockPreview, { className: "self-center", scope: block.scope, layout: block.layout })] }) }, "block.config")] }));
|
|
24
40
|
}
|
|
41
|
+
// helpers
|
|
42
|
+
const blockScopes = [
|
|
43
|
+
{ id: 'desktop', label: 'Desktop' },
|
|
44
|
+
{ id: 'mobile', label: 'Mobile' },
|
|
45
|
+
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function NotFound(): import("react/jsx-runtime").JSX.Element;
|
package/dist/NotFound.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotFound = NotFound;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const components_1 = require("@nascentdigital/funnel-editor/components");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const react_router_1 = require("react-router");
|
|
8
|
+
function NotFound() {
|
|
9
|
+
// bind hooks
|
|
10
|
+
const navigate = (0, react_router_1.useNavigate)();
|
|
11
|
+
const splash = (0, components_1.useSplash)();
|
|
12
|
+
// dismiss splash
|
|
13
|
+
(0, react_1.useEffect)(() => {
|
|
14
|
+
splash.dismiss();
|
|
15
|
+
}, [splash]);
|
|
16
|
+
// render
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(components_1.FadeIn, { className: "w-full flex-1 flex flex-col", variant: "blur", children: (0, jsx_runtime_1.jsxs)(components_1.EmptyState, { variant: "missing", size: "md", children: [(0, jsx_runtime_1.jsx)("h1", { className: "heading-md", children: "Sorry! You took a wrong turn somewhere..." }), (0, jsx_runtime_1.jsx)(components_1.Button, { variant: "primary", size: "md", onClick: () => navigate('/'), children: "Go to Dashboard" })] }) }, "notFound"));
|
|
18
|
+
}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import { EditorAppSDK } from '@contentful/app-sdk';
|
|
1
|
+
import { EditorAppSDK, PageAppSDK } from '@contentful/app-sdk';
|
|
2
|
+
import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
|
|
2
3
|
import { IAssetRepository } from '@nascentdigital/funnel-editor/components';
|
|
3
4
|
export declare class AssetRepository implements IAssetRepository {
|
|
4
|
-
readonly sdk: EditorAppSDK;
|
|
5
|
-
|
|
5
|
+
readonly sdk: EditorAppSDK | PageAppSDK;
|
|
6
|
+
readonly contentfulClient: ContentfulContentClient;
|
|
7
|
+
constructor(args: AssetRepository.ConstructorArgs);
|
|
6
8
|
search(args: IAssetRepository.Search.Args): Promise<IAssetRepository.Search.Result>;
|
|
7
9
|
get(args: IAssetRepository.Get.Args): Promise<IAssetRepository.Get.Result>;
|
|
8
10
|
update(args: IAssetRepository.Update.Args): Promise<IAssetRepository.Update.Result>;
|
|
9
11
|
uploadFile(args: IAssetRepository.UploadFile.Args): Promise<IAssetRepository.UploadFile.Result>;
|
|
10
12
|
}
|
|
13
|
+
export declare namespace AssetRepository {
|
|
14
|
+
type ConstructorArgs = {
|
|
15
|
+
sdk: EditorAppSDK | PageAppSDK;
|
|
16
|
+
contentfulClient: ContentfulContentClient;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AssetRepository = void 0;
|
|
4
4
|
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
5
|
-
const core_1 = require("../../core");
|
|
6
5
|
// class
|
|
7
6
|
class AssetRepository {
|
|
8
|
-
constructor(
|
|
9
|
-
|
|
7
|
+
constructor(args) {
|
|
8
|
+
// initialize instance
|
|
9
|
+
this.sdk = args.sdk;
|
|
10
|
+
this.contentfulClient = args.contentfulClient;
|
|
10
11
|
}
|
|
11
12
|
async search(args) {
|
|
12
13
|
// TODO: implement fetching assets
|
|
@@ -25,9 +26,9 @@ class AssetRepository {
|
|
|
25
26
|
}
|
|
26
27
|
async uploadFile(args) {
|
|
27
28
|
// upload asset
|
|
28
|
-
const asset = await
|
|
29
|
+
const asset = await this.contentfulClient.uploadAsset(args);
|
|
29
30
|
// return result
|
|
30
|
-
return
|
|
31
|
+
return funnel_core_1.Schema.AssetField.LinkedValue.toData(asset);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
exports.AssetRepository = AssetRepository;
|
|
@@ -12,6 +12,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.Collection = void 0;
|
|
15
|
+
const contentful_1 = require("@nascentdigital/funnel-cms/contentful");
|
|
15
16
|
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
16
17
|
const components_1 = require("@nascentdigital/funnel-editor/components");
|
|
17
18
|
const rxjs_1 = require("rxjs");
|
|
@@ -341,7 +342,7 @@ exports.Collection = Collection;
|
|
|
341
342
|
schema,
|
|
342
343
|
content: fields[id],
|
|
343
344
|
snapshot: fieldsSnapshot[id]
|
|
344
|
-
})), files: Object.values(files), collections: Object.values(collections) }));
|
|
345
|
+
})), files: Object.values(files), collections: Object.values(collections), references: contentful_1.ContentfulData.findReferences(fields) }));
|
|
345
346
|
}
|
|
346
347
|
Collection.fromSchemaData = fromSchemaData;
|
|
347
348
|
function toUpdates(collection, savables) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { EditorAppSDK, EntrySys } from '@contentful/app-sdk';
|
|
1
|
+
import { EditorAppSDK, EntrySys, PageAppSDK } from '@contentful/app-sdk';
|
|
2
2
|
import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
|
|
3
3
|
import { Schema } from '@nascentdigital/funnel-core';
|
|
4
4
|
import { CollectionFieldProxy, CollectionGroup, ICollection, ICollectionRepository } from '@nascentdigital/funnel-editor/components';
|
|
5
5
|
import { Collection } from '../domain';
|
|
6
6
|
export declare class CollectionRepository implements ICollectionRepository {
|
|
7
|
-
readonly sdk: EditorAppSDK;
|
|
7
|
+
readonly sdk: EditorAppSDK | PageAppSDK;
|
|
8
8
|
readonly contentfulClient: ContentfulContentClient;
|
|
9
9
|
constructor(args: CollectionRepository.ConstructorArgs);
|
|
10
10
|
getOverview(args: ICollectionRepository.GetOverview.Args): Promise<ICollectionRepository.GetOverview.Result>;
|
|
@@ -22,7 +22,7 @@ export declare class CollectionRepository implements ICollectionRepository {
|
|
|
22
22
|
}
|
|
23
23
|
export declare namespace CollectionRepository {
|
|
24
24
|
type ConstructorArgs = {
|
|
25
|
-
sdk: EditorAppSDK;
|
|
25
|
+
sdk: EditorAppSDK | PageAppSDK;
|
|
26
26
|
contentfulClient: ContentfulContentClient;
|
|
27
27
|
};
|
|
28
28
|
namespace Load {
|
|
@@ -48,8 +48,12 @@ class CollectionRepository {
|
|
|
48
48
|
throw new funnel_core_1.NotImplementedError();
|
|
49
49
|
}
|
|
50
50
|
async load(sys) {
|
|
51
|
-
//
|
|
51
|
+
// blow up if we're not in the editor
|
|
52
52
|
const { sdk, contentfulClient } = this;
|
|
53
|
+
if (!('entry' in sdk)) {
|
|
54
|
+
throw new funnel_core_1.InvalidOperationError('Attempt to call load() outside of EntryEditor');
|
|
55
|
+
}
|
|
56
|
+
// throw if entry isn't a collection (it should be in this case)
|
|
53
57
|
const { entry } = sdk;
|
|
54
58
|
sys = sys !== null && sys !== void 0 ? sys : entry.getSys();
|
|
55
59
|
const { id: entryId, contentType: { sys: { id: entryType } } } = sys;
|
|
@@ -78,7 +82,7 @@ class CollectionRepository {
|
|
|
78
82
|
const { data: _remote } = collectionResult, references = __rest(collectionResult, ["data"]);
|
|
79
83
|
const data = entryToCollectionData(entry);
|
|
80
84
|
// return collection model from data
|
|
81
|
-
const collection = domain_1.Collection.fromSchemaData(
|
|
85
|
+
const collection = domain_1.Collection.fromSchemaData({ data, references });
|
|
82
86
|
return {
|
|
83
87
|
collectionGroup: new components_1.CollectionGroup(Object.assign({ template: collection.template, collections }, group)),
|
|
84
88
|
collection,
|
|
@@ -86,6 +90,11 @@ class CollectionRepository {
|
|
|
86
90
|
};
|
|
87
91
|
}
|
|
88
92
|
async save(collection) {
|
|
93
|
+
// guard method
|
|
94
|
+
const { sdk } = this;
|
|
95
|
+
if (!('entry' in sdk)) {
|
|
96
|
+
throw new funnel_core_1.InvalidOperationError('Attempt to call save() outside of EntryEditor');
|
|
97
|
+
}
|
|
89
98
|
// serialize collection updates (or skip if there are no changes)
|
|
90
99
|
const savables = [];
|
|
91
100
|
const updateArgs = domain_1.Collection.toUpdates(collection, savables);
|
|
@@ -97,7 +106,6 @@ class CollectionRepository {
|
|
|
97
106
|
savables.forEach(savable => savable.onSaveStart());
|
|
98
107
|
// update entry if page is local
|
|
99
108
|
let updatedOn;
|
|
100
|
-
const { sdk } = this;
|
|
101
109
|
const { entry } = sdk;
|
|
102
110
|
const { id: entryId, contentType: { sys: { id: entryType } } } = entry.getSys();
|
|
103
111
|
if (entryType === contentful_1.ContentfulCollectionData.contentType && collection.id === entryId) {
|
|
@@ -117,7 +125,8 @@ class CollectionRepository {
|
|
|
117
125
|
// swap to new collection (if update returned new data)
|
|
118
126
|
if (result.collection) {
|
|
119
127
|
console.debug('[PageRepository/save] switching to new page data', result.collection);
|
|
120
|
-
|
|
128
|
+
const _a = result.collection, { data } = _a, references = __rest(_a, ["data"]);
|
|
129
|
+
collection = domain_1.Collection.fromSchemaData({ data, references });
|
|
121
130
|
}
|
|
122
131
|
}
|
|
123
132
|
console.debug('[PageRepository/save] finalizing save');
|
|
@@ -129,8 +138,12 @@ class CollectionRepository {
|
|
|
129
138
|
return collection;
|
|
130
139
|
}
|
|
131
140
|
async sync({ collection, sys }) {
|
|
132
|
-
//
|
|
141
|
+
// guard method
|
|
133
142
|
const { sdk } = this;
|
|
143
|
+
if (!('entry' in sdk)) {
|
|
144
|
+
throw new funnel_core_1.InvalidOperationError('Attempt to call sync() outside of EntryEditor');
|
|
145
|
+
}
|
|
146
|
+
// skip if entity version and updated sys are same
|
|
134
147
|
const { entry } = sdk;
|
|
135
148
|
const entrySys = entry.getSys();
|
|
136
149
|
if (sys.version === entrySys.version) {
|
|
@@ -161,7 +174,7 @@ class CollectionRepository {
|
|
|
161
174
|
};
|
|
162
175
|
// create new page (use existing sys)
|
|
163
176
|
return {
|
|
164
|
-
collection: domain_1.Collection.fromSchemaData(
|
|
177
|
+
collection: domain_1.Collection.fromSchemaData({ data, references }),
|
|
165
178
|
sys
|
|
166
179
|
};
|
|
167
180
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Callback } from '@nascentdigital/funnel-core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { Tagged } from 'type-fest';
|
|
4
|
+
import { IAppBridgeMessage } from './IAppBridgeMessage';
|
|
5
|
+
export declare class AppBridge {
|
|
6
|
+
readonly id: AppBridge.Id;
|
|
7
|
+
readonly role: AppBridge.Role;
|
|
8
|
+
private readonly _bridges$;
|
|
9
|
+
private readonly _messages$;
|
|
10
|
+
private readonly _state$;
|
|
11
|
+
private readonly _channel;
|
|
12
|
+
constructor(role: string);
|
|
13
|
+
get messages$(): Observable<IAppBridgeMessage<string, string>>;
|
|
14
|
+
get bridges$(): Observable<ReadonlySet<AppBridge.Id>>;
|
|
15
|
+
get bridges(): ReadonlySet<AppBridge.Id>;
|
|
16
|
+
private addBridge;
|
|
17
|
+
private removeBridge;
|
|
18
|
+
get state$(): Observable<AppBridge.State>;
|
|
19
|
+
get state(): AppBridge.State;
|
|
20
|
+
private set state(value);
|
|
21
|
+
connect(): AppBridge.DisconnectMethod;
|
|
22
|
+
send<TMessage extends IAppBridgeMessage>(args: AppBridge.SendArgs<TMessage>): void;
|
|
23
|
+
}
|
|
24
|
+
export declare namespace AppBridge {
|
|
25
|
+
type Id = Tagged<string, 'AppBridge.Id'>;
|
|
26
|
+
type Role = 'hub' | 'client';
|
|
27
|
+
type State = 'uninitialized' | 'initializing' | 'ready';
|
|
28
|
+
type DisconnectMethod = Callback.Void;
|
|
29
|
+
type SendArgs<TMessage extends IAppBridgeMessage> = Omit<TMessage, 'senderId' | 'sonderRole' | 'timestamp'>;
|
|
30
|
+
}
|
|
31
|
+
export declare function createBridgeChannel(): BroadcastChannel;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppBridge = void 0;
|
|
4
|
+
exports.createBridgeChannel = createBridgeChannel;
|
|
5
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
6
|
+
const rxjs_1 = require("rxjs");
|
|
7
|
+
const BridgeLifecycleMessage_1 = require("./BridgeLifecycleMessage");
|
|
8
|
+
const IAppBridgeMessage_1 = require("./IAppBridgeMessage");
|
|
9
|
+
// class
|
|
10
|
+
class AppBridge {
|
|
11
|
+
constructor(role) {
|
|
12
|
+
// initialize instance variables
|
|
13
|
+
this.id = funnel_core_1.Value.uuid();
|
|
14
|
+
this.role = role;
|
|
15
|
+
this._bridges$ = new rxjs_1.BehaviorSubject(new Set());
|
|
16
|
+
this._messages$ = new rxjs_1.Subject();
|
|
17
|
+
this._state$ = new rxjs_1.BehaviorSubject('uninitialized');
|
|
18
|
+
this._channel = createBridgeChannel();
|
|
19
|
+
}
|
|
20
|
+
get messages$() {
|
|
21
|
+
return this._messages$.asObservable();
|
|
22
|
+
}
|
|
23
|
+
get bridges$() {
|
|
24
|
+
return this._bridges$.asObservable();
|
|
25
|
+
}
|
|
26
|
+
get bridges() {
|
|
27
|
+
return this._bridges$.value;
|
|
28
|
+
}
|
|
29
|
+
addBridge(bridge) {
|
|
30
|
+
const bridges = new Set(this.bridges);
|
|
31
|
+
bridges.add(bridge);
|
|
32
|
+
this._bridges$.next(bridges);
|
|
33
|
+
}
|
|
34
|
+
removeBridge(bridge) {
|
|
35
|
+
const bridges = new Set(this.bridges);
|
|
36
|
+
bridges.delete(bridge);
|
|
37
|
+
this._bridges$.next(bridges);
|
|
38
|
+
}
|
|
39
|
+
get state$() {
|
|
40
|
+
return this._state$.asObservable();
|
|
41
|
+
}
|
|
42
|
+
get state() {
|
|
43
|
+
return this._state$.value;
|
|
44
|
+
}
|
|
45
|
+
set state(state) {
|
|
46
|
+
this._state$.next(state);
|
|
47
|
+
}
|
|
48
|
+
connect() {
|
|
49
|
+
// throw if already connecting/connected
|
|
50
|
+
const { id, role, _messages$, _channel } = this;
|
|
51
|
+
if (this.state !== 'uninitialized') {
|
|
52
|
+
throw new funnel_core_1.InvalidOperationError('Cannot call connect() unless disconnected');
|
|
53
|
+
}
|
|
54
|
+
console.debug(`[${role}/${id}] initializing`);
|
|
55
|
+
// update state
|
|
56
|
+
this.state = 'initializing';
|
|
57
|
+
// add self to bridges
|
|
58
|
+
this.addBridge(id);
|
|
59
|
+
// create broadcast handler
|
|
60
|
+
const onChannelMessage = (event) => {
|
|
61
|
+
console.debug(`[${role}/${id}] received event`, event);
|
|
62
|
+
// ignore message if it's an echo
|
|
63
|
+
const message = event.data;
|
|
64
|
+
if (message.senderId === id) {
|
|
65
|
+
console.debug(`[${role}/${id}] ignoring echo`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// or ignore if it's directed to another bridge type
|
|
69
|
+
else if (message.recipientId && message.recipientId !== id) {
|
|
70
|
+
console.debug(`[${role}/${id}] ignoring message for recipient: `, message.recipientId);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// handle bridge lifecycle events
|
|
74
|
+
if (IAppBridgeMessage_1.IAppBridgeMessage.filter(message, 'appBridge')) {
|
|
75
|
+
switch (message.type) {
|
|
76
|
+
case 'connect': {
|
|
77
|
+
console.debug(`[${role}/${id}] tracking connect for:`, message.senderId);
|
|
78
|
+
// track bridge connect
|
|
79
|
+
this.addBridge(message.senderId);
|
|
80
|
+
// greet if hub and sender joined
|
|
81
|
+
if (role === 'hub' && message.sonderRole === 'client') {
|
|
82
|
+
console.debug(`[${role}/${id}] greeting client: `, message.senderId);
|
|
83
|
+
// track client connect
|
|
84
|
+
this.send(BridgeLifecycleMessage_1.BridgeLifecycleMessage.create({ type: 'greet', recipientId: message.senderId }));
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case 'greet': {
|
|
89
|
+
// track bridge on greet
|
|
90
|
+
this.addBridge(message.senderId);
|
|
91
|
+
// mark client ready when greeted by hub
|
|
92
|
+
if (role === 'client' && message.sonderRole === 'hub') {
|
|
93
|
+
console.debug(`[${role}/${id}] received greeting from hub - marking ready`);
|
|
94
|
+
this.state = 'ready';
|
|
95
|
+
}
|
|
96
|
+
// shouldn't receive greet from client (or a sibling hub)
|
|
97
|
+
else {
|
|
98
|
+
console.warn(`[${role}/${id}] received unexpected greeting`, message);
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'disconnect': {
|
|
103
|
+
console.debug(`[${role}/${id}] tracking disconnect for:`, message.senderId);
|
|
104
|
+
// remove bridge on disconnect
|
|
105
|
+
this.removeBridge(message.senderId);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.debug(`[${role}/${id}] message is not a lifecycle message`, message);
|
|
112
|
+
}
|
|
113
|
+
// forward locally
|
|
114
|
+
_messages$.next(message);
|
|
115
|
+
};
|
|
116
|
+
// listen to messages and forward all to the channel
|
|
117
|
+
_channel.addEventListener('message', onChannelMessage);
|
|
118
|
+
console.debug(`[${role}/${id}] broadcasting connect`);
|
|
119
|
+
// broadcast connect
|
|
120
|
+
this.send(BridgeLifecycleMessage_1.BridgeLifecycleMessage.create({ type: 'connect' }));
|
|
121
|
+
// broadcast greet (if we're the hub)
|
|
122
|
+
if (role === 'hub') {
|
|
123
|
+
console.debug(`[${role}/${id}] broadcasting greet`);
|
|
124
|
+
// greet
|
|
125
|
+
this.send(BridgeLifecycleMessage_1.BridgeLifecycleMessage.create({ type: 'greet' }));
|
|
126
|
+
// mark ready
|
|
127
|
+
this.state = 'ready';
|
|
128
|
+
}
|
|
129
|
+
// return disconnect handler
|
|
130
|
+
return () => {
|
|
131
|
+
console.debug(`[${role}/${id}] broadcasting disconnect`);
|
|
132
|
+
// stop listening
|
|
133
|
+
_channel.removeEventListener('message', onChannelMessage);
|
|
134
|
+
// broadcast disconnect
|
|
135
|
+
this.send(BridgeLifecycleMessage_1.BridgeLifecycleMessage.create({ type: 'disconnect' }));
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
send(args) {
|
|
139
|
+
// create full message
|
|
140
|
+
const { id, role, _messages$, _channel } = this;
|
|
141
|
+
const message = Object.assign({ senderId: id, sonderRole: role, timestamp: Date.now() }, args);
|
|
142
|
+
// post locally
|
|
143
|
+
_messages$.next(message);
|
|
144
|
+
_channel.postMessage(message);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.AppBridge = AppBridge;
|
|
148
|
+
// helpers
|
|
149
|
+
const CHANNEL_PREFIX = 'funnel:channel:';
|
|
150
|
+
const CHANNEL_ID_KEY = 'funnel:appBridge:channelId';
|
|
151
|
+
function createBridgeChannel() {
|
|
152
|
+
// fetch channel id (or create one)
|
|
153
|
+
let channelId = window.sessionStorage.getItem(CHANNEL_ID_KEY);
|
|
154
|
+
if (!channelId) {
|
|
155
|
+
channelId = funnel_core_1.Value.uuid();
|
|
156
|
+
window.sessionStorage.setItem(CHANNEL_ID_KEY, channelId);
|
|
157
|
+
}
|
|
158
|
+
// create broadcast channel for bridge
|
|
159
|
+
return new BroadcastChannel(`'${CHANNEL_PREFIX}${channelId}`);
|
|
160
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
export declare function AppBridgeContainer({ children }: AppBridgeContainer.Props): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
import { AppBridge } from './AppBridge';
|
|
3
|
+
export declare function AppBridgeContainer({ role, children }: AppBridgeContainer.Props): import("react/jsx-runtime").JSX.Element;
|
|
4
4
|
export declare namespace AppBridgeContainer {
|
|
5
5
|
type Props = {
|
|
6
|
+
role: AppBridge.Role;
|
|
6
7
|
children: ReactNode;
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
|
-
export declare function getUniqueId(): string;
|
|
@@ -1,55 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CHANNEL_PREFIX = void 0;
|
|
4
3
|
exports.AppBridgeContainer = AppBridgeContainer;
|
|
5
|
-
exports.getUniqueId = getUniqueId;
|
|
6
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
5
|
const react_1 = require("react");
|
|
8
|
-
const
|
|
9
|
-
const uuid_1 = require("uuid");
|
|
6
|
+
const AppBridge_1 = require("./AppBridge");
|
|
10
7
|
const AppBridgeContext_1 = require("./AppBridgeContext");
|
|
11
|
-
// constants
|
|
12
|
-
exports.CHANNEL_PREFIX = 'funnel:channel:';
|
|
13
8
|
// container
|
|
14
|
-
function AppBridgeContainer({ children }) {
|
|
15
|
-
//
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
channel: new BroadcastChannel(exports.CHANNEL_PREFIX + getUniqueId())
|
|
20
|
-
}), []);
|
|
21
|
-
// forward all events to channel
|
|
9
|
+
function AppBridgeContainer({ role, children }) {
|
|
10
|
+
// bind bridge/context
|
|
11
|
+
const appBridge = (0, react_1.useMemo)(() => new AppBridge_1.AppBridge(role), [role]);
|
|
12
|
+
const context = (0, react_1.useMemo)(() => ({ appBridge }), [appBridge]);
|
|
13
|
+
// connect on mount (automatically disconnects b/c of result
|
|
22
14
|
(0, react_1.useEffect)(() => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const onChannelMessage = (event) => {
|
|
26
|
-
console.debug(`[${id}] received event`, event);
|
|
27
|
-
// ignore message if sent from this container
|
|
28
|
-
const message = event.data;
|
|
29
|
-
if (message.source === id) {
|
|
30
|
-
console.debug(`[${id}] ignoring echo`);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
console.debug(`[${id}] forwarding message to local bus`);
|
|
34
|
-
eventBus.next(message);
|
|
35
|
-
};
|
|
36
|
-
// listen to messages and forward all to the channel
|
|
37
|
-
channel.addEventListener('message', onChannelMessage);
|
|
38
|
-
// remove listener on unmount
|
|
39
|
-
return () => channel.removeEventListener('message', onChannelMessage);
|
|
40
|
-
}, [context]);
|
|
15
|
+
return appBridge.connect();
|
|
16
|
+
}, [appBridge]);
|
|
41
17
|
// render
|
|
42
18
|
return ((0, jsx_runtime_1.jsx)(AppBridgeContext_1.AppBridgeContext.Provider, { value: context, children: children }));
|
|
43
19
|
}
|
|
44
|
-
// helpers
|
|
45
|
-
const UUID_KEY = 'funnel:uuid';
|
|
46
|
-
function getUniqueId() {
|
|
47
|
-
// fetch window id (or create one)
|
|
48
|
-
let value = window.sessionStorage.getItem(UUID_KEY);
|
|
49
|
-
if (!value) {
|
|
50
|
-
value = (0, uuid_1.v4)();
|
|
51
|
-
window.sessionStorage.setItem(UUID_KEY, value);
|
|
52
|
-
}
|
|
53
|
-
// return value
|
|
54
|
-
return value;
|
|
55
|
-
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export declare const AppBridgeContext: import("react").Context<IAppBridgeContext>;
|
|
1
|
+
import { AppBridge } from './AppBridge';
|
|
2
|
+
export declare const AppBridgeContext: import("react").Context<AppBridgeContext.Data>;
|
|
3
|
+
export declare namespace AppBridgeContext {
|
|
4
|
+
type Data = {
|
|
5
|
+
appBridge?: AppBridge;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
@@ -2,10 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppBridgeContext = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
|
-
const rxjs_1 = require("rxjs");
|
|
6
5
|
// context
|
|
7
|
-
exports.AppBridgeContext = (0, react_1.createContext)({
|
|
8
|
-
id: '',
|
|
9
|
-
eventBus: new rxjs_1.Subject(),
|
|
10
|
-
channel: {}
|
|
11
|
-
});
|
|
6
|
+
exports.AppBridgeContext = (0, react_1.createContext)({});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IAppBridgeMessage } from './IAppBridgeMessage';
|
|
2
|
+
export interface BridgeLifecycleMessage extends IAppBridgeMessage<'appBridge', BridgeLifecycleMessage.Type> {
|
|
3
|
+
}
|
|
4
|
+
export declare namespace BridgeLifecycleMessage {
|
|
5
|
+
type Type = 'connect' | 'greet' | 'disconnect';
|
|
6
|
+
function create(args: IAppBridgeMessage.Create.Args<BridgeLifecycleMessage>): IAppBridgeMessage.Create.Result<BridgeLifecycleMessage>;
|
|
7
|
+
}
|