@23blocks/react 1.0.1 → 1.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.
- package/dist/lib/index.js +7 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/simple-provider.js +170 -74
- package/dist/lib/simple-provider.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/index.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
-
//
|
|
2
|
+
// Main API (Recommended)
|
|
3
3
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
-
export {
|
|
4
|
+
export { // Main exports
|
|
5
|
+
Provider, useClient, useAuth, // Backward compatibility (deprecated)
|
|
6
|
+
SimpleBlocks23Provider, useSimpleBlocks23, useSimpleAuth } from './simple-provider.js';
|
|
5
7
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
8
|
// Advanced API (Custom transport)
|
|
7
9
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
10
|
// Context and Provider
|
|
9
11
|
export { Blocks23Provider, use23Blocks, useAuthenticationBlock, useSearchBlock, useProductsBlock, useCrmBlock, useContentBlock, useGeolocationBlock, useConversationsBlock, useFilesBlock, useFormsBlock, useAssetsBlock, useCampaignsBlock, useCompanyBlock, useRewardsBlock, useSalesBlock, useWalletBlock, useJarvisBlock, useOnboardingBlock, useUniversityBlock } from './context.js';
|
|
10
|
-
// Hooks
|
|
11
|
-
export { // Auth
|
|
12
|
-
useAuth, useUsers, // Search
|
|
12
|
+
// Hooks (for advanced API with custom transport)
|
|
13
|
+
export { // Auth - renamed to avoid conflict with main useAuth
|
|
14
|
+
useAuth as useAuthState, useUsers, // Search
|
|
13
15
|
useSearch, useFavorites } from './hooks/index.js';
|
|
14
16
|
|
|
15
17
|
//# sourceMappingURL=index.js.map
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n//
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// Main API (Recommended)\n// ─────────────────────────────────────────────────────────────────────────────\nexport {\n // Main exports\n Provider,\n useClient,\n useAuth,\n type ProviderProps,\n type ClientContext,\n type ServiceUrls,\n type AuthMode,\n type StorageType,\n type TokenManager,\n\n // Backward compatibility (deprecated)\n SimpleBlocks23Provider,\n useSimpleBlocks23,\n useSimpleAuth,\n type SimpleBlocks23ProviderProps,\n type SimpleBlocks23Context,\n} from './simple-provider.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Advanced API (Custom transport)\n// ─────────────────────────────────────────────────────────────────────────────\n// Context and Provider\nexport {\n Blocks23Provider,\n use23Blocks,\n useAuthenticationBlock,\n useSearchBlock,\n useProductsBlock,\n useCrmBlock,\n useContentBlock,\n useGeolocationBlock,\n useConversationsBlock,\n useFilesBlock,\n useFormsBlock,\n useAssetsBlock,\n useCampaignsBlock,\n useCompanyBlock,\n useRewardsBlock,\n useSalesBlock,\n useWalletBlock,\n useJarvisBlock,\n useOnboardingBlock,\n useUniversityBlock,\n type Blocks23ProviderProps,\n type Blocks23Context,\n} from './context.js';\n\n// Hooks (for advanced API with custom transport)\nexport {\n // Auth - renamed to avoid conflict with main useAuth\n useAuth as useAuthState,\n useUsers,\n type UseAuthReturn,\n type UseAuthState,\n type UseAuthActions,\n type UseUsersReturn,\n type UseUsersState,\n type UseUsersActions,\n\n // Search\n useSearch,\n useFavorites,\n type UseSearchReturn,\n type UseSearchState,\n type UseSearchActions,\n type UseFavoritesReturn,\n type UseFavoritesState,\n type UseFavoritesActions,\n} from './hooks/index.js';\n"],"names":["Provider","useClient","useAuth","SimpleBlocks23Provider","useSimpleBlocks23","useSimpleAuth","Blocks23Provider","use23Blocks","useAuthenticationBlock","useSearchBlock","useProductsBlock","useCrmBlock","useContentBlock","useGeolocationBlock","useConversationsBlock","useFilesBlock","useFormsBlock","useAssetsBlock","useCampaignsBlock","useCompanyBlock","useRewardsBlock","useSalesBlock","useWalletBlock","useJarvisBlock","useOnboardingBlock","useUniversityBlock","useAuthState","useUsers","useSearch","useFavorites"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAChF,SACE,eAAe;AACfA,QAAQ,EACRC,SAAS,EACTC,OAAO,EAQP,sCAAsC;AACtCC,sBAAsB,EACtBC,iBAAiB,EACjBC,aAAa,QAGR,uBAAuB;AAE9B,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAChF,uBAAuB;AACvB,SACEC,gBAAgB,EAChBC,WAAW,EACXC,sBAAsB,EACtBC,cAAc,EACdC,gBAAgB,EAChBC,WAAW,EACXC,eAAe,EACfC,mBAAmB,EACnBC,qBAAqB,EACrBC,aAAa,EACbC,aAAa,EACbC,cAAc,EACdC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfC,aAAa,EACbC,cAAc,EACdC,cAAc,EACdC,kBAAkB,EAClBC,kBAAkB,QAGb,eAAe;AAEtB,iDAAiD;AACjD,SACE,qDAAqD;AACrDvB,WAAWwB,YAAY,EACvBC,QAAQ,EAQR,SAAS;AACTC,SAAS,EACTC,YAAY,QAOP,mBAAmB"}
|
|
@@ -118,43 +118,50 @@ function createTokenManager(appId, storageType, tenantId) {
|
|
|
118
118
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
119
119
|
// Context
|
|
120
120
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
121
|
-
const
|
|
121
|
+
const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
122
122
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
123
123
|
// Provider Component
|
|
124
124
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
125
125
|
/**
|
|
126
|
-
*
|
|
126
|
+
* Provider component for 23blocks services.
|
|
127
127
|
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
128
|
+
* Wrap your app with this provider to access all 23blocks services
|
|
129
|
+
* with automatic token management.
|
|
130
130
|
*
|
|
131
|
-
* @example
|
|
131
|
+
* @example Basic usage with multiple services
|
|
132
132
|
* ```tsx
|
|
133
|
-
* import {
|
|
133
|
+
* import { Provider } from '@23blocks/react';
|
|
134
134
|
*
|
|
135
135
|
* function App() {
|
|
136
136
|
* return (
|
|
137
|
-
* <
|
|
138
|
-
* baseUrl="https://api.yourapp.com"
|
|
137
|
+
* <Provider
|
|
139
138
|
* appId="your-app-id"
|
|
139
|
+
* urls={{
|
|
140
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
141
|
+
* crm: 'https://crm.23blocks.com',
|
|
142
|
+
* products: 'https://products.23blocks.com',
|
|
143
|
+
* }}
|
|
140
144
|
* >
|
|
141
145
|
* <MyApp />
|
|
142
|
-
* </
|
|
146
|
+
* </Provider>
|
|
143
147
|
* );
|
|
144
148
|
* }
|
|
145
149
|
* ```
|
|
146
150
|
*
|
|
147
151
|
* @example Cookie mode (recommended for security)
|
|
148
152
|
* ```tsx
|
|
149
|
-
* <
|
|
150
|
-
* baseUrl="https://api.yourapp.com"
|
|
153
|
+
* <Provider
|
|
151
154
|
* appId="your-app-id"
|
|
152
155
|
* authMode="cookie"
|
|
156
|
+
* urls={{
|
|
157
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
158
|
+
* crm: 'https://crm.23blocks.com',
|
|
159
|
+
* }}
|
|
153
160
|
* >
|
|
154
161
|
* <MyApp />
|
|
155
|
-
* </
|
|
162
|
+
* </Provider>
|
|
156
163
|
* ```
|
|
157
|
-
*/ export function
|
|
164
|
+
*/ export function Provider({ children, urls, appId, tenantId, authMode = 'token', storage = 'localStorage', headers: staticHeaders = {}, timeout }) {
|
|
158
165
|
// Create token manager (memoized) with scoped storage keys
|
|
159
166
|
const tokenManager = useMemo(()=>authMode === 'token' ? createTokenManager(appId, storage, tenantId) : null, [
|
|
160
167
|
authMode,
|
|
@@ -162,8 +169,8 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
162
169
|
storage,
|
|
163
170
|
tenantId
|
|
164
171
|
]);
|
|
165
|
-
//
|
|
166
|
-
const
|
|
172
|
+
// Factory to create transport for a specific service URL
|
|
173
|
+
const createServiceTransport = useCallback((baseUrl)=>{
|
|
167
174
|
return createHttpTransport({
|
|
168
175
|
baseUrl,
|
|
169
176
|
timeout,
|
|
@@ -185,16 +192,14 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
185
192
|
}
|
|
186
193
|
});
|
|
187
194
|
}, [
|
|
188
|
-
baseUrl,
|
|
189
195
|
appId,
|
|
190
196
|
tenantId,
|
|
191
197
|
authMode,
|
|
192
|
-
storage,
|
|
193
198
|
staticHeaders,
|
|
194
199
|
timeout,
|
|
195
200
|
tokenManager
|
|
196
201
|
]);
|
|
197
|
-
// Create blocks (memoized)
|
|
202
|
+
// Create blocks (memoized) - each with its own transport
|
|
198
203
|
const blockConfig = useMemo(()=>({
|
|
199
204
|
appId,
|
|
200
205
|
tenantId
|
|
@@ -202,76 +207,167 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
202
207
|
appId,
|
|
203
208
|
tenantId
|
|
204
209
|
]);
|
|
205
|
-
|
|
206
|
-
|
|
210
|
+
// Auth transport is required
|
|
211
|
+
const authTransport = useMemo(()=>createServiceTransport(urls.authentication), [
|
|
212
|
+
createServiceTransport,
|
|
213
|
+
urls.authentication
|
|
214
|
+
]);
|
|
215
|
+
const authentication = useMemo(()=>createAuthenticationBlock(authTransport, blockConfig), [
|
|
216
|
+
authTransport,
|
|
207
217
|
blockConfig
|
|
208
218
|
]);
|
|
209
|
-
|
|
210
|
-
|
|
219
|
+
// Other blocks use their own URL or fall back to auth URL
|
|
220
|
+
const search = useMemo(()=>{
|
|
221
|
+
const transport = urls.search ? createServiceTransport(urls.search) : authTransport;
|
|
222
|
+
return createSearchBlock(transport, blockConfig);
|
|
223
|
+
}, [
|
|
224
|
+
createServiceTransport,
|
|
225
|
+
urls.search,
|
|
226
|
+
authTransport,
|
|
211
227
|
blockConfig
|
|
212
228
|
]);
|
|
213
|
-
const products = useMemo(()=>
|
|
214
|
-
transport
|
|
229
|
+
const products = useMemo(()=>{
|
|
230
|
+
const transport = urls.products ? createServiceTransport(urls.products) : authTransport;
|
|
231
|
+
return createProductsBlock(transport, blockConfig);
|
|
232
|
+
}, [
|
|
233
|
+
createServiceTransport,
|
|
234
|
+
urls.products,
|
|
235
|
+
authTransport,
|
|
215
236
|
blockConfig
|
|
216
237
|
]);
|
|
217
|
-
const crm = useMemo(()=>
|
|
218
|
-
transport
|
|
238
|
+
const crm = useMemo(()=>{
|
|
239
|
+
const transport = urls.crm ? createServiceTransport(urls.crm) : authTransport;
|
|
240
|
+
return createCrmBlock(transport, blockConfig);
|
|
241
|
+
}, [
|
|
242
|
+
createServiceTransport,
|
|
243
|
+
urls.crm,
|
|
244
|
+
authTransport,
|
|
219
245
|
blockConfig
|
|
220
246
|
]);
|
|
221
|
-
const content = useMemo(()=>
|
|
222
|
-
transport
|
|
247
|
+
const content = useMemo(()=>{
|
|
248
|
+
const transport = urls.content ? createServiceTransport(urls.content) : authTransport;
|
|
249
|
+
return createContentBlock(transport, blockConfig);
|
|
250
|
+
}, [
|
|
251
|
+
createServiceTransport,
|
|
252
|
+
urls.content,
|
|
253
|
+
authTransport,
|
|
223
254
|
blockConfig
|
|
224
255
|
]);
|
|
225
|
-
const geolocation = useMemo(()=>
|
|
226
|
-
transport
|
|
256
|
+
const geolocation = useMemo(()=>{
|
|
257
|
+
const transport = urls.geolocation ? createServiceTransport(urls.geolocation) : authTransport;
|
|
258
|
+
return createGeolocationBlock(transport, blockConfig);
|
|
259
|
+
}, [
|
|
260
|
+
createServiceTransport,
|
|
261
|
+
urls.geolocation,
|
|
262
|
+
authTransport,
|
|
227
263
|
blockConfig
|
|
228
264
|
]);
|
|
229
|
-
const conversations = useMemo(()=>
|
|
230
|
-
transport
|
|
265
|
+
const conversations = useMemo(()=>{
|
|
266
|
+
const transport = urls.conversations ? createServiceTransport(urls.conversations) : authTransport;
|
|
267
|
+
return createConversationsBlock(transport, blockConfig);
|
|
268
|
+
}, [
|
|
269
|
+
createServiceTransport,
|
|
270
|
+
urls.conversations,
|
|
271
|
+
authTransport,
|
|
231
272
|
blockConfig
|
|
232
273
|
]);
|
|
233
|
-
const files = useMemo(()=>
|
|
234
|
-
transport
|
|
274
|
+
const files = useMemo(()=>{
|
|
275
|
+
const transport = urls.files ? createServiceTransport(urls.files) : authTransport;
|
|
276
|
+
return createFilesBlock(transport, blockConfig);
|
|
277
|
+
}, [
|
|
278
|
+
createServiceTransport,
|
|
279
|
+
urls.files,
|
|
280
|
+
authTransport,
|
|
235
281
|
blockConfig
|
|
236
282
|
]);
|
|
237
|
-
const forms = useMemo(()=>
|
|
238
|
-
transport
|
|
283
|
+
const forms = useMemo(()=>{
|
|
284
|
+
const transport = urls.forms ? createServiceTransport(urls.forms) : authTransport;
|
|
285
|
+
return createFormsBlock(transport, blockConfig);
|
|
286
|
+
}, [
|
|
287
|
+
createServiceTransport,
|
|
288
|
+
urls.forms,
|
|
289
|
+
authTransport,
|
|
239
290
|
blockConfig
|
|
240
291
|
]);
|
|
241
|
-
const assets = useMemo(()=>
|
|
242
|
-
transport
|
|
292
|
+
const assets = useMemo(()=>{
|
|
293
|
+
const transport = urls.assets ? createServiceTransport(urls.assets) : authTransport;
|
|
294
|
+
return createAssetsBlock(transport, blockConfig);
|
|
295
|
+
}, [
|
|
296
|
+
createServiceTransport,
|
|
297
|
+
urls.assets,
|
|
298
|
+
authTransport,
|
|
243
299
|
blockConfig
|
|
244
300
|
]);
|
|
245
|
-
const campaigns = useMemo(()=>
|
|
246
|
-
transport
|
|
301
|
+
const campaigns = useMemo(()=>{
|
|
302
|
+
const transport = urls.campaigns ? createServiceTransport(urls.campaigns) : authTransport;
|
|
303
|
+
return createCampaignsBlock(transport, blockConfig);
|
|
304
|
+
}, [
|
|
305
|
+
createServiceTransport,
|
|
306
|
+
urls.campaigns,
|
|
307
|
+
authTransport,
|
|
247
308
|
blockConfig
|
|
248
309
|
]);
|
|
249
|
-
const company = useMemo(()=>
|
|
250
|
-
transport
|
|
310
|
+
const company = useMemo(()=>{
|
|
311
|
+
const transport = urls.company ? createServiceTransport(urls.company) : authTransport;
|
|
312
|
+
return createCompanyBlock(transport, blockConfig);
|
|
313
|
+
}, [
|
|
314
|
+
createServiceTransport,
|
|
315
|
+
urls.company,
|
|
316
|
+
authTransport,
|
|
251
317
|
blockConfig
|
|
252
318
|
]);
|
|
253
|
-
const rewards = useMemo(()=>
|
|
254
|
-
transport
|
|
319
|
+
const rewards = useMemo(()=>{
|
|
320
|
+
const transport = urls.rewards ? createServiceTransport(urls.rewards) : authTransport;
|
|
321
|
+
return createRewardsBlock(transport, blockConfig);
|
|
322
|
+
}, [
|
|
323
|
+
createServiceTransport,
|
|
324
|
+
urls.rewards,
|
|
325
|
+
authTransport,
|
|
255
326
|
blockConfig
|
|
256
327
|
]);
|
|
257
|
-
const sales = useMemo(()=>
|
|
258
|
-
transport
|
|
328
|
+
const sales = useMemo(()=>{
|
|
329
|
+
const transport = urls.sales ? createServiceTransport(urls.sales) : authTransport;
|
|
330
|
+
return createSalesBlock(transport, blockConfig);
|
|
331
|
+
}, [
|
|
332
|
+
createServiceTransport,
|
|
333
|
+
urls.sales,
|
|
334
|
+
authTransport,
|
|
259
335
|
blockConfig
|
|
260
336
|
]);
|
|
261
|
-
const wallet = useMemo(()=>
|
|
262
|
-
transport
|
|
337
|
+
const wallet = useMemo(()=>{
|
|
338
|
+
const transport = urls.wallet ? createServiceTransport(urls.wallet) : authTransport;
|
|
339
|
+
return createWalletBlock(transport, blockConfig);
|
|
340
|
+
}, [
|
|
341
|
+
createServiceTransport,
|
|
342
|
+
urls.wallet,
|
|
343
|
+
authTransport,
|
|
263
344
|
blockConfig
|
|
264
345
|
]);
|
|
265
|
-
const jarvis = useMemo(()=>
|
|
266
|
-
transport
|
|
346
|
+
const jarvis = useMemo(()=>{
|
|
347
|
+
const transport = urls.jarvis ? createServiceTransport(urls.jarvis) : authTransport;
|
|
348
|
+
return createJarvisBlock(transport, blockConfig);
|
|
349
|
+
}, [
|
|
350
|
+
createServiceTransport,
|
|
351
|
+
urls.jarvis,
|
|
352
|
+
authTransport,
|
|
267
353
|
blockConfig
|
|
268
354
|
]);
|
|
269
|
-
const onboarding = useMemo(()=>
|
|
270
|
-
transport
|
|
355
|
+
const onboarding = useMemo(()=>{
|
|
356
|
+
const transport = urls.onboarding ? createServiceTransport(urls.onboarding) : authTransport;
|
|
357
|
+
return createOnboardingBlock(transport, blockConfig);
|
|
358
|
+
}, [
|
|
359
|
+
createServiceTransport,
|
|
360
|
+
urls.onboarding,
|
|
361
|
+
authTransport,
|
|
271
362
|
blockConfig
|
|
272
363
|
]);
|
|
273
|
-
const university = useMemo(()=>
|
|
274
|
-
transport
|
|
364
|
+
const university = useMemo(()=>{
|
|
365
|
+
const transport = urls.university ? createServiceTransport(urls.university) : authTransport;
|
|
366
|
+
return createUniversityBlock(transport, blockConfig);
|
|
367
|
+
}, [
|
|
368
|
+
createServiceTransport,
|
|
369
|
+
urls.university,
|
|
370
|
+
authTransport,
|
|
275
371
|
blockConfig
|
|
276
372
|
]);
|
|
277
373
|
// Auth methods with automatic token management
|
|
@@ -404,7 +500,7 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
404
500
|
onStorageChange,
|
|
405
501
|
authMode
|
|
406
502
|
]);
|
|
407
|
-
return /*#__PURE__*/ React.createElement(
|
|
503
|
+
return /*#__PURE__*/ React.createElement(Blocks23Context.Provider, {
|
|
408
504
|
value: value
|
|
409
505
|
}, children);
|
|
410
506
|
}
|
|
@@ -412,29 +508,23 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
412
508
|
// Hooks
|
|
413
509
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
414
510
|
/**
|
|
415
|
-
* Hook to access
|
|
511
|
+
* Hook to access all 23blocks services.
|
|
416
512
|
*
|
|
417
513
|
* @example
|
|
418
514
|
* ```tsx
|
|
419
|
-
* function
|
|
420
|
-
* const {
|
|
515
|
+
* function Dashboard() {
|
|
516
|
+
* const { products, crm, files } = useClient();
|
|
421
517
|
*
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
518
|
+
* // Access any service
|
|
519
|
+
* const loadProducts = async () => {
|
|
520
|
+
* const { data } = await products.products.list({ limit: 10 });
|
|
425
521
|
* };
|
|
426
|
-
*
|
|
427
|
-
* return (
|
|
428
|
-
* <button onClick={handleLogin}>
|
|
429
|
-
* {isAuthenticated() ? 'Logged In' : 'Log In'}
|
|
430
|
-
* </button>
|
|
431
|
-
* );
|
|
432
522
|
* }
|
|
433
523
|
* ```
|
|
434
|
-
*/ export function
|
|
435
|
-
const context = useContext(
|
|
524
|
+
*/ export function useClient() {
|
|
525
|
+
const context = useContext(Blocks23Context);
|
|
436
526
|
if (!context) {
|
|
437
|
-
throw new Error('
|
|
527
|
+
throw new Error('useClient must be used within a Provider');
|
|
438
528
|
}
|
|
439
529
|
return context;
|
|
440
530
|
}
|
|
@@ -443,8 +533,8 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
443
533
|
*
|
|
444
534
|
* @example
|
|
445
535
|
* ```tsx
|
|
446
|
-
* function
|
|
447
|
-
* const { signIn, signOut, isAuthenticated
|
|
536
|
+
* function LoginPage() {
|
|
537
|
+
* const { signIn, signOut, isAuthenticated } = useAuth();
|
|
448
538
|
*
|
|
449
539
|
* const handleLogin = async () => {
|
|
450
540
|
* await signIn({ email: 'user@example.com', password: 'password' });
|
|
@@ -461,8 +551,8 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
461
551
|
* );
|
|
462
552
|
* }
|
|
463
553
|
* ```
|
|
464
|
-
*/ export function
|
|
465
|
-
const context =
|
|
554
|
+
*/ export function useAuth() {
|
|
555
|
+
const context = useClient();
|
|
466
556
|
return {
|
|
467
557
|
signIn: context.signIn,
|
|
468
558
|
signUp: context.signUp,
|
|
@@ -476,5 +566,11 @@ const SimpleBlocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
|
476
566
|
authentication: context.authentication
|
|
477
567
|
};
|
|
478
568
|
}
|
|
569
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
570
|
+
// Backward Compatibility Aliases (deprecated)
|
|
571
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
572
|
+
/** @deprecated Use `Provider` instead */ export const SimpleBlocks23Provider = Provider;
|
|
573
|
+
/** @deprecated Use `useClient` instead */ export const useSimpleBlocks23 = useClient;
|
|
574
|
+
/** @deprecated Use `useAuth` instead */ export const useSimpleAuth = useAuth;
|
|
479
575
|
|
|
480
576
|
//# sourceMappingURL=simple-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/simple-provider.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, useCallback, type ReactNode } from 'react';\nimport { createHttpTransport } from '@23blocks/transport-http';\nimport type { Transport } from '@23blocks/contracts';\nimport { createAuthenticationBlock, type AuthenticationBlock, type SignInRequest, type SignInResponse, type SignUpRequest, type SignUpResponse } from '@23blocks/block-authentication';\nimport { createSearchBlock, type SearchBlock } from '@23blocks/block-search';\nimport { createProductsBlock, type ProductsBlock } from '@23blocks/block-products';\nimport { createCrmBlock, type CrmBlock } from '@23blocks/block-crm';\nimport { createContentBlock, type ContentBlock } from '@23blocks/block-content';\nimport { createGeolocationBlock, type GeolocationBlock } from '@23blocks/block-geolocation';\nimport { createConversationsBlock, type ConversationsBlock } from '@23blocks/block-conversations';\nimport { createFilesBlock, type FilesBlock } from '@23blocks/block-files';\nimport { createFormsBlock, type FormsBlock } from '@23blocks/block-forms';\nimport { createAssetsBlock, type AssetsBlock } from '@23blocks/block-assets';\nimport { createCampaignsBlock, type CampaignsBlock } from '@23blocks/block-campaigns';\nimport { createCompanyBlock, type CompanyBlock } from '@23blocks/block-company';\nimport { createRewardsBlock, type RewardsBlock } from '@23blocks/block-rewards';\nimport { createSalesBlock, type SalesBlock } from '@23blocks/block-sales';\nimport { createWalletBlock, type WalletBlock } from '@23blocks/block-wallet';\nimport { createJarvisBlock, type JarvisBlock } from '@23blocks/block-jarvis';\nimport { createOnboardingBlock, type OnboardingBlock } from '@23blocks/block-onboarding';\nimport { createUniversityBlock, type UniversityBlock } from '@23blocks/block-university';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Authentication mode\n */\nexport type AuthMode = 'token' | 'cookie';\n\n/**\n * Storage type for token mode\n */\nexport type StorageType = 'localStorage' | 'sessionStorage' | 'memory';\n\n/**\n * Token manager interface\n */\nexport interface TokenManager {\n getAccessToken(): string | null;\n getRefreshToken(): string | null;\n setTokens(accessToken: string, refreshToken?: string): void;\n clearTokens(): void;\n /**\n * Subscribe to storage changes from other tabs/windows.\n * Returns an unsubscribe function.\n */\n onStorageChange(callback: () => void): () => void;\n}\n\n/**\n * Simplified provider props\n */\nexport interface SimpleBlocks23ProviderProps {\n children: ReactNode;\n\n /**\n * Base URL for the 23blocks API\n * @example 'https://api.yourapp.com'\n */\n baseUrl: string;\n\n /**\n * Application ID\n */\n appId: string;\n\n /**\n * Tenant ID (optional, for multi-tenant setups)\n */\n tenantId?: string;\n\n /**\n * Authentication mode\n * - 'token' (default): SDK stores tokens in localStorage/sessionStorage/memory\n * - 'cookie': Backend manages auth via httpOnly cookies\n */\n authMode?: AuthMode;\n\n /**\n * Storage type for token mode\n * @default 'localStorage'\n */\n storage?: StorageType;\n\n /**\n * Additional headers to include with every request\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Context value for simplified provider\n */\nexport interface SimpleBlocks23Context {\n // Blocks\n authentication: AuthenticationBlock;\n search: SearchBlock;\n products: ProductsBlock;\n crm: CrmBlock;\n content: ContentBlock;\n geolocation: GeolocationBlock;\n conversations: ConversationsBlock;\n files: FilesBlock;\n forms: FormsBlock;\n assets: AssetsBlock;\n campaigns: CampaignsBlock;\n company: CompanyBlock;\n rewards: RewardsBlock;\n sales: SalesBlock;\n wallet: WalletBlock;\n jarvis: JarvisBlock;\n onboarding: OnboardingBlock;\n university: UniversityBlock;\n\n // Auth with automatic token management\n signIn: (request: SignInRequest) => Promise<SignInResponse>;\n signUp: (request: SignUpRequest) => Promise<SignUpResponse>;\n signOut: () => Promise<void>;\n\n // Token utilities\n getAccessToken: () => string | null;\n getRefreshToken: () => string | null;\n setTokens: (accessToken: string, refreshToken?: string) => void;\n clearTokens: () => void;\n isAuthenticated: () => boolean | null;\n /**\n * Subscribe to token changes from other tabs/windows.\n * Returns an unsubscribe function.\n */\n onStorageChange: (callback: () => void) => () => void;\n\n // Config info\n authMode: AuthMode;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Token Manager Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate storage key scoped to app and tenant\n */\nfunction getStorageKey(type: 'access' | 'refresh', appId: string, tenantId?: string): string {\n const scope = tenantId ? `${appId}_${tenantId}` : appId;\n return `23blocks_${scope}_${type}_token`;\n}\n\nclass MemoryStorage {\n private data = new Map<string, string>();\n getItem(key: string): string | null {\n return this.data.get(key) ?? null;\n }\n setItem(key: string, value: string): void {\n this.data.set(key, value);\n }\n removeItem(key: string): void {\n this.data.delete(key);\n }\n}\n\nfunction createTokenManager(appId: string, storageType: StorageType, tenantId?: string): TokenManager {\n const isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\n const accessTokenKey = getStorageKey('access', appId, tenantId);\n const refreshTokenKey = getStorageKey('refresh', appId, tenantId);\n\n let storage: Storage | MemoryStorage;\n if (!isBrowser) {\n storage = new MemoryStorage();\n } else {\n switch (storageType) {\n case 'sessionStorage':\n storage = window.sessionStorage;\n break;\n case 'memory':\n storage = new MemoryStorage();\n break;\n default:\n storage = window.localStorage;\n }\n }\n\n return {\n getAccessToken(): string | null {\n try {\n return storage.getItem(accessTokenKey);\n } catch {\n return null;\n }\n },\n getRefreshToken(): string | null {\n try {\n return storage.getItem(refreshTokenKey);\n } catch {\n return null;\n }\n },\n setTokens(accessToken: string, refreshToken?: string): void {\n try {\n storage.setItem(accessTokenKey, accessToken);\n if (refreshToken) {\n storage.setItem(refreshTokenKey, refreshToken);\n }\n } catch {\n console.warn('[23blocks] Unable to store tokens');\n }\n },\n clearTokens(): void {\n try {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n } catch {\n // Silently fail\n }\n },\n onStorageChange(callback: () => void): () => void {\n // Only works in browser with localStorage/sessionStorage\n if (!isBrowser || storageType === 'memory') {\n // Return no-op unsubscribe for SSR/memory storage\n return () => {};\n }\n\n const handler = (event: StorageEvent) => {\n // Only trigger if our keys changed\n if (event.key === accessTokenKey || event.key === refreshTokenKey) {\n callback();\n }\n };\n\n window.addEventListener('storage', handler);\n\n // Return unsubscribe function\n return () => {\n window.removeEventListener('storage', handler);\n };\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SimpleBlocks23ContextInternal = createContext<SimpleBlocks23Context | null>(null);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Simplified provider component for 23blocks services.\n *\n * This is the recommended way to set up 23blocks in new React applications.\n * It automatically handles token storage and authentication headers.\n *\n * @example Token mode (default)\n * ```tsx\n * import { SimpleBlocks23Provider } from '@23blocks/react';\n *\n * function App() {\n * return (\n * <SimpleBlocks23Provider\n * baseUrl=\"https://api.yourapp.com\"\n * appId=\"your-app-id\"\n * >\n * <MyApp />\n * </SimpleBlocks23Provider>\n * );\n * }\n * ```\n *\n * @example Cookie mode (recommended for security)\n * ```tsx\n * <SimpleBlocks23Provider\n * baseUrl=\"https://api.yourapp.com\"\n * appId=\"your-app-id\"\n * authMode=\"cookie\"\n * >\n * <MyApp />\n * </SimpleBlocks23Provider>\n * ```\n */\nexport function SimpleBlocks23Provider({\n children,\n baseUrl,\n appId,\n tenantId,\n authMode = 'token',\n storage = 'localStorage',\n headers: staticHeaders = {},\n timeout,\n}: SimpleBlocks23ProviderProps) {\n // Create token manager (memoized) with scoped storage keys\n const tokenManager = useMemo(\n () => (authMode === 'token' ? createTokenManager(appId, storage, tenantId) : null),\n [authMode, appId, storage, tenantId]\n );\n\n // Create transport (memoized)\n const transport = useMemo(() => {\n return createHttpTransport({\n baseUrl,\n timeout,\n credentials: authMode === 'cookie' ? 'include' : undefined,\n headers: () => {\n const headers: Record<string, string> = {\n ...staticHeaders,\n appid: appId,\n };\n\n if (tenantId) {\n headers['tenant-id'] = tenantId;\n }\n\n if (authMode === 'token' && tokenManager) {\n const token = tokenManager.getAccessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n\n return headers;\n },\n });\n }, [baseUrl, appId, tenantId, authMode, storage, staticHeaders, timeout, tokenManager]);\n\n // Create blocks (memoized)\n const blockConfig = useMemo(() => ({ appId, tenantId }), [appId, tenantId]);\n\n const authentication = useMemo(() => createAuthenticationBlock(transport, blockConfig), [transport, blockConfig]);\n const search = useMemo(() => createSearchBlock(transport, blockConfig), [transport, blockConfig]);\n const products = useMemo(() => createProductsBlock(transport, blockConfig), [transport, blockConfig]);\n const crm = useMemo(() => createCrmBlock(transport, blockConfig), [transport, blockConfig]);\n const content = useMemo(() => createContentBlock(transport, blockConfig), [transport, blockConfig]);\n const geolocation = useMemo(() => createGeolocationBlock(transport, blockConfig), [transport, blockConfig]);\n const conversations = useMemo(() => createConversationsBlock(transport, blockConfig), [transport, blockConfig]);\n const files = useMemo(() => createFilesBlock(transport, blockConfig), [transport, blockConfig]);\n const forms = useMemo(() => createFormsBlock(transport, blockConfig), [transport, blockConfig]);\n const assets = useMemo(() => createAssetsBlock(transport, blockConfig), [transport, blockConfig]);\n const campaigns = useMemo(() => createCampaignsBlock(transport, blockConfig), [transport, blockConfig]);\n const company = useMemo(() => createCompanyBlock(transport, blockConfig), [transport, blockConfig]);\n const rewards = useMemo(() => createRewardsBlock(transport, blockConfig), [transport, blockConfig]);\n const sales = useMemo(() => createSalesBlock(transport, blockConfig), [transport, blockConfig]);\n const wallet = useMemo(() => createWalletBlock(transport, blockConfig), [transport, blockConfig]);\n const jarvis = useMemo(() => createJarvisBlock(transport, blockConfig), [transport, blockConfig]);\n const onboarding = useMemo(() => createOnboardingBlock(transport, blockConfig), [transport, blockConfig]);\n const university = useMemo(() => createUniversityBlock(transport, blockConfig), [transport, blockConfig]);\n\n // Auth methods with automatic token management\n const signIn = useCallback(async (request: SignInRequest): Promise<SignInResponse> => {\n const response = await authentication.auth.signIn(request);\n if (authMode === 'token' && tokenManager && response.accessToken) {\n tokenManager.setTokens(response.accessToken, response.refreshToken);\n }\n return response;\n }, [authentication, authMode, tokenManager]);\n\n const signUp = useCallback(async (request: SignUpRequest): Promise<SignUpResponse> => {\n const response = await authentication.auth.signUp(request);\n if (authMode === 'token' && tokenManager && response.accessToken) {\n tokenManager.setTokens(response.accessToken);\n }\n return response;\n }, [authentication, authMode, tokenManager]);\n\n const signOut = useCallback(async (): Promise<void> => {\n await authentication.auth.signOut();\n if (authMode === 'token' && tokenManager) {\n tokenManager.clearTokens();\n }\n }, [authentication, authMode, tokenManager]);\n\n // Token utilities\n const getAccessToken = useCallback(() => tokenManager?.getAccessToken() ?? null, [tokenManager]);\n const getRefreshToken = useCallback(() => tokenManager?.getRefreshToken() ?? null, [tokenManager]);\n const setTokens = useCallback((accessToken: string, refreshToken?: string) => {\n tokenManager?.setTokens(accessToken, refreshToken);\n }, [tokenManager]);\n const clearTokens = useCallback(() => tokenManager?.clearTokens(), [tokenManager]);\n const isAuthenticated = useCallback((): boolean | null => {\n if (authMode === 'cookie') return null;\n return tokenManager ? !!tokenManager.getAccessToken() : false;\n }, [authMode, tokenManager]);\n const onStorageChange = useCallback((callback: () => void): (() => void) => {\n return tokenManager?.onStorageChange(callback) ?? (() => {});\n }, [tokenManager]);\n\n const value = useMemo<SimpleBlocks23Context>(() => ({\n // Blocks\n authentication,\n search,\n products,\n crm,\n content,\n geolocation,\n conversations,\n files,\n forms,\n assets,\n campaigns,\n company,\n rewards,\n sales,\n wallet,\n jarvis,\n onboarding,\n university,\n\n // Auth with token management\n signIn,\n signUp,\n signOut,\n\n // Token utilities\n getAccessToken,\n getRefreshToken,\n setTokens,\n clearTokens,\n isAuthenticated,\n onStorageChange,\n\n // Config\n authMode,\n }), [\n authentication, search, products, crm, content, geolocation, conversations,\n files, forms, assets, campaigns, company, rewards, sales, wallet, jarvis,\n onboarding, university, signIn, signUp, signOut, getAccessToken, getRefreshToken,\n setTokens, clearTokens, isAuthenticated, onStorageChange, authMode,\n ]);\n\n return (\n <SimpleBlocks23ContextInternal.Provider value={value}>\n {children}\n </SimpleBlocks23ContextInternal.Provider>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hooks\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook to access the 23blocks context with simplified API.\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const { signIn, isAuthenticated, authentication } = useSimpleBlocks23();\n *\n * const handleLogin = async () => {\n * const result = await signIn({ email: 'user@example.com', password: 'password' });\n * console.log('Logged in:', result.user);\n * };\n *\n * return (\n * <button onClick={handleLogin}>\n * {isAuthenticated() ? 'Logged In' : 'Log In'}\n * </button>\n * );\n * }\n * ```\n */\nexport function useSimpleBlocks23(): SimpleBlocks23Context {\n const context = useContext(SimpleBlocks23ContextInternal);\n if (!context) {\n throw new Error('useSimpleBlocks23 must be used within a SimpleBlocks23Provider');\n }\n return context;\n}\n\n/**\n * Hook for authentication operations with automatic token management.\n *\n * @example\n * ```tsx\n * function AuthComponent() {\n * const { signIn, signOut, isAuthenticated, authentication } = useSimpleAuth();\n *\n * const handleLogin = async () => {\n * await signIn({ email: 'user@example.com', password: 'password' });\n * };\n *\n * return (\n * <div>\n * {isAuthenticated() ? (\n * <button onClick={signOut}>Sign Out</button>\n * ) : (\n * <button onClick={handleLogin}>Sign In</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSimpleAuth() {\n const context = useSimpleBlocks23();\n return {\n signIn: context.signIn,\n signUp: context.signUp,\n signOut: context.signOut,\n getAccessToken: context.getAccessToken,\n getRefreshToken: context.getRefreshToken,\n setTokens: context.setTokens,\n clearTokens: context.clearTokens,\n isAuthenticated: context.isAuthenticated,\n onStorageChange: context.onStorageChange,\n authentication: context.authentication,\n };\n}\n"],"names":["createContext","useContext","useMemo","useCallback","createHttpTransport","createAuthenticationBlock","createSearchBlock","createProductsBlock","createCrmBlock","createContentBlock","createGeolocationBlock","createConversationsBlock","createFilesBlock","createFormsBlock","createAssetsBlock","createCampaignsBlock","createCompanyBlock","createRewardsBlock","createSalesBlock","createWalletBlock","createJarvisBlock","createOnboardingBlock","createUniversityBlock","getStorageKey","type","appId","tenantId","scope","MemoryStorage","getItem","key","data","get","setItem","value","set","removeItem","delete","Map","createTokenManager","storageType","isBrowser","window","localStorage","accessTokenKey","refreshTokenKey","storage","sessionStorage","getAccessToken","getRefreshToken","setTokens","accessToken","refreshToken","console","warn","clearTokens","onStorageChange","callback","handler","event","addEventListener","removeEventListener","SimpleBlocks23ContextInternal","SimpleBlocks23Provider","children","baseUrl","authMode","headers","staticHeaders","timeout","tokenManager","transport","credentials","undefined","appid","token","blockConfig","authentication","search","products","crm","content","geolocation","conversations","files","forms","assets","campaigns","company","rewards","sales","wallet","jarvis","onboarding","university","signIn","request","response","auth","signUp","signOut","isAuthenticated","Provider","useSimpleBlocks23","context","Error","useSimpleAuth"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/simple-provider.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, useCallback, type ReactNode } from 'react';\nimport { createHttpTransport } from '@23blocks/transport-http';\nimport type { Transport } from '@23blocks/contracts';\nimport { createAuthenticationBlock, type AuthenticationBlock, type SignInRequest, type SignInResponse, type SignUpRequest, type SignUpResponse } from '@23blocks/block-authentication';\nimport { createSearchBlock, type SearchBlock } from '@23blocks/block-search';\nimport { createProductsBlock, type ProductsBlock } from '@23blocks/block-products';\nimport { createCrmBlock, type CrmBlock } from '@23blocks/block-crm';\nimport { createContentBlock, type ContentBlock } from '@23blocks/block-content';\nimport { createGeolocationBlock, type GeolocationBlock } from '@23blocks/block-geolocation';\nimport { createConversationsBlock, type ConversationsBlock } from '@23blocks/block-conversations';\nimport { createFilesBlock, type FilesBlock } from '@23blocks/block-files';\nimport { createFormsBlock, type FormsBlock } from '@23blocks/block-forms';\nimport { createAssetsBlock, type AssetsBlock } from '@23blocks/block-assets';\nimport { createCampaignsBlock, type CampaignsBlock } from '@23blocks/block-campaigns';\nimport { createCompanyBlock, type CompanyBlock } from '@23blocks/block-company';\nimport { createRewardsBlock, type RewardsBlock } from '@23blocks/block-rewards';\nimport { createSalesBlock, type SalesBlock } from '@23blocks/block-sales';\nimport { createWalletBlock, type WalletBlock } from '@23blocks/block-wallet';\nimport { createJarvisBlock, type JarvisBlock } from '@23blocks/block-jarvis';\nimport { createOnboardingBlock, type OnboardingBlock } from '@23blocks/block-onboarding';\nimport { createUniversityBlock, type UniversityBlock } from '@23blocks/block-university';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Authentication mode\n */\nexport type AuthMode = 'token' | 'cookie';\n\n/**\n * Storage type for token mode\n */\nexport type StorageType = 'localStorage' | 'sessionStorage' | 'memory';\n\n/**\n * Token manager interface\n */\nexport interface TokenManager {\n getAccessToken(): string | null;\n getRefreshToken(): string | null;\n setTokens(accessToken: string, refreshToken?: string): void;\n clearTokens(): void;\n /**\n * Subscribe to storage changes from other tabs/windows.\n * Returns an unsubscribe function.\n */\n onStorageChange(callback: () => void): () => void;\n}\n\n/**\n * Service URL configuration - each microservice has its own URL\n */\nexport interface ServiceUrls {\n /** Authentication service URL (required) */\n authentication: string;\n /** Search service URL */\n search?: string;\n /** Products service URL */\n products?: string;\n /** CRM service URL */\n crm?: string;\n /** Content service URL */\n content?: string;\n /** Geolocation service URL */\n geolocation?: string;\n /** Conversations service URL */\n conversations?: string;\n /** Files service URL */\n files?: string;\n /** Forms service URL */\n forms?: string;\n /** Assets service URL */\n assets?: string;\n /** Campaigns service URL */\n campaigns?: string;\n /** Company service URL */\n company?: string;\n /** Rewards service URL */\n rewards?: string;\n /** Sales service URL */\n sales?: string;\n /** Wallet service URL */\n wallet?: string;\n /** Jarvis (AI) service URL */\n jarvis?: string;\n /** Onboarding service URL */\n onboarding?: string;\n /** University (LMS) service URL */\n university?: string;\n}\n\n/**\n * Provider props\n */\nexport interface ProviderProps {\n children: ReactNode;\n\n /**\n * Service URLs for each microservice.\n * At minimum, `authentication` URL is required.\n *\n * @example\n * ```tsx\n * <Provider\n * appId=\"your-app-id\"\n * urls={{\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * products: 'https://products.23blocks.com',\n * }}\n * >\n * <App />\n * </Provider>\n * ```\n */\n urls: ServiceUrls;\n\n /**\n * Application ID\n */\n appId: string;\n\n /**\n * Tenant ID (optional, for multi-tenant setups)\n */\n tenantId?: string;\n\n /**\n * Authentication mode\n * - 'token' (default): SDK stores tokens in localStorage/sessionStorage/memory\n * - 'cookie': Backend manages auth via httpOnly cookies\n */\n authMode?: AuthMode;\n\n /**\n * Storage type for token mode\n * @default 'localStorage'\n */\n storage?: StorageType;\n\n /**\n * Additional headers to include with every request\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Context value providing access to all 23blocks services\n */\nexport interface ClientContext {\n // Blocks\n authentication: AuthenticationBlock;\n search: SearchBlock;\n products: ProductsBlock;\n crm: CrmBlock;\n content: ContentBlock;\n geolocation: GeolocationBlock;\n conversations: ConversationsBlock;\n files: FilesBlock;\n forms: FormsBlock;\n assets: AssetsBlock;\n campaigns: CampaignsBlock;\n company: CompanyBlock;\n rewards: RewardsBlock;\n sales: SalesBlock;\n wallet: WalletBlock;\n jarvis: JarvisBlock;\n onboarding: OnboardingBlock;\n university: UniversityBlock;\n\n // Auth with automatic token management\n signIn: (request: SignInRequest) => Promise<SignInResponse>;\n signUp: (request: SignUpRequest) => Promise<SignUpResponse>;\n signOut: () => Promise<void>;\n\n // Token utilities\n getAccessToken: () => string | null;\n getRefreshToken: () => string | null;\n setTokens: (accessToken: string, refreshToken?: string) => void;\n clearTokens: () => void;\n isAuthenticated: () => boolean | null;\n /**\n * Subscribe to token changes from other tabs/windows.\n * Returns an unsubscribe function.\n */\n onStorageChange: (callback: () => void) => () => void;\n\n // Config info\n authMode: AuthMode;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Token Manager Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate storage key scoped to app and tenant\n */\nfunction getStorageKey(type: 'access' | 'refresh', appId: string, tenantId?: string): string {\n const scope = tenantId ? `${appId}_${tenantId}` : appId;\n return `23blocks_${scope}_${type}_token`;\n}\n\nclass MemoryStorage {\n private data = new Map<string, string>();\n getItem(key: string): string | null {\n return this.data.get(key) ?? null;\n }\n setItem(key: string, value: string): void {\n this.data.set(key, value);\n }\n removeItem(key: string): void {\n this.data.delete(key);\n }\n}\n\nfunction createTokenManager(appId: string, storageType: StorageType, tenantId?: string): TokenManager {\n const isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\n const accessTokenKey = getStorageKey('access', appId, tenantId);\n const refreshTokenKey = getStorageKey('refresh', appId, tenantId);\n\n let storage: Storage | MemoryStorage;\n if (!isBrowser) {\n storage = new MemoryStorage();\n } else {\n switch (storageType) {\n case 'sessionStorage':\n storage = window.sessionStorage;\n break;\n case 'memory':\n storage = new MemoryStorage();\n break;\n default:\n storage = window.localStorage;\n }\n }\n\n return {\n getAccessToken(): string | null {\n try {\n return storage.getItem(accessTokenKey);\n } catch {\n return null;\n }\n },\n getRefreshToken(): string | null {\n try {\n return storage.getItem(refreshTokenKey);\n } catch {\n return null;\n }\n },\n setTokens(accessToken: string, refreshToken?: string): void {\n try {\n storage.setItem(accessTokenKey, accessToken);\n if (refreshToken) {\n storage.setItem(refreshTokenKey, refreshToken);\n }\n } catch {\n console.warn('[23blocks] Unable to store tokens');\n }\n },\n clearTokens(): void {\n try {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n } catch {\n // Silently fail\n }\n },\n onStorageChange(callback: () => void): () => void {\n // Only works in browser with localStorage/sessionStorage\n if (!isBrowser || storageType === 'memory') {\n // Return no-op unsubscribe for SSR/memory storage\n return () => {};\n }\n\n const handler = (event: StorageEvent) => {\n // Only trigger if our keys changed\n if (event.key === accessTokenKey || event.key === refreshTokenKey) {\n callback();\n }\n };\n\n window.addEventListener('storage', handler);\n\n // Return unsubscribe function\n return () => {\n window.removeEventListener('storage', handler);\n };\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst Blocks23Context = createContext<ClientContext | null>(null);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Provider component for 23blocks services.\n *\n * Wrap your app with this provider to access all 23blocks services\n * with automatic token management.\n *\n * @example Basic usage with multiple services\n * ```tsx\n * import { Provider } from '@23blocks/react';\n *\n * function App() {\n * return (\n * <Provider\n * appId=\"your-app-id\"\n * urls={{\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * products: 'https://products.23blocks.com',\n * }}\n * >\n * <MyApp />\n * </Provider>\n * );\n * }\n * ```\n *\n * @example Cookie mode (recommended for security)\n * ```tsx\n * <Provider\n * appId=\"your-app-id\"\n * authMode=\"cookie\"\n * urls={{\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * }}\n * >\n * <MyApp />\n * </Provider>\n * ```\n */\nexport function Provider({\n children,\n urls,\n appId,\n tenantId,\n authMode = 'token',\n storage = 'localStorage',\n headers: staticHeaders = {},\n timeout,\n}: ProviderProps) {\n // Create token manager (memoized) with scoped storage keys\n const tokenManager = useMemo(\n () => (authMode === 'token' ? createTokenManager(appId, storage, tenantId) : null),\n [authMode, appId, storage, tenantId]\n );\n\n // Factory to create transport for a specific service URL\n const createServiceTransport = useCallback((baseUrl: string) => {\n return createHttpTransport({\n baseUrl,\n timeout,\n credentials: authMode === 'cookie' ? 'include' : undefined,\n headers: () => {\n const headers: Record<string, string> = {\n ...staticHeaders,\n appid: appId,\n };\n\n if (tenantId) {\n headers['tenant-id'] = tenantId;\n }\n\n if (authMode === 'token' && tokenManager) {\n const token = tokenManager.getAccessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n\n return headers;\n },\n });\n }, [appId, tenantId, authMode, staticHeaders, timeout, tokenManager]);\n\n // Create blocks (memoized) - each with its own transport\n const blockConfig = useMemo(() => ({ appId, tenantId }), [appId, tenantId]);\n\n // Auth transport is required\n const authTransport = useMemo(\n () => createServiceTransport(urls.authentication),\n [createServiceTransport, urls.authentication]\n );\n\n const authentication = useMemo(() => createAuthenticationBlock(authTransport, blockConfig), [authTransport, blockConfig]);\n\n // Other blocks use their own URL or fall back to auth URL\n const search = useMemo(() => {\n const transport = urls.search ? createServiceTransport(urls.search) : authTransport;\n return createSearchBlock(transport, blockConfig);\n }, [createServiceTransport, urls.search, authTransport, blockConfig]);\n\n const products = useMemo(() => {\n const transport = urls.products ? createServiceTransport(urls.products) : authTransport;\n return createProductsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.products, authTransport, blockConfig]);\n\n const crm = useMemo(() => {\n const transport = urls.crm ? createServiceTransport(urls.crm) : authTransport;\n return createCrmBlock(transport, blockConfig);\n }, [createServiceTransport, urls.crm, authTransport, blockConfig]);\n\n const content = useMemo(() => {\n const transport = urls.content ? createServiceTransport(urls.content) : authTransport;\n return createContentBlock(transport, blockConfig);\n }, [createServiceTransport, urls.content, authTransport, blockConfig]);\n\n const geolocation = useMemo(() => {\n const transport = urls.geolocation ? createServiceTransport(urls.geolocation) : authTransport;\n return createGeolocationBlock(transport, blockConfig);\n }, [createServiceTransport, urls.geolocation, authTransport, blockConfig]);\n\n const conversations = useMemo(() => {\n const transport = urls.conversations ? createServiceTransport(urls.conversations) : authTransport;\n return createConversationsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.conversations, authTransport, blockConfig]);\n\n const files = useMemo(() => {\n const transport = urls.files ? createServiceTransport(urls.files) : authTransport;\n return createFilesBlock(transport, blockConfig);\n }, [createServiceTransport, urls.files, authTransport, blockConfig]);\n\n const forms = useMemo(() => {\n const transport = urls.forms ? createServiceTransport(urls.forms) : authTransport;\n return createFormsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.forms, authTransport, blockConfig]);\n\n const assets = useMemo(() => {\n const transport = urls.assets ? createServiceTransport(urls.assets) : authTransport;\n return createAssetsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.assets, authTransport, blockConfig]);\n\n const campaigns = useMemo(() => {\n const transport = urls.campaigns ? createServiceTransport(urls.campaigns) : authTransport;\n return createCampaignsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.campaigns, authTransport, blockConfig]);\n\n const company = useMemo(() => {\n const transport = urls.company ? createServiceTransport(urls.company) : authTransport;\n return createCompanyBlock(transport, blockConfig);\n }, [createServiceTransport, urls.company, authTransport, blockConfig]);\n\n const rewards = useMemo(() => {\n const transport = urls.rewards ? createServiceTransport(urls.rewards) : authTransport;\n return createRewardsBlock(transport, blockConfig);\n }, [createServiceTransport, urls.rewards, authTransport, blockConfig]);\n\n const sales = useMemo(() => {\n const transport = urls.sales ? createServiceTransport(urls.sales) : authTransport;\n return createSalesBlock(transport, blockConfig);\n }, [createServiceTransport, urls.sales, authTransport, blockConfig]);\n\n const wallet = useMemo(() => {\n const transport = urls.wallet ? createServiceTransport(urls.wallet) : authTransport;\n return createWalletBlock(transport, blockConfig);\n }, [createServiceTransport, urls.wallet, authTransport, blockConfig]);\n\n const jarvis = useMemo(() => {\n const transport = urls.jarvis ? createServiceTransport(urls.jarvis) : authTransport;\n return createJarvisBlock(transport, blockConfig);\n }, [createServiceTransport, urls.jarvis, authTransport, blockConfig]);\n\n const onboarding = useMemo(() => {\n const transport = urls.onboarding ? createServiceTransport(urls.onboarding) : authTransport;\n return createOnboardingBlock(transport, blockConfig);\n }, [createServiceTransport, urls.onboarding, authTransport, blockConfig]);\n\n const university = useMemo(() => {\n const transport = urls.university ? createServiceTransport(urls.university) : authTransport;\n return createUniversityBlock(transport, blockConfig);\n }, [createServiceTransport, urls.university, authTransport, blockConfig]);\n\n // Auth methods with automatic token management\n const signIn = useCallback(async (request: SignInRequest): Promise<SignInResponse> => {\n const response = await authentication.auth.signIn(request);\n if (authMode === 'token' && tokenManager && response.accessToken) {\n tokenManager.setTokens(response.accessToken, response.refreshToken);\n }\n return response;\n }, [authentication, authMode, tokenManager]);\n\n const signUp = useCallback(async (request: SignUpRequest): Promise<SignUpResponse> => {\n const response = await authentication.auth.signUp(request);\n if (authMode === 'token' && tokenManager && response.accessToken) {\n tokenManager.setTokens(response.accessToken);\n }\n return response;\n }, [authentication, authMode, tokenManager]);\n\n const signOut = useCallback(async (): Promise<void> => {\n await authentication.auth.signOut();\n if (authMode === 'token' && tokenManager) {\n tokenManager.clearTokens();\n }\n }, [authentication, authMode, tokenManager]);\n\n // Token utilities\n const getAccessToken = useCallback(() => tokenManager?.getAccessToken() ?? null, [tokenManager]);\n const getRefreshToken = useCallback(() => tokenManager?.getRefreshToken() ?? null, [tokenManager]);\n const setTokens = useCallback((accessToken: string, refreshToken?: string) => {\n tokenManager?.setTokens(accessToken, refreshToken);\n }, [tokenManager]);\n const clearTokens = useCallback(() => tokenManager?.clearTokens(), [tokenManager]);\n const isAuthenticated = useCallback((): boolean | null => {\n if (authMode === 'cookie') return null;\n return tokenManager ? !!tokenManager.getAccessToken() : false;\n }, [authMode, tokenManager]);\n const onStorageChange = useCallback((callback: () => void): (() => void) => {\n return tokenManager?.onStorageChange(callback) ?? (() => {});\n }, [tokenManager]);\n\n const value = useMemo<ClientContext>(() => ({\n // Blocks\n authentication,\n search,\n products,\n crm,\n content,\n geolocation,\n conversations,\n files,\n forms,\n assets,\n campaigns,\n company,\n rewards,\n sales,\n wallet,\n jarvis,\n onboarding,\n university,\n\n // Auth with token management\n signIn,\n signUp,\n signOut,\n\n // Token utilities\n getAccessToken,\n getRefreshToken,\n setTokens,\n clearTokens,\n isAuthenticated,\n onStorageChange,\n\n // Config\n authMode,\n }), [\n authentication, search, products, crm, content, geolocation, conversations,\n files, forms, assets, campaigns, company, rewards, sales, wallet, jarvis,\n onboarding, university, signIn, signUp, signOut, getAccessToken, getRefreshToken,\n setTokens, clearTokens, isAuthenticated, onStorageChange, authMode,\n ]);\n\n return (\n <Blocks23Context.Provider value={value}>\n {children}\n </Blocks23Context.Provider>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hooks\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook to access all 23blocks services.\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { products, crm, files } = useClient();\n *\n * // Access any service\n * const loadProducts = async () => {\n * const { data } = await products.products.list({ limit: 10 });\n * };\n * }\n * ```\n */\nexport function useClient(): ClientContext {\n const context = useContext(Blocks23Context);\n if (!context) {\n throw new Error('useClient must be used within a Provider');\n }\n return context;\n}\n\n/**\n * Hook for authentication operations with automatic token management.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { signIn, signOut, isAuthenticated } = useAuth();\n *\n * const handleLogin = async () => {\n * await signIn({ email: 'user@example.com', password: 'password' });\n * };\n *\n * return (\n * <div>\n * {isAuthenticated() ? (\n * <button onClick={signOut}>Sign Out</button>\n * ) : (\n * <button onClick={handleLogin}>Sign In</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useAuth() {\n const context = useClient();\n return {\n signIn: context.signIn,\n signUp: context.signUp,\n signOut: context.signOut,\n getAccessToken: context.getAccessToken,\n getRefreshToken: context.getRefreshToken,\n setTokens: context.setTokens,\n clearTokens: context.clearTokens,\n isAuthenticated: context.isAuthenticated,\n onStorageChange: context.onStorageChange,\n authentication: context.authentication,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Backward Compatibility Aliases (deprecated)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @deprecated Use `Provider` instead */\nexport const SimpleBlocks23Provider = Provider;\n\n/** @deprecated Use `ProviderProps` instead */\nexport type SimpleBlocks23ProviderProps = ProviderProps;\n\n/** @deprecated Use `ClientContext` instead */\nexport type SimpleBlocks23Context = ClientContext;\n\n/** @deprecated Use `useClient` instead */\nexport const useSimpleBlocks23 = useClient;\n\n/** @deprecated Use `useAuth` instead */\nexport const useSimpleAuth = useAuth;\n"],"names":["createContext","useContext","useMemo","useCallback","createHttpTransport","createAuthenticationBlock","createSearchBlock","createProductsBlock","createCrmBlock","createContentBlock","createGeolocationBlock","createConversationsBlock","createFilesBlock","createFormsBlock","createAssetsBlock","createCampaignsBlock","createCompanyBlock","createRewardsBlock","createSalesBlock","createWalletBlock","createJarvisBlock","createOnboardingBlock","createUniversityBlock","getStorageKey","type","appId","tenantId","scope","MemoryStorage","getItem","key","data","get","setItem","value","set","removeItem","delete","Map","createTokenManager","storageType","isBrowser","window","localStorage","accessTokenKey","refreshTokenKey","storage","sessionStorage","getAccessToken","getRefreshToken","setTokens","accessToken","refreshToken","console","warn","clearTokens","onStorageChange","callback","handler","event","addEventListener","removeEventListener","Blocks23Context","Provider","children","urls","authMode","headers","staticHeaders","timeout","tokenManager","createServiceTransport","baseUrl","credentials","undefined","appid","token","blockConfig","authTransport","authentication","search","transport","products","crm","content","geolocation","conversations","files","forms","assets","campaigns","company","rewards","sales","wallet","jarvis","onboarding","university","signIn","request","response","auth","signUp","signOut","isAuthenticated","useClient","context","Error","useAuth","SimpleBlocks23Provider","useSimpleBlocks23","useSimpleAuth"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|