@stackable-labs/sdk-extension-react 1.70.0 → 1.71.0

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/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ApiRequest, FetchRequestInit, FetchResponse, ToastPayload, InvokeAction, ContextData, IdentityBaseClaims, IdentityEventType, IdentityEvent, ExtendIdentityHandler, MessagingEventType, MessagingEventHandler, AllowedIconName } from '@stackable-labs/sdk-extension-contracts';
2
+ import { ApiRequest, FetchRequestInit, FetchResponse, ToastPayload, InvokeAction, ContextData, IdentityBaseClaims, IdentityEventType, IdentityEvent, ExtendIdentityHandler, MessagingEventType, MessagingEventHandler, ActivityEventType, ActivityEventHandler, EventType, AllowedIconName } from '@stackable-labs/sdk-extension-contracts';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
 
5
5
  /**
@@ -88,14 +88,16 @@ declare const useExtension: () => ExtensionContextValue;
88
88
  /**
89
89
  * useIdentityEvent — subscribe to identity events pushed from the host.
90
90
  *
91
- * Spike-only: no encryption, no loading state management.
91
+ * Parameters are domain-stripped (e.g., 'login' not 'identity:login').
92
+ * Use '*' to receive all identity events.
92
93
  */
93
94
 
94
95
  /**
95
- * Register a callback for a specific identity event type (e.g. 'identity.login').
96
+ * Register a callback for a specific identity event type (e.g. 'login').
97
+ * Use '*' to receive all identity events.
96
98
  * The callback receives the full IdentityEvent payload.
97
99
  */
98
- declare const useIdentityEvent: (eventType: IdentityEventType, handler: (event: IdentityEvent) => void) => void;
100
+ declare const useIdentityEvent: (eventType: IdentityEventType | "*", handler: (event: IdentityEvent) => void) => void;
99
101
 
100
102
  /**
101
103
  * useExtendIdentity — register a handler for identity claim enrichment.
@@ -115,17 +117,47 @@ declare const useExtendIdentity: (handler: ExtendIdentityHandler) => void;
115
117
  /**
116
118
  * useMessagingEvent — subscribe to messaging events pushed from the host.
117
119
  *
118
- * Supports both wildcard ('postback') and specific ('postback:add_to_cart') subscriptions.
120
+ * Supports wildcard ('*'), sub-domain ('postback'), and specific ('postback:add_to_cart') subscriptions.
119
121
  * Host-side filtering ensures only matching events cross the sandbox boundary;
120
- * this hook applies a secondary actionName match within the extension.
122
+ * this hook applies a secondary eventName/actionName match within the extension.
121
123
  */
122
124
 
123
125
  /**
124
126
  * Register a callback for messaging events.
125
- * - 'postback' — receive ALL postback events (requires elevated marketplace review)
127
+ * - '*' — receive ALL messaging events (requires elevated marketplace review)
128
+ * - 'postback' — receive all postback events
126
129
  * - 'postback:<actionName>' — receive only events matching actionName
127
130
  */
128
- declare const useMessagingEvent: (eventType: MessagingEventType, handler: MessagingEventHandler) => void;
131
+ declare const useMessagingEvent: (eventType: MessagingEventType | "*", handler: MessagingEventHandler) => void;
132
+
133
+ /**
134
+ * useActivityEvent — subscribe to activity events pushed from the host.
135
+ *
136
+ * Parameters are domain-stripped (e.g., 'product_view' not 'activity:product_view').
137
+ * Use '*' to receive all activity events.
138
+ */
139
+
140
+ /**
141
+ * Register a callback for a specific activity event type (e.g. 'product_view').
142
+ * Use '*' to receive all activity events.
143
+ * The callback receives the full ActivityEvent payload.
144
+ */
145
+ declare const useActivityEvent: (eventType: ActivityEventType | "*", handler: ActivityEventHandler) => void;
146
+
147
+ /**
148
+ * useEvent — generic cross-domain event hook.
149
+ *
150
+ * Accepts fully-qualified event types (e.g., 'activity:product_view', 'identity:login', 'messaging:postback').
151
+ * Use bare domain name (e.g., 'activity', 'identity') as wildcard to receive all events in that domain.
152
+ */
153
+
154
+ /**
155
+ * Register a callback for any event type across all domains.
156
+ * - 'activity' / 'identity' / 'messaging' — domain wildcard, receives all events in that domain
157
+ * - 'identity:login' / 'messaging:postback' / 'activity:product_view' — specific event
158
+ * - 'messaging:postback:add_to_cart' — specific event with sub-filter
159
+ */
160
+ declare const useEvent: (eventType: EventType, handler: (payload: unknown) => void) => void;
129
161
 
130
162
  interface SurfaceProps {
131
163
  /** The extension point target ID (e.g., "slot.header") */
@@ -538,4 +570,4 @@ type UseContextDataResult = ContextData & {
538
570
  };
539
571
  declare const useContextData: () => UseContextDataResult;
540
572
 
541
- export { type Store, Surface, createExtension, createStore, ui, useCapabilities, useContextData, useExtendIdentity, useExtension, useIdentityEvent, useMessagingEvent, useStore, useSurfaceContext };
573
+ export { type Store, Surface, createExtension, createStore, ui, useActivityEvent, useCapabilities, useContextData, useEvent, useExtendIdentity, useExtension, useIdentityEvent, useMessagingEvent, useStore, useSurfaceContext };
package/dist/index.js CHANGED
@@ -231,10 +231,13 @@ var useExtension = () => {
231
231
  var useIdentityEvent = (eventType, handler) => {
232
232
  useEffect(() => {
233
233
  const unsubscribe = onExtensionEvent((type, payload) => {
234
- if (type !== eventType) {
234
+ if (type !== "identity") {
235
235
  return;
236
236
  }
237
- handler(payload);
237
+ const event = payload;
238
+ if (eventType === "*" || event.eventName === eventType) {
239
+ handler(event);
240
+ }
238
241
  });
239
242
  return unsubscribe;
240
243
  }, [eventType, handler]);
@@ -248,15 +251,53 @@ var useExtendIdentity = (handler) => {
248
251
  var useMessagingEvent = (eventType, handler) => {
249
252
  useEffect(() => {
250
253
  const unsubscribe = onExtensionEvent((type, payload) => {
251
- if (type !== "messaging:postback") return;
254
+ if (type !== "messaging") {
255
+ return;
256
+ }
252
257
  const event = payload;
253
- if (eventType === "postback" || eventType === `postback:${event.actionName}`) {
258
+ if (eventType === "*" || event.eventName === eventType || `${event.eventName}:${event.data.actionName}` === eventType) {
254
259
  handler(event);
255
260
  }
256
261
  });
257
262
  return unsubscribe;
258
263
  }, [eventType, handler]);
259
264
  };
265
+ var useActivityEvent = (eventType, handler) => {
266
+ useEffect(() => {
267
+ const unsubscribe = onExtensionEvent((type, payload) => {
268
+ if (type !== "activity") {
269
+ return;
270
+ }
271
+ const event = payload;
272
+ if (eventType === "*" || event.eventName === eventType) {
273
+ handler(event);
274
+ }
275
+ });
276
+ return unsubscribe;
277
+ }, [eventType, handler]);
278
+ };
279
+ var useEvent = (eventType, handler) => {
280
+ useEffect(() => {
281
+ const [domain, ...rest] = eventType.split(":");
282
+ const targetEventName = rest.join(":");
283
+ const unsubscribe = onExtensionEvent((type, payload) => {
284
+ if (type !== domain) {
285
+ return;
286
+ }
287
+ if (targetEventName) {
288
+ const event = payload;
289
+ if (event.eventName === targetEventName) ; else if (targetEventName.startsWith(`${event.eventName}:`)) {
290
+ const subFilter = targetEventName.slice(event.eventName.length + 1);
291
+ if (event.data?.actionName !== subFilter) return;
292
+ } else {
293
+ return;
294
+ }
295
+ }
296
+ handler(payload);
297
+ });
298
+ return unsubscribe;
299
+ }, [eventType, handler]);
300
+ };
260
301
  var useExtensionId = () => {
261
302
  const ctx = React2.useContext(ExtensionContext);
262
303
  return ctx?.extensionId ?? "unknown";
@@ -506,4 +547,4 @@ var useContextData = () => {
506
547
  return { ...contextData, loading };
507
548
  };
508
549
 
509
- export { Surface, createExtension, createStore, ui_exports as ui, useCapabilities, useContextData, useExtendIdentity, useExtension, useIdentityEvent, useMessagingEvent, useStore, useSurfaceContext };
550
+ export { Surface, createExtension, createStore, ui_exports as ui, useActivityEvent, useCapabilities, useContextData, useEvent, useExtendIdentity, useExtension, useIdentityEvent, useMessagingEvent, useStore, useSurfaceContext };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackable-labs/sdk-extension-react",
3
- "version": "1.70.0",
3
+ "version": "1.71.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "@agnostack/verifyd": "alpha",
16
16
  "@remote-dom/core": "1.x",
17
17
  "@remote-dom/react": "1.x",
18
- "@stackable-labs/sdk-extension-contracts": "1.70.0"
18
+ "@stackable-labs/sdk-extension-contracts": "1.71.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=18.0.0 <19.0.0",