@nascentdigital/funnel-editor-contentful 5.0.1 → 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.
Files changed (164) hide show
  1. package/dist/EditorApp.js +11 -9
  2. package/dist/EditorPageRouter.d.ts +1 -0
  3. package/dist/EditorPageRouter.js +34 -0
  4. package/dist/EditorPageRoutes.d.ts +1 -0
  5. package/dist/EditorPageRoutes.js +16 -0
  6. package/dist/EntryEditor.js +30 -29
  7. package/dist/EntrySidebar.js +26 -5
  8. package/dist/NotFound.d.ts +1 -0
  9. package/dist/NotFound.js +18 -0
  10. package/dist/asset/index.d.ts +1 -0
  11. package/dist/{core/api → asset}/index.js +1 -3
  12. package/dist/{core → asset}/repository/AssetRepository.d.ts +11 -3
  13. package/dist/{core → asset}/repository/AssetRepository.js +6 -5
  14. package/dist/asset/repository/index.d.ts +1 -0
  15. package/dist/{core → asset}/repository/index.js +0 -4
  16. package/dist/collection/controller/{LocalCollectionController.d.ts → ContentfulCollectionController.d.ts} +17 -11
  17. package/dist/collection/controller/ContentfulCollectionController.js +278 -0
  18. package/dist/collection/controller/ContentfulCollectionControllerContainer.d.ts +5 -0
  19. package/dist/collection/controller/ContentfulCollectionControllerContainer.js +28 -0
  20. package/dist/collection/controller/index.d.ts +3 -4
  21. package/dist/collection/controller/index.js +3 -4
  22. package/dist/collection/controller/useContentfulCollectionController.d.ts +2 -0
  23. package/dist/collection/controller/useContentfulCollectionController.js +8 -0
  24. package/dist/{core → collection}/domain/Collection.d.ts +11 -2
  25. package/dist/{core → collection}/domain/Collection.js +76 -0
  26. package/dist/{core → collection}/domain/index.d.ts +0 -1
  27. package/dist/{core → collection}/domain/index.js +0 -1
  28. package/dist/collection/index.d.ts +1 -0
  29. package/dist/collection/index.js +1 -0
  30. package/dist/collection/repository/CollectionRepository.d.ts +49 -0
  31. package/dist/collection/repository/CollectionRepository.js +223 -0
  32. package/dist/collection/repository/index.d.ts +1 -0
  33. package/dist/{core/contentful → collection/repository}/index.js +1 -5
  34. package/dist/collection/screens/CollectionEditor.js +23 -6
  35. package/dist/core/bridge/AppBridge.d.ts +31 -0
  36. package/dist/core/bridge/AppBridge.js +160 -0
  37. package/dist/core/bridge/AppBridgeContainer.d.ts +3 -3
  38. package/dist/core/bridge/AppBridgeContainer.js +8 -44
  39. package/dist/core/bridge/AppBridgeContext.d.ts +7 -8
  40. package/dist/core/bridge/AppBridgeContext.js +1 -6
  41. package/dist/core/bridge/BridgeLifecycleMessage.d.ts +7 -0
  42. package/dist/core/bridge/BridgeLifecycleMessage.js +12 -0
  43. package/dist/core/bridge/IAppBridgeMessage.d.ts +16 -0
  44. package/dist/core/bridge/IAppBridgeMessage.js +12 -0
  45. package/dist/core/bridge/index.d.ts +2 -1
  46. package/dist/core/bridge/index.js +2 -1
  47. package/dist/core/bridge/useAppBridge.d.ts +2 -8
  48. package/dist/core/bridge/useAppBridge.js +24 -15
  49. package/dist/core/client/ContentfulClientContainer.d.ts +8 -0
  50. package/dist/core/client/ContentfulClientContainer.js +43 -0
  51. package/dist/core/client/ContentfulClientContext.d.ts +8 -0
  52. package/dist/core/client/ContentfulClientContext.js +8 -0
  53. package/dist/core/client/index.d.ts +3 -0
  54. package/dist/core/client/index.js +19 -0
  55. package/dist/core/client/useContentfulClient.d.ts +4 -0
  56. package/dist/core/client/useContentfulClient.js +24 -0
  57. package/dist/core/index.d.ts +1 -4
  58. package/dist/core/index.js +1 -4
  59. package/dist/explore/components/header/Header.d.ts +14 -0
  60. package/dist/explore/components/header/Header.js +33 -0
  61. package/dist/explore/components/header/HeaderActions.d.ts +8 -0
  62. package/dist/explore/components/header/HeaderActions.js +37 -0
  63. package/dist/explore/components/header/HeaderContainer.d.ts +2 -0
  64. package/dist/explore/components/header/HeaderContainer.js +15 -0
  65. package/dist/explore/components/header/HeaderContext.d.ts +7 -0
  66. package/dist/{core/api/EditorApiContext.js → explore/components/header/HeaderContext.js} +2 -2
  67. package/dist/explore/components/header/HeaderController.d.ts +39 -0
  68. package/dist/explore/components/header/HeaderController.js +100 -0
  69. package/dist/explore/components/header/HeaderOptions.d.ts +10 -0
  70. package/dist/explore/components/header/HeaderOptions.js +26 -0
  71. package/dist/explore/components/header/index.d.ts +5 -0
  72. package/dist/explore/components/header/index.js +21 -0
  73. package/dist/explore/components/header/useHeader.d.ts +2 -0
  74. package/dist/explore/components/header/useHeader.js +30 -0
  75. package/dist/explore/components/index.d.ts +2 -0
  76. package/dist/explore/components/index.js +18 -0
  77. package/dist/explore/components/pages/PagesExplorerLayout.d.ts +4 -0
  78. package/dist/explore/components/pages/PagesExplorerLayout.js +28 -0
  79. package/dist/explore/components/pages/index.d.ts +1 -0
  80. package/dist/explore/components/pages/index.js +17 -0
  81. package/dist/explore/index.d.ts +2 -0
  82. package/dist/explore/index.js +18 -0
  83. package/dist/explore/screens/Dashboard.d.ts +4 -0
  84. package/dist/explore/screens/Dashboard.js +55 -0
  85. package/dist/explore/screens/PageExplorer.d.ts +11 -0
  86. package/dist/explore/screens/PageExplorer.js +129 -0
  87. package/dist/explore/screens/PagesExplorer.d.ts +7 -0
  88. package/dist/explore/screens/PagesExplorer.js +98 -0
  89. package/dist/explore/screens/index.d.ts +3 -0
  90. package/dist/explore/screens/index.js +19 -0
  91. package/dist/page/bridge/BlockChangedMessage.d.ts +25 -0
  92. package/dist/page/bridge/BlockChangedMessage.js +18 -0
  93. package/dist/page/bridge/PageBridgeHub.d.ts +8 -0
  94. package/dist/page/bridge/PageBridgeHub.js +51 -0
  95. package/dist/page/bridge/index.d.ts +2 -0
  96. package/dist/page/bridge/index.js +18 -0
  97. package/dist/page/controller/{LocalPageController.d.ts → ContentfulPageController.d.ts} +15 -9
  98. package/dist/page/controller/ContentfulPageController.js +277 -0
  99. package/dist/page/controller/ContentfulPageControllerContainer.d.ts +5 -0
  100. package/dist/page/controller/ContentfulPageControllerContainer.js +28 -0
  101. package/dist/page/controller/index.d.ts +3 -3
  102. package/dist/page/controller/index.js +3 -3
  103. package/dist/page/controller/useContentfulPageController.d.ts +2 -0
  104. package/dist/page/controller/useContentfulPageController.js +8 -0
  105. package/dist/{core → page}/domain/Page.d.ts +23 -12
  106. package/dist/{core → page}/domain/Page.js +139 -0
  107. package/dist/page/domain/index.d.ts +1 -0
  108. package/dist/page/domain/index.js +17 -0
  109. package/dist/page/index.d.ts +3 -0
  110. package/dist/page/index.js +3 -0
  111. package/dist/page/repository/PageRepository.d.ts +45 -0
  112. package/dist/page/repository/PageRepository.js +241 -0
  113. package/dist/page/repository/index.d.ts +1 -0
  114. package/dist/page/repository/index.js +17 -0
  115. package/dist/page/screens/PageEditor.js +36 -12
  116. package/package.json +9 -5
  117. package/dist/collection/controller/LocalCollectionController.js +0 -200
  118. package/dist/collection/controller/LocalCollectionControllerContainer.d.ts +0 -8
  119. package/dist/collection/controller/LocalCollectionControllerContainer.js +0 -36
  120. package/dist/collection/controller/LocalCollectionControllerContext.d.ts +0 -7
  121. package/dist/collection/controller/LocalCollectionControllerContext.js +0 -6
  122. package/dist/collection/controller/useLocalCollectionController.d.ts +0 -2
  123. package/dist/collection/controller/useLocalCollectionController.js +0 -10
  124. package/dist/core/api/EditorApiClient.d.ts +0 -7
  125. package/dist/core/api/EditorApiClient.js +0 -29
  126. package/dist/core/api/EditorApiContainer.d.ts +0 -5
  127. package/dist/core/api/EditorApiContainer.js +0 -16
  128. package/dist/core/api/EditorApiContext.d.ts +0 -7
  129. package/dist/core/api/index.d.ts +0 -3
  130. package/dist/core/api/useEditorApi.d.ts +0 -2
  131. package/dist/core/api/useEditorApi.js +0 -12
  132. package/dist/core/bridge/AppMessage.d.ts +0 -19
  133. package/dist/core/bridge/AppMessage.js +0 -19
  134. package/dist/core/contentful/Contentful.d.ts +0 -33
  135. package/dist/core/contentful/Contentful.js +0 -67
  136. package/dist/core/contentful/ContentfulAsset.d.ts +0 -23
  137. package/dist/core/contentful/ContentfulAsset.js +0 -88
  138. package/dist/core/contentful/ContentfulCollection.d.ts +0 -29
  139. package/dist/core/contentful/ContentfulCollection.js +0 -97
  140. package/dist/core/contentful/ContentfulPage.d.ts +0 -31
  141. package/dist/core/contentful/ContentfulPage.js +0 -84
  142. package/dist/core/contentful/ContentfulRefs.d.ts +0 -16
  143. package/dist/core/contentful/ContentfulRefs.js +0 -152
  144. package/dist/core/contentful/index.d.ts +0 -5
  145. package/dist/core/repository/CollectionSerializer.d.ts +0 -9
  146. package/dist/core/repository/CollectionSerializer.js +0 -41
  147. package/dist/core/repository/LocalCollectionRepository.d.ts +0 -27
  148. package/dist/core/repository/LocalCollectionRepository.js +0 -143
  149. package/dist/core/repository/LocalPageRepository.d.ts +0 -16
  150. package/dist/core/repository/LocalPageRepository.js +0 -153
  151. package/dist/core/repository/PageSerializer.d.ts +0 -9
  152. package/dist/core/repository/PageSerializer.js +0 -47
  153. package/dist/core/repository/RemoteCollectionRepository.d.ts +0 -19
  154. package/dist/core/repository/RemoteCollectionRepository.js +0 -236
  155. package/dist/core/repository/RemotePageRepository.d.ts +0 -14
  156. package/dist/core/repository/RemotePageRepository.js +0 -113
  157. package/dist/core/repository/index.d.ts +0 -5
  158. package/dist/page/controller/LocalPageController.js +0 -190
  159. package/dist/page/controller/LocalPageControllerContainer.d.ts +0 -8
  160. package/dist/page/controller/LocalPageControllerContainer.js +0 -36
  161. package/dist/page/controller/LocalPageControllerContext.d.ts +0 -7
  162. package/dist/page/controller/LocalPageControllerContext.js +0 -6
  163. package/dist/page/controller/useLocalPageController.d.ts +0 -2
  164. package/dist/page/controller/useLocalPageController.js +0 -10
@@ -1,8 +1,2 @@
1
- import { Observable } from 'rxjs';
2
- import { AppMessage } from './AppMessage';
3
- export type AppMessageSubmission = Omit<AppMessage, 'source'>;
4
- export type UseAppBridgetHook = {
5
- sendMessage(message: AppMessageSubmission): void;
6
- messages$: Observable<AppMessage>;
7
- };
8
- export declare function useAppBridge(): UseAppBridgetHook;
1
+ import { AppBridge } from './AppBridge';
2
+ export declare function useAppBridge(): AppBridge;
@@ -1,24 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useAppBridge = useAppBridge;
4
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
5
+ const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
4
6
  const react_1 = require("react");
5
7
  const AppBridgeContext_1 = require("./AppBridgeContext");
6
8
  // hook
7
9
  function useAppBridge() {
8
10
  // bind context
9
- const { id, eventBus, channel } = (0, react_1.useContext)(AppBridgeContext_1.AppBridgeContext);
10
- // helpers
11
- const sendMessage = (message) => {
12
- // track the message
13
- const trackedMessage = Object.assign({ source: id }, message);
14
- // send to local bus
15
- eventBus.next(trackedMessage);
16
- // echo to remote bus (if any)
17
- channel.postMessage(trackedMessage);
18
- };
19
- // return hook interface
20
- return {
21
- sendMessage,
22
- messages$: eventBus.asObservable()
23
- };
11
+ const { appBridge } = (0, react_1.useContext)(AppBridgeContext_1.AppBridgeContext);
12
+ const touch = (0, hooks_1.useTouch)();
13
+ // sync with state
14
+ (0, react_1.useEffect)(() => {
15
+ // skip if not available (shouldn't happen)
16
+ if (!appBridge) {
17
+ return;
18
+ }
19
+ // subscribe to state
20
+ const subscriptions = [
21
+ appBridge.state$.subscribe(touch),
22
+ appBridge.bridges$.subscribe(touch)
23
+ ];
24
+ // unsubscribe on unmount
25
+ return () => subscriptions.forEach(subscription => subscription.unsubscribe());
26
+ }, [appBridge, touch]);
27
+ // throw if not available (shouldn't happen)
28
+ if (!appBridge) {
29
+ throw new funnel_core_1.InvalidOperationError('Cannot use AppBridge outside of AppBridgeContainer');
30
+ }
31
+ // return bridge
32
+ return appBridge;
24
33
  }
@@ -0,0 +1,8 @@
1
+ import { KnownAppSDK } from '@contentful/app-sdk';
2
+ import { PropsWithChildren } from 'react';
3
+ export declare function ContentfulClientContainer({ sdk, children }: ContentfulClientContainer.Props): import("react/jsx-runtime").JSX.Element;
4
+ export declare namespace ContentfulClientContainer {
5
+ type Props = PropsWithChildren & {
6
+ sdk: KnownAppSDK;
7
+ };
8
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulClientContainer = ContentfulClientContainer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const contentful_1 = require("@nascentdigital/funnel-cms/contentful");
6
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
7
+ const react_1 = require("react");
8
+ const ContentfulClientContext_1 = require("./ContentfulClientContext");
9
+ // container
10
+ function ContentfulClientContainer({ sdk, children }) {
11
+ // bind state
12
+ const [client, setClient] = (0, react_1.useState)(() => ({ __type: 'pending' }));
13
+ const context = (0, react_1.useMemo)(() => ({ client }), [client]);
14
+ // create client on mount
15
+ (0, react_1.useEffect)(() => {
16
+ // fetch client
17
+ let cancelled = false;
18
+ const mount = async () => {
19
+ // try to create
20
+ try {
21
+ // create editor
22
+ const client = await contentful_1.ContentfulContentClient.forEditor(sdk);
23
+ // bind if not cancelled
24
+ if (!cancelled) {
25
+ setClient({ __type: 'success', result: client });
26
+ }
27
+ }
28
+ // or handle error (if not cancelled)
29
+ catch (e) {
30
+ if (!cancelled) {
31
+ setClient({ __type: 'failure', error: funnel_core_1.IsometricErrorUtils.coerceError(e) });
32
+ }
33
+ }
34
+ };
35
+ mount().catch(console.error);
36
+ // cancel on unmount
37
+ return () => {
38
+ cancelled = true;
39
+ };
40
+ }, [sdk]);
41
+ // render
42
+ return ((0, jsx_runtime_1.jsx)(ContentfulClientContext_1.ContentfulClientContext.Provider, { value: context, children: client.__type === 'success' && children }));
43
+ }
@@ -0,0 +1,8 @@
1
+ import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
2
+ import { Result } from '@nascentdigital/funnel-core';
3
+ export declare const ContentfulClientContext: import("react").Context<ContentfulClientContext.Data>;
4
+ export declare namespace ContentfulClientContext {
5
+ type Data = {
6
+ client: Result<ContentfulContentClient>;
7
+ };
8
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulClientContext = void 0;
4
+ const react_1 = require("react");
5
+ // context
6
+ exports.ContentfulClientContext = (0, react_1.createContext)({
7
+ client: { __type: 'pending' }
8
+ });
@@ -0,0 +1,3 @@
1
+ export * from './ContentfulClientContainer';
2
+ export * from './ContentfulClientContext';
3
+ export * from './useContentfulClient';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ContentfulClientContainer"), exports);
18
+ __exportStar(require("./ContentfulClientContext"), exports);
19
+ __exportStar(require("./useContentfulClient"), exports);
@@ -0,0 +1,4 @@
1
+ import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
2
+ import { Result } from '@nascentdigital/funnel-core';
3
+ export declare function usePossibleContentfulClient(): Result<ContentfulContentClient>;
4
+ export declare function useContentfulClient(): ContentfulContentClient;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usePossibleContentfulClient = usePossibleContentfulClient;
4
+ exports.useContentfulClient = useContentfulClient;
5
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
6
+ const react_1 = require("react");
7
+ const ContentfulClientContext_1 = require("./ContentfulClientContext");
8
+ // hooks
9
+ function usePossibleContentfulClient() {
10
+ // bind context
11
+ const { client } = (0, react_1.useContext)(ContentfulClientContext_1.ContentfulClientContext);
12
+ // return result
13
+ return client;
14
+ }
15
+ function useContentfulClient() {
16
+ // bind context
17
+ const { client } = (0, react_1.useContext)(ContentfulClientContext_1.ContentfulClientContext);
18
+ // throw if unavailable (shouldn't happen - see ContentfulClientContainer)
19
+ if (client.__type !== 'success') {
20
+ throw new funnel_core_1.IllegalStateError('ContentfulContentClient isn\'t available');
21
+ }
22
+ // return result
23
+ return client.result;
24
+ }
@@ -1,5 +1,2 @@
1
- export * from './api';
2
1
  export * from './bridge';
3
- export * from './contentful';
4
- export * from './domain';
5
- export * from './repository';
2
+ export * from './client';
@@ -14,8 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./api"), exports);
18
17
  __exportStar(require("./bridge"), exports);
19
- __exportStar(require("./contentful"), exports);
20
- __exportStar(require("./domain"), exports);
21
- __exportStar(require("./repository"), exports);
18
+ __exportStar(require("./client"), exports);
@@ -0,0 +1,14 @@
1
+ export declare function Header({ className }: Header.Props): import("react/jsx-runtime").JSX.Element;
2
+ export declare namespace Header {
3
+ type Breadcrumb = Breadcrumb.Label | Breadcrumb.Link;
4
+ namespace Breadcrumb {
5
+ type Label = string;
6
+ type Link = {
7
+ label: string;
8
+ url: string;
9
+ };
10
+ }
11
+ type Props = {
12
+ className?: string;
13
+ };
14
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Header = Header;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const components_1 = require("@nascentdigital/funnel-editor/components");
9
+ const classnames_1 = __importDefault(require("classnames"));
10
+ const react_1 = require("motion/react");
11
+ const react_2 = require("react");
12
+ const react_router_1 = require("react-router");
13
+ const useHeader_1 = require("./useHeader");
14
+ // component
15
+ function Header({ className }) {
16
+ // bind props + hooks
17
+ const controller = (0, useHeader_1.useHeader)();
18
+ const { breadcrumbs, highlightBreadcrumb, backButton, disableBack, actions } = controller;
19
+ const breadcrumbsEndIndex = breadcrumbs.length - 1;
20
+ // render
21
+ return ((0, jsx_runtime_1.jsxs)("nav", { className: (0, classnames_1.default)(className, 'h-48 flex items-center gap-l4 px-l8', 'label-sm text-content-primary bg-background border-b border-solid border-border-l1'), children: [backButton === 'none'
22
+ // logo
23
+ ?
24
+ (0, jsx_runtime_1.jsx)("span", { className: "w-40 h-40 flex justify-center items-center", children: (0, jsx_runtime_1.jsx)(components_1.Logo, { size: 28 }) })
25
+ // back/close
26
+ :
27
+ (0, jsx_runtime_1.jsx)(components_1.IconButton, { icon: backButton === 'back' ? 'ArrowLeft' : 'X', onClick: () => controller.onBack(), disabled: disableBack }), (0, jsx_runtime_1.jsx)("ul", { className: "flex-1 flex items-center gap-l5", children: (0, jsx_runtime_1.jsx)(react_1.AnimatePresence, { mode: "popLayout", children: breadcrumbs.map((breadcrumb, index) => (0, jsx_runtime_1.jsxs)(react_1.motion.li, { className: "flex items-center gap-l5", variants: components_1.Animate.Variants.fade, initial: "initial", animate: "animate", exit: "exit", layout: "position", children: [index > 0 &&
28
+ (0, jsx_runtime_1.jsx)("span", { children: "/" }), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)({ 'label-sm label-strong': highlightBreadcrumb && index === breadcrumbsEndIndex }), children: typeof breadcrumb === 'string'
29
+ ?
30
+ (0, jsx_runtime_1.jsx)("span", { children: breadcrumb })
31
+ :
32
+ (0, jsx_runtime_1.jsx)(react_router_1.Link, { to: breadcrumb.url, children: breadcrumb.label }) })] }, typeof breadcrumb === 'string' ? `${breadcrumb}` : `${breadcrumb.label}`)) }) }), (0, jsx_runtime_1.jsx)("div", { className: "h-full flex items-center gap-l6", children: actions.map(action => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: action.components }, action.id)) })] }));
33
+ }
@@ -0,0 +1,8 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { HeaderController } from './HeaderController';
3
+ export declare function HeaderActions({ children: components, dependencies: dependenciesRaw, ...actionOptionsRaw }: HeaderActions.Props): null;
4
+ export declare namespace HeaderActions {
5
+ type Props = PropsWithChildren & Omit<HeaderController.ActionsOptions, 'id' | 'components'> & {
6
+ dependencies?: ReadonlyArray<any>;
7
+ };
8
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.HeaderActions = HeaderActions;
15
+ const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
16
+ const react_1 = require("react");
17
+ const useHeader_1 = require("./useHeader");
18
+ // component
19
+ function HeaderActions(_a) {
20
+ var { children: components, dependencies: dependenciesRaw = [] } = _a, actionOptionsRaw = __rest(_a, ["children", "dependencies"]);
21
+ // bind hooks
22
+ const id = (0, react_1.useId)();
23
+ const controller = (0, useHeader_1.useHeader)();
24
+ const componentsRef = (0, react_1.useRef)(components);
25
+ const dependencies = (0, hooks_1.useLatestValue)(dependenciesRaw);
26
+ const actionOptions = (0, hooks_1.useLatestValue)(actionOptionsRaw);
27
+ // sync controller on mount
28
+ (0, react_1.useEffect)(() => {
29
+ // register
30
+ controller.registerActions(Object.assign({ id, components: componentsRef.current }, actionOptions));
31
+ // unregister on unmount
32
+ return () => controller.unregisterActions(id);
33
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
+ }, [controller, id, actionOptions, ...dependencies]);
35
+ // render nothing
36
+ return null;
37
+ }
@@ -0,0 +1,2 @@
1
+ import { PropsWithChildren } from 'react';
2
+ export declare function HeaderContainer({ children }: PropsWithChildren): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeaderContainer = HeaderContainer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const HeaderContext_1 = require("./HeaderContext");
7
+ const HeaderController_1 = require("./HeaderController");
8
+ // component
9
+ function HeaderContainer({ children }) {
10
+ // create controller
11
+ const controller = (0, react_1.useMemo)(() => new HeaderController_1.HeaderController(), []);
12
+ const context = (0, react_1.useMemo)(() => ({ controller }), [controller]);
13
+ // render
14
+ return ((0, jsx_runtime_1.jsx)(HeaderContext_1.HeaderContext.Provider, { value: context, children: children }));
15
+ }
@@ -0,0 +1,7 @@
1
+ import { HeaderController } from './HeaderController';
2
+ export declare const HeaderContext: import("react").Context<HeaderContext.Data>;
3
+ export declare namespace HeaderContext {
4
+ type Data = {
5
+ controller?: HeaderController;
6
+ };
7
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EditorApiContext = void 0;
3
+ exports.HeaderContext = void 0;
4
4
  const react_1 = require("react");
5
5
  // context
6
- exports.EditorApiContext = (0, react_1.createContext)({});
6
+ exports.HeaderContext = (0, react_1.createContext)({});
@@ -0,0 +1,39 @@
1
+ import { Callback } from '@nascentdigital/funnel-core';
2
+ import { ReactNode } from 'react';
3
+ import type { Header } from './Header';
4
+ export declare class HeaderController {
5
+ private readonly _changed$;
6
+ private _breadcrumbs;
7
+ private _highlightBreadcrumb;
8
+ private _backButton;
9
+ private _disableBack;
10
+ private readonly _onBackHandlers;
11
+ private readonly _actions;
12
+ constructor();
13
+ get changed$(): import("rxjs").Observable<HeaderController.Change>;
14
+ get breadcrumbs(): ReadonlyArray<Header.Breadcrumb>;
15
+ set breadcrumbs(breadcrumbs: ReadonlyArray<Header.Breadcrumb>);
16
+ get highlightBreadcrumb(): boolean;
17
+ set highlightBreadcrumb(on: boolean);
18
+ get backButton(): HeaderController.BackButton;
19
+ set backButton(button: HeaderController.BackButton);
20
+ get disableBack(): boolean;
21
+ set disableBack(disabled: boolean);
22
+ registerOnBack(handler: HeaderController.OnBackHandler): HeaderController.Unsubscribe;
23
+ get actions(): HeaderController.ActionsOptions[];
24
+ registerActions(options: HeaderController.ActionsOptions): void;
25
+ unregisterActions(clientId: string): void;
26
+ onBack(): void;
27
+ private raiseChanged;
28
+ }
29
+ export declare namespace HeaderController {
30
+ type Change = 'breadcrumbs' | 'highlightBreadcrumb' | 'backButton' | 'disableBack' | 'onBack' | 'actions';
31
+ type BackButton = 'none' | 'back' | 'close';
32
+ type OnBackHandler = (stopPropagation: Callback.Void) => void;
33
+ type Unsubscribe = Callback.Void;
34
+ type ActionsOptions = {
35
+ id: string;
36
+ priority?: number;
37
+ components: ReactNode;
38
+ };
39
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeaderController = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ // class
6
+ class HeaderController {
7
+ constructor() {
8
+ // initialize instance variables
9
+ this._changed$ = new rxjs_1.Subject();
10
+ this._breadcrumbs = [];
11
+ this._highlightBreadcrumb = false;
12
+ this._backButton = 'none';
13
+ this._disableBack = false;
14
+ this._onBackHandlers = [];
15
+ this._actions = new Map();
16
+ }
17
+ get changed$() {
18
+ return this._changed$.asObservable();
19
+ }
20
+ get breadcrumbs() {
21
+ return this._breadcrumbs;
22
+ }
23
+ set breadcrumbs(breadcrumbs) {
24
+ this._breadcrumbs = breadcrumbs;
25
+ this.raiseChanged('breadcrumbs');
26
+ }
27
+ get highlightBreadcrumb() {
28
+ return this._highlightBreadcrumb;
29
+ }
30
+ set highlightBreadcrumb(on) {
31
+ this._highlightBreadcrumb = on;
32
+ this.raiseChanged('highlightBreadcrumb');
33
+ }
34
+ get backButton() {
35
+ return this._backButton;
36
+ }
37
+ set backButton(button) {
38
+ this._backButton = button;
39
+ this.raiseChanged('backButton');
40
+ }
41
+ get disableBack() {
42
+ return this._disableBack;
43
+ }
44
+ set disableBack(disabled) {
45
+ this._disableBack = disabled;
46
+ this.raiseChanged('disableBack');
47
+ }
48
+ registerOnBack(handler) {
49
+ // register handler
50
+ this._onBackHandlers.push(handler);
51
+ this.raiseChanged('onBack');
52
+ // return unsubscribe
53
+ return () => {
54
+ const handlerIndex = this._onBackHandlers.indexOf(handler);
55
+ if (handlerIndex >= 0) {
56
+ this._onBackHandlers.splice(handlerIndex, 1);
57
+ }
58
+ };
59
+ }
60
+ get actions() {
61
+ return this._actions.values().toArray().sort((lhs, rhs) => {
62
+ var _a, _b;
63
+ const lhsPriority = (_a = lhs.priority) !== null && _a !== void 0 ? _a : 0;
64
+ const rhsPriority = (_b = rhs.priority) !== null && _b !== void 0 ? _b : 0;
65
+ return lhsPriority === rhsPriority
66
+ ? 0
67
+ : lhsPriority < rhsPriority
68
+ ? -1
69
+ : 1;
70
+ });
71
+ }
72
+ registerActions(options) {
73
+ this._actions.set(options.id, options);
74
+ this.raiseChanged('actions');
75
+ }
76
+ unregisterActions(clientId) {
77
+ this._actions.delete(clientId);
78
+ this.raiseChanged('actions');
79
+ }
80
+ onBack() {
81
+ // create handbrake
82
+ let stopped = false;
83
+ const onStop = () => {
84
+ stopped = true;
85
+ };
86
+ // invoke handlers until complete
87
+ for (const handler of this._onBackHandlers) {
88
+ // invoke handler
89
+ handler(onStop);
90
+ // exit if stopped
91
+ if (stopped) {
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ raiseChanged(change) {
97
+ this._changed$.next(change);
98
+ }
99
+ }
100
+ exports.HeaderController = HeaderController;
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from 'react';
2
+ import { HeaderController } from './HeaderController';
3
+ export declare function HeaderOptions({ breadcrumbs: breadCrumbsRaw, highlightBreadcrumb, backButton, disableBack, onBack }: HeaderOptions.Props): null;
4
+ export declare namespace HeaderOptions {
5
+ type Props = Pick<Partial<HeaderController>, 'breadcrumbs' | 'highlightBreadcrumb' | 'backButton' | 'disableBack'> & {
6
+ onBack?: HeaderController.OnBackHandler;
7
+ actionsPriority?: number;
8
+ actions?: ReactNode;
9
+ };
10
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeaderOptions = HeaderOptions;
4
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
5
+ const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
6
+ const react_1 = require("react");
7
+ const useHeader_1 = require("./useHeader");
8
+ // component
9
+ function HeaderOptions({ breadcrumbs: breadCrumbsRaw = [], highlightBreadcrumb = false, backButton = 'none', disableBack = false, onBack = funnel_core_1.Fn.NoOp }) {
10
+ // bind hooks
11
+ const controller = (0, useHeader_1.useHeader)();
12
+ const breadcrumbs = (0, hooks_1.useLatestValue)(breadCrumbsRaw);
13
+ const onBackRef = (0, react_1.useRef)(onBack);
14
+ // sync controller on mount
15
+ (0, react_1.useEffect)(() => {
16
+ // update breadcrumbs
17
+ controller.breadcrumbs = breadcrumbs;
18
+ controller.highlightBreadcrumb = highlightBreadcrumb;
19
+ controller.backButton = backButton;
20
+ controller.disableBack = disableBack;
21
+ // register back handler (unsubscribe on unmount)
22
+ return controller.registerOnBack(onStop => onBackRef.current(onStop));
23
+ }, [controller, breadcrumbs, highlightBreadcrumb, backButton, disableBack]);
24
+ // render nothing
25
+ return null;
26
+ }
@@ -0,0 +1,5 @@
1
+ export * from './Header';
2
+ export * from './HeaderActions';
3
+ export * from './HeaderContainer';
4
+ export * from './HeaderOptions';
5
+ export * from './useHeader';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Header"), exports);
18
+ __exportStar(require("./HeaderActions"), exports);
19
+ __exportStar(require("./HeaderContainer"), exports);
20
+ __exportStar(require("./HeaderOptions"), exports);
21
+ __exportStar(require("./useHeader"), exports);
@@ -0,0 +1,2 @@
1
+ import { HeaderController } from './HeaderController';
2
+ export declare function useHeader(): HeaderController;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useHeader = useHeader;
4
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
5
+ const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
6
+ const react_1 = require("react");
7
+ const HeaderContext_1 = require("./HeaderContext");
8
+ // hook
9
+ function useHeader() {
10
+ // bind hooks
11
+ const { controller } = (0, react_1.useContext)(HeaderContext_1.HeaderContext);
12
+ const touch = (0, hooks_1.useTouch)();
13
+ // sync on controller update
14
+ (0, react_1.useEffect)(() => {
15
+ // skip if not bound
16
+ if (!controller) {
17
+ return;
18
+ }
19
+ // listen to changes
20
+ const subscription = controller.changed$.subscribe(touch);
21
+ // unsubscribe on unmount
22
+ return () => subscription.unsubscribe();
23
+ }, [controller, touch]);
24
+ // throw if there's no controller
25
+ if (!controller) {
26
+ throw new funnel_core_1.InvalidOperationError('Cannot access HeaderController outside of HeaderContainer');
27
+ }
28
+ // return controller
29
+ return controller;
30
+ }
@@ -0,0 +1,2 @@
1
+ export * from './header/index';
2
+ export * from './pages';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./header/index"), exports);
18
+ __exportStar(require("./pages"), exports);
@@ -0,0 +1,4 @@
1
+ export declare function PagesExplorerLayout(): import("react/jsx-runtime").JSX.Element;
2
+ export declare namespace PagesExplorerLayout {
3
+ type Params = 'region';
4
+ }