@bookinglab/booking-journey-api 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -218,6 +218,7 @@ client.setAuthToken('your-auth-token');
218
218
  - `client.createBooking(data)` - Create a new booking
219
219
  - `client.updateBooking(id, data)` - Update a booking
220
220
  - `client.cancelBooking(companyId, bookingId, request, clientToken)` - Cancel a booking
221
+ - `client.resetPassword(memberId, companyId, request, authToken, clientToken)` - Reset a member's password
221
222
  - `client.deleteBooking(id)` - Delete a booking
222
223
  - `client.getServices()` - Get all services
223
224
  - `client.getService(id)` - Get a specific service
@@ -374,6 +375,7 @@ const client = useJrniClient();
374
375
  - `useCreateBooking()` - Create a new booking
375
376
  - `useUpdateBooking()` - Update a booking
376
377
  - `useCancelBooking(companyId, bookingId, clientToken)` - Cancel a booking
378
+ - `useResetPassword(memberId, companyId, authToken, clientToken)` - Reset a member's password
377
379
  - `useClientDetails(companyId, clientToken, enabled?)` - Get client details
378
380
  - `useCreateClient(companyId, clientToken?)` - Create a new client
379
381
  - `useServices()` - Get all services
@@ -461,6 +463,7 @@ import type {
461
463
  Service,
462
464
  CancelBookingRequest,
463
465
  CancelBookingResponse,
466
+ ResetPasswordRequest,
464
467
  } from '@bookinglab/booking-journey-api';
465
468
  ```
466
469
 
package/dist/index.d.cts CHANGED
@@ -839,6 +839,60 @@ interface UpdateClientResponse {
839
839
  }
840
840
  type UpdateMemberRequest = UpdateClientRequest;
841
841
  type UpdateMemberResponse = UpdateClientResponse;
842
+ /**
843
+ * Get Member Types
844
+ */
845
+ interface GetMemberResponse {
846
+ id: number;
847
+ name: string;
848
+ first_name: string;
849
+ last_name: string;
850
+ wallet_amount: number;
851
+ client_type: string;
852
+ email: string;
853
+ country: string;
854
+ phone: string;
855
+ phone_prefix: string;
856
+ phone_prefix_country_code: string;
857
+ mobile_prefix: string;
858
+ mobile_prefix_country_code: string;
859
+ auth_token: string;
860
+ path: string;
861
+ company_id: number;
862
+ has_active_wallet: boolean;
863
+ has_wallet: boolean;
864
+ consent: boolean;
865
+ locale: string;
866
+ q?: Record<string, {
867
+ answer: string;
868
+ answer_id: number;
869
+ name: string;
870
+ }>;
871
+ answers?: Array<{
872
+ question_id: number;
873
+ name: string;
874
+ answer: string;
875
+ answer_id: number;
876
+ }>;
877
+ notification_preferences?: {
878
+ email: {
879
+ bookings: boolean | null;
880
+ };
881
+ sms: {
882
+ bookings: boolean | null;
883
+ };
884
+ };
885
+ _links: Record<string, any>;
886
+ [key: string]: any;
887
+ }
888
+ /**
889
+ * Reset Password Types
890
+ */
891
+ interface ResetPasswordRequest {
892
+ new_password: string;
893
+ confirm_new_password: string;
894
+ current_password: string;
895
+ }
842
896
 
843
897
  /**
844
898
  * Core API Client
@@ -946,6 +1000,15 @@ declare class BookingLabClient extends ApiClient {
946
1000
  * @param clientToken - Client token for authentication
947
1001
  */
948
1002
  cancelBooking(companyId: number, bookingId: number, request: CancelBookingRequest, clientToken: string): Promise<ApiResponse<CancelBookingResponse>>;
1003
+ /**
1004
+ * Reset password for a member
1005
+ * @param memberId - The member ID
1006
+ * @param companyId - The company ID
1007
+ * @param request - Reset password request with current and new passwords
1008
+ * @param authToken - Auth token for authentication
1009
+ * @param clientToken - Client token for authentication
1010
+ */
1011
+ resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
949
1012
  }
950
1013
  /**
951
1014
  * Create a new BookingLab client instance
@@ -1058,6 +1121,13 @@ declare class JrniClient extends ApiClient {
1058
1121
  * @param authToken - Auth token for authenticated requests (required)
1059
1122
  */
1060
1123
  updateMember(companyId: number, memberId: number, request: UpdateMemberRequest, authToken: string): Promise<ApiResponse<UpdateMemberResponse>>;
1124
+ /**
1125
+ * Get a member by ID
1126
+ * @param companyId - The company ID
1127
+ * @param memberId - The member ID
1128
+ * @param authToken - Auth token for authenticated requests (required)
1129
+ */
1130
+ getMember(companyId: number, memberId: number, authToken: string): Promise<ApiResponse<GetMemberResponse>>;
1061
1131
  /**
1062
1132
  * Update JRNI configuration
1063
1133
  */
@@ -1224,6 +1294,14 @@ declare function useUpdateClient(companyId: number, clientId: number, authToken:
1224
1294
  * @param authToken - Auth token for authenticated requests (required)
1225
1295
  */
1226
1296
  declare function useUpdateMember(companyId: number, memberId: number, authToken: string): _tanstack_react_query.UseMutationResult<UpdateClientResponse, Error, UpdateClientRequest, unknown>;
1297
+ /**
1298
+ * Hook for fetching a member by ID
1299
+ * @param companyId - The company ID
1300
+ * @param memberId - The member ID
1301
+ * @param authToken - Auth token for authenticated requests (required)
1302
+ * @param enabled - Whether the query should run
1303
+ */
1304
+ declare function useGetMember(companyId: number, memberId: number, authToken: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<GetMemberResponse, Error>;
1227
1305
 
1228
1306
  /**
1229
1307
  * Hook for fetching client details
@@ -1245,5 +1323,13 @@ declare function useCreateClient(companyId: number, clientToken?: string): _tans
1245
1323
  * @param clientToken - Client token for authentication
1246
1324
  */
1247
1325
  declare function useCancelBooking(companyId: number, bookingId: number, clientToken: string): _tanstack_react_query.UseMutationResult<CancelBookingResponse, Error, CancelBookingRequest, unknown>;
1326
+ /**
1327
+ * Hook for resetting a member's password
1328
+ * @param memberId - The member ID
1329
+ * @param companyId - The company ID
1330
+ * @param authToken - Auth token for authentication
1331
+ * @param clientToken - Client token for authentication
1332
+ */
1333
+ declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
1248
1334
 
1249
- 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 GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
1335
+ export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type ResetPasswordRequest, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
package/dist/index.d.ts CHANGED
@@ -839,6 +839,60 @@ interface UpdateClientResponse {
839
839
  }
840
840
  type UpdateMemberRequest = UpdateClientRequest;
841
841
  type UpdateMemberResponse = UpdateClientResponse;
842
+ /**
843
+ * Get Member Types
844
+ */
845
+ interface GetMemberResponse {
846
+ id: number;
847
+ name: string;
848
+ first_name: string;
849
+ last_name: string;
850
+ wallet_amount: number;
851
+ client_type: string;
852
+ email: string;
853
+ country: string;
854
+ phone: string;
855
+ phone_prefix: string;
856
+ phone_prefix_country_code: string;
857
+ mobile_prefix: string;
858
+ mobile_prefix_country_code: string;
859
+ auth_token: string;
860
+ path: string;
861
+ company_id: number;
862
+ has_active_wallet: boolean;
863
+ has_wallet: boolean;
864
+ consent: boolean;
865
+ locale: string;
866
+ q?: Record<string, {
867
+ answer: string;
868
+ answer_id: number;
869
+ name: string;
870
+ }>;
871
+ answers?: Array<{
872
+ question_id: number;
873
+ name: string;
874
+ answer: string;
875
+ answer_id: number;
876
+ }>;
877
+ notification_preferences?: {
878
+ email: {
879
+ bookings: boolean | null;
880
+ };
881
+ sms: {
882
+ bookings: boolean | null;
883
+ };
884
+ };
885
+ _links: Record<string, any>;
886
+ [key: string]: any;
887
+ }
888
+ /**
889
+ * Reset Password Types
890
+ */
891
+ interface ResetPasswordRequest {
892
+ new_password: string;
893
+ confirm_new_password: string;
894
+ current_password: string;
895
+ }
842
896
 
843
897
  /**
844
898
  * Core API Client
@@ -946,6 +1000,15 @@ declare class BookingLabClient extends ApiClient {
946
1000
  * @param clientToken - Client token for authentication
947
1001
  */
948
1002
  cancelBooking(companyId: number, bookingId: number, request: CancelBookingRequest, clientToken: string): Promise<ApiResponse<CancelBookingResponse>>;
1003
+ /**
1004
+ * Reset password for a member
1005
+ * @param memberId - The member ID
1006
+ * @param companyId - The company ID
1007
+ * @param request - Reset password request with current and new passwords
1008
+ * @param authToken - Auth token for authentication
1009
+ * @param clientToken - Client token for authentication
1010
+ */
1011
+ resetPassword(memberId: number, companyId: number, request: ResetPasswordRequest, authToken: string, clientToken: string): Promise<ApiResponse<LoginResponse>>;
949
1012
  }
950
1013
  /**
951
1014
  * Create a new BookingLab client instance
@@ -1058,6 +1121,13 @@ declare class JrniClient extends ApiClient {
1058
1121
  * @param authToken - Auth token for authenticated requests (required)
1059
1122
  */
1060
1123
  updateMember(companyId: number, memberId: number, request: UpdateMemberRequest, authToken: string): Promise<ApiResponse<UpdateMemberResponse>>;
1124
+ /**
1125
+ * Get a member by ID
1126
+ * @param companyId - The company ID
1127
+ * @param memberId - The member ID
1128
+ * @param authToken - Auth token for authenticated requests (required)
1129
+ */
1130
+ getMember(companyId: number, memberId: number, authToken: string): Promise<ApiResponse<GetMemberResponse>>;
1061
1131
  /**
1062
1132
  * Update JRNI configuration
1063
1133
  */
@@ -1224,6 +1294,14 @@ declare function useUpdateClient(companyId: number, clientId: number, authToken:
1224
1294
  * @param authToken - Auth token for authenticated requests (required)
1225
1295
  */
1226
1296
  declare function useUpdateMember(companyId: number, memberId: number, authToken: string): _tanstack_react_query.UseMutationResult<UpdateClientResponse, Error, UpdateClientRequest, unknown>;
1297
+ /**
1298
+ * Hook for fetching a member by ID
1299
+ * @param companyId - The company ID
1300
+ * @param memberId - The member ID
1301
+ * @param authToken - Auth token for authenticated requests (required)
1302
+ * @param enabled - Whether the query should run
1303
+ */
1304
+ declare function useGetMember(companyId: number, memberId: number, authToken: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<GetMemberResponse, Error>;
1227
1305
 
1228
1306
  /**
1229
1307
  * Hook for fetching client details
@@ -1245,5 +1323,13 @@ declare function useCreateClient(companyId: number, clientToken?: string): _tans
1245
1323
  * @param clientToken - Client token for authentication
1246
1324
  */
1247
1325
  declare function useCancelBooking(companyId: number, bookingId: number, clientToken: string): _tanstack_react_query.UseMutationResult<CancelBookingResponse, Error, CancelBookingRequest, unknown>;
1326
+ /**
1327
+ * Hook for resetting a member's password
1328
+ * @param memberId - The member ID
1329
+ * @param companyId - The company ID
1330
+ * @param authToken - Auth token for authentication
1331
+ * @param clientToken - Client token for authentication
1332
+ */
1333
+ declare function useResetPassword(memberId: number, companyId: number, authToken: string, clientToken: string): _tanstack_react_query.UseMutationResult<LoginResponse, Error, ResetPasswordRequest, unknown>;
1248
1334
 
1249
- 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 GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
1335
+ export { type AddBasketItemRequest, type AddServiceItemAssets, type AddServiceItemQuestion, type AddServiceItemRequest, ApiClient, type ApiClientConfig, ApiClientProvider, type ApiError, type ApiResponse, type AvailabilityTime, type AvailabilityTimesResponse, type Booking, type BookingAnswer, BookingLabClient, BookingLabProvider, type BookingPaymentItem, type BookingSettings, type CancelBookingRequest, type CancelBookingResponse, type CheckoutBasketClient, type CheckoutBasketRequest, type CheckoutBasketResponse, type ChildCompaniesResponse, type ChildCompany, type ChildCompanyAddress, type ChildCompanySettings, type ClearBasketsResponse, type ClientDetailsQuestion, type ClientDetailsResponse, type CreateBasketRequest, type CreateBasketResponse, type CreateBookingRequest, type CreateClientRequest, type CreateClientResponse, type DateSlot, type DatesResponse, type ForgottenPasswordRequest, type ForgottenPasswordResponse, type GetChildCompaniesParams, type GetDatesParams, type GetMemberResponse, type GetQuestionsParams, type GetTimesParams, type JrniBooking, JrniClient, type JrniConfig, JrniProvider, type JrniService, type ListBookingsParams, type ListBookingsResponse, type Location, type LocationsResponse, type LoginRequest, type LoginResponse, type MemberBooking, type MemberBookingsResponse, MemberType, type PersonImage, type PersonImagesResponse, type Question, type QuestionOption, type QuestionsResponse, type RequestOptions, type ResetPasswordRequest, type Resource, type ResourceLinks, type ResourcesResponse, type Service, type ServiceItemResponse, type ServicesResponse, type TimeSlot, type TimesResponse, type UpdateClientAnswer, type UpdateClientAnswerEntry, type UpdateClientDetailsData, type UpdateClientExtraInfo, type UpdateClientNotificationPreferences, type UpdateClientQuestionEntry, type UpdateClientRequest, type UpdateClientResponse, type UpdateMemberDetailsData, type UpdateMemberRequest, type UpdateMemberResponse, type Vehicle, type VehiclesResponse, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
package/dist/index.js CHANGED
@@ -256,6 +256,28 @@ var BookingLabClient = class extends ApiClient {
256
256
  }
257
257
  );
258
258
  }
259
+ /**
260
+ * Reset password for a member
261
+ * @param memberId - The member ID
262
+ * @param companyId - The company ID
263
+ * @param request - Reset password request with current and new passwords
264
+ * @param authToken - Auth token for authentication
265
+ * @param clientToken - Client token for authentication
266
+ */
267
+ async resetPassword(memberId, companyId, request, authToken, clientToken) {
268
+ return this.post(
269
+ `/member/${memberId}/reset-password`,
270
+ request,
271
+ {
272
+ headers: {
273
+ "X-member-id": String(memberId),
274
+ "x-company-id": String(companyId),
275
+ "authtoken": authToken,
276
+ "clienttoken": clientToken
277
+ }
278
+ }
279
+ );
280
+ }
259
281
  };
260
282
  function createBookingLabClient(baseUrl, authToken) {
261
283
  const client = new BookingLabClient({ baseUrl });
@@ -543,6 +565,24 @@ var JrniClient = class extends ApiClient {
543
565
  }
544
566
  );
545
567
  }
568
+ /**
569
+ * Get a member by ID
570
+ * @param companyId - The company ID
571
+ * @param memberId - The member ID
572
+ * @param authToken - Auth token for authenticated requests (required)
573
+ */
574
+ async getMember(companyId, memberId, authToken) {
575
+ return this.get(
576
+ `/${companyId}/members/${memberId}`,
577
+ {
578
+ headers: {
579
+ ...this.getDefaultHeaders(),
580
+ "App-Key": this.appKey,
581
+ "Auth-Token": authToken
582
+ }
583
+ }
584
+ );
585
+ }
546
586
  /**
547
587
  * Update JRNI configuration
548
588
  */
@@ -817,6 +857,17 @@ function useUpdateMember(companyId, memberId, authToken) {
817
857
  }
818
858
  });
819
859
  }
860
+ function useGetMember(companyId, memberId, authToken, enabled = true) {
861
+ const client = useJrniClient();
862
+ return reactQuery.useQuery({
863
+ queryKey: ["getMember", companyId, memberId],
864
+ queryFn: async () => {
865
+ const response = await client.getMember(companyId, memberId, authToken);
866
+ return response.data;
867
+ },
868
+ enabled: enabled && !!companyId && !!memberId && !!authToken
869
+ });
870
+ }
820
871
  function useClientDetails(companyId, clientToken, enabled = true) {
821
872
  const client = useBookingLabClient();
822
873
  return reactQuery.useQuery({
@@ -846,6 +897,15 @@ function useCancelBooking(companyId, bookingId, clientToken) {
846
897
  }
847
898
  });
848
899
  }
900
+ function useResetPassword(memberId, companyId, authToken, clientToken) {
901
+ const client = useBookingLabClient();
902
+ return reactQuery.useMutation({
903
+ mutationFn: async (request) => {
904
+ const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);
905
+ return response.data;
906
+ }
907
+ });
908
+ }
849
909
 
850
910
  exports.ApiClient = ApiClient;
851
911
  exports.ApiClientProvider = ApiClientProvider;
@@ -869,11 +929,13 @@ exports.useCreateBasket = useCreateBasket;
869
929
  exports.useCreateClient = useCreateClient;
870
930
  exports.useDates = useDates;
871
931
  exports.useForgottenPassword = useForgottenPassword;
932
+ exports.useGetMember = useGetMember;
872
933
  exports.useJrniClient = useJrniClient;
873
934
  exports.useJrniContext = useJrniContext;
874
935
  exports.useListBookings = useListBookings;
875
936
  exports.useLogin = useLogin;
876
937
  exports.useQuestions = useQuestions;
938
+ exports.useResetPassword = useResetPassword;
877
939
  exports.useResources = useResources;
878
940
  exports.useServices = useServices;
879
941
  exports.useTimes = useTimes;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","QueryClient","useMemo","jsx","QueryClientProvider","useContext","useMutation","useQuery"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest } 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 * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","QueryClient","useMemo","jsx","QueryClientProvider","useContext","useMutation","useQuery"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
package/dist/index.mjs CHANGED
@@ -254,6 +254,28 @@ var BookingLabClient = class extends ApiClient {
254
254
  }
255
255
  );
256
256
  }
257
+ /**
258
+ * Reset password for a member
259
+ * @param memberId - The member ID
260
+ * @param companyId - The company ID
261
+ * @param request - Reset password request with current and new passwords
262
+ * @param authToken - Auth token for authentication
263
+ * @param clientToken - Client token for authentication
264
+ */
265
+ async resetPassword(memberId, companyId, request, authToken, clientToken) {
266
+ return this.post(
267
+ `/member/${memberId}/reset-password`,
268
+ request,
269
+ {
270
+ headers: {
271
+ "X-member-id": String(memberId),
272
+ "x-company-id": String(companyId),
273
+ "authtoken": authToken,
274
+ "clienttoken": clientToken
275
+ }
276
+ }
277
+ );
278
+ }
257
279
  };
258
280
  function createBookingLabClient(baseUrl, authToken) {
259
281
  const client = new BookingLabClient({ baseUrl });
@@ -541,6 +563,24 @@ var JrniClient = class extends ApiClient {
541
563
  }
542
564
  );
543
565
  }
566
+ /**
567
+ * Get a member by ID
568
+ * @param companyId - The company ID
569
+ * @param memberId - The member ID
570
+ * @param authToken - Auth token for authenticated requests (required)
571
+ */
572
+ async getMember(companyId, memberId, authToken) {
573
+ return this.get(
574
+ `/${companyId}/members/${memberId}`,
575
+ {
576
+ headers: {
577
+ ...this.getDefaultHeaders(),
578
+ "App-Key": this.appKey,
579
+ "Auth-Token": authToken
580
+ }
581
+ }
582
+ );
583
+ }
544
584
  /**
545
585
  * Update JRNI configuration
546
586
  */
@@ -815,6 +855,17 @@ function useUpdateMember(companyId, memberId, authToken) {
815
855
  }
816
856
  });
817
857
  }
858
+ function useGetMember(companyId, memberId, authToken, enabled = true) {
859
+ const client = useJrniClient();
860
+ return useQuery({
861
+ queryKey: ["getMember", companyId, memberId],
862
+ queryFn: async () => {
863
+ const response = await client.getMember(companyId, memberId, authToken);
864
+ return response.data;
865
+ },
866
+ enabled: enabled && !!companyId && !!memberId && !!authToken
867
+ });
868
+ }
818
869
  function useClientDetails(companyId, clientToken, enabled = true) {
819
870
  const client = useBookingLabClient();
820
871
  return useQuery({
@@ -844,7 +895,16 @@ function useCancelBooking(companyId, bookingId, clientToken) {
844
895
  }
845
896
  });
846
897
  }
898
+ function useResetPassword(memberId, companyId, authToken, clientToken) {
899
+ const client = useBookingLabClient();
900
+ return useMutation({
901
+ mutationFn: async (request) => {
902
+ const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);
903
+ return response.data;
904
+ }
905
+ });
906
+ }
847
907
 
848
- export { ApiClient, ApiClientProvider, BookingLabClient, BookingLabProvider, JrniClient, JrniProvider, MemberType, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
908
+ export { ApiClient, ApiClientProvider, BookingLabClient, BookingLabProvider, JrniClient, JrniProvider, MemberType, createBookingLabClient, createJrniClient, useAddServiceItem, useApiClientContext, useBookingLabClient, useBookingLabContext, useCancelBooking, useCheckoutBasket, useChildCompanies, useClearBaskets, useClientDetails, useCreateBasket, useCreateClient, useDates, useForgottenPassword, useGetMember, useJrniClient, useJrniContext, useListBookings, useLogin, useQuestions, useResetPassword, useResources, useServices, useTimes, useUpdateClient, useUpdateMember };
849
909
  //# sourceMappingURL=index.mjs.map
850
910
  //# sourceMappingURL=index.mjs.map
@@ -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 appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest } 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 * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/types.ts","../src/booking-lab.ts","../src/jrni.ts","../src/providers/ApiClientProvider.tsx","../src/providers/BookingLabProvider.tsx","../src/providers/JrniProvider.tsx","../src/hooks/useApiClient.ts","../src/hooks/useJrni.ts","../src/hooks/useBookingLab.ts"],"names":["MemberType","createContext","useMemo","jsx","useContext","useQuery","useMutation"],"mappings":";;;;;AAOO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAkC;AAC1C,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnE,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,EAAQ;AACxE,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAe;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,QAAA,EACA,OAAA,GAA0B,EAAC,EACF;AACzB,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,YAAA,EAAa,GAAI,OAAA;AAGpC,IAAA,IAAI,YAAA,GAAe,QAAA;AAInB,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,CAAS,SAAS,KAAK,YAAA,CAAa,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3E,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAAA,IACtD;AAIA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAI,KAAK,YAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACjE,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,YAAY,CAAA,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,GAAA,IAAO,IAAI,WAAW,CAAA,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,GAAK,YAAA,CAAa,OAAA,IAAsC;AAAC,KAC3D;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,YAAA;AAAA,QACH,OAAA;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,IAAA,CAAK,eAAe,KAAc,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,GAAA,CAAO,QAAA,EAAkB,OAAA,EAAmD;AAC1F,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,IAAA,CACd,QAAA,EACA,IAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU;AAAA,MAC/B,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACrC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,GAAA,CACd,QAAA,EACA,IAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU;AAAA,MAC/B,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACrC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,MAAA,CAAU,QAAA,EAAkB,OAAA,EAAmD;AAC7F,IAAA,OAAO,IAAA,CAAK,QAAW,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,QAAA,EAAuC;AAC/D,IAAA,IAAI,UAAU,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAC7D,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,SAAS,IAAA,EAAK;AAC9B,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MACpB,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAwB;AAC7C,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,iBAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,OAAA,IAAW,eAAA;AAAA,MAC1B,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACF;;;ACykBO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,WAAAA,CAAAA,WAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAFU,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;;;ACvwBL,IAAM,gBAAA,GAAN,cAA+B,SAAA,CAAU;AAAA;AAAA;AAAA;AAAA,EAI9C,MAAM,YAAY,MAAA,EAAkD;AAClE,IAAA,OAAO,IAAA,CAAK,IAAe,WAAA,EAAa;AAAA,MACtC,MAAA,EAAQ,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAkD;AACjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAA8D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAc,WAAA,EAAa,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,IAAI,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,SAAA,EAA+C;AACjE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA+C;AACnD,IAAA,OAAO,IAAA,CAAK,IAAe,WAAW,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAkD;AACjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,SAAA,EACA,WAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,YAAY,SAAS,CAAA,eAAA,CAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACJ,SAAA,EACA,UAAA,EACA,WAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,SAAS,CAAA,OAAA,CAAA;AAAA,MACrB,UAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA,GAAc,EAAE,aAAA,EAAe,aAAY,GAAI;AAAA;AAC1D,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,CACJ,SAAA,EACA,SAAA,EACA,SACA,WAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,CAAA,SAAA,EAAY,SAAS,CAAA,SAAA,EAAY,SAAS,CAAA,OAAA,CAAA;AAAA,MAC1C,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,OAAO,SAAS,CAAA;AAAA,UAChC,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACJ,QAAA,EACA,SAAA,EACA,OAAA,EACA,WACA,WAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,WAAW,QAAQ,CAAA,eAAA,CAAA;AAAA,MACnB,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,UAC9B,cAAA,EAAgB,OAAO,SAAS,CAAA;AAAA,UAChC,WAAA,EAAa,SAAA;AAAA,UACb,aAAA,EAAe;AAAA;AACjB;AACF,KACF;AAAA,EACF;AACF;AAKO,SAAS,sBAAA,CAAuB,SAAiB,SAAA,EAAoB;AAC1E,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,EAAE,SAAS,CAAA;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,aAAa,SAAS,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA;AACT;;;ACnIO,IAAM,UAAA,GAAN,cAAyB,SAAA,CAAU;AAAA,EAIxC,WAAA,CAAY,SAAiB,MAAA,EAAoB;AAC/C,IAAA,KAAA,CAAM,EAAE,SAAS,CAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4C;AAClD,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,WAAA,EAAgE;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAoB,QAAA,EAAU,WAAA,EAAa;AAAA,MACrD,OAAA,EAAS;AAAA,QACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,QAC1B,WAAW,IAAA,CAAK;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,SAAA,EACA,MAAA,EAC8C;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,YAAY,SAAS,CAAA,SAAA,CAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAA,EAA4D;AAC7E,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,UAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,SAAA,EAA2D;AAC3E,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,SAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CAAa,OAAA,EAA8B,SAAA,EAAgE;AAC/G,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,UAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAA,EAAgE;AACjF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,UAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,QAAA,EACA,WAAA,EACA,SAAA,EAC2C;AAC3C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,QAAQ,CAAA,cAAA,CAAA;AAAA,MACpB,WAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,MAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,MAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CACJ,SAAA,EACA,MAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,IAAI,SAAS,CAAA,UAAA,CAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,QAAA,EACA,OAAA,EACA,SAAA,EAC8C;AAC9C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAK,iBAAA,EAAkB;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KAClB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,YAAY,QAAQ,CAAA,SAAA,CAAA;AAAA,MACpB,OAAA;AAAA,MACA,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,QACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,SAAA,CAAA;AAAA,MACjC;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA,SAChB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,SAAA,EACA,OAAA,EACiD;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,UAAU,SAAS,CAAA,qBAAA,CAAA;AAAA,MACnB,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK;AAAA;AAClB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,SACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAAA,MAChC,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,QAAA,EACA,SACA,SAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA;AAAA,MACjC,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,CACJ,SAAA,EACA,QAAA,EACA,SAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA;AAAA,MACjC;AAAA,QACE,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,iBAAA,EAAkB;AAAA,UAC1B,WAAW,IAAA,CAAK,MAAA;AAAA,UAChB,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAA,EAA6B;AACzC,IAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,KAAA;AACtC,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,EAC1C;AACF;AAKO,SAAS,gBAAA,CAAiB,SAAiB,MAAA,EAAoB;AACpE,EAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AACvC;AClYA,IAAM,gBAAA,GAAmB,cAAiD,MAAS,CAAA;AAGnF,IAAM,kBAAA,GAAqB,IAAI,WAAA,CAAY;AAAA,EACzC,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA,MACpB,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAMM,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,SAAS,WAAA,IAAe,kBAAA;AAE9B,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,mBAAmB,OAAO,IAAA;AAC/B,IAAA,MAAM,iBAAiB,IAAI,gBAAA,CAAiB,EAAE,OAAA,EAAS,mBAAmB,CAAA;AAC1E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,CAAe,aAAa,SAAS,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAEjC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,OAAO,IAAI,UAAA,CAAW,WAAA,EAAa,UAAU,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,GAAG,CAAC,WAAA,EAAa,YAAY,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,gBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,kBAAkB,UAAU;AAAA,GAC/B;AAEA,EAAA,uBACE,GAAA,CAAC,uBAAoB,MAAA,EACnB,QAAA,kBAAA,GAAA,CAAC,iBAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAe,QAAA,EAAS,CAAA,EACrD,CAAA;AAEJ;AAKO,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,OAAA;AACT;ACzEA,IAAM,iBAAA,GAAoBC,cAAkD,MAAS,CAAA;AAK9E,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,MAAA,GAASC,QAAQ,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,IAAI,gBAAA,CAAiB,EAAE,SAAS,CAAA;AACvD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,CAAe,aAAa,SAAS,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,MAAM,KAAA,GAAQA,QAAQ,OAAO,EAAE,QAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAElD,EAAA,uBACEC,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAKO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,OAAA,GAAUC,WAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;ACnCA,IAAM,WAAA,GAAcH,cAA4C,MAAS,CAAA;AAKlE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,OAAA,EAAS,QAAO,EAAsB;AAC7E,EAAA,MAAM,MAAA,GAASC,QAAQ,MAAM;AAC3B,IAAA,OAAO,IAAI,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAAA,EACvC,GAAG,CAAC,OAAA,EAAS,OAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQA,QAAQ,OAAO,EAAE,QAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAElD,EAAA,uBAAOC,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAKO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;;;AChCO,SAAS,mBAAA,GAAsB;AAEpC,EAAA,IAAI;AACF,IAAA,OAAO,oBAAA,EAAqB;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,IAAA,IAAI,CAAC,QAAQ,gBAAA,EAAkB;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,gBAAA;AAAA,EACjB;AACF;AAKO,SAAS,aAAA,GAAgB;AAE9B,EAAA,IAAI;AACF,IAAA,OAAO,cAAA,EAAe;AAAA,EACxB,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,IAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,EACjB;AACF;AChCO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,WAAA,KAA8B;AAC/C,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAC/C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,iBAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,gBAAA,EAAkB,SAAA,EAAW,MAAM,CAAA;AAAA,IAC9C,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,iBAAA,CAAkB,WAAW,MAAM,CAAA;AACjE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAOO,SAAS,YAAA,CAAa,SAAA,EAAmB,OAAA,GAAmB,IAAA,EAAM;AACvE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,IACjC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAOO,SAAS,WAAA,CAAY,SAAA,EAAmB,OAAA,GAAmB,IAAA,EAAM;AACtE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,IAChC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AACnD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA,GACvB,CAAA;AACH;AAMO,SAAS,gBAAgB,SAAA,EAAoB;AAClD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,SAAS,CAAA;AAC7D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAMO,SAAS,gBAAgB,SAAA,EAAmB;AACjD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,YAAY,YAAY;AACtB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAOO,SAAS,iBAAA,CAAkB,UAAkB,SAAA,EAAmB;AACrE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,WAAA,KAAuC;AACxD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,aAAa,SAAS,CAAA;AAC7E,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,QAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AACxD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO;AAAA,GACpE,CAAA;AACH;AAQO,SAAS,QAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AACxD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC,aAAa,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO;AAAA,GAC3F,CAAA;AACH;AAQO,SAAS,YAAA,CACd,SAAA,EACA,MAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAA,EAAW,MAAM,CAAA;AAAA,IACzC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,WAAW,MAAM,CAAA;AAC5D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,MAAA,CAAO;AAAA,GAC7C,CAAA;AACH;AAOO,SAAS,iBAAA,CAAkB,UAAkB,SAAA,EAAmB;AACrE,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAmC;AACpD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAA,CAAe,QAAA,EAAU,SAAS,SAAS,CAAA;AACzE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAUO,SAAS,gBACd,SAAA,EACA,QAAA,EACA,MAAA,EACA,SAAA,EACA,UAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,cAAA,EAAgB,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,IACtD,SAAS,YAAY;AACnB,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,QAAQ,SAAS,CAAA;AACjF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,QAAA,IAAY,CAAC,CAAC,OAAO,UAAA,IAAc,CAAC,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,CAAC;AAAA,GAChG,CAAA;AACH;AAMO,SAAS,qBAAqB,SAAA,EAAmB;AACtD,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAsC;AACvD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,iBAAA,CAAkB,WAAW,OAAO,CAAA;AAClE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,SAAA,EAAmB;AACtF,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,SAAS,SAAS,CAAA;AAClF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,SAAA,EAAmB;AACtF,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAiC;AAClD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,aAAa,SAAA,EAAW,QAAA,EAAU,SAAS,SAAS,CAAA;AAClF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AASO,SAAS,YAAA,CACd,SAAA,EACA,QAAA,EACA,SAAA,EACA,UAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAE7B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,WAAA,EAAa,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC3C,SAAS,YAAY;AACnB,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,SAAA,CAAU,SAAA,EAAW,UAAU,SAAS,CAAA;AACtE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,QAAA,IAAY,CAAC,CAAC;AAAA,GACpD,CAAA;AACH;ACxSO,SAAS,gBAAA,CACd,SAAA,EACA,WAAA,EACA,OAAA,GAAmB,IAAA,EACnB;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOC,QAAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA;AAAA,IACrC,SAAS,YAAY;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,gBAAA,CAAiB,WAAW,WAAW,CAAA;AACrE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,SAAS,OAAA,IAAW,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC;AAAA,GACtC,CAAA;AACH;AAOO,SAAS,eAAA,CAAgB,WAAmB,WAAA,EAAsB;AACvE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOC,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,UAAA,KAAoC;AACrD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAA,EAAW,YAAY,WAAW,CAAA;AAC7E,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AAQO,SAAS,gBAAA,CACd,SAAA,EACA,SAAA,EACA,WAAA,EACA;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAkC;AACnD,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,cAAc,SAAA,EAAW,SAAA,EAAW,SAAS,WAAW,CAAA;AACtF,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH;AASO,SAAS,gBAAA,CACd,QAAA,EACA,SAAA,EACA,SAAA,EACA,WAAA,EACA;AACA,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,WAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAkC;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,UAAU,SAAA,EAAW,OAAA,EAAS,WAAW,WAAW,CAAA;AAChG,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAAA,GACD,CAAA;AACH","file":"index.mjs","sourcesContent":["/**\n * Core API Client\n * Base class for making HTTP requests\n */\n\nimport { ApiClientConfig, RequestOptions, ApiResponse, ApiError } from './types';\n\nexport class ApiClient {\n protected baseUrl: string;\n protected headers: Record<string, string>;\n protected timeout: number;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.headers = config.headers || {};\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<ApiClientConfig>) {\n if (config.baseUrl) this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n if (config.headers) this.headers = { ...this.headers, ...config.headers };\n if (config.timeout) this.timeout = config.timeout;\n }\n\n /**\n * Set authorization token\n */\n setAuthToken(token: string) {\n this.headers['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Make an HTTP request\n */\n protected async request<T>(\n endpoint: string,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const { params, ...fetchOptions } = options;\n\n // Build URL with query parameters\n let endpointPath = endpoint;\n\n // JRNI API v5 compatibility: avoid duplicating `/api/v5` when callers include it in both\n // the baseUrl (e.g. https://.../api/v5) and the endpoint (e.g. /api/v5/company/...)\n if (this.baseUrl.endsWith('/api/v5') && endpointPath.startsWith('/api/v5/')) {\n endpointPath = endpointPath.replace(/^\\/api\\/v5/, '');\n }\n\n // BookingLab API compatibility: avoid duplicating `/1` when baseUrl ends with /1\n // and endpoint also starts with /1/\n if (this.baseUrl.endsWith('/1') && endpointPath.startsWith('/1/')) {\n endpointPath = endpointPath.replace(/^\\/1/, '');\n }\n\n let url = `${this.baseUrl}${endpointPath}`;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n // Merge headers\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((fetchOptions.headers as Record<string, string>) || {}),\n };\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw await this.handleError(response);\n }\n\n const data = await response.json();\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n throw this.normalizeError(error as Error);\n }\n }\n\n /**\n * GET request\n */\n protected async get<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'GET' });\n }\n\n /**\n * POST request\n */\n protected async post<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n protected async put<T>(\n endpoint: string,\n body?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, {\n ...options,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n protected async delete<T>(endpoint: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n }\n\n /**\n * Handle error responses\n */\n private async handleError(response: Response): Promise<ApiError> {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n let details: any;\n\n try {\n details = await response.json();\n if (details.message) {\n message = details.message;\n } else if (details.error) {\n message = details.error;\n }\n } catch {\n // Response body is not JSON\n }\n\n return {\n message,\n status: response.status,\n details,\n };\n }\n\n /**\n * Normalize errors to consistent format\n */\n private normalizeError(error: Error): ApiError {\n if (error.name === 'AbortError') {\n return {\n message: 'Request timeout',\n code: 'TIMEOUT',\n };\n }\n\n if ('status' in error) {\n return error as ApiError;\n }\n\n return {\n message: error.message || 'Unknown error',\n code: 'UNKNOWN',\n };\n }\n}\n","/**\n * Core API Client Types\n */\n\nexport interface ApiClientConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ApiResponse<T = any> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\n// BookingLab API Types\nexport interface Booking {\n id: string;\n userId: string;\n serviceId: string;\n date: string;\n status: 'pending' | 'confirmed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateBookingRequest {\n userId: string;\n serviceId: string;\n date: string;\n notes?: string;\n}\n\nexport interface Service {\n id: string;\n name: string;\n description: string;\n duration: number;\n price: number;\n}\n\n/**\n * JRNI Configuration\n */\nexport interface JrniConfig {\n appId: string;\n appKey: string;\n}\n\n/**\n * JRNI API Types\n */\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n email: string;\n auth_token: string;\n company_id: number;\n path: string;\n role?: string;\n _embedded?: {\n members?: Array<{\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n email: string;\n [key: string]: any;\n }>;\n administrators?: any[];\n };\n _links?: any;\n}\n\nexport interface JrniService {\n id: number;\n name: string;\n description: string;\n durations: number[];\n prices: number[];\n detail_group_id: number;\n listed_durations: any[];\n extra: Record<string, any>;\n booking_time_step: number;\n can_refund_automatically: boolean;\n is_event_group: boolean;\n type: string;\n group_id: number | null;\n deleted: boolean;\n queuing_disabled: boolean;\n company_id: number;\n min_advance_period: number;\n max_advance_period: number;\n min_cancel_period: number;\n booking_type_public: string;\n booking_type: number;\n mbooking_type: number;\n min_bookings: number;\n max_bookings: number;\n method_of_appointment: string;\n groups: any[];\n order: number;\n child_level_service: boolean;\n global_id: number;\n availability: number;\n prices_in_major_units: number[];\n combine_resource_and_staff: boolean;\n disabled: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ServicesResponse {\n total_entries: number;\n _embedded: {\n services: JrniService[];\n };\n _links: Record<string, any>;\n}\n\nexport interface QuestionOption {\n name: string;\n price: number;\n is_default: boolean;\n id: number;\n}\n\nexport interface Question {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n default?: string;\n help_text?: string;\n _links: Record<string, any>;\n}\n\nexport interface QuestionsResponse {\n company_id: number;\n questions: Question[];\n name: string;\n _links: Record<string, any>;\n}\n\nexport interface Location {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address: {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n };\n}\n\nexport interface LocationsResponse {\n total_entries: number;\n _embedded: {\n resources: Location[];\n };\n _links: Record<string, any>;\n}\n\nexport interface Vehicle {\n id: number;\n name: string;\n description: string;\n type: string;\n extra: {\n vehicle_registration?: string;\n vehicle_make?: string;\n vehicle_model?: string;\n vehicle_size?: string;\n fuel_type?: string;\n vehicle_brand?: string;\n vehicle_transmission?: string;\n base_location?: string;\n driver_name?: string;\n driver_email?: string;\n };\n group_id: number | null;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n created_at: string;\n updated_at: string;\n _links: Record<string, any>;\n}\n\nexport interface VehiclesResponse {\n total_entries: number;\n _embedded: {\n people: Vehicle[];\n };\n _links: Record<string, any>;\n}\n\nexport interface AddBasketItemRequest {\n service_id: number;\n start: string;\n duration: number;\n company_id: string;\n person_id: number;\n questions: Array<{ id: string; answer: string }>;\n}\n\nexport interface AvailabilityTime {\n start: string;\n available: boolean;\n durations: number[];\n prices: number[];\n _links: Record<string, any>;\n}\n\nexport interface AvailabilityTimesResponse {\n times: AvailabilityTime[];\n}\n\nexport interface JrniBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n service_name: string;\n service_id: number;\n status: string;\n is_cancelled: boolean;\n min_cancellation_time?: number;\n person_ids?: number[];\n settings?: {\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n obfuscated_id?: string;\n who_updated?: string;\n };\n questions: Record<string, { answer: string; answer_id: number | null; name: string }>;\n _embedded?: {\n answers?: Array<{\n id: number;\n value: string;\n question_text: string;\n }>;\n };\n}\n\nexport interface MemberBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: JrniBooking[];\n };\n _links: Record<string, any>;\n}\n\nexport interface PersonImage {\n id: number;\n name: string;\n url: string;\n order: number;\n person_id?: number;\n}\n\nexport interface PersonImagesResponse {\n _embedded: {\n images: PersonImage[];\n };\n _links: Record<string, any>;\n}\n\nexport interface UpdateClientDetailsData {\n first_name: string;\n last_name: string;\n mobile: string;\n questions?: Record<string, { answer: string }>;\n}\n\nexport interface UpdateMemberDetailsData {\n first_name: string;\n last_name: string;\n mobile?: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n}\n\n/**\n * Child Company Types\n */\nexport interface ChildCompanyAddress {\n id: number;\n address1: string;\n address2: string;\n address3: string;\n address4: string;\n address5: string;\n postcode: string;\n country: string;\n lat: number;\n long: number;\n map_url: string;\n map_marker: string;\n phone: string;\n homephone: string;\n pretty_workphone: string;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompanySettings {\n has_services: boolean;\n has_resources: boolean;\n has_groups: boolean;\n payment_tax: number;\n currency: string;\n requires_login: boolean;\n has_wallets: boolean;\n has_question_groups: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ChildCompany {\n id: number;\n name: string;\n description: string;\n company_type: string;\n address_id: number;\n website: string;\n multi_status: string[];\n numeric_widget_id: number;\n currency_code: string;\n timezone: string;\n country_code: string;\n live: boolean;\n ref: string;\n created_at: string;\n updated_at: string;\n children_count: number;\n locale: string;\n available_locales: string[];\n membership_id: number;\n address: ChildCompanyAddress;\n _embedded: {\n settings: ChildCompanySettings;\n };\n _links: Record<string, any>;\n}\n\nexport interface ChildCompaniesResponse {\n total_entries: number;\n _embedded: {\n companies: ChildCompany[];\n };\n _links: Record<string, any>;\n}\n\nexport interface GetChildCompaniesParams {\n [key: string]: string | number | boolean | null | undefined;\n person_id?: number;\n Person_Id?: string;\n service_id?: string;\n}\n\n/**\n * Resource Types\n */\nexport interface ResourceLinks {\n self: { href: string };\n items: { href: string };\n images: { href: string };\n}\n\nexport interface Resource {\n id: number;\n name: string;\n type: string;\n group_id: number;\n deleted: boolean;\n disabled: boolean;\n company_id: number;\n order: number;\n max_book: number;\n _links: ResourceLinks;\n}\n\nexport interface ResourcesResponse {\n total_entries: number;\n _embedded: {\n resources: Resource[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Basket Types\n */\nexport interface CreateBasketRequest {\n company_id: number;\n}\n\nexport interface CreateBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n total_price_in_major_units: number;\n total_due_price_in_major_units: number;\n service_items: any[];\n event_items: any[];\n _embedded: {\n items: any[];\n items_removed: any[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Clear Baskets Response\n */\nexport interface ClearBasketsResponse {\n _embedded: {\n baskets: string[];\n };\n}\n\n/**\n * Add Service Item Types\n */\nexport interface AddServiceItemAssets {\n company_rule?: string[];\n person_rule?: string[];\n resource_rule?: string[];\n pre_time?: number[];\n post_time?: number[];\n person_group_id?: number[];\n resource_group_id?: number[];\n}\n\nexport interface AddServiceItemQuestion {\n id: string;\n answer: string;\n}\n\nexport interface AddServiceItemRequest {\n service_item_id?: string;\n service_id: number;\n start: string;\n duration?: number;\n company_id?: number;\n person_id?: number;\n resource_id?: number;\n assets?: AddServiceItemAssets;\n requested_assets?: AddServiceItemAssets;\n questions: AddServiceItemQuestion[];\n pre_time?: number;\n post_time?: number;\n time_zone?: string;\n}\n\nexport interface ServiceItemResponse {\n id: string;\n type: string;\n company_id: number;\n service_id: number;\n person_id: number;\n resource_id: number;\n attachment_id: number;\n questions: string[];\n duration: number;\n start: string;\n expires: string;\n price: number;\n total_price: number;\n discount_price: number;\n price_in_major_units: number;\n total_price_in_major_units: number;\n discount_price_in_major_units: number;\n requested_assets: string[];\n held_assets: string[];\n}\n\n/**\n * Get Times Types\n */\nexport interface GetTimesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n person_id?: number;\n resource_id?: number;\n start_date: string;\n end_date?: string;\n}\n\nexport interface TimeSlot {\n start: string;\n available: boolean;\n durations: number[];\n}\n\nexport interface TimesResponse {\n times: TimeSlot[];\n}\n\n/**\n * Get Questions Types\n */\nexport interface GetQuestionsParams {\n [key: string]: string | number | boolean | null | undefined;\n detail_group_id: number;\n include_hidden_questions?: boolean;\n}\n\n/**\n * Checkout Basket Types\n */\nexport interface CheckoutBasketClient {\n id: number;\n}\n\nexport interface CheckoutBasketRequest {\n client: CheckoutBasketClient;\n take_from_wallet?: boolean;\n reference?: string;\n no_notifications?: boolean;\n}\n\nexport interface CheckoutBasketResponse {\n id: string;\n company_id: number;\n total_price: number;\n total_due_price: number;\n status: string;\n reference?: string;\n _embedded?: {\n bookings?: any[];\n member?: any;\n };\n _links?: Record<string, any>;\n}\n\n/**\n * List Bookings Types\n */\nexport interface ListBookingsParams {\n [key: string]: string | number | boolean | null | undefined;\n start_date: string;\n end_date: string;\n include_cancelled?: string;\n}\n\nexport interface BookingPaymentItem {\n id: number;\n price: number;\n paid: number;\n describe: string;\n full_describe: string;\n item_type: string;\n _links: Record<string, any>;\n}\n\nexport interface BookingAnswer {\n id: number;\n value: string;\n price: number;\n question_id: number;\n answer_id: number;\n admin_only: boolean;\n important: boolean;\n question_text: string;\n outcome: boolean;\n company_id: number;\n _links: Record<string, any>;\n}\n\nexport interface BookingSettings {\n obfuscated_id?: string;\n token?: string;\n current_multi_stat?: string;\n multi_stats?: Record<string, string>;\n who_updated?: string;\n}\n\nexport interface MemberBooking {\n id: number;\n full_describe: string;\n describe: string;\n person_name: string;\n datetime: string;\n end_datetime: string;\n duration: number;\n on_waitlist: boolean;\n company_id: number;\n attended: boolean;\n price: number;\n paid: number;\n quantity: number;\n event_id: number;\n purchase_id: number;\n purchase_ref: string;\n min_cancellation_time: string;\n service_name: string;\n service_id: number;\n time_zone: string;\n status: string;\n is_cancelled: boolean;\n mobile: string;\n person_ids: number[];\n settings: BookingSettings;\n questions: Record<string, {\n answer: string;\n answer_id: number;\n name: string;\n }>;\n _embedded: {\n payment_item?: BookingPaymentItem;\n answers?: BookingAnswer[];\n };\n _links: Record<string, any>;\n}\n\nexport interface ListBookingsResponse {\n total_entries: number;\n _embedded: {\n bookings: MemberBooking[];\n };\n _links: Record<string, any>;\n}\n\n/**\n * Create Client Types\n */\nexport interface CreateClientRequest {\n email: string;\n first_name: string;\n last_name: string;\n consent?: boolean;\n send_welcome_email?: boolean;\n member_type?: number;\n password?: string;\n}\n\n/**\n * Cancel Booking Types (BookingLab)\n */\nexport interface CancelBookingRequest {\n notify: boolean;\n reason: string;\n}\n\nexport interface CancelBookingResponse {\n id: number;\n status: string;\n is_cancelled: boolean;\n [key: string]: any;\n}\n\nexport interface CreateClientResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n locale: string;\n q: Record<string, any>;\n answers: any[];\n notification_preferences: {\n email: { bookings: boolean };\n sms: { bookings: boolean };\n };\n bl_jrni_auth_token: string;\n _links: Record<string, any>;\n}\n\n/**\n * Client Details Types\n */\nexport interface ClientDetailsQuestion {\n id: number;\n name: string;\n required: boolean;\n important: boolean;\n admin_only: boolean;\n applies_to: number;\n ask_member: boolean;\n detail_type: string;\n options?: QuestionOption[];\n settings: Record<string, any>;\n price: number;\n price_per_booking: boolean;\n outcome: boolean;\n hide_on_customer_journey: boolean;\n _links: Record<string, any>;\n}\n\nexport interface ClientDetailsResponse {\n company_id: number;\n questions: ClientDetailsQuestion[];\n offer_login: boolean;\n ask_address: boolean;\n no_phone: number;\n _links: Record<string, any>;\n}\n\n/**\n * Get Dates Types\n */\nexport interface GetDatesParams {\n [key: string]: string | number | boolean | null | undefined;\n service_id: number;\n start_date: string;\n end_date: string;\n person_id?: number;\n resource_id?: number;\n}\n\nexport interface DateSlot {\n start_date: string;\n count: number;\n available: boolean;\n}\n\nexport interface DatesResponse {\n dates: DateSlot[];\n}\n\n/**\n * Forgotten Password Types\n */\nexport interface ForgottenPasswordRequest {\n email: string;\n}\n\nexport interface ForgottenPasswordResponse {\n result: string;\n message: string;\n}\n\n/**\n * Update Client Types\n */\nexport enum MemberType {\n Type1 = 1,\n Type2 = 2,\n}\n\nexport interface UpdateClientExtraInfo {\n locale?: string;\n comp_ref?: string;\n default_company_id?: string;\n reference?: string;\n join_date?: string;\n}\n\nexport interface UpdateClientNotificationPreferences {\n email?: {\n bookings?: boolean;\n };\n sms?: {\n bookings?: boolean;\n };\n}\n\nexport interface UpdateClientQuestionEntry {\n answer: string;\n answer_id: number;\n name: string;\n}\n\nexport interface UpdateClientAnswerEntry {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientRequest {\n first_name?: string;\n first_name_extra?: string;\n last_name?: string;\n last_name_extra?: string;\n email?: string;\n mobile_prefix?: string;\n mobile?: string;\n mobile_prefix_country_code?: string;\n phone_prefix?: string;\n phone?: string;\n phone_prefix_country_code?: string;\n address1?: string;\n address2?: string;\n address3?: string;\n address4?: string;\n address5?: string;\n postcode?: string;\n country?: string;\n member_type?: MemberType;\n member_level_id?: number;\n mem_join_date?: string;\n time_zone?: string;\n consent?: boolean;\n extra_info?: UpdateClientExtraInfo;\n notification_preferences?: UpdateClientNotificationPreferences;\n q?: Record<string, UpdateClientQuestionEntry>;\n answers?: UpdateClientAnswerEntry[];\n}\n\nexport interface UpdateClientAnswer {\n question_id: number;\n name: string;\n answer: string;\n answer_id: number;\n}\n\nexport interface UpdateClientResponse {\n first_name: string;\n last_name: string;\n name: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n id: number;\n answers: UpdateClientAnswer[];\n deleted: boolean;\n notifications: Record<string, any>;\n client_type: string;\n locale: string;\n consent: boolean;\n _links: Record<string, any>;\n notification_preferences: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n}\n\n// Update Member types (same shape as Update Client)\nexport type UpdateMemberRequest = UpdateClientRequest;\nexport type UpdateMemberResponse = UpdateClientResponse;\n\n/**\n * Get Member Types\n */\nexport interface GetMemberResponse {\n id: number;\n name: string;\n first_name: string;\n last_name: string;\n wallet_amount: number;\n client_type: string;\n email: string;\n country: string;\n phone: string;\n phone_prefix: string;\n phone_prefix_country_code: string;\n mobile_prefix: string;\n mobile_prefix_country_code: string;\n auth_token: string;\n path: string;\n company_id: number;\n has_active_wallet: boolean;\n has_wallet: boolean;\n consent: boolean;\n locale: string;\n q?: Record<string, { answer: string; answer_id: number; name: string }>;\n answers?: Array<{ question_id: number; name: string; answer: string; answer_id: number }>;\n notification_preferences?: {\n email: { bookings: boolean | null };\n sms: { bookings: boolean | null };\n };\n _links: Record<string, any>;\n [key: string]: any;\n}\n\n/**\n * Reset Password Types\n */\nexport interface ResetPasswordRequest {\n new_password: string;\n confirm_new_password: string;\n current_password: string;\n}\n","/**\n * BookingLab API Client\n * Provides methods for interacting with the BookingLab API\n */\n\nimport { ApiClient } from './core';\nimport { Booking, CreateBookingRequest, Service, ApiResponse, ClientDetailsResponse, CreateClientRequest, CreateClientResponse, CancelBookingRequest, CancelBookingResponse, ResetPasswordRequest, LoginResponse } from './types';\n\nexport class BookingLabClient extends ApiClient {\n /**\n * Get all bookings\n */\n async getBookings(userId?: string): Promise<ApiResponse<Booking[]>> {\n return this.get<Booking[]>('/bookings', {\n params: userId ? { userId } : undefined,\n });\n }\n\n /**\n * Get a single booking by ID\n */\n async getBooking(bookingId: string): Promise<ApiResponse<Booking>> {\n return this.get<Booking>(`/bookings/${bookingId}`);\n }\n\n /**\n * Create a new booking\n */\n async createBooking(booking: CreateBookingRequest): Promise<ApiResponse<Booking>> {\n return this.post<Booking>('/bookings', booking);\n }\n\n /**\n * Update an existing booking\n */\n async updateBooking(\n bookingId: string,\n updates: Partial<Booking>\n ): Promise<ApiResponse<Booking>> {\n return this.put<Booking>(`/bookings/${bookingId}`, updates);\n }\n\n /**\n * Delete a booking\n */\n\n /**\n * Delete a booking\n */\n async deleteBooking(bookingId: string): Promise<ApiResponse<void>> {\n return this.delete<void>(`/bookings/${bookingId}`);\n }\n\n /**\n * Get all services\n */\n async getServices(): Promise<ApiResponse<Service[]>> {\n return this.get<Service[]>('/services');\n }\n\n /**\n * Get a single service by ID\n */\n async getService(serviceId: string): Promise<ApiResponse<Service>> {\n return this.get<Service>(`/services/${serviceId}`);\n }\n\n /**\n * Get client details for a company\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n */\n async getClientDetails(\n companyId: number,\n clientToken: string\n ): Promise<ApiResponse<ClientDetailsResponse>> {\n return this.get<ClientDetailsResponse>(\n `/company/${companyId}/client-details`,\n {\n headers: {\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Create a new client for a company\n * @param companyId - The company ID\n * @param clientData - Client registration data\n * @param clientToken - Optional client token for authentication\n */\n async createClient(\n companyId: number,\n clientData: CreateClientRequest,\n clientToken?: string\n ): Promise<ApiResponse<CreateClientResponse>> {\n return this.post<CreateClientResponse>(\n `/company/${companyId}/client`,\n clientData,\n {\n headers: clientToken ? { 'clienttoken': clientToken } : undefined,\n }\n );\n }\n\n /**\n * Cancel a booking for a company\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param request - Cancel booking request with notify flag and reason\n * @param clientToken - Client token for authentication\n */\n async cancelBooking(\n companyId: number,\n bookingId: number,\n request: CancelBookingRequest,\n clientToken: string\n ): Promise<ApiResponse<CancelBookingResponse>> {\n return this.post<CancelBookingResponse>(\n `/company/${companyId}/booking/${bookingId}/cancel`,\n request,\n {\n headers: {\n 'x-company-id': String(companyId),\n 'clienttoken': clientToken,\n },\n }\n );\n }\n\n /**\n * Reset password for a member\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param request - Reset password request with current and new passwords\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\n async resetPassword(\n memberId: number,\n companyId: number,\n request: ResetPasswordRequest,\n authToken: string,\n clientToken: string\n ): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>(\n `/member/${memberId}/reset-password`,\n request,\n {\n headers: {\n 'X-member-id': String(memberId),\n 'x-company-id': String(companyId),\n 'authtoken': authToken,\n 'clienttoken': clientToken,\n },\n }\n );\n }\n}\n\n/**\n * Create a new BookingLab client instance\n */\nexport function createBookingLabClient(baseUrl: string, authToken?: string) {\n const client = new BookingLabClient({ baseUrl });\n if (authToken) {\n client.setAuthToken(authToken);\n }\n return client;\n}\n","/**\n * JRNI API Client\n * Provides methods for interacting with the JRNI API\n */\n\nimport { ApiClient } from './core';\nimport { \n LoginRequest, \n LoginResponse, \n ApiResponse, \n JrniConfig,\n ChildCompaniesResponse,\n GetChildCompaniesParams,\n ResourcesResponse,\n ServicesResponse,\n CreateBasketRequest,\n CreateBasketResponse,\n ClearBasketsResponse,\n AddServiceItemRequest,\n ServiceItemResponse,\n GetTimesParams,\n TimesResponse,\n GetDatesParams,\n DatesResponse,\n GetQuestionsParams,\n QuestionsResponse,\n CheckoutBasketRequest,\n CheckoutBasketResponse,\n ListBookingsParams,\n ListBookingsResponse,\n ForgottenPasswordRequest,\n ForgottenPasswordResponse,\n UpdateClientRequest,\n UpdateClientResponse,\n UpdateMemberRequest,\n UpdateMemberResponse,\n GetMemberResponse,\n} from './types';\n\nexport class JrniClient extends ApiClient {\n private appId: string;\n private appKey: string;\n\n constructor(baseUrl: string, config: JrniConfig) {\n super({ baseUrl });\n this.appId = config.appId;\n this.appKey = config.appKey;\n }\n\n /**\n * Get default headers for JRNI API requests\n */\n private getDefaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'App-Id': this.appId,\n };\n }\n\n /**\n * Login to JRNI\n */\n async login(credentials: LoginRequest): Promise<ApiResponse<LoginResponse>> {\n return this.post<LoginResponse>('/login', credentials, {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n });\n }\n\n /**\n * Get child companies for a parent company\n * @param companyId - The parent company ID\n * @param params - Optional query parameters (person_id, Person_Id)\n */\n async getChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams\n ): Promise<ApiResponse<ChildCompaniesResponse>> {\n return this.get<ChildCompaniesResponse>(\n `/company/${companyId}/children`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get resources for a company\n * @param companyId - The company ID\n */\n async getResources(companyId: number): Promise<ApiResponse<ResourcesResponse>> {\n return this.get<ResourcesResponse>(\n `/${companyId}/resources`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Get services for a company\n * @param companyId - The company ID\n */\n async getServices(companyId: number): Promise<ApiResponse<ServicesResponse>> {\n return this.get<ServicesResponse>(\n `/${companyId}/services`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Create a new basket\n * @param request - The create basket request containing company_id\n * @param authToken - Optional auth token for authenticated requests\n */\n async createBasket(request: CreateBasketRequest, authToken?: string): Promise<ApiResponse<CreateBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CreateBasketResponse>(\n '/baskets',\n request,\n { headers }\n );\n }\n\n /**\n * Clear all baskets\n * @param authToken - Optional auth token for authenticated requests\n */\n async clearBaskets(authToken?: string): Promise<ApiResponse<ClearBasketsResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.delete<ClearBasketsResponse>(\n '/baskets',\n { headers }\n );\n }\n\n /**\n * Add a service item to a basket\n * @param basketId - The basket ID\n * @param serviceItem - The service item data\n * @param authToken - Optional auth token for authenticated requests\n */\n async addServiceItem(\n basketId: string,\n serviceItem: AddServiceItemRequest,\n authToken?: string\n ): Promise<ApiResponse<ServiceItemResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<ServiceItemResponse>(\n `/baskets/${basketId}/service_items`,\n serviceItem,\n { headers }\n );\n }\n\n /**\n * Get available times for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n */\n async getTimes(\n companyId: number,\n params: GetTimesParams\n ): Promise<ApiResponse<TimesResponse>> {\n return this.get<TimesResponse>(\n `/${companyId}/times`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get available dates for a service\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n */\n async getDates(\n companyId: number,\n params: GetDatesParams\n ): Promise<ApiResponse<DatesResponse>> {\n return this.get<DatesResponse>(\n `/${companyId}/dates`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Get questions for a company\n * @param companyId - The company ID\n * @param params - Query parameters including detail_group_id (required)\n */\n async getQuestions(\n companyId: number,\n params: GetQuestionsParams\n ): Promise<ApiResponse<QuestionsResponse>> {\n return this.get<QuestionsResponse>(\n `/${companyId}/questions`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n params,\n }\n );\n }\n\n /**\n * Checkout a basket\n * @param basketId - The basket ID\n * @param request - The checkout request containing client info and options\n * @param authToken - Optional auth token for authenticated requests\n */\n async checkoutBasket(\n basketId: string,\n request: CheckoutBasketRequest,\n authToken?: string\n ): Promise<ApiResponse<CheckoutBasketResponse>> {\n const headers: Record<string, string> = {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n };\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n return this.post<CheckoutBasketResponse>(\n `/baskets/${basketId}/checkout`,\n request,\n { headers }\n );\n }\n\n /**\n * List bookings for a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n */\n async listBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string\n ): Promise<ApiResponse<ListBookingsResponse>> {\n return this.get<ListBookingsResponse>(\n `/${companyId}/members/${memberId}/bookings`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n params,\n }\n );\n }\n\n /**\n * Request password reset email\n * @param companyId - The company ID\n * @param request - The request containing the email address\n */\n async forgottenPassword(\n companyId: number,\n request: ForgottenPasswordRequest\n ): Promise<ApiResponse<ForgottenPasswordResponse>> {\n return this.post<ForgottenPasswordResponse>(\n `/login/${companyId}/email_password_reset`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n },\n }\n );\n }\n\n /**\n * Update a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateClient(\n companyId: number,\n clientId: number,\n request: UpdateClientRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateClientResponse>> {\n return this.put<UpdateClientResponse>(\n `/${companyId}/client/${clientId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param request - The update request data\n * @param authToken - Auth token for authenticated requests (required)\n */\n async updateMember(\n companyId: number,\n memberId: number,\n request: UpdateMemberRequest,\n authToken: string\n ): Promise<ApiResponse<UpdateMemberResponse>> {\n return this.put<UpdateMemberResponse>(\n `/${companyId}/members/${memberId}`,\n request,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Get a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\n async getMember(\n companyId: number,\n memberId: number,\n authToken: string\n ): Promise<ApiResponse<GetMemberResponse>> {\n return this.get<GetMemberResponse>(\n `/${companyId}/members/${memberId}`,\n {\n headers: {\n ...this.getDefaultHeaders(),\n 'App-Key': this.appKey,\n 'Auth-Token': authToken,\n },\n }\n );\n }\n\n /**\n * Update JRNI configuration\n */\n setJrniConfig(config: Partial<JrniConfig>) {\n if (config.appId) this.appId = config.appId;\n if (config.appKey) this.appKey = config.appKey;\n }\n}\n\n/**\n * Create a new JRNI client instance\n */\nexport function createJrniClient(baseUrl: string, config: JrniConfig) {\n return new JrniClient(baseUrl, config);\n}\n","/**\n * React Context Provider for API Clients\n * Combined provider for applications using multiple API clients\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BookingLabClient } from '../booking-lab';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface ApiClientContextValue {\n bookingLabClient: BookingLabClient | null;\n jrniClient: JrniClient | null;\n}\n\ninterface ApiClientProviderProps {\n children: ReactNode;\n bookingLabBaseUrl?: string;\n jrniBaseUrl?: string;\n jrniConfig?: JrniConfig;\n authToken?: string;\n queryClient?: QueryClient;\n}\n\nconst ApiClientContext = createContext<ApiClientContextValue | undefined>(undefined);\n\n// Default QueryClient for the provider\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\n/**\n * Combined provider for multiple API clients\n * Includes QueryClientProvider for React Query hooks\n */\nexport function ApiClientProvider({\n children,\n bookingLabBaseUrl,\n jrniBaseUrl,\n jrniConfig,\n authToken,\n queryClient,\n}: ApiClientProviderProps) {\n const client = queryClient || defaultQueryClient;\n\n const bookingLabClient = useMemo(() => {\n if (!bookingLabBaseUrl) return null;\n const clientInstance = new BookingLabClient({ baseUrl: bookingLabBaseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [bookingLabBaseUrl, authToken]);\n\n const jrniClient = useMemo(() => {\n if (jrniBaseUrl && jrniConfig) {\n return new JrniClient(jrniBaseUrl, jrniConfig);\n }\n return null;\n }, [jrniBaseUrl, jrniConfig?.appId, jrniConfig?.appKey]);\n\n const value = useMemo(\n () => ({\n bookingLabClient,\n jrniClient,\n }),\n [bookingLabClient, jrniClient]\n );\n\n return (\n <QueryClientProvider client={client}>\n <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access API client context\n */\nexport function useApiClientContext() {\n const context = useContext(ApiClientContext);\n if (context === undefined) {\n throw new Error('useApiClientContext must be used within an ApiClientProvider');\n }\n return context;\n}\n","/**\n * React Context Provider for BookingLab API Client\n * Standalone provider for apps that only use BookingLab\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { BookingLabClient } from '../booking-lab';\n\ninterface BookingLabContextValue {\n client: BookingLabClient;\n}\n\ninterface BookingLabProviderProps {\n children: ReactNode;\n baseUrl: string;\n authToken?: string;\n}\n\nconst BookingLabContext = createContext<BookingLabContextValue | undefined>(undefined);\n\n/**\n * Provider component for BookingLab client\n */\nexport function BookingLabProvider({\n children,\n baseUrl,\n authToken,\n}: BookingLabProviderProps) {\n const client = useMemo(() => {\n const clientInstance = new BookingLabClient({ baseUrl });\n if (authToken) {\n clientInstance.setAuthToken(authToken);\n }\n return clientInstance;\n }, [baseUrl, authToken]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <BookingLabContext.Provider value={value}>\n {children}\n </BookingLabContext.Provider>\n );\n}\n\n/**\n * Hook to access BookingLab client from context\n */\nexport function useBookingLabContext() {\n const context = useContext(BookingLabContext);\n if (context === undefined) {\n throw new Error('useBookingLabContext must be used within a BookingLabProvider');\n }\n return context.client;\n}\n","/**\n * React Context Provider for JRNI API Client\n * Standalone provider for apps that only use JRNI\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode } from 'react';\nimport { JrniClient } from '../jrni';\nimport { JrniConfig } from '../types';\n\ninterface JrniContextValue {\n client: JrniClient;\n}\n\ninterface JrniProviderProps {\n children: ReactNode;\n baseUrl: string;\n config: JrniConfig;\n}\n\nconst JrniContext = createContext<JrniContextValue | undefined>(undefined);\n\n/**\n * Provider component for JRNI client\n */\nexport function JrniProvider({ children, baseUrl, config }: JrniProviderProps) {\n const client = useMemo(() => {\n return new JrniClient(baseUrl, config);\n }, [baseUrl, config.appId, config.appKey]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n return <JrniContext.Provider value={value}>{children}</JrniContext.Provider>;\n}\n\n/**\n * Hook to access JRNI client from context\n */\nexport function useJrniContext() {\n const context = useContext(JrniContext);\n if (context === undefined) {\n throw new Error('useJrniContext must be used within a JrniProvider');\n }\n return context.client;\n}\n","/**\n * Hook to access API clients from context\n */\n\nimport { useApiClientContext } from '../providers/ApiClientProvider';\nimport { useBookingLabContext } from '../providers/BookingLabProvider';\nimport { useJrniContext } from '../providers/JrniProvider';\n\n/**\n * Hook to get BookingLab client from either ApiClientProvider or BookingLabProvider\n */\nexport function useBookingLabClient() {\n // Try to get from standalone provider first\n try {\n return useBookingLabContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.bookingLabClient) {\n throw new Error(\n 'BookingLab client not configured. Wrap your app with ApiClientProvider or BookingLabProvider.'\n );\n }\n return context.bookingLabClient;\n }\n}\n\n/**\n * Hook to get JRNI client from either ApiClientProvider or JrniProvider\n */\nexport function useJrniClient() {\n // Try to get from standalone provider first\n try {\n return useJrniContext();\n } catch {\n // Fall back to combined provider\n const context = useApiClientContext();\n if (!context.jrniClient) {\n throw new Error(\n 'JRNI client not configured. Wrap your app with ApiClientProvider or JrniProvider.'\n );\n }\n return context.jrniClient;\n }\n}\n","/**\n * React hooks for JRNI API\n * @module hooks/useJrni\n */\n\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useJrniClient } from './useApiClient';\nimport type { LoginRequest, GetChildCompaniesParams, CreateBasketRequest, AddServiceItemRequest, GetTimesParams, GetDatesParams, GetQuestionsParams, CheckoutBasketRequest, ListBookingsParams, ForgottenPasswordRequest, UpdateClientRequest, UpdateMemberRequest, GetMemberResponse } from '../types';\n\n/**\n * Hook for JRNI login\n */\nexport function useLogin() {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (credentials: LoginRequest) => {\n const response = await client.login(credentials);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching child companies\n * @param companyId - The parent company ID\n * @param params - Optional query parameters\n * @param enabled - Whether the query should run\n */\nexport function useChildCompanies(\n companyId: number,\n params?: GetChildCompaniesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['childCompanies', companyId, params],\n queryFn: async () => {\n const response = await client.getChildCompanies(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching resources\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useResources(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['resources', companyId],\n queryFn: async () => {\n const response = await client.getResources(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for fetching services\n * @param companyId - The company ID\n * @param enabled - Whether the query should run\n */\nexport function useServices(companyId: number, enabled: boolean = true) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['services', companyId],\n queryFn: async () => {\n const response = await client.getServices(companyId);\n return response.data;\n },\n enabled: enabled && !!companyId,\n });\n}\n\n/**\n * Hook for creating a basket\n * @param authToken - Optional auth token for authenticated requests\n */\nexport function useCreateBasket(authToken?: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CreateBasketRequest) => {\n const response = await client.createBasket(request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for clearing baskets\n * @param authToken - Auth token for authenticated requests\n */\nexport function useClearBaskets(authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await client.clearBaskets(authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for adding a service item to a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useAddServiceItem(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (serviceItem: AddServiceItemRequest) => {\n const response = await client.addServiceItem(basketId, serviceItem, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching available times\n * @param companyId - The company ID\n * @param params - Query parameters (service_id required, start_date required)\n * @param enabled - Whether the query should run\n */\nexport function useTimes(\n companyId: number,\n params: GetTimesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['times', companyId, params],\n queryFn: async () => {\n const response = await client.getTimes(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date,\n });\n}\n\n/**\n * Hook for fetching available dates\n * @param companyId - The company ID\n * @param params - Query parameters (service_id, start_date, end_date required)\n * @param enabled - Whether the query should run\n */\nexport function useDates(\n companyId: number,\n params: GetDatesParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['dates', companyId, params],\n queryFn: async () => {\n const response = await client.getDates(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.service_id && !!params.start_date && !!params.end_date,\n });\n}\n\n/**\n * Hook for fetching questions\n * @param companyId - The company ID\n * @param params - Query parameters (detail_group_id required)\n * @param enabled - Whether the query should run\n */\nexport function useQuestions(\n companyId: number,\n params: GetQuestionsParams,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['questions', companyId, params],\n queryFn: async () => {\n const response = await client.getQuestions(companyId, params);\n return response.data;\n },\n enabled: enabled && !!companyId && !!params.detail_group_id,\n });\n}\n\n/**\n * Hook for checking out a basket\n * @param basketId - The basket ID\n * @param authToken - Auth token for authenticated requests\n */\nexport function useCheckoutBasket(basketId: string, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: CheckoutBasketRequest) => {\n const response = await client.checkoutBasket(basketId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for listing member bookings\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param params - Query parameters (start_date, end_date, include_cancelled)\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useListBookings(\n companyId: number,\n memberId: number,\n params: ListBookingsParams,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['listBookings', companyId, memberId, params],\n queryFn: async () => {\n const response = await client.listBookings(companyId, memberId, params, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!params.start_date && !!params.end_date && !!authToken,\n });\n}\n\n/**\n * Hook for requesting a password reset email\n * @param companyId - The company ID\n */\nexport function useForgottenPassword(companyId: number) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: ForgottenPasswordRequest) => {\n const response = await client.forgottenPassword(companyId, request);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a client/member\n * @param companyId - The company ID\n * @param clientId - The client/member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateClient(companyId: number, clientId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateClientRequest) => {\n const response = await client.updateClient(companyId, clientId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for updating a member\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n */\nexport function useUpdateMember(companyId: number, memberId: number, authToken: string) {\n const client = useJrniClient();\n\n return useMutation({\n mutationFn: async (request: UpdateMemberRequest) => {\n const response = await client.updateMember(companyId, memberId, request, authToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for fetching a member by ID\n * @param companyId - The company ID\n * @param memberId - The member ID\n * @param authToken - Auth token for authenticated requests (required)\n * @param enabled - Whether the query should run\n */\nexport function useGetMember(\n companyId: number,\n memberId: number,\n authToken: string,\n enabled: boolean = true\n) {\n const client = useJrniClient();\n\n return useQuery({\n queryKey: ['getMember', companyId, memberId],\n queryFn: async () => {\n const response = await client.getMember(companyId, memberId, authToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!memberId && !!authToken,\n });\n}\n","/**\n * React hooks for BookingLab API\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { useBookingLabClient } from './useApiClient';\nimport type { CreateClientRequest, CancelBookingRequest, ResetPasswordRequest } from '../types';\n\nexport { useBookingLabClient } from './useApiClient';\n\n/**\n * Hook for fetching client details\n * @param companyId - The company ID\n * @param clientToken - Client token for authentication\n * @param enabled - Whether the query should run\n */\nexport function useClientDetails(\n companyId: number,\n clientToken: string,\n enabled: boolean = true\n) {\n const client = useBookingLabClient();\n\n return useQuery({\n queryKey: ['clientDetails', companyId],\n queryFn: async () => {\n const response = await client.getClientDetails(companyId, clientToken);\n return response.data;\n },\n enabled: enabled && !!companyId && !!clientToken,\n });\n}\n\n/**\n * Hook for creating a new client\n * @param companyId - The company ID\n * @param clientToken - Optional client token for authentication\n */\nexport function useCreateClient(companyId: number, clientToken?: string) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (clientData: CreateClientRequest) => {\n const response = await client.createClient(companyId, clientData, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for cancelling a booking\n * @param companyId - The company ID\n * @param bookingId - The booking ID to cancel\n * @param clientToken - Client token for authentication\n */\nexport function useCancelBooking(\n companyId: number,\n bookingId: number,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: CancelBookingRequest) => {\n const response = await client.cancelBooking(companyId, bookingId, request, clientToken);\n return response.data;\n },\n });\n}\n\n/**\n * Hook for resetting a member's password\n * @param memberId - The member ID\n * @param companyId - The company ID\n * @param authToken - Auth token for authentication\n * @param clientToken - Client token for authentication\n */\nexport function useResetPassword(\n memberId: number,\n companyId: number,\n authToken: string,\n clientToken: string\n) {\n const client = useBookingLabClient();\n\n return useMutation({\n mutationFn: async (request: ResetPasswordRequest) => {\n const response = await client.resetPassword(memberId, companyId, request, authToken, clientToken);\n return response.data;\n },\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bookinglab/booking-journey-api",
3
- "version": "1.11.0",
3
+ "version": "1.13.0",
4
4
  "type": "module",
5
5
  "description": "TypeScript library for BookingLab and JRNI APIs with React hooks support",
6
6
  "main": "./dist/index.js",