@23blocks/react 1.1.3 → 2.0.1
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.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ } from '@swc/helpers/_/_extends';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { useMemo, useCallback, createContext, useContext
|
|
3
|
+
import { useState, useRef, useMemo, useCallback, createContext, useContext } from 'react';
|
|
4
4
|
import { createHttpTransport } from '@23blocks/transport-http';
|
|
5
5
|
import { createAuthenticationBlock } from '@23blocks/block-authentication';
|
|
6
6
|
import { createSearchBlock } from '@23blocks/block-search';
|
|
@@ -45,7 +45,9 @@ let MemoryStorage = class MemoryStorage {
|
|
|
45
45
|
this.data = new Map();
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Create a sync token manager for web (localStorage, sessionStorage, memory)
|
|
50
|
+
*/ function createSyncTokenManager(appId, storageType, tenantId) {
|
|
49
51
|
const isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
|
|
50
52
|
const accessTokenKey = getStorageKey('access', appId, tenantId);
|
|
51
53
|
const refreshTokenKey = getStorageKey('refresh', appId, tenantId);
|
|
@@ -117,6 +119,65 @@ function createTokenManager(appId, storageType, tenantId) {
|
|
|
117
119
|
}
|
|
118
120
|
};
|
|
119
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Create an async token manager for React Native with a sync cache.
|
|
124
|
+
* Uses a sync in-memory cache for immediate access while persisting to async storage.
|
|
125
|
+
*/ function createAsyncTokenManager(appId, asyncStorage, tenantId, onReady) {
|
|
126
|
+
const accessTokenKey = getStorageKey('access', appId, tenantId);
|
|
127
|
+
const refreshTokenKey = getStorageKey('refresh', appId, tenantId);
|
|
128
|
+
// In-memory cache for sync access
|
|
129
|
+
let accessTokenCache = null;
|
|
130
|
+
let refreshTokenCache = null;
|
|
131
|
+
// Load tokens from async storage on initialization
|
|
132
|
+
Promise.all([
|
|
133
|
+
asyncStorage.getItem(accessTokenKey),
|
|
134
|
+
asyncStorage.getItem(refreshTokenKey)
|
|
135
|
+
]).then(([accessToken, refreshToken])=>{
|
|
136
|
+
accessTokenCache = accessToken;
|
|
137
|
+
refreshTokenCache = refreshToken;
|
|
138
|
+
onReady == null ? void 0 : onReady();
|
|
139
|
+
}).catch((error)=>{
|
|
140
|
+
console.warn('[23blocks] Failed to load tokens from storage:', error);
|
|
141
|
+
onReady == null ? void 0 : onReady();
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
getAccessToken () {
|
|
145
|
+
return accessTokenCache;
|
|
146
|
+
},
|
|
147
|
+
getRefreshToken () {
|
|
148
|
+
return refreshTokenCache;
|
|
149
|
+
},
|
|
150
|
+
setTokens (accessToken, refreshToken) {
|
|
151
|
+
// Update cache immediately for sync access
|
|
152
|
+
accessTokenCache = accessToken;
|
|
153
|
+
if (refreshToken !== undefined) {
|
|
154
|
+
refreshTokenCache = refreshToken;
|
|
155
|
+
}
|
|
156
|
+
// Persist to async storage (fire and forget with error logging)
|
|
157
|
+
asyncStorage.setItem(accessTokenKey, accessToken).catch((error)=>{
|
|
158
|
+
console.warn('[23blocks] Failed to persist access token:', error);
|
|
159
|
+
});
|
|
160
|
+
if (refreshToken) {
|
|
161
|
+
asyncStorage.setItem(refreshTokenKey, refreshToken).catch((error)=>{
|
|
162
|
+
console.warn('[23blocks] Failed to persist refresh token:', error);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
clearTokens () {
|
|
167
|
+
// Clear cache immediately
|
|
168
|
+
accessTokenCache = null;
|
|
169
|
+
refreshTokenCache = null;
|
|
170
|
+
// Clear from async storage (fire and forget)
|
|
171
|
+
asyncStorage.removeItem(accessTokenKey).catch(()=>{});
|
|
172
|
+
asyncStorage.removeItem(refreshTokenKey).catch(()=>{});
|
|
173
|
+
},
|
|
174
|
+
onStorageChange (_callback) {
|
|
175
|
+
// Async storage doesn't support cross-tab events
|
|
176
|
+
// For React Native, this is typically not needed anyway
|
|
177
|
+
return ()=>{};
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
120
181
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
121
182
|
// Context
|
|
122
183
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -175,13 +236,70 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
175
236
|
* <MyApp />
|
|
176
237
|
* </Provider>
|
|
177
238
|
* ```
|
|
178
|
-
|
|
239
|
+
*
|
|
240
|
+
* @example React Native with AsyncStorage
|
|
241
|
+
* ```tsx
|
|
242
|
+
* import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
243
|
+
*
|
|
244
|
+
* <Provider
|
|
245
|
+
* appId="your-app-id"
|
|
246
|
+
* customStorage={AsyncStorage}
|
|
247
|
+
* urls={{
|
|
248
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
249
|
+
* }}
|
|
250
|
+
* >
|
|
251
|
+
* <App />
|
|
252
|
+
* </Provider>
|
|
253
|
+
* ```
|
|
254
|
+
*
|
|
255
|
+
* @example React Native with Expo SecureStore (recommended for sensitive data)
|
|
256
|
+
* ```tsx
|
|
257
|
+
* import * as SecureStore from 'expo-secure-store';
|
|
258
|
+
*
|
|
259
|
+
* const secureStorage = {
|
|
260
|
+
* getItem: SecureStore.getItemAsync,
|
|
261
|
+
* setItem: SecureStore.setItemAsync,
|
|
262
|
+
* removeItem: SecureStore.deleteItemAsync,
|
|
263
|
+
* };
|
|
264
|
+
*
|
|
265
|
+
* <Provider
|
|
266
|
+
* appId="your-app-id"
|
|
267
|
+
* customStorage={secureStorage}
|
|
268
|
+
* urls={{
|
|
269
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
270
|
+
* }}
|
|
271
|
+
* >
|
|
272
|
+
* <App />
|
|
273
|
+
* </Provider>
|
|
274
|
+
* ```
|
|
275
|
+
*/ function Provider({ children, urls, appId, tenantId, authMode = 'token', storage = 'localStorage', customStorage, headers: staticHeaders = {}, timeout }) {
|
|
276
|
+
// Track if async storage has loaded tokens
|
|
277
|
+
const [isReady, setIsReady] = useState(!customStorage);
|
|
278
|
+
const tokenManagerRef = useRef(null);
|
|
179
279
|
// Create token manager (memoized) with scoped storage keys
|
|
180
|
-
const tokenManager = useMemo(()=>
|
|
280
|
+
const tokenManager = useMemo(()=>{
|
|
281
|
+
if (authMode !== 'token') {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
if (customStorage) {
|
|
285
|
+
// Use async storage for React Native
|
|
286
|
+
const manager = createAsyncTokenManager(appId, customStorage, tenantId, ()=>{
|
|
287
|
+
setIsReady(true);
|
|
288
|
+
});
|
|
289
|
+
tokenManagerRef.current = manager;
|
|
290
|
+
return manager;
|
|
291
|
+
} else {
|
|
292
|
+
// Use sync storage for web
|
|
293
|
+
const manager = createSyncTokenManager(appId, storage, tenantId);
|
|
294
|
+
tokenManagerRef.current = manager;
|
|
295
|
+
return manager;
|
|
296
|
+
}
|
|
297
|
+
}, [
|
|
181
298
|
authMode,
|
|
182
299
|
appId,
|
|
183
300
|
storage,
|
|
184
|
-
tenantId
|
|
301
|
+
tenantId,
|
|
302
|
+
customStorage
|
|
185
303
|
]);
|
|
186
304
|
// Factory to create transport for a specific service URL
|
|
187
305
|
const createServiceTransport = useCallback((baseUrl)=>{
|
|
@@ -191,13 +309,13 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
191
309
|
credentials: authMode === 'cookie' ? 'include' : undefined,
|
|
192
310
|
headers: ()=>{
|
|
193
311
|
const headers = _({}, staticHeaders, {
|
|
194
|
-
|
|
312
|
+
'x-api-key': appId
|
|
195
313
|
});
|
|
196
314
|
if (tenantId) {
|
|
197
315
|
headers['tenant-id'] = tenantId;
|
|
198
316
|
}
|
|
199
|
-
if (authMode === 'token' &&
|
|
200
|
-
const token =
|
|
317
|
+
if (authMode === 'token' && tokenManagerRef.current) {
|
|
318
|
+
const token = tokenManagerRef.current.getAccessToken();
|
|
201
319
|
if (token) {
|
|
202
320
|
headers['Authorization'] = `Bearer ${token}`;
|
|
203
321
|
}
|
|
@@ -210,8 +328,7 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
210
328
|
tenantId,
|
|
211
329
|
authMode,
|
|
212
330
|
staticHeaders,
|
|
213
|
-
timeout
|
|
214
|
-
tokenManager
|
|
331
|
+
timeout
|
|
215
332
|
]);
|
|
216
333
|
// Create blocks (memoized) - each with its own transport (no fallback)
|
|
217
334
|
const blockConfig = useMemo(()=>({
|
|
@@ -515,7 +632,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
515
632
|
isAuthenticated,
|
|
516
633
|
onStorageChange,
|
|
517
634
|
// Config
|
|
518
|
-
authMode
|
|
635
|
+
authMode,
|
|
636
|
+
isReady
|
|
519
637
|
}), [
|
|
520
638
|
authentication,
|
|
521
639
|
search,
|
|
@@ -544,7 +662,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
544
662
|
clearTokens,
|
|
545
663
|
isAuthenticated,
|
|
546
664
|
onStorageChange,
|
|
547
|
-
authMode
|
|
665
|
+
authMode,
|
|
666
|
+
isReady
|
|
548
667
|
]);
|
|
549
668
|
return jsx(Blocks23Context.Provider, {
|
|
550
669
|
value: value,
|
|
@@ -598,6 +717,19 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
598
717
|
* );
|
|
599
718
|
* }
|
|
600
719
|
* ```
|
|
720
|
+
*
|
|
721
|
+
* @example React Native - wait for tokens to load
|
|
722
|
+
* ```tsx
|
|
723
|
+
* function App() {
|
|
724
|
+
* const { isReady, isAuthenticated } = useAuth();
|
|
725
|
+
*
|
|
726
|
+
* if (!isReady) {
|
|
727
|
+
* return <LoadingScreen />;
|
|
728
|
+
* }
|
|
729
|
+
*
|
|
730
|
+
* return isAuthenticated() ? <HomeScreen /> : <LoginScreen />;
|
|
731
|
+
* }
|
|
732
|
+
* ```
|
|
601
733
|
*/ function useAuth$1() {
|
|
602
734
|
const context = useClient();
|
|
603
735
|
return {
|
|
@@ -610,7 +742,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
610
742
|
clearTokens: context.clearTokens,
|
|
611
743
|
isAuthenticated: context.isAuthenticated,
|
|
612
744
|
onStorageChange: context.onStorageChange,
|
|
613
|
-
authentication: context.authentication
|
|
745
|
+
authentication: context.authentication,
|
|
746
|
+
isReady: context.isReady
|
|
614
747
|
};
|
|
615
748
|
}
|
|
616
749
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -25,6 +25,15 @@ export type AuthMode = 'token' | 'cookie';
|
|
|
25
25
|
* Storage type for token mode
|
|
26
26
|
*/
|
|
27
27
|
export type StorageType = 'localStorage' | 'sessionStorage' | 'memory';
|
|
28
|
+
/**
|
|
29
|
+
* Async storage interface for React Native compatibility.
|
|
30
|
+
* Compatible with @react-native-async-storage/async-storage and expo-secure-store.
|
|
31
|
+
*/
|
|
32
|
+
export interface AsyncStorageInterface {
|
|
33
|
+
getItem(key: string): Promise<string | null>;
|
|
34
|
+
setItem(key: string, value: string): Promise<void>;
|
|
35
|
+
removeItem(key: string): Promise<void>;
|
|
36
|
+
}
|
|
28
37
|
/**
|
|
29
38
|
* Token manager interface
|
|
30
39
|
*/
|
|
@@ -121,10 +130,48 @@ export interface ProviderProps {
|
|
|
121
130
|
*/
|
|
122
131
|
authMode?: AuthMode;
|
|
123
132
|
/**
|
|
124
|
-
* Storage type for token mode
|
|
133
|
+
* Storage type for token mode (ignored if customStorage is provided)
|
|
125
134
|
* @default 'localStorage'
|
|
126
135
|
*/
|
|
127
136
|
storage?: StorageType;
|
|
137
|
+
/**
|
|
138
|
+
* Custom async storage for React Native.
|
|
139
|
+
* When provided, this takes precedence over the `storage` prop.
|
|
140
|
+
* Compatible with @react-native-async-storage/async-storage and expo-secure-store.
|
|
141
|
+
*
|
|
142
|
+
* @example React Native with AsyncStorage
|
|
143
|
+
* ```tsx
|
|
144
|
+
* import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
145
|
+
*
|
|
146
|
+
* <Provider
|
|
147
|
+
* appId="your-app-id"
|
|
148
|
+
* customStorage={AsyncStorage}
|
|
149
|
+
* urls={{ authentication: 'https://api.example.com' }}
|
|
150
|
+
* >
|
|
151
|
+
* <App />
|
|
152
|
+
* </Provider>
|
|
153
|
+
* ```
|
|
154
|
+
*
|
|
155
|
+
* @example React Native with Expo SecureStore
|
|
156
|
+
* ```tsx
|
|
157
|
+
* import * as SecureStore from 'expo-secure-store';
|
|
158
|
+
*
|
|
159
|
+
* const secureStorage = {
|
|
160
|
+
* getItem: SecureStore.getItemAsync,
|
|
161
|
+
* setItem: SecureStore.setItemAsync,
|
|
162
|
+
* removeItem: SecureStore.deleteItemAsync,
|
|
163
|
+
* };
|
|
164
|
+
*
|
|
165
|
+
* <Provider
|
|
166
|
+
* appId="your-app-id"
|
|
167
|
+
* customStorage={secureStorage}
|
|
168
|
+
* urls={{ authentication: 'https://api.example.com' }}
|
|
169
|
+
* >
|
|
170
|
+
* <App />
|
|
171
|
+
* </Provider>
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
customStorage?: AsyncStorageInterface;
|
|
128
175
|
/**
|
|
129
176
|
* Additional headers to include with every request
|
|
130
177
|
*/
|
|
@@ -171,6 +218,12 @@ export interface ClientContext {
|
|
|
171
218
|
*/
|
|
172
219
|
onStorageChange: (callback: () => void) => () => void;
|
|
173
220
|
authMode: AuthMode;
|
|
221
|
+
/**
|
|
222
|
+
* Whether the provider has finished loading tokens from async storage.
|
|
223
|
+
* Always true for sync storage (localStorage, sessionStorage, memory).
|
|
224
|
+
* For React Native with customStorage, this is false until tokens are loaded.
|
|
225
|
+
*/
|
|
226
|
+
isReady: boolean;
|
|
174
227
|
}
|
|
175
228
|
/**
|
|
176
229
|
* Provider component for 23blocks services.
|
|
@@ -214,8 +267,44 @@ export interface ClientContext {
|
|
|
214
267
|
* <MyApp />
|
|
215
268
|
* </Provider>
|
|
216
269
|
* ```
|
|
270
|
+
*
|
|
271
|
+
* @example React Native with AsyncStorage
|
|
272
|
+
* ```tsx
|
|
273
|
+
* import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
274
|
+
*
|
|
275
|
+
* <Provider
|
|
276
|
+
* appId="your-app-id"
|
|
277
|
+
* customStorage={AsyncStorage}
|
|
278
|
+
* urls={{
|
|
279
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
280
|
+
* }}
|
|
281
|
+
* >
|
|
282
|
+
* <App />
|
|
283
|
+
* </Provider>
|
|
284
|
+
* ```
|
|
285
|
+
*
|
|
286
|
+
* @example React Native with Expo SecureStore (recommended for sensitive data)
|
|
287
|
+
* ```tsx
|
|
288
|
+
* import * as SecureStore from 'expo-secure-store';
|
|
289
|
+
*
|
|
290
|
+
* const secureStorage = {
|
|
291
|
+
* getItem: SecureStore.getItemAsync,
|
|
292
|
+
* setItem: SecureStore.setItemAsync,
|
|
293
|
+
* removeItem: SecureStore.deleteItemAsync,
|
|
294
|
+
* };
|
|
295
|
+
*
|
|
296
|
+
* <Provider
|
|
297
|
+
* appId="your-app-id"
|
|
298
|
+
* customStorage={secureStorage}
|
|
299
|
+
* urls={{
|
|
300
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
301
|
+
* }}
|
|
302
|
+
* >
|
|
303
|
+
* <App />
|
|
304
|
+
* </Provider>
|
|
305
|
+
* ```
|
|
217
306
|
*/
|
|
218
|
-
export declare function Provider({ children, urls, appId, tenantId, authMode, storage, headers: staticHeaders, timeout, }: ProviderProps): any;
|
|
307
|
+
export declare function Provider({ children, urls, appId, tenantId, authMode, storage, customStorage, headers: staticHeaders, timeout, }: ProviderProps): any;
|
|
219
308
|
/**
|
|
220
309
|
* Hook to access all 23blocks services.
|
|
221
310
|
*
|
|
@@ -255,6 +344,19 @@ export declare function useClient(): ClientContext;
|
|
|
255
344
|
* );
|
|
256
345
|
* }
|
|
257
346
|
* ```
|
|
347
|
+
*
|
|
348
|
+
* @example React Native - wait for tokens to load
|
|
349
|
+
* ```tsx
|
|
350
|
+
* function App() {
|
|
351
|
+
* const { isReady, isAuthenticated } = useAuth();
|
|
352
|
+
*
|
|
353
|
+
* if (!isReady) {
|
|
354
|
+
* return <LoadingScreen />;
|
|
355
|
+
* }
|
|
356
|
+
*
|
|
357
|
+
* return isAuthenticated() ? <HomeScreen /> : <LoginScreen />;
|
|
358
|
+
* }
|
|
359
|
+
* ```
|
|
258
360
|
*/
|
|
259
361
|
export declare function useAuth(): {
|
|
260
362
|
signIn: (request: SignInRequest) => Promise<SignInResponse>;
|
|
@@ -267,6 +369,7 @@ export declare function useAuth(): {
|
|
|
267
369
|
isAuthenticated: () => boolean | null;
|
|
268
370
|
onStorageChange: (callback: () => void) => () => void;
|
|
269
371
|
authentication: AuthenticationBlock;
|
|
372
|
+
isReady: boolean;
|
|
270
373
|
};
|
|
271
374
|
/** @deprecated Use `Provider` instead */
|
|
272
375
|
export declare const SimpleBlocks23Provider: typeof Provider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-provider.d.ts","sourceRoot":"","sources":["../../../src/lib/simple-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"simple-provider.d.ts","sourceRoot":"","sources":["../../../src/lib/simple-provider.tsx"],"names":[],"mappings":"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"}
|