@bookinglab/booking-journey-api 1.13.0 → 2.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/README.md +4 -6
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -32
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,7 +33,6 @@ import { createJrniClient } from '@bookinglab/booking-journey-api';
|
|
|
33
33
|
|
|
34
34
|
const client = createJrniClient('https://api.jrni.com', {
|
|
35
35
|
appId: 'your-app-id',
|
|
36
|
-
appKey: 'your-app-key',
|
|
37
36
|
});
|
|
38
37
|
|
|
39
38
|
// Login
|
|
@@ -82,7 +81,7 @@ function App() {
|
|
|
82
81
|
<QueryClientProvider client={queryClient}>
|
|
83
82
|
<JrniProvider
|
|
84
83
|
baseUrl="https://api.jrni.com"
|
|
85
|
-
config={{ appId: 'your-app-id'
|
|
84
|
+
config={{ appId: 'your-app-id' }}
|
|
86
85
|
>
|
|
87
86
|
<LoginForm />
|
|
88
87
|
</JrniProvider>
|
|
@@ -154,7 +153,7 @@ function App() {
|
|
|
154
153
|
<ApiClientProvider
|
|
155
154
|
bookingLabBaseUrl="https://api.bookinglab.com"
|
|
156
155
|
jrniBaseUrl="https://api.jrni.com"
|
|
157
|
-
jrniConfig={{ appId: 'your-app-id'
|
|
156
|
+
jrniConfig={{ appId: 'your-app-id' }}
|
|
158
157
|
authToken="your-auth-token"
|
|
159
158
|
>
|
|
160
159
|
<YourApp />
|
|
@@ -181,7 +180,6 @@ Creates a new JRNI client instance.
|
|
|
181
180
|
```typescript
|
|
182
181
|
const client = createJrniClient('https://api.jrni.com', {
|
|
183
182
|
appId: 'your-app-id',
|
|
184
|
-
appKey: 'your-app-key',
|
|
185
183
|
});
|
|
186
184
|
```
|
|
187
185
|
|
|
@@ -233,7 +231,7 @@ Provides JRNI client context to React components.
|
|
|
233
231
|
```tsx
|
|
234
232
|
<JrniProvider
|
|
235
233
|
baseUrl="https://api.jrni.com"
|
|
236
|
-
config={{ appId: 'your-app-id'
|
|
234
|
+
config={{ appId: 'your-app-id' }}
|
|
237
235
|
>
|
|
238
236
|
{children}
|
|
239
237
|
</JrniProvider>
|
|
@@ -260,7 +258,7 @@ Combined provider for applications using multiple API clients.
|
|
|
260
258
|
<ApiClientProvider
|
|
261
259
|
bookingLabBaseUrl="https://api.bookinglab.com"
|
|
262
260
|
jrniBaseUrl="https://api.jrni.com"
|
|
263
|
-
jrniConfig={{ appId: 'your-app-id'
|
|
261
|
+
jrniConfig={{ appId: 'your-app-id' }}
|
|
264
262
|
authToken="your-auth-token"
|
|
265
263
|
>
|
|
266
264
|
{children}
|
package/dist/index.d.cts
CHANGED
|
@@ -52,7 +52,6 @@ interface Service {
|
|
|
52
52
|
*/
|
|
53
53
|
interface JrniConfig {
|
|
54
54
|
appId: string;
|
|
55
|
-
appKey: string;
|
|
56
55
|
}
|
|
57
56
|
/**
|
|
58
57
|
* JRNI API Types
|
|
@@ -634,6 +633,8 @@ interface CreateClientRequest {
|
|
|
634
633
|
email: string;
|
|
635
634
|
first_name: string;
|
|
636
635
|
last_name: string;
|
|
636
|
+
mobile?: string;
|
|
637
|
+
phone?: string;
|
|
637
638
|
consent?: boolean;
|
|
638
639
|
send_welcome_email?: boolean;
|
|
639
640
|
member_type?: number;
|
|
@@ -1022,7 +1023,6 @@ declare function createBookingLabClient(baseUrl: string, authToken?: string): Bo
|
|
|
1022
1023
|
|
|
1023
1024
|
declare class JrniClient extends ApiClient {
|
|
1024
1025
|
private appId;
|
|
1025
|
-
private appKey;
|
|
1026
1026
|
constructor(baseUrl: string, config: JrniConfig);
|
|
1027
1027
|
/**
|
|
1028
1028
|
* Get default headers for JRNI API requests
|
package/dist/index.d.ts
CHANGED
|
@@ -52,7 +52,6 @@ interface Service {
|
|
|
52
52
|
*/
|
|
53
53
|
interface JrniConfig {
|
|
54
54
|
appId: string;
|
|
55
|
-
appKey: string;
|
|
56
55
|
}
|
|
57
56
|
/**
|
|
58
57
|
* JRNI API Types
|
|
@@ -634,6 +633,8 @@ interface CreateClientRequest {
|
|
|
634
633
|
email: string;
|
|
635
634
|
first_name: string;
|
|
636
635
|
last_name: string;
|
|
636
|
+
mobile?: string;
|
|
637
|
+
phone?: string;
|
|
637
638
|
consent?: boolean;
|
|
638
639
|
send_welcome_email?: boolean;
|
|
639
640
|
member_type?: number;
|
|
@@ -1022,7 +1023,6 @@ declare function createBookingLabClient(baseUrl: string, authToken?: string): Bo
|
|
|
1022
1023
|
|
|
1023
1024
|
declare class JrniClient extends ApiClient {
|
|
1024
1025
|
private appId;
|
|
1025
|
-
private appKey;
|
|
1026
1026
|
constructor(baseUrl: string, config: JrniConfig);
|
|
1027
1027
|
/**
|
|
1028
1028
|
* Get default headers for JRNI API requests
|
package/dist/index.js
CHANGED
|
@@ -292,7 +292,6 @@ var JrniClient = class extends ApiClient {
|
|
|
292
292
|
constructor(baseUrl, config) {
|
|
293
293
|
super({ baseUrl });
|
|
294
294
|
this.appId = config.appId;
|
|
295
|
-
this.appKey = config.appKey;
|
|
296
295
|
}
|
|
297
296
|
/**
|
|
298
297
|
* Get default headers for JRNI API requests
|
|
@@ -309,8 +308,7 @@ var JrniClient = class extends ApiClient {
|
|
|
309
308
|
async login(credentials) {
|
|
310
309
|
return this.post("/login", credentials, {
|
|
311
310
|
headers: {
|
|
312
|
-
...this.getDefaultHeaders()
|
|
313
|
-
"App-Key": this.appKey
|
|
311
|
+
...this.getDefaultHeaders()
|
|
314
312
|
}
|
|
315
313
|
});
|
|
316
314
|
}
|
|
@@ -324,8 +322,7 @@ var JrniClient = class extends ApiClient {
|
|
|
324
322
|
`/company/${companyId}/children`,
|
|
325
323
|
{
|
|
326
324
|
headers: {
|
|
327
|
-
...this.getDefaultHeaders()
|
|
328
|
-
"App-Key": this.appKey
|
|
325
|
+
...this.getDefaultHeaders()
|
|
329
326
|
},
|
|
330
327
|
params
|
|
331
328
|
}
|
|
@@ -340,8 +337,7 @@ var JrniClient = class extends ApiClient {
|
|
|
340
337
|
`/${companyId}/resources`,
|
|
341
338
|
{
|
|
342
339
|
headers: {
|
|
343
|
-
...this.getDefaultHeaders()
|
|
344
|
-
"App-Key": this.appKey
|
|
340
|
+
...this.getDefaultHeaders()
|
|
345
341
|
}
|
|
346
342
|
}
|
|
347
343
|
);
|
|
@@ -355,8 +351,7 @@ var JrniClient = class extends ApiClient {
|
|
|
355
351
|
`/${companyId}/services`,
|
|
356
352
|
{
|
|
357
353
|
headers: {
|
|
358
|
-
...this.getDefaultHeaders()
|
|
359
|
-
"App-Key": this.appKey
|
|
354
|
+
...this.getDefaultHeaders()
|
|
360
355
|
}
|
|
361
356
|
}
|
|
362
357
|
);
|
|
@@ -368,8 +363,7 @@ var JrniClient = class extends ApiClient {
|
|
|
368
363
|
*/
|
|
369
364
|
async createBasket(request, authToken) {
|
|
370
365
|
const headers = {
|
|
371
|
-
...this.getDefaultHeaders()
|
|
372
|
-
"App-Key": this.appKey
|
|
366
|
+
...this.getDefaultHeaders()
|
|
373
367
|
};
|
|
374
368
|
if (authToken) {
|
|
375
369
|
headers["Auth-Token"] = authToken;
|
|
@@ -386,8 +380,7 @@ var JrniClient = class extends ApiClient {
|
|
|
386
380
|
*/
|
|
387
381
|
async clearBaskets(authToken) {
|
|
388
382
|
const headers = {
|
|
389
|
-
...this.getDefaultHeaders()
|
|
390
|
-
"App-Key": this.appKey
|
|
383
|
+
...this.getDefaultHeaders()
|
|
391
384
|
};
|
|
392
385
|
if (authToken) {
|
|
393
386
|
headers["Auth-Token"] = authToken;
|
|
@@ -405,8 +398,7 @@ var JrniClient = class extends ApiClient {
|
|
|
405
398
|
*/
|
|
406
399
|
async addServiceItem(basketId, serviceItem, authToken) {
|
|
407
400
|
const headers = {
|
|
408
|
-
...this.getDefaultHeaders()
|
|
409
|
-
"App-Key": this.appKey
|
|
401
|
+
...this.getDefaultHeaders()
|
|
410
402
|
};
|
|
411
403
|
if (authToken) {
|
|
412
404
|
headers["Auth-Token"] = authToken;
|
|
@@ -427,8 +419,7 @@ var JrniClient = class extends ApiClient {
|
|
|
427
419
|
`/${companyId}/times`,
|
|
428
420
|
{
|
|
429
421
|
headers: {
|
|
430
|
-
...this.getDefaultHeaders()
|
|
431
|
-
"App-Key": this.appKey
|
|
422
|
+
...this.getDefaultHeaders()
|
|
432
423
|
},
|
|
433
424
|
params
|
|
434
425
|
}
|
|
@@ -444,8 +435,7 @@ var JrniClient = class extends ApiClient {
|
|
|
444
435
|
`/${companyId}/dates`,
|
|
445
436
|
{
|
|
446
437
|
headers: {
|
|
447
|
-
...this.getDefaultHeaders()
|
|
448
|
-
"App-Key": this.appKey
|
|
438
|
+
...this.getDefaultHeaders()
|
|
449
439
|
},
|
|
450
440
|
params
|
|
451
441
|
}
|
|
@@ -461,8 +451,7 @@ var JrniClient = class extends ApiClient {
|
|
|
461
451
|
`/${companyId}/questions`,
|
|
462
452
|
{
|
|
463
453
|
headers: {
|
|
464
|
-
...this.getDefaultHeaders()
|
|
465
|
-
"App-Key": this.appKey
|
|
454
|
+
...this.getDefaultHeaders()
|
|
466
455
|
},
|
|
467
456
|
params
|
|
468
457
|
}
|
|
@@ -476,8 +465,7 @@ var JrniClient = class extends ApiClient {
|
|
|
476
465
|
*/
|
|
477
466
|
async checkoutBasket(basketId, request, authToken) {
|
|
478
467
|
const headers = {
|
|
479
|
-
...this.getDefaultHeaders()
|
|
480
|
-
"App-Key": this.appKey
|
|
468
|
+
...this.getDefaultHeaders()
|
|
481
469
|
};
|
|
482
470
|
if (authToken) {
|
|
483
471
|
headers["Auth-Token"] = authToken;
|
|
@@ -501,7 +489,6 @@ var JrniClient = class extends ApiClient {
|
|
|
501
489
|
{
|
|
502
490
|
headers: {
|
|
503
491
|
...this.getDefaultHeaders(),
|
|
504
|
-
"App-Key": this.appKey,
|
|
505
492
|
"Auth-Token": authToken
|
|
506
493
|
},
|
|
507
494
|
params
|
|
@@ -519,8 +506,7 @@ var JrniClient = class extends ApiClient {
|
|
|
519
506
|
request,
|
|
520
507
|
{
|
|
521
508
|
headers: {
|
|
522
|
-
...this.getDefaultHeaders()
|
|
523
|
-
"App-Key": this.appKey
|
|
509
|
+
...this.getDefaultHeaders()
|
|
524
510
|
}
|
|
525
511
|
}
|
|
526
512
|
);
|
|
@@ -539,7 +525,6 @@ var JrniClient = class extends ApiClient {
|
|
|
539
525
|
{
|
|
540
526
|
headers: {
|
|
541
527
|
...this.getDefaultHeaders(),
|
|
542
|
-
"App-Key": this.appKey,
|
|
543
528
|
"Auth-Token": authToken
|
|
544
529
|
}
|
|
545
530
|
}
|
|
@@ -559,7 +544,6 @@ var JrniClient = class extends ApiClient {
|
|
|
559
544
|
{
|
|
560
545
|
headers: {
|
|
561
546
|
...this.getDefaultHeaders(),
|
|
562
|
-
"App-Key": this.appKey,
|
|
563
547
|
"Auth-Token": authToken
|
|
564
548
|
}
|
|
565
549
|
}
|
|
@@ -577,7 +561,6 @@ var JrniClient = class extends ApiClient {
|
|
|
577
561
|
{
|
|
578
562
|
headers: {
|
|
579
563
|
...this.getDefaultHeaders(),
|
|
580
|
-
"App-Key": this.appKey,
|
|
581
564
|
"Auth-Token": authToken
|
|
582
565
|
}
|
|
583
566
|
}
|
|
@@ -588,7 +571,6 @@ var JrniClient = class extends ApiClient {
|
|
|
588
571
|
*/
|
|
589
572
|
setJrniConfig(config) {
|
|
590
573
|
if (config.appId) this.appId = config.appId;
|
|
591
|
-
if (config.appKey) this.appKey = config.appKey;
|
|
592
574
|
}
|
|
593
575
|
};
|
|
594
576
|
function createJrniClient(baseUrl, config) {
|
|
@@ -625,7 +607,7 @@ function ApiClientProvider({
|
|
|
625
607
|
return new JrniClient(jrniBaseUrl, jrniConfig);
|
|
626
608
|
}
|
|
627
609
|
return null;
|
|
628
|
-
}, [jrniBaseUrl, jrniConfig?.appId
|
|
610
|
+
}, [jrniBaseUrl, jrniConfig?.appId]);
|
|
629
611
|
const value = react.useMemo(
|
|
630
612
|
() => ({
|
|
631
613
|
bookingLabClient,
|
|
@@ -669,7 +651,7 @@ var JrniContext = react.createContext(void 0);
|
|
|
669
651
|
function JrniProvider({ children, baseUrl, config }) {
|
|
670
652
|
const client = react.useMemo(() => {
|
|
671
653
|
return new JrniClient(baseUrl, config);
|
|
672
|
-
}, [baseUrl, config.appId
|
|
654
|
+
}, [baseUrl, config.appId]);
|
|
673
655
|
const value = react.useMemo(() => ({ client }), [client]);
|
|
674
656
|
return /* @__PURE__ */ jsxRuntime.jsx(JrniContext.Provider, { value, children });
|
|
675
657
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","QueryClient","useMemo","jsx","QueryClientProvider","useContext","useMutation","useQuery"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","QueryClient","useMemo","jsx","QueryClientProvider","useContext","useMutation","useQuery"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -290,7 +290,6 @@ var JrniClient = class extends ApiClient {
|
|
|
290
290
|
constructor(baseUrl, config) {
|
|
291
291
|
super({ baseUrl });
|
|
292
292
|
this.appId = config.appId;
|
|
293
|
-
this.appKey = config.appKey;
|
|
294
293
|
}
|
|
295
294
|
/**
|
|
296
295
|
* Get default headers for JRNI API requests
|
|
@@ -307,8 +306,7 @@ var JrniClient = class extends ApiClient {
|
|
|
307
306
|
async login(credentials) {
|
|
308
307
|
return this.post("/login", credentials, {
|
|
309
308
|
headers: {
|
|
310
|
-
...this.getDefaultHeaders()
|
|
311
|
-
"App-Key": this.appKey
|
|
309
|
+
...this.getDefaultHeaders()
|
|
312
310
|
}
|
|
313
311
|
});
|
|
314
312
|
}
|
|
@@ -322,8 +320,7 @@ var JrniClient = class extends ApiClient {
|
|
|
322
320
|
`/company/${companyId}/children`,
|
|
323
321
|
{
|
|
324
322
|
headers: {
|
|
325
|
-
...this.getDefaultHeaders()
|
|
326
|
-
"App-Key": this.appKey
|
|
323
|
+
...this.getDefaultHeaders()
|
|
327
324
|
},
|
|
328
325
|
params
|
|
329
326
|
}
|
|
@@ -338,8 +335,7 @@ var JrniClient = class extends ApiClient {
|
|
|
338
335
|
`/${companyId}/resources`,
|
|
339
336
|
{
|
|
340
337
|
headers: {
|
|
341
|
-
...this.getDefaultHeaders()
|
|
342
|
-
"App-Key": this.appKey
|
|
338
|
+
...this.getDefaultHeaders()
|
|
343
339
|
}
|
|
344
340
|
}
|
|
345
341
|
);
|
|
@@ -353,8 +349,7 @@ var JrniClient = class extends ApiClient {
|
|
|
353
349
|
`/${companyId}/services`,
|
|
354
350
|
{
|
|
355
351
|
headers: {
|
|
356
|
-
...this.getDefaultHeaders()
|
|
357
|
-
"App-Key": this.appKey
|
|
352
|
+
...this.getDefaultHeaders()
|
|
358
353
|
}
|
|
359
354
|
}
|
|
360
355
|
);
|
|
@@ -366,8 +361,7 @@ var JrniClient = class extends ApiClient {
|
|
|
366
361
|
*/
|
|
367
362
|
async createBasket(request, authToken) {
|
|
368
363
|
const headers = {
|
|
369
|
-
...this.getDefaultHeaders()
|
|
370
|
-
"App-Key": this.appKey
|
|
364
|
+
...this.getDefaultHeaders()
|
|
371
365
|
};
|
|
372
366
|
if (authToken) {
|
|
373
367
|
headers["Auth-Token"] = authToken;
|
|
@@ -384,8 +378,7 @@ var JrniClient = class extends ApiClient {
|
|
|
384
378
|
*/
|
|
385
379
|
async clearBaskets(authToken) {
|
|
386
380
|
const headers = {
|
|
387
|
-
...this.getDefaultHeaders()
|
|
388
|
-
"App-Key": this.appKey
|
|
381
|
+
...this.getDefaultHeaders()
|
|
389
382
|
};
|
|
390
383
|
if (authToken) {
|
|
391
384
|
headers["Auth-Token"] = authToken;
|
|
@@ -403,8 +396,7 @@ var JrniClient = class extends ApiClient {
|
|
|
403
396
|
*/
|
|
404
397
|
async addServiceItem(basketId, serviceItem, authToken) {
|
|
405
398
|
const headers = {
|
|
406
|
-
...this.getDefaultHeaders()
|
|
407
|
-
"App-Key": this.appKey
|
|
399
|
+
...this.getDefaultHeaders()
|
|
408
400
|
};
|
|
409
401
|
if (authToken) {
|
|
410
402
|
headers["Auth-Token"] = authToken;
|
|
@@ -425,8 +417,7 @@ var JrniClient = class extends ApiClient {
|
|
|
425
417
|
`/${companyId}/times`,
|
|
426
418
|
{
|
|
427
419
|
headers: {
|
|
428
|
-
...this.getDefaultHeaders()
|
|
429
|
-
"App-Key": this.appKey
|
|
420
|
+
...this.getDefaultHeaders()
|
|
430
421
|
},
|
|
431
422
|
params
|
|
432
423
|
}
|
|
@@ -442,8 +433,7 @@ var JrniClient = class extends ApiClient {
|
|
|
442
433
|
`/${companyId}/dates`,
|
|
443
434
|
{
|
|
444
435
|
headers: {
|
|
445
|
-
...this.getDefaultHeaders()
|
|
446
|
-
"App-Key": this.appKey
|
|
436
|
+
...this.getDefaultHeaders()
|
|
447
437
|
},
|
|
448
438
|
params
|
|
449
439
|
}
|
|
@@ -459,8 +449,7 @@ var JrniClient = class extends ApiClient {
|
|
|
459
449
|
`/${companyId}/questions`,
|
|
460
450
|
{
|
|
461
451
|
headers: {
|
|
462
|
-
...this.getDefaultHeaders()
|
|
463
|
-
"App-Key": this.appKey
|
|
452
|
+
...this.getDefaultHeaders()
|
|
464
453
|
},
|
|
465
454
|
params
|
|
466
455
|
}
|
|
@@ -474,8 +463,7 @@ var JrniClient = class extends ApiClient {
|
|
|
474
463
|
*/
|
|
475
464
|
async checkoutBasket(basketId, request, authToken) {
|
|
476
465
|
const headers = {
|
|
477
|
-
...this.getDefaultHeaders()
|
|
478
|
-
"App-Key": this.appKey
|
|
466
|
+
...this.getDefaultHeaders()
|
|
479
467
|
};
|
|
480
468
|
if (authToken) {
|
|
481
469
|
headers["Auth-Token"] = authToken;
|
|
@@ -499,7 +487,6 @@ var JrniClient = class extends ApiClient {
|
|
|
499
487
|
{
|
|
500
488
|
headers: {
|
|
501
489
|
...this.getDefaultHeaders(),
|
|
502
|
-
"App-Key": this.appKey,
|
|
503
490
|
"Auth-Token": authToken
|
|
504
491
|
},
|
|
505
492
|
params
|
|
@@ -517,8 +504,7 @@ var JrniClient = class extends ApiClient {
|
|
|
517
504
|
request,
|
|
518
505
|
{
|
|
519
506
|
headers: {
|
|
520
|
-
...this.getDefaultHeaders()
|
|
521
|
-
"App-Key": this.appKey
|
|
507
|
+
...this.getDefaultHeaders()
|
|
522
508
|
}
|
|
523
509
|
}
|
|
524
510
|
);
|
|
@@ -537,7 +523,6 @@ var JrniClient = class extends ApiClient {
|
|
|
537
523
|
{
|
|
538
524
|
headers: {
|
|
539
525
|
...this.getDefaultHeaders(),
|
|
540
|
-
"App-Key": this.appKey,
|
|
541
526
|
"Auth-Token": authToken
|
|
542
527
|
}
|
|
543
528
|
}
|
|
@@ -557,7 +542,6 @@ var JrniClient = class extends ApiClient {
|
|
|
557
542
|
{
|
|
558
543
|
headers: {
|
|
559
544
|
...this.getDefaultHeaders(),
|
|
560
|
-
"App-Key": this.appKey,
|
|
561
545
|
"Auth-Token": authToken
|
|
562
546
|
}
|
|
563
547
|
}
|
|
@@ -575,7 +559,6 @@ var JrniClient = class extends ApiClient {
|
|
|
575
559
|
{
|
|
576
560
|
headers: {
|
|
577
561
|
...this.getDefaultHeaders(),
|
|
578
|
-
"App-Key": this.appKey,
|
|
579
562
|
"Auth-Token": authToken
|
|
580
563
|
}
|
|
581
564
|
}
|
|
@@ -586,7 +569,6 @@ var JrniClient = class extends ApiClient {
|
|
|
586
569
|
*/
|
|
587
570
|
setJrniConfig(config) {
|
|
588
571
|
if (config.appId) this.appId = config.appId;
|
|
589
|
-
if (config.appKey) this.appKey = config.appKey;
|
|
590
572
|
}
|
|
591
573
|
};
|
|
592
574
|
function createJrniClient(baseUrl, config) {
|
|
@@ -623,7 +605,7 @@ function ApiClientProvider({
|
|
|
623
605
|
return new JrniClient(jrniBaseUrl, jrniConfig);
|
|
624
606
|
}
|
|
625
607
|
return null;
|
|
626
|
-
}, [jrniBaseUrl, jrniConfig?.appId
|
|
608
|
+
}, [jrniBaseUrl, jrniConfig?.appId]);
|
|
627
609
|
const value = useMemo(
|
|
628
610
|
() => ({
|
|
629
611
|
bookingLabClient,
|
|
@@ -667,7 +649,7 @@ var JrniContext = createContext(void 0);
|
|
|
667
649
|
function JrniProvider({ children, baseUrl, config }) {
|
|
668
650
|
const client = useMemo(() => {
|
|
669
651
|
return new JrniClient(baseUrl, config);
|
|
670
|
-
}, [baseUrl, config.appId
|
|
652
|
+
}, [baseUrl, config.appId]);
|
|
671
653
|
const value = useMemo(() => ({ client }), [client]);
|
|
672
654
|
return /* @__PURE__ */ jsx(JrniContext.Provider, { value, children });
|
|
673
655
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","useMemo","jsx","useContext","useQuery","useMutation"],"mappings":";;;;;AAOO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAkC;AAC1C,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnE,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,EAAQ;AACxE,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAe;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,QAAA,EACA,OAAA,GAA0B,EAAC,EACF;AACzB,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,YAAA,EAAa,GAAI,OAAA;AAGpC,IAAA,IAAI,YAAA,GAAe,QAAA;AAInB,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,CAAS,SAAS,KAAK,YAAA,CAAa,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3E,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAAA,IACtD;AAIA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAI,KAAK,YAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACjE,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,YAAY,CAAA,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,GAAA,IAAO,IAAI,WAAW,CAAA,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,GAAK,YAAA,CAAa,OAAA,IAAsC;AAAC,KAC3D;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,YAAA;AAAA,QACH,OAAA;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,IAAA,CAAK,eAAe,KAAc,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,GAAA,CAAO,QAAA,EAAkB,OAAA,EAAmD;AAC1F,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,IAAA,CACd,QAAA,EACA,IAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU;AAAA,MAC/B,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACrC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,GAAA,CACd,QAAA,EACA,IAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU;AAAA,MAC/B,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACrC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,MAAA,CAAU,QAAA,EAAkB,OAAA,EAAmD;AAC7F,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,QAAA,EAAuC;AAC/D,IAAA,IAAI,UAAU,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAC7D,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,SAAS,IAAA,EAAK;AAC9B,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MACpB,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAwB;AAC7C,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,iBAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,OAAA,IAAW,eAAA;AAAA,MAC1B,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACF;;;ACykBO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAFU,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;;;ACvwBL,IAAM,gBAAA,GAAN,cAA+B,SAAA,CAAU;AAAA;AAAA;AAAA;AAAA,EAI9C,MAAM,YAAY,MAAA,EAAkD;AAClE,IAAA,OAAO,IAAA,CAAK,IAAe,WAAA,EAAa;AAAA,MACtC,MAAA,EAAQ,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAkD;AACjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAA8D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAc,WAAA,EAAa,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,IAAI,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,SAAA,EAA+C;AACjE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA+C;AACnD,IAAA,OAAO,IAAA,CAAK,IAAe,WAAW,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAkD;AACjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,SAAA,EACA,WAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,YAAY,SAAS,CAAA,eAAA,CAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACJ,SAAA,EACA,UAAA,EACA,WAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,SAAS,CAAA,OAAA,CAAA;AAAA,MACrB,UAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA,GAAc,EAAE,aAAA,EAAe,aAAY,GAAI;AAAA;AAC1D,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,CACJ,SAAA,EACA,SAAA,EACA,SACA,WAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,CAAA,SAAA,EAAY,SAAS,CAAA,SAAA,EAAY,SAAS,CAAA,OAAA,CAAA;AAAA,MAC1C,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,OAAO,SAAS,CAAA;AAAA,UAChC,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACJ,QAAA,EACA,SAAA,EACA,OAAA,EACA,WACA,WAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,WAAW,QAAQ,CAAA,eAAA,CAAA;AAAA,MACnB,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,UAC9B,cAAA,EAAgB,OAAO,SAAS,CAAA;AAAA,UAChC,WAAA,EAAa,SAAA;AAAA,UACb,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AACF;AAKO,SAAS,sBAAA,CAAuB,SAAiB,SAAA,EAAoB;AAC1E,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,EAAE,SAAS,CAAA;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA;AACT;;;ACnIO,IAAM,UAAA,GAAN,cAAyB,SAAA,CAAU;AAAA,EAIxC,WAAA,CAAY,SAAiB,MAAA,EAAoB;AAC/C,IAAA,KAAA,CAAM,EAAE,SAAS,CAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4C;AAClD,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,WAAA,EAAgE;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAoB,QAAA,EAAU,WAAA,EAAa;AAAA,MACrD,OAAA,EAAS;AAAA,QACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,QAC1B,WAAW,IAAA,CAAK;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,SAAA,EACA,MAAA,EAC8C;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,YAAY,SAAS,CAAA,SAAA,CAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAA,EAA4D;AAC7E,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,UAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,SAAA,EAA2D;AAC3E,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,SAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CAAa,OAAA,EAA8B,SAAA,EAAgE;AAC/G,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,UAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAA,EAAgE;AACjF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,UAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,QAAA,EACA,WAAA,EACA,SAAA,EAC2C;AAC3C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,QAAQ,CAAA,cAAA,CAAA;AAAA,MACpB,WAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,MAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,MAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CACJ,SAAA,EACA,MAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,UAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,QAAA,EACA,OAAA,EACA,SAAA,EAC8C;AAC9C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,QAAQ,CAAA,SAAA,CAAA;AAAA,MACpB,OAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,QACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,SAAA,CAAA;AAAA,MACjC;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA,SAChB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,SAAA,EACA,OAAA,EACiD;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,UAAU,SAAS,CAAA,qBAAA,CAAA;AAAA,MACnB,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,SACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAAA,MAChC,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,SACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA;AAAA,MACjC,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,CACJ,SAAA,EACA,QAAA,EACA,SAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA;AAAA,MACjC;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAA,EAA6B;AACzC,IAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,KAAA;AACtC,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,EAC1C;AACF;AAKO,SAAS,gBAAA,CAAiB,SAAiB,MAAA,EAAoB;AACpE,EAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AACvC;AClYA,IAAM,gBAAA,GAAmB,cAAiD,MAAS,CAAA;AAGnF,IAAM,kBAAA,GAAqB,IAAI,WAAA,CAAY;AAAA,EACzC,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA,MACpB,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAMM,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,SAAS,WAAA,IAAe,kBAAA;AAE9B,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,mBAAmB,OAAO,IAAA;AAC/B,IAAA,MAAM,iBAAiB,IAAI,gBAAA,CAAiB,EAAE,OAAA,EAAS,mBAAmB,CAAA;AAC1E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,CAAe,aAAa,SAAS,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAEjC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,OAAO,IAAI,UAAA,CAAW,WAAA,EAAa,UAAU,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,GAAG,CAAC,WAAA,EAAa,YAAY,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,gBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,kBAAkB,UAAU;AAAA,GAC/B;AAEA,EAAA,uBACE,GAAA,CAAC,uBAAoB,MAAA,EACnB,QAAA,kBAAA,GAAA,CAAC,iBAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAe,QAAA,EAAS,CAAA,EACrD,CAAA;AAEJ;AAKO,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,OAAA;AACT;ACzEA,IAAM,iBAAA,GAAoBC,cAAkD,MAAS,CAAA;AAK9E,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,MAAA,GAASC,QAAQ,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,IAAI,gBAAA,CAAiB,EAAE,SAAS,CAAA;AACvD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,CAAe,aAAa,SAAS,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,KAAA,GAAQA,QAAQ,OAAO,EAAE,QAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAElD,EAAA,uBACEC,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAKO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,OAAA,GAAUC,WAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;ACnCA,IAAM,WAAA,GAAcH,cAA4C,MAAS,CAAA;AAKlE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,OAAA,EAAS,QAAO,EAAsB;AAC7E,EAAA,MAAM,MAAA,GAASC,QAAQ,MAAM;AAC3B,IAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAAA,EACvC,GAAG,CAAC,OAAA,EAAS,OAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQA,QAAQ,OAAO,EAAE,QAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAElD,EAAA,uBAAOC,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAKO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;;;AChCO,SAAS,mBAAA,GAAsB;AAEpC,EAAA,IAAI;AACF,IAAA,OAAO,oBAAA,EAAqB;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,IAAA,IAAI,CAAC,QAAQ,gBAAA,EAAkB;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,gBAAA;AAAA,EACjB;AACF;AAKO,SAAS,aAAA,GAAgB;AAE9B,EAAA,IAAI;AACF,IAAA,OAAO,cAAA,EAAe;AAAA,EACxB,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,IAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,EACjB;AACF;AChCO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,WAAA,KAA8B;AAC/C,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAC/C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,iBAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,gBAAA,EAAkB,SAAA,EAAW,MAAM,CAAA;AAAA,IAC9C,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,iBAAA,CAAkB,WAAW,MAAM,CAAA;AACjE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAOO,SAAS,YAAA,CAAa,SAAA,EAAmB,OAAA,GAAmB,IAAA,EAAM;AACvE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,IACjC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAOO,SAAS,WAAA,CAAY,SAAA,EAAmB,OAAA,GAAmB,IAAA,EAAM;AACtE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,IAChC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AACnD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAMO,SAAS,gBAAgB,SAAA,EAAoB;AAClD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,SAAS,CAAA;AAC7D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAMO,SAAS,gBAAgB,SAAA,EAAmB;AACjD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,YAAY,YAAY;AACtB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAOO,SAAS,iBAAA,CAAkB,UAAkB,SAAA,EAAmB;AACrE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,WAAA,KAAuC;AACxD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,aAAa,SAAS,CAAA;AAC7E,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,QAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AACxD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO;AAAA,GACpE,CAAA;AACH;AAQO,SAAS,QAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AACxD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC,aAAa,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO;AAAA,GAC3F,CAAA;AACH;AAQO,SAAS,YAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAA,EAAW,MAAM,CAAA;AAAA,IACzC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,WAAW,MAAM,CAAA;AAC5D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO;AAAA,GAC7C,CAAA;AACH;AAOO,SAAS,iBAAA,CAAkB,UAAkB,SAAA,EAAmB;AACrE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAmC;AACpD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,SAAS,SAAS,CAAA;AACzE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAUO,SAAS,gBACd,SAAA,EACA,QAAA,EACA,MAAA,EACA,SAAA,EACA,UAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,cAAA,EAAgB,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,IACtD,SAAS,YAAY;AACnB,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,QAAQ,SAAS,CAAA;AACjF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,QAAA,IAAY,CAAC,CAAC,OAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,CAAC;AAAA,GAChG,CAAA;AACH;AAMO,SAAS,qBAAqB,SAAA,EAAmB;AACtD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAsC;AACvD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,iBAAA,CAAkB,WAAW,OAAO,CAAA;AAClE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,SAAA,EAAmB;AACtF,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,SAAS,SAAS,CAAA;AAClF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,SAAA,EAAmB;AACtF,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,SAAS,SAAS,CAAA;AAClF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AASO,SAAS,YAAA,CACd,SAAA,EACA,QAAA,EACA,SAAA,EACA,UAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC3C,SAAS,YAAY;AACnB,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,SAAA,CAAU,SAAA,EAAW,UAAU,SAAS,CAAA;AACtE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,QAAA,IAAY,CAAC,CAAC;AAAA,GACpD,CAAA;AACH;ACxSO,SAAS,gBAAA,CACd,SAAA,EACA,WAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOC,QAAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,gBAAA,CAAiB,WAAW,WAAW,CAAA;AACrE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC;AAAA,GACtC,CAAA;AACH;AAOO,SAAS,eAAA,CAAgB,WAAmB,WAAA,EAAsB;AACvE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOC,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,UAAA,KAAoC;AACrD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAA,EAAW,YAAY,WAAW,CAAA;AAC7E,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,gBAAA,CACd,SAAA,EACA,SAAA,EACA,WAAA,EACA;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAkC;AACnD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAc,SAAA,EAAW,SAAA,EAAW,SAAS,WAAW,CAAA;AACtF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AASO,SAAS,gBAAA,CACd,QAAA,EACA,SAAA,EACA,SAAA,EACA,WAAA,EACA;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAkC;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,UAAU,SAAA,EAAW,OAAA,EAAS,WAAW,WAAW,CAAA;AAChG,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH","file":"index.mjs","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","useMemo","jsx","useContext","useQuery","useMutation"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|