@bookinglab/booking-journey-api 1.12.0 → 1.13.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 +3 -0
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +32 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -218,6 +218,7 @@ client.setAuthToken('your-auth-token');
|
|
|
218
218
|
- `client.createBooking(data)` - Create a new booking
|
|
219
219
|
- `client.updateBooking(id, data)` - Update a booking
|
|
220
220
|
- `client.cancelBooking(companyId, bookingId, request, clientToken)` - Cancel a booking
|
|
221
|
+
- `client.resetPassword(memberId, companyId, request, authToken, clientToken)` - Reset a member's password
|
|
221
222
|
- `client.deleteBooking(id)` - Delete a booking
|
|
222
223
|
- `client.getServices()` - Get all services
|
|
223
224
|
- `client.getService(id)` - Get a specific service
|
|
@@ -374,6 +375,7 @@ const client = useJrniClient();
|
|
|
374
375
|
- `useCreateBooking()` - Create a new booking
|
|
375
376
|
- `useUpdateBooking()` - Update a booking
|
|
376
377
|
- `useCancelBooking(companyId, bookingId, clientToken)` - Cancel a booking
|
|
378
|
+
- `useResetPassword(memberId, companyId, authToken, clientToken)` - Reset a member's password
|
|
377
379
|
- `useClientDetails(companyId, clientToken, enabled?)` - Get client details
|
|
378
380
|
- `useCreateClient(companyId, clientToken?)` - Create a new client
|
|
379
381
|
- `useServices()` - Get all services
|
|
@@ -461,6 +463,7 @@ import type {
|
|
|
461
463
|
Service,
|
|
462
464
|
CancelBookingRequest,
|
|
463
465
|
CancelBookingResponse,
|
|
466
|
+
ResetPasswordRequest,
|
|
464
467
|
} from '@bookinglab/booking-journey-api';
|
|
465
468
|
```
|
|
466
469
|
|
package/dist/index.d.cts
CHANGED
|
@@ -885,6 +885,14 @@ interface GetMemberResponse {
|
|
|
885
885
|
_links: Record<string, any>;
|
|
886
886
|
[key: string]: any;
|
|
887
887
|
}
|
|
888
|
+
/**
|
|
889
|
+
* Reset Password Types
|
|
890
|
+
*/
|
|
891
|
+
interface ResetPasswordRequest {
|
|
892
|
+
new_password: string;
|
|
893
|
+
confirm_new_password: string;
|
|
894
|
+
current_password: string;
|
|
895
|
+
}
|
|
888
896
|
|
|
889
897
|
/**
|
|
890
898
|
* Core API Client
|
|
@@ -992,6 +1000,15 @@ declare class BookingLabClient extends ApiClient {
|
|
|
992
1000
|
* @param clientToken - Client token for authentication
|
|
993
1001
|
*/
|
|
994
1002
|
cancelBooking(companyId: number, bookingId: number, request: CancelBookingRequest, clientToken: string): Promise<ApiResponse<CancelBookingResponse>>;
|
|
1003
|
+
/**
|
|
1004
|
+
* Reset password for a member
|
|
1005
|
+
* @param memberId - The member ID
|
|
1006
|
+
* @param companyId - The company ID
|
|
1007
|
+
* @param request - Reset password request with current and new passwords
|
|
1008
|
+
* @param authToken - Auth token for authentication
|
|
1009
|
+
* @param clientToken - Client token for authentication
|
|
1010
|
+
*/
|
|
1011
|
+
resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
|
|
995
1012
|
}
|
|
996
1013
|
/**
|
|
997
1014
|
* Create a new BookingLab client instance
|
|
@@ -1306,5 +1323,13 @@ declare function useCreateClient(companyId: number, clientToken?: string): _tans
|
|
|
1306
1323
|
* @param clientToken - Client token for authentication
|
|
1307
1324
|
*/
|
|
1308
1325
|
declare function useCancelBooking(companyId: number, bookingId: number, clientToken: string): _tanstack_react_query.UseMutationResult<CancelBookingResponse, Error, CancelBookingRequest, unknown>;
|
|
1326
|
+
/**
|
|
1327
|
+
* Hook for resetting a member's password
|
|
1328
|
+
* @param memberId - The member ID
|
|
1329
|
+
* @param companyId - The company ID
|
|
1330
|
+
* @param authToken - Auth token for authentication
|
|
1331
|
+
* @param clientToken - Client token for authentication
|
|
1332
|
+
*/
|
|
1333
|
+
declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
|
|
1309
1334
|
|
|
1310
|
-
export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
|
1335
|
+
export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type ResetPasswordRequest, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
package/dist/index.d.ts
CHANGED
|
@@ -885,6 +885,14 @@ interface GetMemberResponse {
|
|
|
885
885
|
_links: Record<string, any>;
|
|
886
886
|
[key: string]: any;
|
|
887
887
|
}
|
|
888
|
+
/**
|
|
889
|
+
* Reset Password Types
|
|
890
|
+
*/
|
|
891
|
+
interface ResetPasswordRequest {
|
|
892
|
+
new_password: string;
|
|
893
|
+
confirm_new_password: string;
|
|
894
|
+
current_password: string;
|
|
895
|
+
}
|
|
888
896
|
|
|
889
897
|
/**
|
|
890
898
|
* Core API Client
|
|
@@ -992,6 +1000,15 @@ declare class BookingLabClient extends ApiClient {
|
|
|
992
1000
|
* @param clientToken - Client token for authentication
|
|
993
1001
|
*/
|
|
994
1002
|
cancelBooking(companyId: number, bookingId: number, request: CancelBookingRequest, clientToken: string): Promise<ApiResponse<CancelBookingResponse>>;
|
|
1003
|
+
/**
|
|
1004
|
+
* Reset password for a member
|
|
1005
|
+
* @param memberId - The member ID
|
|
1006
|
+
* @param companyId - The company ID
|
|
1007
|
+
* @param request - Reset password request with current and new passwords
|
|
1008
|
+
* @param authToken - Auth token for authentication
|
|
1009
|
+
* @param clientToken - Client token for authentication
|
|
1010
|
+
*/
|
|
1011
|
+
resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
|
|
995
1012
|
}
|
|
996
1013
|
/**
|
|
997
1014
|
* Create a new BookingLab client instance
|
|
@@ -1306,5 +1323,13 @@ declare function useCreateClient(companyId: number, clientToken?: string): _tans
|
|
|
1306
1323
|
* @param clientToken - Client token for authentication
|
|
1307
1324
|
*/
|
|
1308
1325
|
declare function useCancelBooking(companyId: number, bookingId: number, clientToken: string): _tanstack_react_query.UseMutationResult<CancelBookingResponse, Error, CancelBookingRequest, unknown>;
|
|
1326
|
+
/**
|
|
1327
|
+
* Hook for resetting a member's password
|
|
1328
|
+
* @param memberId - The member ID
|
|
1329
|
+
* @param companyId - The company ID
|
|
1330
|
+
* @param authToken - Auth token for authentication
|
|
1331
|
+
* @param clientToken - Client token for authentication
|
|
1332
|
+
*/
|
|
1333
|
+
declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
|
|
1309
1334
|
|
|
1310
|
-
export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
|
1335
|
+
export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type ResetPasswordRequest, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
package/dist/index.js
CHANGED
|
@@ -256,6 +256,28 @@ var BookingLabClient = class extends ApiClient {
|
|
|
256
256
|
}
|
|
257
257
|
);
|
|
258
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Reset password for a member
|
|
261
|
+
* @param memberId - The member ID
|
|
262
|
+
* @param companyId - The company ID
|
|
263
|
+
* @param request - Reset password request with current and new passwords
|
|
264
|
+
* @param authToken - Auth token for authentication
|
|
265
|
+
* @param clientToken - Client token for authentication
|
|
266
|
+
*/
|
|
267
|
+
async resetPassword(memberId, companyId, request, authToken, clientToken) {
|
|
268
|
+
return this.post(
|
|
269
|
+
`/member/${memberId}/reset-password`,
|
|
270
|
+
request,
|
|
271
|
+
{
|
|
272
|
+
headers: {
|
|
273
|
+
"X-member-id": String(memberId),
|
|
274
|
+
"x-company-id": String(companyId),
|
|
275
|
+
"authtoken": authToken,
|
|
276
|
+
"clienttoken": clientToken
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
);
|
|
280
|
+
}
|
|
259
281
|
};
|
|
260
282
|
function createBookingLabClient(baseUrl, authToken) {
|
|
261
283
|
const client = new BookingLabClient({ baseUrl });
|
|
@@ -875,6 +897,15 @@ function useCancelBooking(companyId, bookingId, clientToken) {
|
|
|
875
897
|
}
|
|
876
898
|
});
|
|
877
899
|
}
|
|
900
|
+
function useResetPassword(memberId, companyId, authToken, clientToken) {
|
|
901
|
+
const client = useBookingLabClient();
|
|
902
|
+
return reactQuery.useMutation({
|
|
903
|
+
mutationFn: async (request) => {
|
|
904
|
+
const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);
|
|
905
|
+
return response.data;
|
|
906
|
+
}
|
|
907
|
+
});
|
|
908
|
+
}
|
|
878
909
|
|
|
879
910
|
exports.ApiClient = ApiClient;
|
|
880
911
|
exports.ApiClientProvider = ApiClientProvider;
|
|
@@ -904,6 +935,7 @@ exports.useJrniContext = useJrniContext;
|
|
|
904
935
|
exports.useListBookings = useListBookings;
|
|
905
936
|
exports.useLogin = useLogin;
|
|
906
937
|
exports.useQuestions = useQuestions;
|
|
938
|
+
exports.useResetPassword = useResetPassword;
|
|
907
939
|
exports.useResources = useResources;
|
|
908
940
|
exports.useServices = useServices;
|
|
909
941
|
exports.useTimes = useTimes;
|
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 * 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 } 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/**\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 } 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"]}
|
|
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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -254,6 +254,28 @@ var BookingLabClient = class extends ApiClient {
|
|
|
254
254
|
}
|
|
255
255
|
);
|
|
256
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Reset password for a member
|
|
259
|
+
* @param memberId - The member ID
|
|
260
|
+
* @param companyId - The company ID
|
|
261
|
+
* @param request - Reset password request with current and new passwords
|
|
262
|
+
* @param authToken - Auth token for authentication
|
|
263
|
+
* @param clientToken - Client token for authentication
|
|
264
|
+
*/
|
|
265
|
+
async resetPassword(memberId, companyId, request, authToken, clientToken) {
|
|
266
|
+
return this.post(
|
|
267
|
+
`/member/${memberId}/reset-password`,
|
|
268
|
+
request,
|
|
269
|
+
{
|
|
270
|
+
headers: {
|
|
271
|
+
"X-member-id": String(memberId),
|
|
272
|
+
"x-company-id": String(companyId),
|
|
273
|
+
"authtoken": authToken,
|
|
274
|
+
"clienttoken": clientToken
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
}
|
|
257
279
|
};
|
|
258
280
|
function createBookingLabClient(baseUrl, authToken) {
|
|
259
281
|
const client = new BookingLabClient({ baseUrl });
|
|
@@ -873,7 +895,16 @@ function useCancelBooking(companyId, bookingId, clientToken) {
|
|
|
873
895
|
}
|
|
874
896
|
});
|
|
875
897
|
}
|
|
898
|
+
function useResetPassword(memberId, companyId, authToken, clientToken) {
|
|
899
|
+
const client = useBookingLabClient();
|
|
900
|
+
return useMutation({
|
|
901
|
+
mutationFn: async (request) => {
|
|
902
|
+
const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);
|
|
903
|
+
return response.data;
|
|
904
|
+
}
|
|
905
|
+
});
|
|
906
|
+
}
|
|
876
907
|
|
|
877
|
-
export { ApiClient, ApiClientProvider, BookingLabClient, BookingLabProvider, JrniClient, JrniProvider, MemberType, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
|
908
|
+
export { ApiClient, ApiClientProvider, BookingLabClient, BookingLabProvider, JrniClient, JrniProvider, MemberType, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
|
878
909
|
//# sourceMappingURL=index.mjs.map
|
|
879
910
|
//# sourceMappingURL=index.mjs.map
|
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;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;;;ACtGO,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","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 * 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 } 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/**\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 } 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"]}
|
|
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 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"]}
|