@voyantjs/customer-portal-react 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/client.d.ts +16 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +78 -0
  4. package/dist/hooks/index.d.ts +8 -0
  5. package/dist/hooks/index.d.ts.map +1 -0
  6. package/dist/hooks/index.js +7 -0
  7. package/dist/hooks/use-customer-portal-booking-documents.d.ts +13 -0
  8. package/dist/hooks/use-customer-portal-booking-documents.d.ts.map +1 -0
  9. package/dist/hooks/use-customer-portal-booking-documents.js +12 -0
  10. package/dist/hooks/use-customer-portal-booking.d.ts +63 -0
  11. package/dist/hooks/use-customer-portal-booking.d.ts.map +1 -0
  12. package/dist/hooks/use-customer-portal-booking.js +12 -0
  13. package/dist/hooks/use-customer-portal-bookings.d.ts +20 -0
  14. package/dist/hooks/use-customer-portal-bookings.d.ts.map +1 -0
  15. package/dist/hooks/use-customer-portal-bookings.js +12 -0
  16. package/dist/hooks/use-customer-portal-companions.d.ts +17 -0
  17. package/dist/hooks/use-customer-portal-companions.d.ts.map +1 -0
  18. package/dist/hooks/use-customer-portal-companions.js +12 -0
  19. package/dist/hooks/use-customer-portal-contact-exists.d.ts +12 -0
  20. package/dist/hooks/use-customer-portal-contact-exists.d.ts.map +1 -0
  21. package/dist/hooks/use-customer-portal-contact-exists.js +12 -0
  22. package/dist/hooks/use-customer-portal-mutation.d.ts +167 -0
  23. package/dist/hooks/use-customer-portal-mutation.d.ts.map +1 -0
  24. package/dist/hooks/use-customer-portal-mutation.js +54 -0
  25. package/dist/hooks/use-customer-portal-profile.d.ts +36 -0
  26. package/dist/hooks/use-customer-portal-profile.d.ts.map +1 -0
  27. package/dist/hooks/use-customer-portal-profile.js +12 -0
  28. package/dist/index.d.ts +9 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +7 -0
  31. package/dist/operations.d.ts +253 -0
  32. package/dist/operations.d.ts.map +1 -0
  33. package/dist/operations.js +50 -0
  34. package/dist/provider.d.ts +2 -0
  35. package/dist/provider.d.ts.map +1 -0
  36. package/dist/provider.js +1 -0
  37. package/dist/query-keys.d.ts +14 -0
  38. package/dist/query-keys.d.ts.map +1 -0
  39. package/dist/query-keys.js +10 -0
  40. package/dist/query-options.d.ts +576 -0
  41. package/dist/query-options.d.ts.map +1 -0
  42. package/dist/query-options.js +40 -0
  43. package/dist/schemas.d.ts +321 -0
  44. package/dist/schemas.d.ts.map +1 -0
  45. package/dist/schemas.js +14 -0
  46. package/package.json +84 -0
@@ -0,0 +1,16 @@
1
+ import type { z } from "zod";
2
+ export type VoyantFetcher = (url: string, init?: RequestInit) => Promise<Response>;
3
+ export declare const defaultFetcher: VoyantFetcher;
4
+ export declare class VoyantApiError extends Error {
5
+ readonly status: number;
6
+ readonly body: unknown;
7
+ constructor(message: string, status: number, body: unknown);
8
+ }
9
+ export interface FetchWithValidationOptions {
10
+ baseUrl: string;
11
+ fetcher: VoyantFetcher;
12
+ }
13
+ export type QueryParamValue = string | number | boolean | null | undefined | Array<string | number | boolean>;
14
+ export declare function fetchWithValidation<TOut>(path: string, schema: z.ZodType<TOut>, options: FetchWithValidationOptions, init?: RequestInit): Promise<TOut>;
15
+ export declare function withQueryParams(path: string, query?: object): string;
16
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,eAAO,MAAM,cAAc,EAAE,aACoB,CAAA;AAEjD,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;gBAEV,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D;AAcD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;AAEpC,wBAAsB,mBAAmB,CAAC,IAAI,EAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,0BAA0B,EACnC,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBpE"}
package/dist/client.js ADDED
@@ -0,0 +1,78 @@
1
+ export const defaultFetcher = (url, init) => fetch(url, { credentials: "include", ...init });
2
+ export class VoyantApiError extends Error {
3
+ status;
4
+ body;
5
+ constructor(message, status, body) {
6
+ super(message);
7
+ this.name = "VoyantApiError";
8
+ this.status = status;
9
+ this.body = body;
10
+ }
11
+ }
12
+ function extractErrorMessage(status, statusText, body) {
13
+ if (typeof body === "object" && body !== null && "error" in body) {
14
+ const err = body.error;
15
+ if (typeof err === "string")
16
+ return err;
17
+ if (typeof err === "object" && err !== null && "message" in err) {
18
+ return String(err.message);
19
+ }
20
+ }
21
+ return `Voyant API error: ${status} ${statusText}`;
22
+ }
23
+ export async function fetchWithValidation(path, schema, options, init) {
24
+ const url = joinUrl(options.baseUrl, path);
25
+ const headers = new Headers(init?.headers);
26
+ if (init?.body !== undefined && !headers.has("Content-Type")) {
27
+ headers.set("Content-Type", "application/json");
28
+ }
29
+ const response = await options.fetcher(url, { ...init, headers });
30
+ if (!response.ok) {
31
+ const body = await safeJson(response);
32
+ throw new VoyantApiError(extractErrorMessage(response.status, response.statusText, body), response.status, body);
33
+ }
34
+ if (response.status === 204)
35
+ return schema.parse(undefined);
36
+ const body = await safeJson(response);
37
+ const parsed = schema.safeParse(body);
38
+ if (!parsed.success) {
39
+ throw new VoyantApiError(`Voyant API response failed validation: ${parsed.error.message}`, response.status, body);
40
+ }
41
+ return parsed.data;
42
+ }
43
+ export function withQueryParams(path, query) {
44
+ if (!query) {
45
+ return path;
46
+ }
47
+ const params = new URLSearchParams();
48
+ for (const [key, value] of Object.entries(query)) {
49
+ if (value === undefined || value === null) {
50
+ continue;
51
+ }
52
+ if (Array.isArray(value)) {
53
+ for (const item of value) {
54
+ params.append(key, String(item));
55
+ }
56
+ continue;
57
+ }
58
+ params.set(key, String(value));
59
+ }
60
+ const serialized = params.toString();
61
+ return serialized ? `${path}?${serialized}` : path;
62
+ }
63
+ async function safeJson(response) {
64
+ const text = await response.text();
65
+ if (!text)
66
+ return undefined;
67
+ try {
68
+ return JSON.parse(text);
69
+ }
70
+ catch {
71
+ return text;
72
+ }
73
+ }
74
+ function joinUrl(baseUrl, path) {
75
+ const trimmedBase = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
76
+ const trimmedPath = path.startsWith("/") ? path : `/${path}`;
77
+ return `${trimmedBase}${trimmedPath}`;
78
+ }
@@ -0,0 +1,8 @@
1
+ export { type UseCustomerPortalBookingOptions, useCustomerPortalBooking, } from "./use-customer-portal-booking.js";
2
+ export { type UseCustomerPortalBookingDocumentsOptions, useCustomerPortalBookingDocuments, } from "./use-customer-portal-booking-documents.js";
3
+ export { type UseCustomerPortalBookingsOptions, useCustomerPortalBookings, } from "./use-customer-portal-bookings.js";
4
+ export { type UseCustomerPortalCompanionsOptions, useCustomerPortalCompanions, } from "./use-customer-portal-companions.js";
5
+ export { type UseCustomerPortalContactExistsOptions, useCustomerPortalContactExists, } from "./use-customer-portal-contact-exists.js";
6
+ export { type DeleteCustomerPortalCompanionMutationInput, type UpdateCustomerPortalCompanionMutationInput, useCustomerPortalMutation, } from "./use-customer-portal-mutation.js";
7
+ export { type UseCustomerPortalProfileOptions, useCustomerPortalProfile, } from "./use-customer-portal-profile.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,+BAA+B,EACpC,wBAAwB,GACzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,KAAK,wCAAwC,EAC7C,iCAAiC,GAClC,MAAM,4CAA4C,CAAA;AACnD,OAAO,EACL,KAAK,gCAAgC,EACrC,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EACL,KAAK,kCAAkC,EACvC,2BAA2B,GAC5B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,KAAK,qCAAqC,EAC1C,8BAA8B,GAC/B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,KAAK,0CAA0C,EAC/C,KAAK,0CAA0C,EAC/C,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EACL,KAAK,+BAA+B,EACpC,wBAAwB,GACzB,MAAM,kCAAkC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { useCustomerPortalBooking, } from "./use-customer-portal-booking.js";
2
+ export { useCustomerPortalBookingDocuments, } from "./use-customer-portal-booking-documents.js";
3
+ export { useCustomerPortalBookings, } from "./use-customer-portal-bookings.js";
4
+ export { useCustomerPortalCompanions, } from "./use-customer-portal-companions.js";
5
+ export { useCustomerPortalContactExists, } from "./use-customer-portal-contact-exists.js";
6
+ export { useCustomerPortalMutation, } from "./use-customer-portal-mutation.js";
7
+ export { useCustomerPortalProfile, } from "./use-customer-portal-profile.js";
@@ -0,0 +1,13 @@
1
+ export interface UseCustomerPortalBookingDocumentsOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalBookingDocuments(bookingId: string | null | undefined, options?: UseCustomerPortalBookingDocumentsOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ id: string;
7
+ participantId: string | null;
8
+ type: "visa" | "insurance" | "health" | "passport_copy" | "other";
9
+ fileName: string;
10
+ fileUrl: string;
11
+ }[];
12
+ }, Error>;
13
+ //# sourceMappingURL=use-customer-portal-booking-documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-booking-documents.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-booking-documents.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,wCAAwC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,OAAO,GAAE,wCAA6C;;;;;;;;UASvD"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalBookingDocumentsQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalBookingDocuments(bookingId, options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalBookingDocumentsQueryOptions({ baseUrl, fetcher }, bookingId ?? ""),
10
+ enabled: enabled && Boolean(bookingId),
11
+ });
12
+ }
@@ -0,0 +1,63 @@
1
+ export interface UseCustomerPortalBookingOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalBooking(bookingId: string | null | undefined, options?: UseCustomerPortalBookingOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ bookingId: string;
7
+ bookingNumber: string;
8
+ status: "draft" | "on_hold" | "confirmed" | "in_progress" | "completed" | "expired" | "cancelled";
9
+ sellCurrency: string;
10
+ sellAmountCents: number | null;
11
+ startDate: string | null;
12
+ endDate: string | null;
13
+ pax: number | null;
14
+ confirmedAt: string | null;
15
+ cancelledAt: string | null;
16
+ completedAt: string | null;
17
+ participants: {
18
+ id: string;
19
+ participantType: "staff" | "other" | "traveler" | "booker" | "contact" | "occupant";
20
+ firstName: string;
21
+ lastName: string;
22
+ isPrimary: boolean;
23
+ }[];
24
+ items: {
25
+ id: string;
26
+ title: string;
27
+ description: string | null;
28
+ itemType: "other" | "unit" | "extra" | "service" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
29
+ status: "draft" | "on_hold" | "confirmed" | "expired" | "cancelled" | "fulfilled";
30
+ serviceDate: string | null;
31
+ startsAt: string | null;
32
+ endsAt: string | null;
33
+ quantity: number;
34
+ sellCurrency: string;
35
+ unitSellAmountCents: number | null;
36
+ totalSellAmountCents: number | null;
37
+ notes: string | null;
38
+ participantLinks: {
39
+ id: string;
40
+ participantId: string;
41
+ role: "other" | "traveler" | "occupant" | "primary_contact" | "service_assignee" | "beneficiary";
42
+ isPrimary: boolean;
43
+ }[];
44
+ }[];
45
+ documents: {
46
+ id: string;
47
+ participantId: string | null;
48
+ type: "visa" | "insurance" | "health" | "passport_copy" | "other";
49
+ fileName: string;
50
+ fileUrl: string;
51
+ }[];
52
+ fulfillments: {
53
+ id: string;
54
+ bookingItemId: string | null;
55
+ participantId: string | null;
56
+ fulfillmentType: "other" | "voucher" | "ticket" | "pdf" | "qr_code" | "barcode" | "mobile";
57
+ deliveryChannel: "other" | "download" | "email" | "api" | "wallet";
58
+ status: "pending" | "issued" | "reissued" | "revoked" | "failed";
59
+ artifactUrl: string | null;
60
+ }[];
61
+ };
62
+ }, Error>;
63
+ //# sourceMappingURL=use-customer-portal-booking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-booking.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-booking.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,OAAO,GAAE,+BAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAS9C"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalBookingQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalBooking(bookingId, options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalBookingQueryOptions({ baseUrl, fetcher }, bookingId ?? ""),
10
+ enabled: enabled && Boolean(bookingId),
11
+ });
12
+ }
@@ -0,0 +1,20 @@
1
+ export interface UseCustomerPortalBookingsOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalBookings(options?: UseCustomerPortalBookingsOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ bookingId: string;
7
+ bookingNumber: string;
8
+ status: "draft" | "on_hold" | "confirmed" | "in_progress" | "completed" | "expired" | "cancelled";
9
+ sellCurrency: string;
10
+ sellAmountCents: number | null;
11
+ startDate: string | null;
12
+ endDate: string | null;
13
+ pax: number | null;
14
+ confirmedAt: string | null;
15
+ completedAt: string | null;
16
+ participantCount: number;
17
+ primaryTravelerName: string | null;
18
+ }[];
19
+ }, Error>;
20
+ //# sourceMappingURL=use-customer-portal-bookings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-bookings.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-bookings.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gCAAgC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,gCAAqC;;;;;;;;;;;;;;;UAQvF"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalBookingsQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalBookings(options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalBookingsQueryOptions({ baseUrl, fetcher }),
10
+ enabled,
11
+ });
12
+ }
@@ -0,0 +1,17 @@
1
+ export interface UseCustomerPortalCompanionsOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalCompanions(options?: UseCustomerPortalCompanionsOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ id: string;
7
+ role: string;
8
+ name: string;
9
+ title: string | null;
10
+ email: string | null;
11
+ phone: string | null;
12
+ isPrimary: boolean;
13
+ notes: string | null;
14
+ metadata: Record<string, unknown> | null;
15
+ }[];
16
+ }, Error>;
17
+ //# sourceMappingURL=use-customer-portal-companions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-companions.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-companions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kCAAkC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kCAAuC;;;;;;;;;;;;UAQ3F"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalCompanionsQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalCompanions(options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalCompanionsQueryOptions({ baseUrl, fetcher }),
10
+ enabled,
11
+ });
12
+ }
@@ -0,0 +1,12 @@
1
+ export interface UseCustomerPortalContactExistsOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalContactExists(email: string | null | undefined, options?: UseCustomerPortalContactExistsOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ email: string;
7
+ authAccountExists: boolean;
8
+ customerRecordExists: boolean;
9
+ linkedCustomerRecordExists: boolean;
10
+ };
11
+ }, Error>;
12
+ //# sourceMappingURL=use-customer-portal-contact-exists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-contact-exists.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-contact-exists.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qCAAqC;IACpD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,GAAE,qCAA0C;;;;;;;UASpD"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalContactExistsQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalContactExists(email, options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalContactExistsQueryOptions({ email: email ?? "" }, { baseUrl, fetcher }),
10
+ enabled: enabled && Boolean(email),
11
+ });
12
+ }
@@ -0,0 +1,167 @@
1
+ import type { UpdateCustomerPortalCompanionInput } from "../schemas.js";
2
+ export interface UpdateCustomerPortalCompanionMutationInput {
3
+ companionId: string;
4
+ input: UpdateCustomerPortalCompanionInput;
5
+ }
6
+ export interface DeleteCustomerPortalCompanionMutationInput {
7
+ companionId: string;
8
+ }
9
+ export declare function useCustomerPortalMutation(): {
10
+ bootstrap: import("@tanstack/react-query").UseMutationResult<{
11
+ data: {
12
+ status: "already_linked" | "linked_existing_customer" | "created_customer" | "customer_selection_required";
13
+ profile: {
14
+ userId: string;
15
+ email: string;
16
+ emailVerified: boolean;
17
+ firstName: string | null;
18
+ lastName: string | null;
19
+ avatarUrl: string | null;
20
+ locale: string;
21
+ timezone: string | null;
22
+ seatingPreference: "aisle" | "window" | "middle" | "no_preference" | null;
23
+ marketingConsent: boolean;
24
+ marketingConsentAt: string | null;
25
+ notificationDefaults: Record<string, unknown> | null;
26
+ uiPrefs: Record<string, unknown> | null;
27
+ customerRecord: {
28
+ id: string;
29
+ firstName: string;
30
+ lastName: string;
31
+ preferredLanguage: string | null;
32
+ preferredCurrency: string | null;
33
+ birthday: string | null;
34
+ email: string | null;
35
+ phone: string | null;
36
+ address: string | null;
37
+ city: string | null;
38
+ country: string | null;
39
+ relation: string | null;
40
+ status: string;
41
+ } | null;
42
+ } | null;
43
+ candidates: {
44
+ id: string;
45
+ firstName: string;
46
+ lastName: string;
47
+ preferredLanguage: string | null;
48
+ preferredCurrency: string | null;
49
+ birthday: string | null;
50
+ email: string | null;
51
+ phone: string | null;
52
+ address: string | null;
53
+ city: string | null;
54
+ country: string | null;
55
+ relation: string | null;
56
+ status: string;
57
+ linkable: boolean;
58
+ claimedByAnotherUser: boolean;
59
+ }[];
60
+ };
61
+ }, Error, {
62
+ customerRecordId?: string | undefined;
63
+ createCustomerIfMissing?: boolean | undefined;
64
+ firstName?: string | null | undefined;
65
+ lastName?: string | null | undefined;
66
+ marketingConsent?: boolean | undefined;
67
+ customerRecord?: {
68
+ preferredLanguage?: string | null | undefined;
69
+ preferredCurrency?: string | null | undefined;
70
+ birthday?: string | null | undefined;
71
+ phone?: string | null | undefined;
72
+ address?: string | null | undefined;
73
+ city?: string | null | undefined;
74
+ country?: string | null | undefined;
75
+ } | undefined;
76
+ }, unknown>;
77
+ updateProfile: import("@tanstack/react-query").UseMutationResult<{
78
+ data: {
79
+ userId: string;
80
+ email: string;
81
+ emailVerified: boolean;
82
+ firstName: string | null;
83
+ lastName: string | null;
84
+ avatarUrl: string | null;
85
+ locale: string;
86
+ timezone: string | null;
87
+ seatingPreference: "aisle" | "window" | "middle" | "no_preference" | null;
88
+ marketingConsent: boolean;
89
+ marketingConsentAt: string | null;
90
+ notificationDefaults: Record<string, unknown> | null;
91
+ uiPrefs: Record<string, unknown> | null;
92
+ customerRecord: {
93
+ id: string;
94
+ firstName: string;
95
+ lastName: string;
96
+ preferredLanguage: string | null;
97
+ preferredCurrency: string | null;
98
+ birthday: string | null;
99
+ email: string | null;
100
+ phone: string | null;
101
+ address: string | null;
102
+ city: string | null;
103
+ country: string | null;
104
+ relation: string | null;
105
+ status: string;
106
+ } | null;
107
+ };
108
+ }, Error, {
109
+ firstName?: string | null | undefined;
110
+ lastName?: string | null | undefined;
111
+ avatarUrl?: string | null | undefined;
112
+ locale?: string | undefined;
113
+ timezone?: string | null | undefined;
114
+ seatingPreference?: "aisle" | "window" | "middle" | "no_preference" | null | undefined;
115
+ marketingConsent?: boolean | undefined;
116
+ notificationDefaults?: Record<string, unknown> | null | undefined;
117
+ uiPrefs?: Record<string, unknown> | null | undefined;
118
+ customerRecord?: {
119
+ preferredLanguage?: string | null | undefined;
120
+ preferredCurrency?: string | null | undefined;
121
+ birthday?: string | null | undefined;
122
+ phone?: string | null | undefined;
123
+ address?: string | null | undefined;
124
+ city?: string | null | undefined;
125
+ country?: string | null | undefined;
126
+ } | undefined;
127
+ }, unknown>;
128
+ createCompanion: import("@tanstack/react-query").UseMutationResult<{
129
+ data: {
130
+ id: string;
131
+ role: string;
132
+ name: string;
133
+ title: string | null;
134
+ email: string | null;
135
+ phone: string | null;
136
+ isPrimary: boolean;
137
+ notes: string | null;
138
+ metadata: Record<string, unknown> | null;
139
+ };
140
+ }, Error, {
141
+ name: string;
142
+ role?: "other" | "primary" | "legal" | "general" | "reservations" | "operations" | "front_desk" | "sales" | "emergency" | "accounting" | undefined;
143
+ title?: string | null | undefined;
144
+ email?: string | null | undefined;
145
+ phone?: string | null | undefined;
146
+ isPrimary?: boolean | undefined;
147
+ notes?: string | null | undefined;
148
+ metadata?: Record<string, unknown> | null | undefined;
149
+ }, unknown>;
150
+ updateCompanion: import("@tanstack/react-query").UseMutationResult<{
151
+ data: {
152
+ id: string;
153
+ role: string;
154
+ name: string;
155
+ title: string | null;
156
+ email: string | null;
157
+ phone: string | null;
158
+ isPrimary: boolean;
159
+ notes: string | null;
160
+ metadata: Record<string, unknown> | null;
161
+ };
162
+ }, Error, UpdateCustomerPortalCompanionMutationInput, unknown>;
163
+ removeCompanion: import("@tanstack/react-query").UseMutationResult<{
164
+ success: boolean;
165
+ }, Error, DeleteCustomerPortalCompanionMutationInput, unknown>;
166
+ };
167
+ //# sourceMappingURL=use-customer-portal-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-mutation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-mutation.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,kCAAkC,EAEnC,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,0CAA0C;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,kCAAkC,CAAA;CAC1C;AAED,MAAM,WAAW,0CAA0C;IACzD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DxC"}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { bootstrapCustomerPortal, createCustomerPortalCompanion, deleteCustomerPortalCompanion, updateCustomerPortalCompanion, updateCustomerPortalProfile, } from "../operations.js";
4
+ import { useVoyantCustomerPortalContext } from "../provider.js";
5
+ import { customerPortalQueryKeys } from "../query-keys.js";
6
+ export function useCustomerPortalMutation() {
7
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
8
+ const queryClient = useQueryClient();
9
+ const client = { baseUrl, fetcher };
10
+ const refreshPortalState = async () => {
11
+ await Promise.all([
12
+ queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.profile() }),
13
+ queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.companions() }),
14
+ queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.bookings() }),
15
+ ]);
16
+ };
17
+ const bootstrap = useMutation({
18
+ mutationFn: async (input) => bootstrapCustomerPortal(client, input),
19
+ onSuccess: async () => {
20
+ await refreshPortalState();
21
+ },
22
+ });
23
+ const updateProfile = useMutation({
24
+ mutationFn: async (input) => updateCustomerPortalProfile(client, input),
25
+ onSuccess: async () => {
26
+ await refreshPortalState();
27
+ },
28
+ });
29
+ const createCompanion = useMutation({
30
+ mutationFn: async (input) => createCustomerPortalCompanion(client, input),
31
+ onSuccess: async () => {
32
+ await queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.companions() });
33
+ },
34
+ });
35
+ const updateCompanion = useMutation({
36
+ mutationFn: async ({ companionId, input }) => updateCustomerPortalCompanion(client, companionId, input),
37
+ onSuccess: async () => {
38
+ await queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.companions() });
39
+ },
40
+ });
41
+ const removeCompanion = useMutation({
42
+ mutationFn: async ({ companionId }) => deleteCustomerPortalCompanion(client, companionId),
43
+ onSuccess: async () => {
44
+ await queryClient.invalidateQueries({ queryKey: customerPortalQueryKeys.companions() });
45
+ },
46
+ });
47
+ return {
48
+ bootstrap,
49
+ updateProfile,
50
+ createCompanion,
51
+ updateCompanion,
52
+ removeCompanion,
53
+ };
54
+ }
@@ -0,0 +1,36 @@
1
+ export interface UseCustomerPortalProfileOptions {
2
+ enabled?: boolean;
3
+ }
4
+ export declare function useCustomerPortalProfile(options?: UseCustomerPortalProfileOptions): import("@tanstack/react-query").UseQueryResult<{
5
+ data: {
6
+ userId: string;
7
+ email: string;
8
+ emailVerified: boolean;
9
+ firstName: string | null;
10
+ lastName: string | null;
11
+ avatarUrl: string | null;
12
+ locale: string;
13
+ timezone: string | null;
14
+ seatingPreference: "aisle" | "window" | "middle" | "no_preference" | null;
15
+ marketingConsent: boolean;
16
+ marketingConsentAt: string | null;
17
+ notificationDefaults: Record<string, unknown> | null;
18
+ uiPrefs: Record<string, unknown> | null;
19
+ customerRecord: {
20
+ id: string;
21
+ firstName: string;
22
+ lastName: string;
23
+ preferredLanguage: string | null;
24
+ preferredCurrency: string | null;
25
+ birthday: string | null;
26
+ email: string | null;
27
+ phone: string | null;
28
+ address: string | null;
29
+ city: string | null;
30
+ country: string | null;
31
+ relation: string | null;
32
+ status: string;
33
+ } | null;
34
+ };
35
+ }, Error>;
36
+ //# sourceMappingURL=use-customer-portal-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-customer-portal-profile.d.ts","sourceRoot":"","sources":["../../src/hooks/use-customer-portal-profile.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,+BAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAQrF"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantCustomerPortalContext } from "../provider.js";
4
+ import { getCustomerPortalProfileQueryOptions } from "../query-options.js";
5
+ export function useCustomerPortalProfile(options = {}) {
6
+ const { baseUrl, fetcher } = useVoyantCustomerPortalContext();
7
+ const { enabled = true } = options;
8
+ return useQuery({
9
+ ...getCustomerPortalProfileQueryOptions({ baseUrl, fetcher }),
10
+ enabled,
11
+ });
12
+ }
@@ -0,0 +1,9 @@
1
+ export { defaultFetcher, fetchWithValidation, VoyantApiError, type VoyantFetcher, withQueryParams, } from "./client.js";
2
+ export * from "./hooks/index.js";
3
+ export { bootstrapCustomerPortal, createCustomerPortalCompanion, deleteCustomerPortalCompanion, getCustomerPortalBooking, getCustomerPortalContactExists, getCustomerPortalProfile, listCustomerPortalBookingDocuments, listCustomerPortalBookings, listCustomerPortalCompanions, updateCustomerPortalCompanion, updateCustomerPortalProfile, } from "./operations.js";
4
+ export { useVoyantCustomerPortalContext, type VoyantCustomerPortalContextValue, VoyantCustomerPortalProvider, type VoyantCustomerPortalProviderProps, } from "./provider.js";
5
+ export type { CustomerPortalContactExistsFilters } from "./query-keys.js";
6
+ export { customerPortalQueryKeys } from "./query-keys.js";
7
+ export { getCustomerPortalBookingDocumentsQueryOptions, getCustomerPortalBookingQueryOptions, getCustomerPortalBookingsQueryOptions, getCustomerPortalCompanionsQueryOptions, getCustomerPortalContactExistsQueryOptions, getCustomerPortalProfileQueryOptions, } from "./query-options.js";
8
+ export * from "./schemas.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,KAAK,aAAa,EAClB,eAAe,GAChB,MAAM,aAAa,CAAA;AACpB,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,EACxB,kCAAkC,EAClC,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,8BAA8B,EAC9B,KAAK,gCAAgC,EACrC,4BAA4B,EAC5B,KAAK,iCAAiC,GACvC,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EACL,6CAA6C,EAC7C,oCAAoC,EACpC,qCAAqC,EACrC,uCAAuC,EACvC,0CAA0C,EAC1C,oCAAoC,GACrC,MAAM,oBAAoB,CAAA;AAC3B,cAAc,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { defaultFetcher, fetchWithValidation, VoyantApiError, withQueryParams, } from "./client.js";
2
+ export * from "./hooks/index.js";
3
+ export { bootstrapCustomerPortal, createCustomerPortalCompanion, deleteCustomerPortalCompanion, getCustomerPortalBooking, getCustomerPortalContactExists, getCustomerPortalProfile, listCustomerPortalBookingDocuments, listCustomerPortalBookings, listCustomerPortalCompanions, updateCustomerPortalCompanion, updateCustomerPortalProfile, } from "./operations.js";
4
+ export { useVoyantCustomerPortalContext, VoyantCustomerPortalProvider, } from "./provider.js";
5
+ export { customerPortalQueryKeys } from "./query-keys.js";
6
+ export { getCustomerPortalBookingDocumentsQueryOptions, getCustomerPortalBookingQueryOptions, getCustomerPortalBookingsQueryOptions, getCustomerPortalCompanionsQueryOptions, getCustomerPortalContactExistsQueryOptions, getCustomerPortalProfileQueryOptions, } from "./query-options.js";
7
+ export * from "./schemas.js";