@23blocks/react 1.0.2 → 1.1.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/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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,
|
|
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"}
|
|
@@ -122,21 +122,37 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
122
122
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
123
123
|
// Provider Component
|
|
124
124
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Helper to create a proxy that throws when accessing unconfigured service
|
|
127
|
+
*/ function createUnconfiguredServiceProxy(serviceName, urlKey) {
|
|
128
|
+
return new Proxy({}, {
|
|
129
|
+
get (_target, prop) {
|
|
130
|
+
throw new Error(`[23blocks] Cannot access '${serviceName}.${String(prop)}': ` + `The ${serviceName} service URL is not configured. ` + `Add 'urls.${urlKey}' to your Provider configuration.`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
125
134
|
/**
|
|
126
135
|
* Provider component for 23blocks services.
|
|
127
136
|
*
|
|
128
137
|
* Wrap your app with this provider to access all 23blocks services
|
|
129
138
|
* with automatic token management.
|
|
130
139
|
*
|
|
131
|
-
*
|
|
140
|
+
* Services are only available if their URL is configured. Accessing
|
|
141
|
+
* a service without a configured URL will throw an error.
|
|
142
|
+
*
|
|
143
|
+
* @example Basic usage with multiple services
|
|
132
144
|
* ```tsx
|
|
133
145
|
* import { Provider } from '@23blocks/react';
|
|
134
146
|
*
|
|
135
147
|
* function App() {
|
|
136
148
|
* return (
|
|
137
149
|
* <Provider
|
|
138
|
-
* baseUrl="https://api.yourapp.com"
|
|
139
150
|
* appId="your-app-id"
|
|
151
|
+
* urls={{
|
|
152
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
153
|
+
* crm: 'https://crm.23blocks.com',
|
|
154
|
+
* products: 'https://products.23blocks.com',
|
|
155
|
+
* }}
|
|
140
156
|
* >
|
|
141
157
|
* <MyApp />
|
|
142
158
|
* </Provider>
|
|
@@ -147,14 +163,17 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
147
163
|
* @example Cookie mode (recommended for security)
|
|
148
164
|
* ```tsx
|
|
149
165
|
* <Provider
|
|
150
|
-
* baseUrl="https://api.yourapp.com"
|
|
151
166
|
* appId="your-app-id"
|
|
152
167
|
* authMode="cookie"
|
|
168
|
+
* urls={{
|
|
169
|
+
* authentication: 'https://gateway.23blocks.com',
|
|
170
|
+
* crm: 'https://crm.23blocks.com',
|
|
171
|
+
* }}
|
|
153
172
|
* >
|
|
154
173
|
* <MyApp />
|
|
155
174
|
* </Provider>
|
|
156
175
|
* ```
|
|
157
|
-
*/ export function Provider({ children,
|
|
176
|
+
*/ export function Provider({ children, urls, appId, tenantId, authMode = 'token', storage = 'localStorage', headers: staticHeaders = {}, timeout }) {
|
|
158
177
|
// Create token manager (memoized) with scoped storage keys
|
|
159
178
|
const tokenManager = useMemo(()=>authMode === 'token' ? createTokenManager(appId, storage, tenantId) : null, [
|
|
160
179
|
authMode,
|
|
@@ -162,8 +181,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
162
181
|
storage,
|
|
163
182
|
tenantId
|
|
164
183
|
]);
|
|
165
|
-
//
|
|
166
|
-
const
|
|
184
|
+
// Factory to create transport for a specific service URL
|
|
185
|
+
const createServiceTransport = useCallback((baseUrl)=>{
|
|
167
186
|
return createHttpTransport({
|
|
168
187
|
baseUrl,
|
|
169
188
|
timeout,
|
|
@@ -185,16 +204,14 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
185
204
|
}
|
|
186
205
|
});
|
|
187
206
|
}, [
|
|
188
|
-
baseUrl,
|
|
189
207
|
appId,
|
|
190
208
|
tenantId,
|
|
191
209
|
authMode,
|
|
192
|
-
storage,
|
|
193
210
|
staticHeaders,
|
|
194
211
|
timeout,
|
|
195
212
|
tokenManager
|
|
196
213
|
]);
|
|
197
|
-
// Create blocks (memoized)
|
|
214
|
+
// Create blocks (memoized) - each with its own transport (no fallback)
|
|
198
215
|
const blockConfig = useMemo(()=>({
|
|
199
216
|
appId,
|
|
200
217
|
tenantId
|
|
@@ -202,80 +219,194 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
202
219
|
appId,
|
|
203
220
|
tenantId
|
|
204
221
|
]);
|
|
205
|
-
|
|
206
|
-
|
|
222
|
+
// Create blocks only if URL is configured, otherwise use proxy that throws helpful error
|
|
223
|
+
const authentication = useMemo(()=>{
|
|
224
|
+
if (!urls.authentication) {
|
|
225
|
+
return createUnconfiguredServiceProxy('authentication', 'authentication');
|
|
226
|
+
}
|
|
227
|
+
return createAuthenticationBlock(createServiceTransport(urls.authentication), blockConfig);
|
|
228
|
+
}, [
|
|
229
|
+
createServiceTransport,
|
|
230
|
+
urls.authentication,
|
|
207
231
|
blockConfig
|
|
208
232
|
]);
|
|
209
|
-
const search = useMemo(()=>
|
|
210
|
-
|
|
233
|
+
const search = useMemo(()=>{
|
|
234
|
+
if (!urls.search) {
|
|
235
|
+
return createUnconfiguredServiceProxy('search', 'search');
|
|
236
|
+
}
|
|
237
|
+
return createSearchBlock(createServiceTransport(urls.search), blockConfig);
|
|
238
|
+
}, [
|
|
239
|
+
createServiceTransport,
|
|
240
|
+
urls.search,
|
|
211
241
|
blockConfig
|
|
212
242
|
]);
|
|
213
|
-
const products = useMemo(()=>
|
|
214
|
-
|
|
243
|
+
const products = useMemo(()=>{
|
|
244
|
+
if (!urls.products) {
|
|
245
|
+
return createUnconfiguredServiceProxy('products', 'products');
|
|
246
|
+
}
|
|
247
|
+
return createProductsBlock(createServiceTransport(urls.products), blockConfig);
|
|
248
|
+
}, [
|
|
249
|
+
createServiceTransport,
|
|
250
|
+
urls.products,
|
|
215
251
|
blockConfig
|
|
216
252
|
]);
|
|
217
|
-
const crm = useMemo(()=>
|
|
218
|
-
|
|
253
|
+
const crm = useMemo(()=>{
|
|
254
|
+
if (!urls.crm) {
|
|
255
|
+
return createUnconfiguredServiceProxy('crm', 'crm');
|
|
256
|
+
}
|
|
257
|
+
return createCrmBlock(createServiceTransport(urls.crm), blockConfig);
|
|
258
|
+
}, [
|
|
259
|
+
createServiceTransport,
|
|
260
|
+
urls.crm,
|
|
219
261
|
blockConfig
|
|
220
262
|
]);
|
|
221
|
-
const content = useMemo(()=>
|
|
222
|
-
|
|
263
|
+
const content = useMemo(()=>{
|
|
264
|
+
if (!urls.content) {
|
|
265
|
+
return createUnconfiguredServiceProxy('content', 'content');
|
|
266
|
+
}
|
|
267
|
+
return createContentBlock(createServiceTransport(urls.content), blockConfig);
|
|
268
|
+
}, [
|
|
269
|
+
createServiceTransport,
|
|
270
|
+
urls.content,
|
|
223
271
|
blockConfig
|
|
224
272
|
]);
|
|
225
|
-
const geolocation = useMemo(()=>
|
|
226
|
-
|
|
273
|
+
const geolocation = useMemo(()=>{
|
|
274
|
+
if (!urls.geolocation) {
|
|
275
|
+
return createUnconfiguredServiceProxy('geolocation', 'geolocation');
|
|
276
|
+
}
|
|
277
|
+
return createGeolocationBlock(createServiceTransport(urls.geolocation), blockConfig);
|
|
278
|
+
}, [
|
|
279
|
+
createServiceTransport,
|
|
280
|
+
urls.geolocation,
|
|
227
281
|
blockConfig
|
|
228
282
|
]);
|
|
229
|
-
const conversations = useMemo(()=>
|
|
230
|
-
|
|
283
|
+
const conversations = useMemo(()=>{
|
|
284
|
+
if (!urls.conversations) {
|
|
285
|
+
return createUnconfiguredServiceProxy('conversations', 'conversations');
|
|
286
|
+
}
|
|
287
|
+
return createConversationsBlock(createServiceTransport(urls.conversations), blockConfig);
|
|
288
|
+
}, [
|
|
289
|
+
createServiceTransport,
|
|
290
|
+
urls.conversations,
|
|
231
291
|
blockConfig
|
|
232
292
|
]);
|
|
233
|
-
const files = useMemo(()=>
|
|
234
|
-
|
|
293
|
+
const files = useMemo(()=>{
|
|
294
|
+
if (!urls.files) {
|
|
295
|
+
return createUnconfiguredServiceProxy('files', 'files');
|
|
296
|
+
}
|
|
297
|
+
return createFilesBlock(createServiceTransport(urls.files), blockConfig);
|
|
298
|
+
}, [
|
|
299
|
+
createServiceTransport,
|
|
300
|
+
urls.files,
|
|
235
301
|
blockConfig
|
|
236
302
|
]);
|
|
237
|
-
const forms = useMemo(()=>
|
|
238
|
-
|
|
303
|
+
const forms = useMemo(()=>{
|
|
304
|
+
if (!urls.forms) {
|
|
305
|
+
return createUnconfiguredServiceProxy('forms', 'forms');
|
|
306
|
+
}
|
|
307
|
+
return createFormsBlock(createServiceTransport(urls.forms), blockConfig);
|
|
308
|
+
}, [
|
|
309
|
+
createServiceTransport,
|
|
310
|
+
urls.forms,
|
|
239
311
|
blockConfig
|
|
240
312
|
]);
|
|
241
|
-
const assets = useMemo(()=>
|
|
242
|
-
|
|
313
|
+
const assets = useMemo(()=>{
|
|
314
|
+
if (!urls.assets) {
|
|
315
|
+
return createUnconfiguredServiceProxy('assets', 'assets');
|
|
316
|
+
}
|
|
317
|
+
return createAssetsBlock(createServiceTransport(urls.assets), blockConfig);
|
|
318
|
+
}, [
|
|
319
|
+
createServiceTransport,
|
|
320
|
+
urls.assets,
|
|
243
321
|
blockConfig
|
|
244
322
|
]);
|
|
245
|
-
const campaigns = useMemo(()=>
|
|
246
|
-
|
|
323
|
+
const campaigns = useMemo(()=>{
|
|
324
|
+
if (!urls.campaigns) {
|
|
325
|
+
return createUnconfiguredServiceProxy('campaigns', 'campaigns');
|
|
326
|
+
}
|
|
327
|
+
return createCampaignsBlock(createServiceTransport(urls.campaigns), blockConfig);
|
|
328
|
+
}, [
|
|
329
|
+
createServiceTransport,
|
|
330
|
+
urls.campaigns,
|
|
247
331
|
blockConfig
|
|
248
332
|
]);
|
|
249
|
-
const company = useMemo(()=>
|
|
250
|
-
|
|
333
|
+
const company = useMemo(()=>{
|
|
334
|
+
if (!urls.company) {
|
|
335
|
+
return createUnconfiguredServiceProxy('company', 'company');
|
|
336
|
+
}
|
|
337
|
+
return createCompanyBlock(createServiceTransport(urls.company), blockConfig);
|
|
338
|
+
}, [
|
|
339
|
+
createServiceTransport,
|
|
340
|
+
urls.company,
|
|
251
341
|
blockConfig
|
|
252
342
|
]);
|
|
253
|
-
const rewards = useMemo(()=>
|
|
254
|
-
|
|
343
|
+
const rewards = useMemo(()=>{
|
|
344
|
+
if (!urls.rewards) {
|
|
345
|
+
return createUnconfiguredServiceProxy('rewards', 'rewards');
|
|
346
|
+
}
|
|
347
|
+
return createRewardsBlock(createServiceTransport(urls.rewards), blockConfig);
|
|
348
|
+
}, [
|
|
349
|
+
createServiceTransport,
|
|
350
|
+
urls.rewards,
|
|
255
351
|
blockConfig
|
|
256
352
|
]);
|
|
257
|
-
const sales = useMemo(()=>
|
|
258
|
-
|
|
353
|
+
const sales = useMemo(()=>{
|
|
354
|
+
if (!urls.sales) {
|
|
355
|
+
return createUnconfiguredServiceProxy('sales', 'sales');
|
|
356
|
+
}
|
|
357
|
+
return createSalesBlock(createServiceTransport(urls.sales), blockConfig);
|
|
358
|
+
}, [
|
|
359
|
+
createServiceTransport,
|
|
360
|
+
urls.sales,
|
|
259
361
|
blockConfig
|
|
260
362
|
]);
|
|
261
|
-
const wallet = useMemo(()=>
|
|
262
|
-
|
|
363
|
+
const wallet = useMemo(()=>{
|
|
364
|
+
if (!urls.wallet) {
|
|
365
|
+
return createUnconfiguredServiceProxy('wallet', 'wallet');
|
|
366
|
+
}
|
|
367
|
+
return createWalletBlock(createServiceTransport(urls.wallet), blockConfig);
|
|
368
|
+
}, [
|
|
369
|
+
createServiceTransport,
|
|
370
|
+
urls.wallet,
|
|
263
371
|
blockConfig
|
|
264
372
|
]);
|
|
265
|
-
const jarvis = useMemo(()=>
|
|
266
|
-
|
|
373
|
+
const jarvis = useMemo(()=>{
|
|
374
|
+
if (!urls.jarvis) {
|
|
375
|
+
return createUnconfiguredServiceProxy('jarvis', 'jarvis');
|
|
376
|
+
}
|
|
377
|
+
return createJarvisBlock(createServiceTransport(urls.jarvis), blockConfig);
|
|
378
|
+
}, [
|
|
379
|
+
createServiceTransport,
|
|
380
|
+
urls.jarvis,
|
|
267
381
|
blockConfig
|
|
268
382
|
]);
|
|
269
|
-
const onboarding = useMemo(()=>
|
|
270
|
-
|
|
383
|
+
const onboarding = useMemo(()=>{
|
|
384
|
+
if (!urls.onboarding) {
|
|
385
|
+
return createUnconfiguredServiceProxy('onboarding', 'onboarding');
|
|
386
|
+
}
|
|
387
|
+
return createOnboardingBlock(createServiceTransport(urls.onboarding), blockConfig);
|
|
388
|
+
}, [
|
|
389
|
+
createServiceTransport,
|
|
390
|
+
urls.onboarding,
|
|
271
391
|
blockConfig
|
|
272
392
|
]);
|
|
273
|
-
const university = useMemo(()=>
|
|
274
|
-
|
|
393
|
+
const university = useMemo(()=>{
|
|
394
|
+
if (!urls.university) {
|
|
395
|
+
return createUnconfiguredServiceProxy('university', 'university');
|
|
396
|
+
}
|
|
397
|
+
return createUniversityBlock(createServiceTransport(urls.university), blockConfig);
|
|
398
|
+
}, [
|
|
399
|
+
createServiceTransport,
|
|
400
|
+
urls.university,
|
|
275
401
|
blockConfig
|
|
276
402
|
]);
|
|
403
|
+
// Check if authentication is configured for auth methods
|
|
404
|
+
const isAuthConfigured = !!urls.authentication;
|
|
277
405
|
// Auth methods with automatic token management
|
|
278
406
|
const signIn = useCallback(async (request)=>{
|
|
407
|
+
if (!isAuthConfigured) {
|
|
408
|
+
throw new Error('[23blocks] Cannot call signIn: The authentication service URL is not configured. ' + "Add 'urls.authentication' to your Provider configuration.");
|
|
409
|
+
}
|
|
279
410
|
const response = await authentication.auth.signIn(request);
|
|
280
411
|
if (authMode === 'token' && tokenManager && response.accessToken) {
|
|
281
412
|
tokenManager.setTokens(response.accessToken, response.refreshToken);
|
|
@@ -284,9 +415,13 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
284
415
|
}, [
|
|
285
416
|
authentication,
|
|
286
417
|
authMode,
|
|
287
|
-
tokenManager
|
|
418
|
+
tokenManager,
|
|
419
|
+
isAuthConfigured
|
|
288
420
|
]);
|
|
289
421
|
const signUp = useCallback(async (request)=>{
|
|
422
|
+
if (!isAuthConfigured) {
|
|
423
|
+
throw new Error('[23blocks] Cannot call signUp: The authentication service URL is not configured. ' + "Add 'urls.authentication' to your Provider configuration.");
|
|
424
|
+
}
|
|
290
425
|
const response = await authentication.auth.signUp(request);
|
|
291
426
|
if (authMode === 'token' && tokenManager && response.accessToken) {
|
|
292
427
|
tokenManager.setTokens(response.accessToken);
|
|
@@ -295,9 +430,13 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
295
430
|
}, [
|
|
296
431
|
authentication,
|
|
297
432
|
authMode,
|
|
298
|
-
tokenManager
|
|
433
|
+
tokenManager,
|
|
434
|
+
isAuthConfigured
|
|
299
435
|
]);
|
|
300
436
|
const signOut = useCallback(async ()=>{
|
|
437
|
+
if (!isAuthConfigured) {
|
|
438
|
+
throw new Error('[23blocks] Cannot call signOut: The authentication service URL is not configured. ' + "Add 'urls.authentication' to your Provider configuration.");
|
|
439
|
+
}
|
|
301
440
|
await authentication.auth.signOut();
|
|
302
441
|
if (authMode === 'token' && tokenManager) {
|
|
303
442
|
tokenManager.clearTokens();
|
|
@@ -305,7 +444,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
305
444
|
}, [
|
|
306
445
|
authentication,
|
|
307
446
|
authMode,
|
|
308
|
-
tokenManager
|
|
447
|
+
tokenManager,
|
|
448
|
+
isAuthConfigured
|
|
309
449
|
]);
|
|
310
450
|
// Token utilities
|
|
311
451
|
const getAccessToken = useCallback(()=>{
|
|
@@ -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 * Provider props\n */\nexport interface ProviderProps {\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 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 Token mode (default)\n * ```tsx\n * import { Provider } from '@23blocks/react';\n *\n * function App() {\n * return (\n * <Provider\n * baseUrl=\"https://api.yourapp.com\"\n * appId=\"your-app-id\"\n * >\n * <MyApp />\n * </Provider>\n * );\n * }\n * ```\n *\n * @example Cookie mode (recommended for security)\n * ```tsx\n * <Provider\n * baseUrl=\"https://api.yourapp.com\"\n * appId=\"your-app-id\"\n * authMode=\"cookie\"\n * >\n * <MyApp />\n * </Provider>\n * ```\n */\nexport function Provider({\n children,\n baseUrl,\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 // 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<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","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","useClient","context","Error","useAuth","SimpleBlocks23Provider","useSimpleBlocks23","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 * All URLs are optional - only configure the services you need.\n */\nexport interface ServiceUrls {\n /** Authentication service URL */\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 * Only configure the services you need - accessing a service without\n * a configured URL will throw an error.\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 * Helper to create a proxy that throws when accessing unconfigured service\n */\nfunction createUnconfiguredServiceProxy<T>(serviceName: string, urlKey: string): T {\n return new Proxy({} as T, {\n get(_target, prop) {\n throw new Error(\n `[23blocks] Cannot access '${serviceName}.${String(prop)}': ` +\n `The ${serviceName} service URL is not configured. ` +\n `Add 'urls.${urlKey}' to your Provider configuration.`\n );\n },\n });\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 * Services are only available if their URL is configured. Accessing\n * a service without a configured URL will throw an error.\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 (no fallback)\n const blockConfig = useMemo(() => ({ appId, tenantId }), [appId, tenantId]);\n\n // Create blocks only if URL is configured, otherwise use proxy that throws helpful error\n const authentication = useMemo(() => {\n if (!urls.authentication) {\n return createUnconfiguredServiceProxy<AuthenticationBlock>('authentication', 'authentication');\n }\n return createAuthenticationBlock(createServiceTransport(urls.authentication), blockConfig);\n }, [createServiceTransport, urls.authentication, blockConfig]);\n\n const search = useMemo(() => {\n if (!urls.search) {\n return createUnconfiguredServiceProxy<SearchBlock>('search', 'search');\n }\n return createSearchBlock(createServiceTransport(urls.search), blockConfig);\n }, [createServiceTransport, urls.search, blockConfig]);\n\n const products = useMemo(() => {\n if (!urls.products) {\n return createUnconfiguredServiceProxy<ProductsBlock>('products', 'products');\n }\n return createProductsBlock(createServiceTransport(urls.products), blockConfig);\n }, [createServiceTransport, urls.products, blockConfig]);\n\n const crm = useMemo(() => {\n if (!urls.crm) {\n return createUnconfiguredServiceProxy<CrmBlock>('crm', 'crm');\n }\n return createCrmBlock(createServiceTransport(urls.crm), blockConfig);\n }, [createServiceTransport, urls.crm, blockConfig]);\n\n const content = useMemo(() => {\n if (!urls.content) {\n return createUnconfiguredServiceProxy<ContentBlock>('content', 'content');\n }\n return createContentBlock(createServiceTransport(urls.content), blockConfig);\n }, [createServiceTransport, urls.content, blockConfig]);\n\n const geolocation = useMemo(() => {\n if (!urls.geolocation) {\n return createUnconfiguredServiceProxy<GeolocationBlock>('geolocation', 'geolocation');\n }\n return createGeolocationBlock(createServiceTransport(urls.geolocation), blockConfig);\n }, [createServiceTransport, urls.geolocation, blockConfig]);\n\n const conversations = useMemo(() => {\n if (!urls.conversations) {\n return createUnconfiguredServiceProxy<ConversationsBlock>('conversations', 'conversations');\n }\n return createConversationsBlock(createServiceTransport(urls.conversations), blockConfig);\n }, [createServiceTransport, urls.conversations, blockConfig]);\n\n const files = useMemo(() => {\n if (!urls.files) {\n return createUnconfiguredServiceProxy<FilesBlock>('files', 'files');\n }\n return createFilesBlock(createServiceTransport(urls.files), blockConfig);\n }, [createServiceTransport, urls.files, blockConfig]);\n\n const forms = useMemo(() => {\n if (!urls.forms) {\n return createUnconfiguredServiceProxy<FormsBlock>('forms', 'forms');\n }\n return createFormsBlock(createServiceTransport(urls.forms), blockConfig);\n }, [createServiceTransport, urls.forms, blockConfig]);\n\n const assets = useMemo(() => {\n if (!urls.assets) {\n return createUnconfiguredServiceProxy<AssetsBlock>('assets', 'assets');\n }\n return createAssetsBlock(createServiceTransport(urls.assets), blockConfig);\n }, [createServiceTransport, urls.assets, blockConfig]);\n\n const campaigns = useMemo(() => {\n if (!urls.campaigns) {\n return createUnconfiguredServiceProxy<CampaignsBlock>('campaigns', 'campaigns');\n }\n return createCampaignsBlock(createServiceTransport(urls.campaigns), blockConfig);\n }, [createServiceTransport, urls.campaigns, blockConfig]);\n\n const company = useMemo(() => {\n if (!urls.company) {\n return createUnconfiguredServiceProxy<CompanyBlock>('company', 'company');\n }\n return createCompanyBlock(createServiceTransport(urls.company), blockConfig);\n }, [createServiceTransport, urls.company, blockConfig]);\n\n const rewards = useMemo(() => {\n if (!urls.rewards) {\n return createUnconfiguredServiceProxy<RewardsBlock>('rewards', 'rewards');\n }\n return createRewardsBlock(createServiceTransport(urls.rewards), blockConfig);\n }, [createServiceTransport, urls.rewards, blockConfig]);\n\n const sales = useMemo(() => {\n if (!urls.sales) {\n return createUnconfiguredServiceProxy<SalesBlock>('sales', 'sales');\n }\n return createSalesBlock(createServiceTransport(urls.sales), blockConfig);\n }, [createServiceTransport, urls.sales, blockConfig]);\n\n const wallet = useMemo(() => {\n if (!urls.wallet) {\n return createUnconfiguredServiceProxy<WalletBlock>('wallet', 'wallet');\n }\n return createWalletBlock(createServiceTransport(urls.wallet), blockConfig);\n }, [createServiceTransport, urls.wallet, blockConfig]);\n\n const jarvis = useMemo(() => {\n if (!urls.jarvis) {\n return createUnconfiguredServiceProxy<JarvisBlock>('jarvis', 'jarvis');\n }\n return createJarvisBlock(createServiceTransport(urls.jarvis), blockConfig);\n }, [createServiceTransport, urls.jarvis, blockConfig]);\n\n const onboarding = useMemo(() => {\n if (!urls.onboarding) {\n return createUnconfiguredServiceProxy<OnboardingBlock>('onboarding', 'onboarding');\n }\n return createOnboardingBlock(createServiceTransport(urls.onboarding), blockConfig);\n }, [createServiceTransport, urls.onboarding, blockConfig]);\n\n const university = useMemo(() => {\n if (!urls.university) {\n return createUnconfiguredServiceProxy<UniversityBlock>('university', 'university');\n }\n return createUniversityBlock(createServiceTransport(urls.university), blockConfig);\n }, [createServiceTransport, urls.university, blockConfig]);\n\n // Check if authentication is configured for auth methods\n const isAuthConfigured = !!urls.authentication;\n\n // Auth methods with automatic token management\n const signIn = useCallback(async (request: SignInRequest): Promise<SignInResponse> => {\n if (!isAuthConfigured) {\n throw new Error(\n '[23blocks] Cannot call signIn: The authentication service URL is not configured. ' +\n \"Add 'urls.authentication' to your Provider configuration.\"\n );\n }\n const response = await (authentication as AuthenticationBlock).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, isAuthConfigured]);\n\n const signUp = useCallback(async (request: SignUpRequest): Promise<SignUpResponse> => {\n if (!isAuthConfigured) {\n throw new Error(\n '[23blocks] Cannot call signUp: The authentication service URL is not configured. ' +\n \"Add 'urls.authentication' to your Provider configuration.\"\n );\n }\n const response = await (authentication as AuthenticationBlock).auth.signUp(request);\n if (authMode === 'token' && tokenManager && response.accessToken) {\n tokenManager.setTokens(response.accessToken);\n }\n return response;\n }, [authentication, authMode, tokenManager, isAuthConfigured]);\n\n const signOut = useCallback(async (): Promise<void> => {\n if (!isAuthConfigured) {\n throw new Error(\n '[23blocks] Cannot call signOut: The authentication service URL is not configured. ' +\n \"Add 'urls.authentication' to your Provider configuration.\"\n );\n }\n await (authentication as AuthenticationBlock).auth.signOut();\n if (authMode === 'token' && tokenManager) {\n tokenManager.clearTokens();\n }\n }, [authentication, authMode, tokenManager, isAuthConfigured]);\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","createUnconfiguredServiceProxy","serviceName","urlKey","Proxy","_target","prop","Error","String","Provider","children","urls","authMode","headers","staticHeaders","timeout","tokenManager","createServiceTransport","baseUrl","credentials","undefined","appid","token","blockConfig","authentication","search","products","crm","content","geolocation","conversations","files","forms","assets","campaigns","company","rewards","sales","wallet","jarvis","onboarding","university","isAuthConfigured","signIn","request","response","auth","signUp","signOut","isAuthenticated","useClient","context","useAuth","SimpleBlocks23Provider","useSimpleBlocks23","useSimpleAuth"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|