@stackable-labs/sdk-extension-react 1.42.0 → 1.43.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, AllowedIconName } from '@stackable-labs/sdk-extension-contracts';
2
+ import { ApiRequest, FetchRequestInit, FetchResponse, ToastPayload, InvokeAction, ContextData, AuthState, AuthEventType, AuthEvent, AllowedIconName } from '@stackable-labs/sdk-extension-contracts';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
 
5
5
  /**
@@ -67,6 +67,14 @@ declare const useCapabilities: () => {
67
67
  context: {
68
68
  read: () => Promise<ContextData>;
69
69
  };
70
+ identity: {
71
+ read: () => Promise<AuthState>;
72
+ extend: (payload: {
73
+ claims: Record<string, unknown>;
74
+ }) => Promise<{
75
+ additionalClaims: Record<string, unknown>;
76
+ }>;
77
+ };
70
78
  };
71
79
  /**
72
80
  * Subscribe to a shared store with an optional selector.
@@ -77,6 +85,18 @@ declare const useStore: <T, S = T>(store: Store<T>, selector?: (state: T) => S)
77
85
  */
78
86
  declare const useExtension: () => ExtensionContextValue;
79
87
 
88
+ /**
89
+ * useAuthEvent — subscribe to identity events pushed from the host.
90
+ *
91
+ * Spike-only: no encryption, no loading state management.
92
+ */
93
+
94
+ /**
95
+ * Register a callback for a specific auth event type (e.g. 'identity.login').
96
+ * The callback receives the full AuthEvent payload.
97
+ */
98
+ declare const useAuthEvent: (eventType: AuthEventType, handler: (event: AuthEvent) => void) => void;
99
+
80
100
  interface SurfaceProps {
81
101
  /** The extension point target ID (e.g., "slot.header") */
82
102
  id: string;
@@ -488,4 +508,4 @@ type UseContextDataResult = ContextData & {
488
508
  };
489
509
  declare const useContextData: () => UseContextDataResult;
490
510
 
491
- export { type Store, Surface, createExtension, createStore, ui, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
511
+ export { type Store, Surface, createExtension, createStore, ui, useAuthEvent, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createRoot } from 'react-dom/client';
2
- import React, { createContext, useContext, useCallback, useSyncExternalStore, useState, useRef, useEffect } from 'react';
2
+ import React, { createContext, useContext, useCallback, useSyncExternalStore, useEffect, useState, useRef } from 'react';
3
3
  import { WebCrypto } from '@agnostack/verifyd/esm';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -21,6 +21,13 @@ var requestCounter = 0;
21
21
  var registeredExtensionId = "unknown";
22
22
  var encryptionKey = null;
23
23
  var pendingRequests = /* @__PURE__ */ new Map();
24
+ var extensionEventHandlers = /* @__PURE__ */ new Set();
25
+ var onExtensionEvent = (handler) => {
26
+ extensionEventHandlers.add(handler);
27
+ return () => {
28
+ extensionEventHandlers.delete(handler);
29
+ };
30
+ };
24
31
  var generateRequestId = () => `req_${++requestCounter}_${Date.now()}`;
25
32
  var setEncryptionKey = async (keyBase64) => {
26
33
  encryptionKey = await getWebCrypto().importRawKey("secret", base64ToBytes(keyBase64), { extractable: false });
@@ -33,6 +40,16 @@ var initRpcListener = (extensionId) => {
33
40
  setEncryptionKey(msg.encryptionKey);
34
41
  return;
35
42
  }
43
+ if (msg?.type === "extension-event") {
44
+ for (const handler of extensionEventHandlers) {
45
+ try {
46
+ handler(msg.eventType, msg.payload);
47
+ } catch (e) {
48
+ console.error("[rpc-client] extension-event handler error:", e);
49
+ }
50
+ }
51
+ return;
52
+ }
36
53
  if (msg?.type === "capability-response") {
37
54
  const response = msg;
38
55
  const pending = pendingRequests.get(response.id);
@@ -138,6 +155,10 @@ var useCapabilities = () => ({
138
155
  },
139
156
  context: {
140
157
  read: () => callCapability("context.read")
158
+ },
159
+ identity: {
160
+ read: () => callCapability("identity.read"),
161
+ extend: (payload) => callCapability("identity.extend", payload)
141
162
  }
142
163
  });
143
164
  var useStore = (store, selector) => {
@@ -156,6 +177,15 @@ var useExtension = () => {
156
177
  }
157
178
  return ctx;
158
179
  };
180
+ var useAuthEvent = (eventType, handler) => {
181
+ useEffect(() => {
182
+ const unsubscribe = onExtensionEvent((type, payload) => {
183
+ if (type !== eventType) return;
184
+ handler(payload);
185
+ });
186
+ return unsubscribe;
187
+ }, [eventType, handler]);
188
+ };
159
189
  var useExtensionId = () => {
160
190
  const ctx = React.useContext(ExtensionContext);
161
191
  return ctx?.extensionId ?? "unknown";
@@ -395,4 +425,4 @@ var useContextData = () => {
395
425
  return { ...contextData, loading };
396
426
  };
397
427
 
398
- export { Surface, createExtension, createStore, ui_exports as ui, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
428
+ export { Surface, createExtension, createStore, ui_exports as ui, useAuthEvent, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackable-labs/sdk-extension-react",
3
- "version": "1.42.0",
3
+ "version": "1.43.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.42.0"
18
+ "@stackable-labs/sdk-extension-contracts": "1.43.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=18.0.0 <19.0.0",