@bookinglab/booking-journey-api 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.cts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -894,6 +894,15 @@ interface ResetPasswordRequest {
|
|
|
894
894
|
confirm_new_password: string;
|
|
895
895
|
current_password: string;
|
|
896
896
|
}
|
|
897
|
+
/**
|
|
898
|
+
* Find Client By Email Types
|
|
899
|
+
*/
|
|
900
|
+
interface FindClientByEmailResponse {
|
|
901
|
+
title?: string;
|
|
902
|
+
type?: string;
|
|
903
|
+
detail?: string;
|
|
904
|
+
[key: string]: any;
|
|
905
|
+
}
|
|
897
906
|
|
|
898
907
|
/**
|
|
899
908
|
* Core API Client
|
|
@@ -1010,6 +1019,13 @@ declare class BookingLabClient extends ApiClient {
|
|
|
1010
1019
|
* @param clientToken - Client token for authentication
|
|
1011
1020
|
*/
|
|
1012
1021
|
resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
|
|
1022
|
+
/**
|
|
1023
|
+
* Find a client by email address
|
|
1024
|
+
* @param companyId - The company ID
|
|
1025
|
+
* @param email - The email address to search for
|
|
1026
|
+
* @param clientToken - Client token for authentication
|
|
1027
|
+
*/
|
|
1028
|
+
findClientByEmail(companyId: number, email: string, clientToken: string): Promise<ApiResponse<FindClientByEmailResponse>>;
|
|
1013
1029
|
}
|
|
1014
1030
|
/**
|
|
1015
1031
|
* Create a new BookingLab client instance
|
|
@@ -1331,5 +1347,13 @@ declare function useCancelBooking(companyId: number, bookingId: number, clientTo
|
|
|
1331
1347
|
* @param clientToken - Client token for authentication
|
|
1332
1348
|
*/
|
|
1333
1349
|
declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
|
|
1350
|
+
/**
|
|
1351
|
+
* Hook for finding a client by email address
|
|
1352
|
+
* @param companyId - The company ID
|
|
1353
|
+
* @param email - The email address to search for
|
|
1354
|
+
* @param clientToken - Client token for authentication
|
|
1355
|
+
* @param enabled - Whether the query should run
|
|
1356
|
+
*/
|
|
1357
|
+
declare function useFindClientByEmail(companyId: number, email: string, clientToken: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<FindClientByEmailResponse, Error>;
|
|
1334
1358
|
|
|
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 };
|
|
1359
|
+
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 FindClientByEmailResponse, 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, useFindClientByEmail, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
package/dist/index.d.ts
CHANGED
|
@@ -894,6 +894,15 @@ interface ResetPasswordRequest {
|
|
|
894
894
|
confirm_new_password: string;
|
|
895
895
|
current_password: string;
|
|
896
896
|
}
|
|
897
|
+
/**
|
|
898
|
+
* Find Client By Email Types
|
|
899
|
+
*/
|
|
900
|
+
interface FindClientByEmailResponse {
|
|
901
|
+
title?: string;
|
|
902
|
+
type?: string;
|
|
903
|
+
detail?: string;
|
|
904
|
+
[key: string]: any;
|
|
905
|
+
}
|
|
897
906
|
|
|
898
907
|
/**
|
|
899
908
|
* Core API Client
|
|
@@ -1010,6 +1019,13 @@ declare class BookingLabClient extends ApiClient {
|
|
|
1010
1019
|
* @param clientToken - Client token for authentication
|
|
1011
1020
|
*/
|
|
1012
1021
|
resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
|
|
1022
|
+
/**
|
|
1023
|
+
* Find a client by email address
|
|
1024
|
+
* @param companyId - The company ID
|
|
1025
|
+
* @param email - The email address to search for
|
|
1026
|
+
* @param clientToken - Client token for authentication
|
|
1027
|
+
*/
|
|
1028
|
+
findClientByEmail(companyId: number, email: string, clientToken: string): Promise<ApiResponse<FindClientByEmailResponse>>;
|
|
1013
1029
|
}
|
|
1014
1030
|
/**
|
|
1015
1031
|
* Create a new BookingLab client instance
|
|
@@ -1331,5 +1347,13 @@ declare function useCancelBooking(companyId: number, bookingId: number, clientTo
|
|
|
1331
1347
|
* @param clientToken - Client token for authentication
|
|
1332
1348
|
*/
|
|
1333
1349
|
declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
|
|
1350
|
+
/**
|
|
1351
|
+
* Hook for finding a client by email address
|
|
1352
|
+
* @param companyId - The company ID
|
|
1353
|
+
* @param email - The email address to search for
|
|
1354
|
+
* @param clientToken - Client token for authentication
|
|
1355
|
+
* @param enabled - Whether the query should run
|
|
1356
|
+
*/
|
|
1357
|
+
declare function useFindClientByEmail(companyId: number, email: string, clientToken: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<FindClientByEmailResponse, Error>;
|
|
1334
1358
|
|
|
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 };
|
|
1359
|
+
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 FindClientByEmailResponse, 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, useFindClientByEmail, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
package/dist/index.js
CHANGED
|
@@ -278,6 +278,22 @@ var BookingLabClient = class extends ApiClient {
|
|
|
278
278
|
}
|
|
279
279
|
);
|
|
280
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* Find a client by email address
|
|
283
|
+
* @param companyId - The company ID
|
|
284
|
+
* @param email - The email address to search for
|
|
285
|
+
* @param clientToken - Client token for authentication
|
|
286
|
+
*/
|
|
287
|
+
async findClientByEmail(companyId, email, clientToken) {
|
|
288
|
+
return this.get(
|
|
289
|
+
`/company/${companyId}/client/email/${encodeURIComponent(email)}`,
|
|
290
|
+
{
|
|
291
|
+
headers: {
|
|
292
|
+
"clienttoken": clientToken
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
);
|
|
296
|
+
}
|
|
281
297
|
};
|
|
282
298
|
function createBookingLabClient(baseUrl, authToken) {
|
|
283
299
|
const client = new BookingLabClient({ baseUrl });
|
|
@@ -888,6 +904,17 @@ function useResetPassword(memberId, companyId, authToken, clientToken) {
|
|
|
888
904
|
}
|
|
889
905
|
});
|
|
890
906
|
}
|
|
907
|
+
function useFindClientByEmail(companyId, email, clientToken, enabled = true) {
|
|
908
|
+
const client = useBookingLabClient();
|
|
909
|
+
return reactQuery.useQuery({
|
|
910
|
+
queryKey: ["findClientByEmail", companyId, email],
|
|
911
|
+
queryFn: async () => {
|
|
912
|
+
const response = await client.findClientByEmail(companyId, email, clientToken);
|
|
913
|
+
return response.data;
|
|
914
|
+
},
|
|
915
|
+
enabled: enabled && !!companyId && !!email && !!clientToken
|
|
916
|
+
});
|
|
917
|
+
}
|
|
891
918
|
|
|
892
919
|
exports.ApiClient = ApiClient;
|
|
893
920
|
exports.ApiClientProvider = ApiClientProvider;
|
|
@@ -910,6 +937,7 @@ exports.useClientDetails = useClientDetails;
|
|
|
910
937
|
exports.useCreateBasket = useCreateBasket;
|
|
911
938
|
exports.useCreateClient = useCreateClient;
|
|
912
939
|
exports.useDates = useDates;
|
|
940
|
+
exports.useFindClientByEmail = useFindClientByEmail;
|
|
913
941
|
exports.useForgottenPassword = useForgottenPassword;
|
|
914
942
|
exports.useGetMember = useGetMember;
|
|
915
943
|
exports.useJrniClient = useJrniClient;
|
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}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","QueryClient","useMemo","jsx","QueryClientProvider","useContext","useMutation","useQuery"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n\n/**\n * Find Client By Email Types\n */\nexport interface FindClientByEmailResponse {\n title?: string;\n type?: string;\n detail?: string;\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, ResetPasswordRequest, LoginResponse, FindClientByEmailResponse } 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 * Find a client by email address\n * @param companyId - The company ID\n * @param email - The email address to search for\n * @param clientToken - Client token for authentication\n */\n async findClientByEmail(\n companyId: number,\n email: string,\n clientToken: string\n ): Promise<ApiResponse<FindClientByEmailResponse>> {\n return this.get<FindClientByEmailResponse>(\n `/company/${companyId}/client/email/${encodeURIComponent(email)}`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest, FindClientByEmailResponse } 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\n/**\n * Hook for finding a client by email address\n * @param companyId - The company ID\n * @param email - The email address to search for\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useFindClientByEmail(\n companyId: number,\n email: string,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['findClientByEmail', companyId, email],\n queryFn: async () => {\n const response = await client.findClientByEmail(companyId, email, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!email && !!clientToken,\n });\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -276,6 +276,22 @@ var BookingLabClient = class extends ApiClient {
|
|
|
276
276
|
}
|
|
277
277
|
);
|
|
278
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Find a client by email address
|
|
281
|
+
* @param companyId - The company ID
|
|
282
|
+
* @param email - The email address to search for
|
|
283
|
+
* @param clientToken - Client token for authentication
|
|
284
|
+
*/
|
|
285
|
+
async findClientByEmail(companyId, email, clientToken) {
|
|
286
|
+
return this.get(
|
|
287
|
+
`/company/${companyId}/client/email/${encodeURIComponent(email)}`,
|
|
288
|
+
{
|
|
289
|
+
headers: {
|
|
290
|
+
"clienttoken": clientToken
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
}
|
|
279
295
|
};
|
|
280
296
|
function createBookingLabClient(baseUrl, authToken) {
|
|
281
297
|
const client = new BookingLabClient({ baseUrl });
|
|
@@ -886,7 +902,18 @@ function useResetPassword(memberId, companyId, authToken, clientToken) {
|
|
|
886
902
|
}
|
|
887
903
|
});
|
|
888
904
|
}
|
|
905
|
+
function useFindClientByEmail(companyId, email, clientToken, enabled = true) {
|
|
906
|
+
const client = useBookingLabClient();
|
|
907
|
+
return useQuery({
|
|
908
|
+
queryKey: ["findClientByEmail", companyId, email],
|
|
909
|
+
queryFn: async () => {
|
|
910
|
+
const response = await client.findClientByEmail(companyId, email, clientToken);
|
|
911
|
+
return response.data;
|
|
912
|
+
},
|
|
913
|
+
enabled: enabled && !!companyId && !!email && !!clientToken
|
|
914
|
+
});
|
|
915
|
+
}
|
|
889
916
|
|
|
890
|
-
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 };
|
|
917
|
+
export { ApiClient, ApiClientProvider, BookingLabClient, BookingLabProvider, JrniClient, JrniProvider, MemberType, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useFindClientByEmail, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
|
|
891
918
|
//# sourceMappingURL=index.mjs.map
|
|
892
919
|
//# 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":"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","file":"index.mjs","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","useMemo","jsx","useContext","useQuery","useMutation"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n mobile?: string;\n phone?: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n\n/**\n * Find Client By Email Types\n */\nexport interface FindClientByEmailResponse {\n title?: string;\n type?: string;\n detail?: string;\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, ResetPasswordRequest, LoginResponse, FindClientByEmailResponse } 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 * Find a client by email address\n * @param companyId - The company ID\n * @param email - The email address to search for\n * @param clientToken - Client token for authentication\n */\n async findClientByEmail(\n companyId: number,\n email: string,\n clientToken: string\n ): Promise<ApiResponse<FindClientByEmailResponse>> {\n return this.get<FindClientByEmailResponse>(\n `/company/${companyId}/client/email/${encodeURIComponent(email)}`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest, FindClientByEmailResponse } 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\n/**\n * Hook for finding a client by email address\n * @param companyId - The company ID\n * @param email - The email address to search for\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useFindClientByEmail(\n companyId: number,\n email: string,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['findClientByEmail', companyId, email],\n queryFn: async () => {\n const response = await client.findClientByEmail(companyId, email, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!email && !!clientToken,\n });\n}\n"]}
|