@gxpl/sdk 0.0.40 → 0.0.42

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 (26) hide show
  1. package/lib/sdk/transitions/transitionMachine.d.ts +27 -0
  2. package/lib/sdk/transitions/transitionMachine.js +11 -16
  3. package/lib/sdk/transitions/utils/getDeltaAndProgress.d.ts +1 -1
  4. package/lib/sdk/transitions/utils/getDeltaAndProgress.js +1 -1
  5. package/lib/sdk/transitions/utils/getScenesOnInstantTransition.d.ts +1 -1
  6. package/lib/sdk/transitions/utils/getScenesOnInstantTransition.js +3 -3
  7. package/lib/sdk/transitions/utils/getScenesOnStart.d.ts +1 -1
  8. package/lib/sdk/transitions/utils/getScenesOnStart.js +5 -5
  9. package/lib/sdk/transitions/utils/types.d.ts +2 -0
  10. package/lib/sdk/types/article/Interaction.d.ts +6 -1
  11. package/lib/sdk-nextjs/components/Page.js +3 -8
  12. package/lib/sdk-nextjs/components/Preview/PreviewListener.js +1 -0
  13. package/lib/sdk-nextjs/components/Scene.js +44 -6
  14. package/lib/sdk-nextjs/components/items/LinkWrapper.js +1 -0
  15. package/lib/sdk-nextjs/components/items/RichTextItem/RichTextItem.js +1 -1
  16. package/lib/sdk-nextjs/fixedLayers/FixedLayerTransitionsRegistry.d.ts +1 -1
  17. package/lib/sdk-nextjs/fixedLayers/FixedLayerTransitionsRegistry.js +2 -2
  18. package/lib/sdk-nextjs/interactions/InteractionsRegistry.d.ts +9 -1
  19. package/lib/sdk-nextjs/interactions/InteractionsRegistry.js +100 -3
  20. package/lib/sdk-nextjs/provider/InOutTransitionContext.d.ts +8 -0
  21. package/lib/sdk-nextjs/provider/InOutTransitionContext.js +14 -0
  22. package/lib/sdk-nextjs/provider/InteractionsContext.js +10 -2
  23. package/lib/sdk-nextjs/provider/TransitionMachineContext.d.ts +96 -0
  24. package/lib/sdk-nextjs/provider/TransitionMachineContextProvider.d.ts +11 -0
  25. package/lib/sdk-nextjs/provider/TransitionMachineContextProvider.js +18 -0
  26. package/package.json +2 -1
@@ -3,12 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InteractionsRegistry = void 0;
4
4
  const isItemType_1 = require("../utils/isItemType");
5
5
  const ArticleItemType_1 = require("../../sdk/types/article/ArticleItemType");
6
+ const ulid_1 = require("ulid");
6
7
  class InteractionsRegistry {
7
- constructor(article) {
8
- var _a;
8
+ constructor(article, isStartSceneInitialized) {
9
9
  this.ctrls = new Map();
10
+ this.inTransitionDefaultStateId = (0, ulid_1.ulid)();
11
+ this.outTransitionStartStateId = (0, ulid_1.ulid)();
12
+ this.isStartSceneInitialized = isStartSceneInitialized;
10
13
  this.items = this.unpackItems(article);
11
- const interactions = (_a = article.interactions) !== null && _a !== void 0 ? _a : [];
14
+ const interactions = [...article.interactions, this.getOutTransitionInteraction(), this.getInTransitionInteraction()];
12
15
  const activeStatesIds = interactions.reduce((map, inter) => {
13
16
  var _a;
14
17
  const activeStateId = (_a = inter.states.find((state) => state.id !== inter.startStateId)) === null || _a === void 0 ? void 0 : _a.id;
@@ -104,6 +107,72 @@ class InteractionsRegistry {
104
107
  }
105
108
  return available;
106
109
  }
110
+ notifySceneInTransition() {
111
+ var _a;
112
+ const transitioningItems = (_a = this.stateItemsIdsMap['in']) !== null && _a !== void 0 ? _a : [];
113
+ this.setCurrentStateForInteraction('in-transition', this.inTransitionDefaultStateId);
114
+ const timestamp = Date.now();
115
+ this.itemsStages = this.itemsStages.map((stage) => {
116
+ if (stage.interactionId !== 'in-transition')
117
+ return stage;
118
+ return {
119
+ itemId: stage.itemId,
120
+ interactionId: stage.interactionId,
121
+ type: 'transitioning',
122
+ from: 'in',
123
+ to: this.inTransitionDefaultStateId,
124
+ direction: 'out',
125
+ updated: timestamp
126
+ };
127
+ });
128
+ const itemsToNotify = new Set(transitioningItems);
129
+ this.notifyItemCtrlsChange(Array.from(itemsToNotify));
130
+ this.notifyTransitionStartForItems(transitioningItems, this.inTransitionDefaultStateId);
131
+ }
132
+ notifySceneOutTransition() {
133
+ var _a;
134
+ const transitioningItems = (_a = this.stateItemsIdsMap['out']) !== null && _a !== void 0 ? _a : [];
135
+ this.setCurrentStateForInteraction('out-transition', 'out');
136
+ const timestamp = Date.now();
137
+ this.itemsStages = this.itemsStages.map((stage) => {
138
+ if (stage.interactionId !== 'out-transition')
139
+ return stage;
140
+ return {
141
+ itemId: stage.itemId,
142
+ interactionId: stage.interactionId,
143
+ type: 'transitioning',
144
+ from: stage.type === 'transitioning' ? stage.to : stage.stateId,
145
+ to: 'out',
146
+ direction: 'in',
147
+ updated: timestamp
148
+ };
149
+ });
150
+ const itemsToNotify = new Set(transitioningItems);
151
+ this.notifyItemCtrlsChange(Array.from(itemsToNotify));
152
+ this.notifyTransitionStartForItems(transitioningItems, 'out');
153
+ }
154
+ notifySceneOutTransitionCancel() {
155
+ var _a;
156
+ const transitioningItems = (_a = this.stateItemsIdsMap['out']) !== null && _a !== void 0 ? _a : [];
157
+ this.setCurrentStateForInteraction('out-transition', this.outTransitionStartStateId);
158
+ const timestamp = Date.now();
159
+ this.itemsStages = this.itemsStages.map((stage) => {
160
+ if (stage.interactionId !== 'out-transition')
161
+ return stage;
162
+ return {
163
+ itemId: stage.itemId,
164
+ interactionId: stage.interactionId,
165
+ type: 'transitioning',
166
+ from: 'out',
167
+ to: this.outTransitionStartStateId,
168
+ direction: 'out',
169
+ updated: timestamp
170
+ };
171
+ });
172
+ const itemsToNotify = new Set(transitioningItems);
173
+ this.notifyItemCtrlsChange(Array.from(itemsToNotify));
174
+ this.notifyTransitionStartForItems(transitioningItems, this.outTransitionStartStateId);
175
+ }
107
176
  notifyLoad() {
108
177
  var _a, _b;
109
178
  const timestamp = Date.now();
@@ -336,6 +405,17 @@ class InteractionsRegistry {
336
405
  if (!itemStatesMap)
337
406
  continue;
338
407
  for (const stateId of Object.keys(itemStatesMap)) {
408
+ if (stateId === 'in' && this.isStartSceneInitialized) {
409
+ stages.push({
410
+ itemId: item.id,
411
+ interactionId: 'in-transition',
412
+ type: 'active',
413
+ isStartState: false,
414
+ updated: timestamp,
415
+ stateId: 'in'
416
+ });
417
+ continue;
418
+ }
339
419
  const interactionId = this.activeStateIdInteractionIdMap[stateId];
340
420
  if (!interactionId)
341
421
  continue;
@@ -351,5 +431,22 @@ class InteractionsRegistry {
351
431
  }
352
432
  return stages;
353
433
  }
434
+ getOutTransitionInteraction() {
435
+ return {
436
+ id: 'out-transition',
437
+ triggers: [],
438
+ states: [{ id: this.outTransitionStartStateId }, { id: 'out' }],
439
+ startStateId: this.outTransitionStartStateId
440
+ };
441
+ }
442
+ getInTransitionInteraction() {
443
+ const startStateId = 'in';
444
+ return {
445
+ id: 'in-transition',
446
+ triggers: [],
447
+ states: [{ id: startStateId }, { id: this.inTransitionDefaultStateId }],
448
+ startStateId: this.inTransitionDefaultStateId
449
+ };
450
+ }
354
451
  }
355
452
  exports.InteractionsRegistry = InteractionsRegistry;
@@ -0,0 +1,8 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ type InOutTransitionContextType = {
3
+ isStartSceneInitialized: boolean;
4
+ setIsStartSceneInitialized: (isStartSceneInitialized: boolean) => void;
5
+ };
6
+ export declare const InOutTransitionContext: import("react").Context<InOutTransitionContextType>;
7
+ export declare const InOutTransitionProvider: FC<PropsWithChildren>;
8
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InOutTransitionProvider = exports.InOutTransitionContext = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ exports.InOutTransitionContext = (0, react_1.createContext)({
7
+ isStartSceneInitialized: false,
8
+ setIsStartSceneInitialized: () => { }
9
+ });
10
+ const InOutTransitionProvider = ({ children }) => {
11
+ const [isStartSceneInitialized, setIsStartSceneInitialized] = (0, react_1.useState)(false);
12
+ return ((0, jsx_runtime_1.jsx)(exports.InOutTransitionContext.Provider, { value: { isStartSceneInitialized, setIsStartSceneInitialized }, children: children }));
13
+ };
14
+ exports.InOutTransitionProvider = InOutTransitionProvider;
@@ -6,11 +6,16 @@ const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const react_1 = require("react");
7
7
  const InteractionsRegistry_1 = require("../interactions/InteractionsRegistry");
8
8
  const ArticleRectContext_1 = require("./ArticleRectContext");
9
+ const InOutTransitionContext_1 = require("./InOutTransitionContext");
10
+ const TransitionMachineContext_1 = require("./TransitionMachineContext");
9
11
  exports.InteractionsContext = (0, react_1.createContext)(undefined);
10
12
  const InteractionsProvider = ({ article, children }) => {
11
13
  const articleRectObserver = (0, react_1.useContext)(ArticleRectContext_1.ArticleRectContext);
14
+ const startScene = TransitionMachineContext_1.TransitionMachineContext.useSelector((state) => (state.context.input.startScene));
15
+ const { isStartSceneInitialized, setIsStartSceneInitialized } = (0, react_1.useContext)(InOutTransitionContext_1.InOutTransitionContext);
12
16
  const registry = (0, react_1.useMemo)(() => {
13
- return new InteractionsRegistry_1.InteractionsRegistry(article);
17
+ return new InteractionsRegistry_1.InteractionsRegistry(article, isStartSceneInitialized);
18
+ // do not add isStartSceneInitialized to the dependencies array, it will cause infinite re-render
14
19
  }, [article]);
15
20
  (0, react_1.useEffect)(() => {
16
21
  if (!registry || !articleRectObserver)
@@ -22,6 +27,9 @@ const InteractionsProvider = ({ article, children }) => {
22
27
  return articleRectObserver.on('scroll', handleScroll);
23
28
  }, [registry, articleRectObserver]);
24
29
  const notifyLoad = (0, react_1.useCallback)(() => {
30
+ if (startScene === article.id) {
31
+ setIsStartSceneInitialized(true);
32
+ }
25
33
  if (!registry)
26
34
  return;
27
35
  requestAnimationFrame(() => {
@@ -29,7 +37,7 @@ const InteractionsProvider = ({ article, children }) => {
29
37
  registry.notifyLoad();
30
38
  }, 0);
31
39
  });
32
- }, [registry]);
40
+ }, [registry, startScene, article.id]);
33
41
  (0, react_1.useEffect)(() => {
34
42
  if (document.readyState === 'complete') {
35
43
  notifyLoad();