@23blocks/react 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -122,12 +122,24 @@ 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
|
*
|
|
140
|
+
* Services are only available if their URL is configured. Accessing
|
|
141
|
+
* a service without a configured URL will throw an error.
|
|
142
|
+
*
|
|
131
143
|
* @example Basic usage with multiple services
|
|
132
144
|
* ```tsx
|
|
133
145
|
* import { Provider } from '@23blocks/react';
|
|
@@ -199,7 +211,7 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
199
211
|
timeout,
|
|
200
212
|
tokenManager
|
|
201
213
|
]);
|
|
202
|
-
// Create blocks (memoized) - each with its own transport
|
|
214
|
+
// Create blocks (memoized) - each with its own transport (no fallback)
|
|
203
215
|
const blockConfig = useMemo(()=>({
|
|
204
216
|
appId,
|
|
205
217
|
tenantId
|
|
@@ -207,171 +219,194 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
207
219
|
appId,
|
|
208
220
|
tenantId
|
|
209
221
|
]);
|
|
210
|
-
//
|
|
211
|
-
const
|
|
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
|
+
}, [
|
|
212
229
|
createServiceTransport,
|
|
213
|
-
urls.authentication
|
|
214
|
-
]);
|
|
215
|
-
const authentication = useMemo(()=>createAuthenticationBlock(authTransport, blockConfig), [
|
|
216
|
-
authTransport,
|
|
230
|
+
urls.authentication,
|
|
217
231
|
blockConfig
|
|
218
232
|
]);
|
|
219
|
-
// Other blocks use their own URL or fall back to auth URL
|
|
220
233
|
const search = useMemo(()=>{
|
|
221
|
-
|
|
222
|
-
|
|
234
|
+
if (!urls.search) {
|
|
235
|
+
return createUnconfiguredServiceProxy('search', 'search');
|
|
236
|
+
}
|
|
237
|
+
return createSearchBlock(createServiceTransport(urls.search), blockConfig);
|
|
223
238
|
}, [
|
|
224
239
|
createServiceTransport,
|
|
225
240
|
urls.search,
|
|
226
|
-
authTransport,
|
|
227
241
|
blockConfig
|
|
228
242
|
]);
|
|
229
243
|
const products = useMemo(()=>{
|
|
230
|
-
|
|
231
|
-
|
|
244
|
+
if (!urls.products) {
|
|
245
|
+
return createUnconfiguredServiceProxy('products', 'products');
|
|
246
|
+
}
|
|
247
|
+
return createProductsBlock(createServiceTransport(urls.products), blockConfig);
|
|
232
248
|
}, [
|
|
233
249
|
createServiceTransport,
|
|
234
250
|
urls.products,
|
|
235
|
-
authTransport,
|
|
236
251
|
blockConfig
|
|
237
252
|
]);
|
|
238
253
|
const crm = useMemo(()=>{
|
|
239
|
-
|
|
240
|
-
|
|
254
|
+
if (!urls.crm) {
|
|
255
|
+
return createUnconfiguredServiceProxy('crm', 'crm');
|
|
256
|
+
}
|
|
257
|
+
return createCrmBlock(createServiceTransport(urls.crm), blockConfig);
|
|
241
258
|
}, [
|
|
242
259
|
createServiceTransport,
|
|
243
260
|
urls.crm,
|
|
244
|
-
authTransport,
|
|
245
261
|
blockConfig
|
|
246
262
|
]);
|
|
247
263
|
const content = useMemo(()=>{
|
|
248
|
-
|
|
249
|
-
|
|
264
|
+
if (!urls.content) {
|
|
265
|
+
return createUnconfiguredServiceProxy('content', 'content');
|
|
266
|
+
}
|
|
267
|
+
return createContentBlock(createServiceTransport(urls.content), blockConfig);
|
|
250
268
|
}, [
|
|
251
269
|
createServiceTransport,
|
|
252
270
|
urls.content,
|
|
253
|
-
authTransport,
|
|
254
271
|
blockConfig
|
|
255
272
|
]);
|
|
256
273
|
const geolocation = useMemo(()=>{
|
|
257
|
-
|
|
258
|
-
|
|
274
|
+
if (!urls.geolocation) {
|
|
275
|
+
return createUnconfiguredServiceProxy('geolocation', 'geolocation');
|
|
276
|
+
}
|
|
277
|
+
return createGeolocationBlock(createServiceTransport(urls.geolocation), blockConfig);
|
|
259
278
|
}, [
|
|
260
279
|
createServiceTransport,
|
|
261
280
|
urls.geolocation,
|
|
262
|
-
authTransport,
|
|
263
281
|
blockConfig
|
|
264
282
|
]);
|
|
265
283
|
const conversations = useMemo(()=>{
|
|
266
|
-
|
|
267
|
-
|
|
284
|
+
if (!urls.conversations) {
|
|
285
|
+
return createUnconfiguredServiceProxy('conversations', 'conversations');
|
|
286
|
+
}
|
|
287
|
+
return createConversationsBlock(createServiceTransport(urls.conversations), blockConfig);
|
|
268
288
|
}, [
|
|
269
289
|
createServiceTransport,
|
|
270
290
|
urls.conversations,
|
|
271
|
-
authTransport,
|
|
272
291
|
blockConfig
|
|
273
292
|
]);
|
|
274
293
|
const files = useMemo(()=>{
|
|
275
|
-
|
|
276
|
-
|
|
294
|
+
if (!urls.files) {
|
|
295
|
+
return createUnconfiguredServiceProxy('files', 'files');
|
|
296
|
+
}
|
|
297
|
+
return createFilesBlock(createServiceTransport(urls.files), blockConfig);
|
|
277
298
|
}, [
|
|
278
299
|
createServiceTransport,
|
|
279
300
|
urls.files,
|
|
280
|
-
authTransport,
|
|
281
301
|
blockConfig
|
|
282
302
|
]);
|
|
283
303
|
const forms = useMemo(()=>{
|
|
284
|
-
|
|
285
|
-
|
|
304
|
+
if (!urls.forms) {
|
|
305
|
+
return createUnconfiguredServiceProxy('forms', 'forms');
|
|
306
|
+
}
|
|
307
|
+
return createFormsBlock(createServiceTransport(urls.forms), blockConfig);
|
|
286
308
|
}, [
|
|
287
309
|
createServiceTransport,
|
|
288
310
|
urls.forms,
|
|
289
|
-
authTransport,
|
|
290
311
|
blockConfig
|
|
291
312
|
]);
|
|
292
313
|
const assets = useMemo(()=>{
|
|
293
|
-
|
|
294
|
-
|
|
314
|
+
if (!urls.assets) {
|
|
315
|
+
return createUnconfiguredServiceProxy('assets', 'assets');
|
|
316
|
+
}
|
|
317
|
+
return createAssetsBlock(createServiceTransport(urls.assets), blockConfig);
|
|
295
318
|
}, [
|
|
296
319
|
createServiceTransport,
|
|
297
320
|
urls.assets,
|
|
298
|
-
authTransport,
|
|
299
321
|
blockConfig
|
|
300
322
|
]);
|
|
301
323
|
const campaigns = useMemo(()=>{
|
|
302
|
-
|
|
303
|
-
|
|
324
|
+
if (!urls.campaigns) {
|
|
325
|
+
return createUnconfiguredServiceProxy('campaigns', 'campaigns');
|
|
326
|
+
}
|
|
327
|
+
return createCampaignsBlock(createServiceTransport(urls.campaigns), blockConfig);
|
|
304
328
|
}, [
|
|
305
329
|
createServiceTransport,
|
|
306
330
|
urls.campaigns,
|
|
307
|
-
authTransport,
|
|
308
331
|
blockConfig
|
|
309
332
|
]);
|
|
310
333
|
const company = useMemo(()=>{
|
|
311
|
-
|
|
312
|
-
|
|
334
|
+
if (!urls.company) {
|
|
335
|
+
return createUnconfiguredServiceProxy('company', 'company');
|
|
336
|
+
}
|
|
337
|
+
return createCompanyBlock(createServiceTransport(urls.company), blockConfig);
|
|
313
338
|
}, [
|
|
314
339
|
createServiceTransport,
|
|
315
340
|
urls.company,
|
|
316
|
-
authTransport,
|
|
317
341
|
blockConfig
|
|
318
342
|
]);
|
|
319
343
|
const rewards = useMemo(()=>{
|
|
320
|
-
|
|
321
|
-
|
|
344
|
+
if (!urls.rewards) {
|
|
345
|
+
return createUnconfiguredServiceProxy('rewards', 'rewards');
|
|
346
|
+
}
|
|
347
|
+
return createRewardsBlock(createServiceTransport(urls.rewards), blockConfig);
|
|
322
348
|
}, [
|
|
323
349
|
createServiceTransport,
|
|
324
350
|
urls.rewards,
|
|
325
|
-
authTransport,
|
|
326
351
|
blockConfig
|
|
327
352
|
]);
|
|
328
353
|
const sales = useMemo(()=>{
|
|
329
|
-
|
|
330
|
-
|
|
354
|
+
if (!urls.sales) {
|
|
355
|
+
return createUnconfiguredServiceProxy('sales', 'sales');
|
|
356
|
+
}
|
|
357
|
+
return createSalesBlock(createServiceTransport(urls.sales), blockConfig);
|
|
331
358
|
}, [
|
|
332
359
|
createServiceTransport,
|
|
333
360
|
urls.sales,
|
|
334
|
-
authTransport,
|
|
335
361
|
blockConfig
|
|
336
362
|
]);
|
|
337
363
|
const wallet = useMemo(()=>{
|
|
338
|
-
|
|
339
|
-
|
|
364
|
+
if (!urls.wallet) {
|
|
365
|
+
return createUnconfiguredServiceProxy('wallet', 'wallet');
|
|
366
|
+
}
|
|
367
|
+
return createWalletBlock(createServiceTransport(urls.wallet), blockConfig);
|
|
340
368
|
}, [
|
|
341
369
|
createServiceTransport,
|
|
342
370
|
urls.wallet,
|
|
343
|
-
authTransport,
|
|
344
371
|
blockConfig
|
|
345
372
|
]);
|
|
346
373
|
const jarvis = useMemo(()=>{
|
|
347
|
-
|
|
348
|
-
|
|
374
|
+
if (!urls.jarvis) {
|
|
375
|
+
return createUnconfiguredServiceProxy('jarvis', 'jarvis');
|
|
376
|
+
}
|
|
377
|
+
return createJarvisBlock(createServiceTransport(urls.jarvis), blockConfig);
|
|
349
378
|
}, [
|
|
350
379
|
createServiceTransport,
|
|
351
380
|
urls.jarvis,
|
|
352
|
-
authTransport,
|
|
353
381
|
blockConfig
|
|
354
382
|
]);
|
|
355
383
|
const onboarding = useMemo(()=>{
|
|
356
|
-
|
|
357
|
-
|
|
384
|
+
if (!urls.onboarding) {
|
|
385
|
+
return createUnconfiguredServiceProxy('onboarding', 'onboarding');
|
|
386
|
+
}
|
|
387
|
+
return createOnboardingBlock(createServiceTransport(urls.onboarding), blockConfig);
|
|
358
388
|
}, [
|
|
359
389
|
createServiceTransport,
|
|
360
390
|
urls.onboarding,
|
|
361
|
-
authTransport,
|
|
362
391
|
blockConfig
|
|
363
392
|
]);
|
|
364
393
|
const university = useMemo(()=>{
|
|
365
|
-
|
|
366
|
-
|
|
394
|
+
if (!urls.university) {
|
|
395
|
+
return createUnconfiguredServiceProxy('university', 'university');
|
|
396
|
+
}
|
|
397
|
+
return createUniversityBlock(createServiceTransport(urls.university), blockConfig);
|
|
367
398
|
}, [
|
|
368
399
|
createServiceTransport,
|
|
369
400
|
urls.university,
|
|
370
|
-
authTransport,
|
|
371
401
|
blockConfig
|
|
372
402
|
]);
|
|
403
|
+
// Check if authentication is configured for auth methods
|
|
404
|
+
const isAuthConfigured = !!urls.authentication;
|
|
373
405
|
// Auth methods with automatic token management
|
|
374
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
|
+
}
|
|
375
410
|
const response = await authentication.auth.signIn(request);
|
|
376
411
|
if (authMode === 'token' && tokenManager && response.accessToken) {
|
|
377
412
|
tokenManager.setTokens(response.accessToken, response.refreshToken);
|
|
@@ -380,9 +415,13 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
380
415
|
}, [
|
|
381
416
|
authentication,
|
|
382
417
|
authMode,
|
|
383
|
-
tokenManager
|
|
418
|
+
tokenManager,
|
|
419
|
+
isAuthConfigured
|
|
384
420
|
]);
|
|
385
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
|
+
}
|
|
386
425
|
const response = await authentication.auth.signUp(request);
|
|
387
426
|
if (authMode === 'token' && tokenManager && response.accessToken) {
|
|
388
427
|
tokenManager.setTokens(response.accessToken);
|
|
@@ -391,9 +430,13 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
391
430
|
}, [
|
|
392
431
|
authentication,
|
|
393
432
|
authMode,
|
|
394
|
-
tokenManager
|
|
433
|
+
tokenManager,
|
|
434
|
+
isAuthConfigured
|
|
395
435
|
]);
|
|
396
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
|
+
}
|
|
397
440
|
await authentication.auth.signOut();
|
|
398
441
|
if (authMode === 'token' && tokenManager) {
|
|
399
442
|
tokenManager.clearTokens();
|
|
@@ -401,7 +444,8 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
|
|
|
401
444
|
}, [
|
|
402
445
|
authentication,
|
|
403
446
|
authMode,
|
|
404
|
-
tokenManager
|
|
447
|
+
tokenManager,
|
|
448
|
+
isAuthConfigured
|
|
405
449
|
]);
|
|
406
450
|
// Token utilities
|
|
407
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 * 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":";AAAA,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,EAAEC,WAAW,QAAwB,QAAQ;AACxF,SAASC,mBAAmB,QAAQ,2BAA2B;AAE/D,SAASC,yBAAyB,QAAoH,iCAAiC;AACvL,SAASC,iBAAiB,QAA0B,yBAAyB;AAC7E,SAASC,mBAAmB,QAA4B,2BAA2B;AACnF,SAASC,cAAc,QAAuB,sBAAsB;AACpE,SAASC,kBAAkB,QAA2B,0BAA0B;AAChF,SAASC,sBAAsB,QAA+B,8BAA8B;AAC5F,SAASC,wBAAwB,QAAiC,gCAAgC;AAClG,SAASC,gBAAgB,QAAyB,wBAAwB;AAC1E,SAASC,gBAAgB,QAAyB,wBAAwB;AAC1E,SAASC,iBAAiB,QAA0B,yBAAyB;AAC7E,SAASC,oBAAoB,QAA6B,4BAA4B;AACtF,SAASC,kBAAkB,QAA2B,0BAA0B;AAChF,SAASC,kBAAkB,QAA2B,0BAA0B;AAChF,SAASC,gBAAgB,QAAyB,wBAAwB;AAC1E,SAASC,iBAAiB,QAA0B,yBAAyB;AAC7E,SAASC,iBAAiB,QAA0B,yBAAyB;AAC7E,SAASC,qBAAqB,QAA8B,6BAA6B;AACzF,SAASC,qBAAqB,QAA8B,6BAA6B;AAmLzF,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF;;CAEC,GACD,SAASC,cAAcC,IAA0B,EAAEC,KAAa,EAAEC,QAAiB;IACjF,MAAMC,QAAQD,WAAW,CAAC,EAAED,MAAM,CAAC,EAAEC,SAAS,CAAC,GAAGD;IAClD,OAAO,CAAC,SAAS,EAAEE,MAAM,CAAC,EAAEH,KAAK,MAAM,CAAC;AAC1C;AAEA,IAAA,AAAMI,gBAAN,MAAMA;IAEJC,QAAQC,GAAW,EAAiB;YAC3B;QAAP,OAAO,CAAA,iBAAA,IAAI,CAACC,IAAI,CAACC,GAAG,CAACF,gBAAd,iBAAsB;IAC/B;IACAG,QAAQH,GAAW,EAAEI,KAAa,EAAQ;QACxC,IAAI,CAACH,IAAI,CAACI,GAAG,CAACL,KAAKI;IACrB;IACAE,WAAWN,GAAW,EAAQ;QAC5B,IAAI,CAACC,IAAI,CAACM,MAAM,CAACP;IACnB;;aATQC,OAAO,IAAIO;;AAUrB;AAEA,SAASC,mBAAmBd,KAAa,EAAEe,WAAwB,EAAEd,QAAiB;IACpF,MAAMe,YAAY,OAAOC,WAAW,eAAe,OAAOA,OAAOC,YAAY,KAAK;IAElF,MAAMC,iBAAiBrB,cAAc,UAAUE,OAAOC;IACtD,MAAMmB,kBAAkBtB,cAAc,WAAWE,OAAOC;IAExD,IAAIoB;IACJ,IAAI,CAACL,WAAW;QACdK,UAAU,IAAIlB;IAChB,OAAO;QACL,OAAQY;YACN,KAAK;gBACHM,UAAUJ,OAAOK,cAAc;gBAC/B;YACF,KAAK;gBACHD,UAAU,IAAIlB;gBACd;YACF;gBACEkB,UAAUJ,OAAOC,YAAY;QACjC;IACF;IAEA,OAAO;QACLK;YACE,IAAI;gBACF,OAAOF,QAAQjB,OAAO,CAACe;YACzB,EAAE,UAAM;gBACN,OAAO;YACT;QACF;QACAK;YACE,IAAI;gBACF,OAAOH,QAAQjB,OAAO,CAACgB;YACzB,EAAE,UAAM;gBACN,OAAO;YACT;QACF;QACAK,WAAUC,WAAmB,EAAEC,YAAqB;YAClD,IAAI;gBACFN,QAAQb,OAAO,CAACW,gBAAgBO;gBAChC,IAAIC,cAAc;oBAChBN,QAAQb,OAAO,CAACY,iBAAiBO;gBACnC;YACF,EAAE,UAAM;gBACNC,QAAQC,IAAI,CAAC;YACf;QACF;QACAC;YACE,IAAI;gBACFT,QAAQV,UAAU,CAACQ;gBACnBE,QAAQV,UAAU,CAACS;YACrB,EAAE,UAAM;YACN,gBAAgB;YAClB;QACF;QACAW,iBAAgBC,QAAoB;YAClC,yDAAyD;YACzD,IAAI,CAAChB,aAAaD,gBAAgB,UAAU;gBAC1C,kDAAkD;gBAClD,OAAO,KAAO;YAChB;YAEA,MAAMkB,UAAU,CAACC;gBACf,mCAAmC;gBACnC,IAAIA,MAAM7B,GAAG,KAAKc,kBAAkBe,MAAM7B,GAAG,KAAKe,iBAAiB;oBACjEY;gBACF;YACF;YAEAf,OAAOkB,gBAAgB,CAAC,WAAWF;YAEnC,8BAA8B;YAC9B,OAAO;gBACLhB,OAAOmB,mBAAmB,CAAC,WAAWH;YACxC;QACF;IACF;AACF;AAEA,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAMI,gCAAkB9D,cAAoC;AAE5D,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCC,GACD,OAAO,SAAS+D,SAAS,EACvBC,QAAQ,EACRC,IAAI,EACJxC,KAAK,EACLC,QAAQ,EACRwC,WAAW,OAAO,EAClBpB,UAAU,cAAc,EACxBqB,SAASC,gBAAgB,CAAC,CAAC,EAC3BC,OAAO,EACO;IACd,2DAA2D;IAC3D,MAAMC,eAAepE,QACnB,IAAOgE,aAAa,UAAU3B,mBAAmBd,OAAOqB,SAASpB,YAAY,MAC7E;QAACwC;QAAUzC;QAAOqB;QAASpB;KAAS;IAGtC,yDAAyD;IACzD,MAAM6C,yBAAyBpE,YAAY,CAACqE;QAC1C,OAAOpE,oBAAoB;YACzBoE;YACAH;YACAI,aAAaP,aAAa,WAAW,YAAYQ;YACjDP,SAAS;gBACP,MAAMA,UAAkC,aACnCC;oBACHO,OAAOlD;;gBAGT,IAAIC,UAAU;oBACZyC,OAAO,CAAC,YAAY,GAAGzC;gBACzB;gBAEA,IAAIwC,aAAa,WAAWI,cAAc;oBACxC,MAAMM,QAAQN,aAAatB,cAAc;oBACzC,IAAI4B,OAAO;wBACTT,OAAO,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAES,MAAM,CAAC;oBAC9C;gBACF;gBAEA,OAAOT;YACT;QACF;IACF,GAAG;QAAC1C;QAAOC;QAAUwC;QAAUE;QAAeC;QAASC;KAAa;IAEpE,yDAAyD;IACzD,MAAMO,cAAc3E,QAAQ,IAAO,CAAA;YAAEuB;YAAOC;QAAS,CAAA,GAAI;QAACD;QAAOC;KAAS;IAE1E,6BAA6B;IAC7B,MAAMoD,gBAAgB5E,QACpB,IAAMqE,uBAAuBN,KAAKc,cAAc,GAChD;QAACR;QAAwBN,KAAKc,cAAc;KAAC;IAG/C,MAAMA,iBAAiB7E,QAAQ,IAAMG,0BAA0ByE,eAAeD,cAAc;QAACC;QAAeD;KAAY;IAExH,0DAA0D;IAC1D,MAAMG,SAAS9E,QAAQ;QACrB,MAAM+E,YAAYhB,KAAKe,MAAM,GAAGT,uBAAuBN,KAAKe,MAAM,IAAIF;QACtE,OAAOxE,kBAAkB2E,WAAWJ;IACtC,GAAG;QAACN;QAAwBN,KAAKe,MAAM;QAAEF;QAAeD;KAAY;IAEpE,MAAMK,WAAWhF,QAAQ;QACvB,MAAM+E,YAAYhB,KAAKiB,QAAQ,GAAGX,uBAAuBN,KAAKiB,QAAQ,IAAIJ;QAC1E,OAAOvE,oBAAoB0E,WAAWJ;IACxC,GAAG;QAACN;QAAwBN,KAAKiB,QAAQ;QAAEJ;QAAeD;KAAY;IAEtE,MAAMM,MAAMjF,QAAQ;QAClB,MAAM+E,YAAYhB,KAAKkB,GAAG,GAAGZ,uBAAuBN,KAAKkB,GAAG,IAAIL;QAChE,OAAOtE,eAAeyE,WAAWJ;IACnC,GAAG;QAACN;QAAwBN,KAAKkB,GAAG;QAAEL;QAAeD;KAAY;IAEjE,MAAMO,UAAUlF,QAAQ;QACtB,MAAM+E,YAAYhB,KAAKmB,OAAO,GAAGb,uBAAuBN,KAAKmB,OAAO,IAAIN;QACxE,OAAOrE,mBAAmBwE,WAAWJ;IACvC,GAAG;QAACN;QAAwBN,KAAKmB,OAAO;QAAEN;QAAeD;KAAY;IAErE,MAAMQ,cAAcnF,QAAQ;QAC1B,MAAM+E,YAAYhB,KAAKoB,WAAW,GAAGd,uBAAuBN,KAAKoB,WAAW,IAAIP;QAChF,OAAOpE,uBAAuBuE,WAAWJ;IAC3C,GAAG;QAACN;QAAwBN,KAAKoB,WAAW;QAAEP;QAAeD;KAAY;IAEzE,MAAMS,gBAAgBpF,QAAQ;QAC5B,MAAM+E,YAAYhB,KAAKqB,aAAa,GAAGf,uBAAuBN,KAAKqB,aAAa,IAAIR;QACpF,OAAOnE,yBAAyBsE,WAAWJ;IAC7C,GAAG;QAACN;QAAwBN,KAAKqB,aAAa;QAAER;QAAeD;KAAY;IAE3E,MAAMU,QAAQrF,QAAQ;QACpB,MAAM+E,YAAYhB,KAAKsB,KAAK,GAAGhB,uBAAuBN,KAAKsB,KAAK,IAAIT;QACpE,OAAOlE,iBAAiBqE,WAAWJ;IACrC,GAAG;QAACN;QAAwBN,KAAKsB,KAAK;QAAET;QAAeD;KAAY;IAEnE,MAAMW,QAAQtF,QAAQ;QACpB,MAAM+E,YAAYhB,KAAKuB,KAAK,GAAGjB,uBAAuBN,KAAKuB,KAAK,IAAIV;QACpE,OAAOjE,iBAAiBoE,WAAWJ;IACrC,GAAG;QAACN;QAAwBN,KAAKuB,KAAK;QAAEV;QAAeD;KAAY;IAEnE,MAAMY,SAASvF,QAAQ;QACrB,MAAM+E,YAAYhB,KAAKwB,MAAM,GAAGlB,uBAAuBN,KAAKwB,MAAM,IAAIX;QACtE,OAAOhE,kBAAkBmE,WAAWJ;IACtC,GAAG;QAACN;QAAwBN,KAAKwB,MAAM;QAAEX;QAAeD;KAAY;IAEpE,MAAMa,YAAYxF,QAAQ;QACxB,MAAM+E,YAAYhB,KAAKyB,SAAS,GAAGnB,uBAAuBN,KAAKyB,SAAS,IAAIZ;QAC5E,OAAO/D,qBAAqBkE,WAAWJ;IACzC,GAAG;QAACN;QAAwBN,KAAKyB,SAAS;QAAEZ;QAAeD;KAAY;IAEvE,MAAMc,UAAUzF,QAAQ;QACtB,MAAM+E,YAAYhB,KAAK0B,OAAO,GAAGpB,uBAAuBN,KAAK0B,OAAO,IAAIb;QACxE,OAAO9D,mBAAmBiE,WAAWJ;IACvC,GAAG;QAACN;QAAwBN,KAAK0B,OAAO;QAAEb;QAAeD;KAAY;IAErE,MAAMe,UAAU1F,QAAQ;QACtB,MAAM+E,YAAYhB,KAAK2B,OAAO,GAAGrB,uBAAuBN,KAAK2B,OAAO,IAAId;QACxE,OAAO7D,mBAAmBgE,WAAWJ;IACvC,GAAG;QAACN;QAAwBN,KAAK2B,OAAO;QAAEd;QAAeD;KAAY;IAErE,MAAMgB,QAAQ3F,QAAQ;QACpB,MAAM+E,YAAYhB,KAAK4B,KAAK,GAAGtB,uBAAuBN,KAAK4B,KAAK,IAAIf;QACpE,OAAO5D,iBAAiB+D,WAAWJ;IACrC,GAAG;QAACN;QAAwBN,KAAK4B,KAAK;QAAEf;QAAeD;KAAY;IAEnE,MAAMiB,SAAS5F,QAAQ;QACrB,MAAM+E,YAAYhB,KAAK6B,MAAM,GAAGvB,uBAAuBN,KAAK6B,MAAM,IAAIhB;QACtE,OAAO3D,kBAAkB8D,WAAWJ;IACtC,GAAG;QAACN;QAAwBN,KAAK6B,MAAM;QAAEhB;QAAeD;KAAY;IAEpE,MAAMkB,SAAS7F,QAAQ;QACrB,MAAM+E,YAAYhB,KAAK8B,MAAM,GAAGxB,uBAAuBN,KAAK8B,MAAM,IAAIjB;QACtE,OAAO1D,kBAAkB6D,WAAWJ;IACtC,GAAG;QAACN;QAAwBN,KAAK8B,MAAM;QAAEjB;QAAeD;KAAY;IAEpE,MAAMmB,aAAa9F,QAAQ;QACzB,MAAM+E,YAAYhB,KAAK+B,UAAU,GAAGzB,uBAAuBN,KAAK+B,UAAU,IAAIlB;QAC9E,OAAOzD,sBAAsB4D,WAAWJ;IAC1C,GAAG;QAACN;QAAwBN,KAAK+B,UAAU;QAAElB;QAAeD;KAAY;IAExE,MAAMoB,aAAa/F,QAAQ;QACzB,MAAM+E,YAAYhB,KAAKgC,UAAU,GAAG1B,uBAAuBN,KAAKgC,UAAU,IAAInB;QAC9E,OAAOxD,sBAAsB2D,WAAWJ;IAC1C,GAAG;QAACN;QAAwBN,KAAKgC,UAAU;QAAEnB;QAAeD;KAAY;IAExE,+CAA+C;IAC/C,MAAMqB,SAAS/F,YAAY,OAAOgG;QAChC,MAAMC,WAAW,MAAMrB,eAAesB,IAAI,CAACH,MAAM,CAACC;QAClD,IAAIjC,aAAa,WAAWI,gBAAgB8B,SAASjD,WAAW,EAAE;YAChEmB,aAAapB,SAAS,CAACkD,SAASjD,WAAW,EAAEiD,SAAShD,YAAY;QACpE;QACA,OAAOgD;IACT,GAAG;QAACrB;QAAgBb;QAAUI;KAAa;IAE3C,MAAMgC,SAASnG,YAAY,OAAOgG;QAChC,MAAMC,WAAW,MAAMrB,eAAesB,IAAI,CAACC,MAAM,CAACH;QAClD,IAAIjC,aAAa,WAAWI,gBAAgB8B,SAASjD,WAAW,EAAE;YAChEmB,aAAapB,SAAS,CAACkD,SAASjD,WAAW;QAC7C;QACA,OAAOiD;IACT,GAAG;QAACrB;QAAgBb;QAAUI;KAAa;IAE3C,MAAMiC,UAAUpG,YAAY;QAC1B,MAAM4E,eAAesB,IAAI,CAACE,OAAO;QACjC,IAAIrC,aAAa,WAAWI,cAAc;YACxCA,aAAaf,WAAW;QAC1B;IACF,GAAG;QAACwB;QAAgBb;QAAUI;KAAa;IAE3C,kBAAkB;IAClB,MAAMtB,iBAAiB7C,YAAY;YAAMmE;eAAAA,CAAAA,+BAAAA,gCAAAA,aAActB,cAAc,cAA5BsB,+BAAkC;IAAG,GAAG;QAACA;KAAa;IAC/F,MAAMrB,kBAAkB9C,YAAY;YAAMmE;eAAAA,CAAAA,gCAAAA,gCAAAA,aAAcrB,eAAe,cAA7BqB,gCAAmC;IAAG,GAAG;QAACA;KAAa;IACjG,MAAMpB,YAAY/C,YAAY,CAACgD,aAAqBC;QAClDkB,gCAAAA,aAAcpB,SAAS,CAACC,aAAaC;IACvC,GAAG;QAACkB;KAAa;IACjB,MAAMf,cAAcpD,YAAY,IAAMmE,gCAAAA,aAAcf,WAAW,IAAI;QAACe;KAAa;IACjF,MAAMkC,kBAAkBrG,YAAY;QAClC,IAAI+D,aAAa,UAAU,OAAO;QAClC,OAAOI,eAAe,CAAC,CAACA,aAAatB,cAAc,KAAK;IAC1D,GAAG;QAACkB;QAAUI;KAAa;IAC3B,MAAMd,kBAAkBrD,YAAY,CAACsD;YAC5Ba;QAAP,OAAOA,CAAAA,gCAAAA,gCAAAA,aAAcd,eAAe,CAACC,qBAA9Ba,gCAA4C,KAAO;IAC5D,GAAG;QAACA;KAAa;IAEjB,MAAMpC,QAAQhC,QAAuB,IAAO,CAAA;YAC1C,SAAS;YACT6E;YACAC;YACAE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YAEA,6BAA6B;YAC7BC;YACAI;YACAC;YAEA,kBAAkB;YAClBvD;YACAC;YACAC;YACAK;YACAiD;YACAhD;YAEA,SAAS;YACTU;QACF,CAAA,GAAI;QACFa;QAAgBC;QAAQE;QAAUC;QAAKC;QAASC;QAAaC;QAC7DC;QAAOC;QAAOC;QAAQC;QAAWC;QAASC;QAASC;QAAOC;QAAQC;QAClEC;QAAYC;QAAYC;QAAQI;QAAQC;QAASvD;QAAgBC;QACjEC;QAAWK;QAAaiD;QAAiBhD;QAAiBU;KAC3D;IAED,qBACE,oBAACJ,gBAAgBC,QAAQ;QAAC7B,OAAOA;OAC9B8B;AAGP;AAEA,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF;;;;;;;;;;;;;;CAcC,GACD,OAAO,SAASyC;IACd,MAAMC,UAAUzG,WAAW6D;IAC3B,IAAI,CAAC4C,SAAS;QACZ,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOD;AACT;AAEA;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GACD,OAAO,SAASE;IACd,MAAMF,UAAUD;IAChB,OAAO;QACLP,QAAQQ,QAAQR,MAAM;QACtBI,QAAQI,QAAQJ,MAAM;QACtBC,SAASG,QAAQH,OAAO;QACxBvD,gBAAgB0D,QAAQ1D,cAAc;QACtCC,iBAAiByD,QAAQzD,eAAe;QACxCC,WAAWwD,QAAQxD,SAAS;QAC5BK,aAAamD,QAAQnD,WAAW;QAChCiD,iBAAiBE,QAAQF,eAAe;QACxChD,iBAAiBkD,QAAQlD,eAAe;QACxCuB,gBAAgB2B,QAAQ3B,cAAc;IACxC;AACF;AAEA,gFAAgF;AAChF,8CAA8C;AAC9C,gFAAgF;AAEhF,uCAAuC,GACvC,OAAO,MAAM8B,yBAAyB9C,SAAS;AAQ/C,wCAAwC,GACxC,OAAO,MAAM+C,oBAAoBL,UAAU;AAE3C,sCAAsC,GACtC,OAAO,MAAMM,gBAAgBH,QAAQ"}
|
|
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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"}
|