@voyant-travel/catalog-react 0.117.2

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 (220) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +36 -0
  3. package/dist/admin/catalog-vertical-host.d.ts +45 -0
  4. package/dist/admin/catalog-vertical-host.d.ts.map +1 -0
  5. package/dist/admin/catalog-vertical-host.js +230 -0
  6. package/dist/admin/cruise-detail-host.d.ts +11 -0
  7. package/dist/admin/cruise-detail-host.d.ts.map +1 -0
  8. package/dist/admin/cruise-detail-host.js +33 -0
  9. package/dist/admin/dynamic-catalog-host.d.ts +13 -0
  10. package/dist/admin/dynamic-catalog-host.d.ts.map +1 -0
  11. package/dist/admin/dynamic-catalog-host.js +17 -0
  12. package/dist/admin/index.d.ts +133 -0
  13. package/dist/admin/index.d.ts.map +1 -0
  14. package/dist/admin/index.js +144 -0
  15. package/dist/admin/open-in-new-tab.d.ts +7 -0
  16. package/dist/admin/open-in-new-tab.d.ts.map +1 -0
  17. package/dist/admin/open-in-new-tab.js +10 -0
  18. package/dist/admin/pages/catalog-accommodations-detail-page.d.ts +4 -0
  19. package/dist/admin/pages/catalog-accommodations-detail-page.d.ts.map +1 -0
  20. package/dist/admin/pages/catalog-accommodations-detail-page.js +7 -0
  21. package/dist/admin/pages/catalog-accommodations-index-page.d.ts +8 -0
  22. package/dist/admin/pages/catalog-accommodations-index-page.d.ts.map +1 -0
  23. package/dist/admin/pages/catalog-accommodations-index-page.js +17 -0
  24. package/dist/admin/pages/catalog-cruises-detail-page.d.ts +4 -0
  25. package/dist/admin/pages/catalog-cruises-detail-page.d.ts.map +1 -0
  26. package/dist/admin/pages/catalog-cruises-detail-page.js +7 -0
  27. package/dist/admin/pages/catalog-cruises-index-page.d.ts +8 -0
  28. package/dist/admin/pages/catalog-cruises-index-page.d.ts.map +1 -0
  29. package/dist/admin/pages/catalog-cruises-index-page.js +19 -0
  30. package/dist/admin/pages/catalog-excursions-detail-page.d.ts +4 -0
  31. package/dist/admin/pages/catalog-excursions-detail-page.d.ts.map +1 -0
  32. package/dist/admin/pages/catalog-excursions-detail-page.js +7 -0
  33. package/dist/admin/pages/catalog-excursions-index-page.d.ts +8 -0
  34. package/dist/admin/pages/catalog-excursions-index-page.d.ts.map +1 -0
  35. package/dist/admin/pages/catalog-excursions-index-page.js +12 -0
  36. package/dist/admin/pages/catalog-products-detail-page.d.ts +8 -0
  37. package/dist/admin/pages/catalog-products-detail-page.d.ts.map +1 -0
  38. package/dist/admin/pages/catalog-products-detail-page.js +12 -0
  39. package/dist/admin/pages/catalog-products-index-page.d.ts +8 -0
  40. package/dist/admin/pages/catalog-products-index-page.d.ts.map +1 -0
  41. package/dist/admin/pages/catalog-products-index-page.js +12 -0
  42. package/dist/admin/pages/catalog-tours-detail-page.d.ts +4 -0
  43. package/dist/admin/pages/catalog-tours-detail-page.d.ts.map +1 -0
  44. package/dist/admin/pages/catalog-tours-detail-page.js +7 -0
  45. package/dist/admin/pages/catalog-tours-index-page.d.ts +8 -0
  46. package/dist/admin/pages/catalog-tours-index-page.d.ts.map +1 -0
  47. package/dist/admin/pages/catalog-tours-index-page.js +12 -0
  48. package/dist/admin/product-detail-host.d.ts +18 -0
  49. package/dist/admin/product-detail-host.d.ts.map +1 -0
  50. package/dist/admin/product-detail-host.js +40 -0
  51. package/dist/admin/scheduled-catalog-host.d.ts +15 -0
  52. package/dist/admin/scheduled-catalog-host.d.ts.map +1 -0
  53. package/dist/admin/scheduled-catalog-host.js +19 -0
  54. package/dist/admin/vertical-detail-host.d.ts +13 -0
  55. package/dist/admin/vertical-detail-host.d.ts.map +1 -0
  56. package/dist/admin/vertical-detail-host.js +62 -0
  57. package/dist/booking-engine/index.d.ts +26 -0
  58. package/dist/booking-engine/index.d.ts.map +1 -0
  59. package/dist/booking-engine/index.js +25 -0
  60. package/dist/booking-engine/use-booking-commit.d.ts +61 -0
  61. package/dist/booking-engine/use-booking-commit.d.ts.map +1 -0
  62. package/dist/booking-engine/use-booking-commit.js +47 -0
  63. package/dist/booking-engine/use-booking-draft-shape.d.ts +20 -0
  64. package/dist/booking-engine/use-booking-draft-shape.d.ts.map +1 -0
  65. package/dist/booking-engine/use-booking-draft-shape.js +9 -0
  66. package/dist/booking-engine/use-booking-draft.d.ts +102 -0
  67. package/dist/booking-engine/use-booking-draft.d.ts.map +1 -0
  68. package/dist/booking-engine/use-booking-draft.js +93 -0
  69. package/dist/booking-engine/use-booking-hold.d.ts +30 -0
  70. package/dist/booking-engine/use-booking-hold.d.ts.map +1 -0
  71. package/dist/booking-engine/use-booking-hold.js +44 -0
  72. package/dist/booking-engine/use-booking-journey-api.d.ts +23 -0
  73. package/dist/booking-engine/use-booking-journey-api.d.ts.map +1 -0
  74. package/dist/booking-engine/use-booking-journey-api.js +24 -0
  75. package/dist/booking-engine/use-booking-quote.d.ts +711 -0
  76. package/dist/booking-engine/use-booking-quote.d.ts.map +1 -0
  77. package/dist/booking-engine/use-booking-quote.js +122 -0
  78. package/dist/catalog-enrichment-mappers.d.ts +162 -0
  79. package/dist/catalog-enrichment-mappers.d.ts.map +1 -0
  80. package/dist/catalog-enrichment-mappers.js +190 -0
  81. package/dist/catalog-enrichment.d.ts +203 -0
  82. package/dist/catalog-enrichment.d.ts.map +1 -0
  83. package/dist/catalog-enrichment.js +130 -0
  84. package/dist/catalog-offers-client.d.ts +58 -0
  85. package/dist/catalog-offers-client.d.ts.map +1 -0
  86. package/dist/catalog-offers-client.js +61 -0
  87. package/dist/catalog-search-params.d.ts +45 -0
  88. package/dist/catalog-search-params.d.ts.map +1 -0
  89. package/dist/catalog-search-params.js +30 -0
  90. package/dist/catalog-surfaces.d.ts +17 -0
  91. package/dist/catalog-surfaces.d.ts.map +1 -0
  92. package/dist/catalog-surfaces.js +26 -0
  93. package/dist/client.d.ts +20 -0
  94. package/dist/client.d.ts.map +1 -0
  95. package/dist/client.js +65 -0
  96. package/dist/components/availability-calendar.d.ts +33 -0
  97. package/dist/components/availability-calendar.d.ts.map +1 -0
  98. package/dist/components/availability-calendar.js +65 -0
  99. package/dist/components/catalog-browse-page.d.ts +41 -0
  100. package/dist/components/catalog-browse-page.d.ts.map +1 -0
  101. package/dist/components/catalog-browse-page.js +47 -0
  102. package/dist/components/catalog-card.d.ts +68 -0
  103. package/dist/components/catalog-card.d.ts.map +1 -0
  104. package/dist/components/catalog-card.js +52 -0
  105. package/dist/components/catalog-detail-cruise-cards.d.ts +16 -0
  106. package/dist/components/catalog-detail-cruise-cards.d.ts.map +1 -0
  107. package/dist/components/catalog-detail-cruise-cards.js +54 -0
  108. package/dist/components/catalog-detail-departures.d.ts +25 -0
  109. package/dist/components/catalog-detail-departures.d.ts.map +1 -0
  110. package/dist/components/catalog-detail-departures.js +240 -0
  111. package/dist/components/catalog-detail-parts.d.ts +70 -0
  112. package/dist/components/catalog-detail-parts.d.ts.map +1 -0
  113. package/dist/components/catalog-detail-parts.js +282 -0
  114. package/dist/components/catalog-detail-sheet.d.ts +93 -0
  115. package/dist/components/catalog-detail-sheet.d.ts.map +1 -0
  116. package/dist/components/catalog-detail-sheet.js +68 -0
  117. package/dist/components/catalog-detail-view.d.ts +39 -0
  118. package/dist/components/catalog-detail-view.d.ts.map +1 -0
  119. package/dist/components/catalog-detail-view.js +157 -0
  120. package/dist/components/catalog-enrichment-fetchers.d.ts +8 -0
  121. package/dist/components/catalog-enrichment-fetchers.d.ts.map +1 -0
  122. package/dist/components/catalog-enrichment-fetchers.js +7 -0
  123. package/dist/components/catalog-faceted-filter.d.ts +30 -0
  124. package/dist/components/catalog-faceted-filter.d.ts.map +1 -0
  125. package/dist/components/catalog-faceted-filter.js +24 -0
  126. package/dist/components/catalog-filter-rail.d.ts +25 -0
  127. package/dist/components/catalog-filter-rail.d.ts.map +1 -0
  128. package/dist/components/catalog-filter-rail.js +88 -0
  129. package/dist/components/catalog-gallery.d.ts +27 -0
  130. package/dist/components/catalog-gallery.d.ts.map +1 -0
  131. package/dist/components/catalog-gallery.js +66 -0
  132. package/dist/components/catalog-hit.d.ts +27 -0
  133. package/dist/components/catalog-hit.d.ts.map +1 -0
  134. package/dist/components/catalog-hit.js +57 -0
  135. package/dist/components/catalog-page-cards.d.ts +21 -0
  136. package/dist/components/catalog-page-cards.d.ts.map +1 -0
  137. package/dist/components/catalog-page-cards.js +174 -0
  138. package/dist/components/catalog-page-config.d.ts +17 -0
  139. package/dist/components/catalog-page-config.d.ts.map +1 -0
  140. package/dist/components/catalog-page-config.js +369 -0
  141. package/dist/components/catalog-page.d.ts +88 -0
  142. package/dist/components/catalog-page.d.ts.map +1 -0
  143. package/dist/components/catalog-page.js +148 -0
  144. package/dist/components/catalog-range-filter.d.ts +34 -0
  145. package/dist/components/catalog-range-filter.d.ts.map +1 -0
  146. package/dist/components/catalog-range-filter.js +72 -0
  147. package/dist/components/catalog-search-page.d.ts +239 -0
  148. package/dist/components/catalog-search-page.d.ts.map +1 -0
  149. package/dist/components/catalog-search-page.js +63 -0
  150. package/dist/components/catalog-search-tab-panel.d.ts +42 -0
  151. package/dist/components/catalog-search-tab-panel.d.ts.map +1 -0
  152. package/dist/components/catalog-search-tab-panel.js +199 -0
  153. package/dist/components/catalog-vertical-detail-page.d.ts +33 -0
  154. package/dist/components/catalog-vertical-detail-page.d.ts.map +1 -0
  155. package/dist/components/catalog-vertical-detail-page.js +100 -0
  156. package/dist/components/cruise-detail-page-parts.d.ts +72 -0
  157. package/dist/components/cruise-detail-page-parts.d.ts.map +1 -0
  158. package/dist/components/cruise-detail-page-parts.js +146 -0
  159. package/dist/components/cruise-detail-page.d.ts +21 -0
  160. package/dist/components/cruise-detail-page.d.ts.map +1 -0
  161. package/dist/components/cruise-detail-page.js +201 -0
  162. package/dist/components/dynamic-catalog-page-parts.d.ts +40 -0
  163. package/dist/components/dynamic-catalog-page-parts.d.ts.map +1 -0
  164. package/dist/components/dynamic-catalog-page-parts.js +43 -0
  165. package/dist/components/dynamic-catalog-page.d.ts +23 -0
  166. package/dist/components/dynamic-catalog-page.d.ts.map +1 -0
  167. package/dist/components/dynamic-catalog-page.js +270 -0
  168. package/dist/components/media-gallery.d.ts +13 -0
  169. package/dist/components/media-gallery.d.ts.map +1 -0
  170. package/dist/components/media-gallery.js +42 -0
  171. package/dist/components/product-detail-page-parts.d.ts +106 -0
  172. package/dist/components/product-detail-page-parts.d.ts.map +1 -0
  173. package/dist/components/product-detail-page-parts.js +130 -0
  174. package/dist/components/product-detail-page.d.ts +57 -0
  175. package/dist/components/product-detail-page.d.ts.map +1 -0
  176. package/dist/components/product-detail-page.js +175 -0
  177. package/dist/components/scheduled-catalog-page.d.ts +34 -0
  178. package/dist/components/scheduled-catalog-page.d.ts.map +1 -0
  179. package/dist/components/scheduled-catalog-page.js +6 -0
  180. package/dist/hooks/index.d.ts +3 -0
  181. package/dist/hooks/index.d.ts.map +1 -0
  182. package/dist/hooks/index.js +2 -0
  183. package/dist/hooks/use-catalog-offers.d.ts +186 -0
  184. package/dist/hooks/use-catalog-offers.d.ts.map +1 -0
  185. package/dist/hooks/use-catalog-offers.js +105 -0
  186. package/dist/hooks/use-catalog-search.d.ts +109 -0
  187. package/dist/hooks/use-catalog-search.d.ts.map +1 -0
  188. package/dist/hooks/use-catalog-search.js +52 -0
  189. package/dist/i18n/en.d.ts +397 -0
  190. package/dist/i18n/en.d.ts.map +1 -0
  191. package/dist/i18n/en.js +396 -0
  192. package/dist/i18n/index.d.ts +5 -0
  193. package/dist/i18n/index.d.ts.map +1 -0
  194. package/dist/i18n/index.js +3 -0
  195. package/dist/i18n/messages.d.ts +335 -0
  196. package/dist/i18n/messages.d.ts.map +1 -0
  197. package/dist/i18n/messages.js +1 -0
  198. package/dist/i18n/provider.d.ts +816 -0
  199. package/dist/i18n/provider.d.ts.map +1 -0
  200. package/dist/i18n/provider.js +44 -0
  201. package/dist/i18n/ro.d.ts +397 -0
  202. package/dist/i18n/ro.d.ts.map +1 -0
  203. package/dist/i18n/ro.js +396 -0
  204. package/dist/index.d.ts +9 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +17 -0
  207. package/dist/provider.d.ts +2 -0
  208. package/dist/provider.d.ts.map +1 -0
  209. package/dist/provider.js +1 -0
  210. package/dist/schemas-catalog-offers.d.ts +290 -0
  211. package/dist/schemas-catalog-offers.d.ts.map +1 -0
  212. package/dist/schemas-catalog-offers.js +155 -0
  213. package/dist/schemas.d.ts +143 -0
  214. package/dist/schemas.d.ts.map +1 -0
  215. package/dist/schemas.js +76 -0
  216. package/dist/ui.d.ts +19 -0
  217. package/dist/ui.d.ts.map +1 -0
  218. package/dist/ui.js +18 -0
  219. package/package.json +150 -0
  220. package/src/styles.css +11 -0
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { keepPreviousData, useQuery } from "@tanstack/react-query";
3
+ import { fetchCatalogSlots, fetchCruiseContent, fetchCruisePrice, fetchCruiseSailingPricing, fetchDepartureAirports, fetchPackageDetail, fetchPackageSearch, } from "../catalog-offers-client.js";
4
+ import { useVoyantCatalogContext } from "../provider.js";
5
+ /**
6
+ * Departure airports for a destination — probed before a full availability
7
+ * search so the operator can pick where they fly from.
8
+ */
9
+ export function useDepartureAirports(options) {
10
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
11
+ const { countryCode, surface = "admin", enabled = true, staleTime = 60_000 } = options;
12
+ return useQuery({
13
+ queryKey: ["catalog-departure-airports", surface, countryCode],
14
+ queryFn: ({ signal }) => fetchDepartureAirports({ baseUrl, fetcher, surface }, { countryCode }, signal),
15
+ enabled: enabled && !!countryCode,
16
+ staleTime,
17
+ });
18
+ }
19
+ /** Dynamic package search by destination/dates/occupancy → live offers. */
20
+ export function usePackageSearch(options) {
21
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
22
+ const { countryCode, departureDateFrom, departureDateTo, adults, nights, surface = "admin", enabled = true, staleTime = 30_000, } = options;
23
+ return useQuery({
24
+ queryKey: [
25
+ "catalog-package-search",
26
+ surface,
27
+ countryCode,
28
+ departureDateFrom,
29
+ departureDateTo,
30
+ adults,
31
+ nights.min,
32
+ nights.max,
33
+ ],
34
+ queryFn: ({ signal }) => fetchPackageSearch({ baseUrl, fetcher, surface }, { countryCode, departureDateFrom, departureDateTo, adults, nights }, signal),
35
+ enabled: enabled && !!countryCode,
36
+ staleTime,
37
+ placeholderData: keepPreviousData,
38
+ });
39
+ }
40
+ /** Full product detail (source content + live dated offers). */
41
+ export function usePackageDetail(options) {
42
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
43
+ const { productId, departureDateFrom, departureDateTo, adults, nights, locale, surface = "admin", enabled = true, staleTime = 30_000, } = options;
44
+ return useQuery({
45
+ queryKey: [
46
+ "catalog-package-detail",
47
+ surface,
48
+ productId,
49
+ departureDateFrom,
50
+ departureDateTo,
51
+ adults,
52
+ nights.min,
53
+ nights.max,
54
+ locale,
55
+ ],
56
+ queryFn: ({ signal }) => fetchPackageDetail({ baseUrl, fetcher, surface }, { productId, departureDateFrom, departureDateTo, adults, nights, locale }, signal),
57
+ enabled: enabled && !!productId,
58
+ staleTime,
59
+ });
60
+ }
61
+ /** Cruise-level "from" price (Connect). */
62
+ export function useCruisePrice(options) {
63
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
64
+ const { cruiseId, surface = "admin", enabled = true, staleTime = 60_000 } = options;
65
+ return useQuery({
66
+ queryKey: ["catalog-cruise-price", surface, cruiseId],
67
+ queryFn: ({ signal }) => fetchCruisePrice({ baseUrl, fetcher, surface }, { cruiseId }, signal),
68
+ enabled: enabled && !!cruiseId,
69
+ staleTime,
70
+ retry: false,
71
+ });
72
+ }
73
+ /** Live per-cabin pricing for one sailing (lazy — enable on row expand). */
74
+ export function useCruiseSailingPricing(options) {
75
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
76
+ const { cruiseId, sailingRef, surface = "admin", enabled = true, staleTime = 0 } = options;
77
+ return useQuery({
78
+ queryKey: ["catalog-cruise-sailing-pricing", surface, cruiseId, sailingRef],
79
+ queryFn: ({ signal }) => fetchCruiseSailingPricing({ baseUrl, fetcher, surface }, { cruiseId, sailingRef }, signal),
80
+ enabled: enabled && !!cruiseId && !!sailingRef,
81
+ staleTime,
82
+ });
83
+ }
84
+ /** Rich cruise content (gallery/sailings/cabins/itinerary) from the source. */
85
+ export function useCruiseContent(options) {
86
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
87
+ const { cruiseId, locale, surface = "admin", enabled = true, staleTime = 60_000 } = options;
88
+ return useQuery({
89
+ queryKey: ["catalog-cruise-content", surface, cruiseId, locale],
90
+ queryFn: ({ signal }) => fetchCruiseContent({ baseUrl, fetcher, surface }, { cruiseId, locale }, signal),
91
+ enabled: enabled && !!cruiseId,
92
+ staleTime,
93
+ });
94
+ }
95
+ /** Per-departure availability slots for an entity. */
96
+ export function useCatalogSlots(options) {
97
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
98
+ const { entityModule, entityId, surface = "admin", enabled = true, staleTime = 30_000 } = options;
99
+ return useQuery({
100
+ queryKey: ["catalog-slots", surface, entityModule, entityId],
101
+ queryFn: ({ signal }) => fetchCatalogSlots({ baseUrl, fetcher, surface }, { entityModule, entityId }, signal),
102
+ enabled: enabled && !!entityId,
103
+ staleTime,
104
+ });
105
+ }
@@ -0,0 +1,109 @@
1
+ export type CatalogSearchMode = "keyword" | "hybrid" | "semantic";
2
+ export type CatalogSearchSort = "relevance" | "price-asc" | "price-desc" | "departure-asc" | "newest";
3
+ export type CatalogSearchProjection = "raw" | "storefront-card";
4
+ export interface CatalogSearchFilter {
5
+ field: string;
6
+ [key: string]: any;
7
+ }
8
+ export interface UseCatalogSearchOptions {
9
+ vertical: string;
10
+ query?: string;
11
+ mode?: CatalogSearchMode;
12
+ sort?: CatalogSearchSort;
13
+ projection?: CatalogSearchProjection;
14
+ filters?: CatalogSearchFilter[];
15
+ facets?: Array<{
16
+ field: string;
17
+ }>;
18
+ pagination?: {
19
+ limit?: number;
20
+ cursor?: string;
21
+ };
22
+ /** Hybrid-mode rank-fusion weight (0..1). 0 keyword-only, 1 semantic-only. */
23
+ alpha?: number;
24
+ /** Cosine-distance cutoff (0..2) for semantic hits. */
25
+ distance_threshold?: number;
26
+ /** Caller-supplied query embedding (skips on-the-fly vectorization). */
27
+ query_embedding?: number[];
28
+ /** Override `defaultScope.market`. */
29
+ market?: string;
30
+ /** Override `defaultScope.locale`. */
31
+ locale?: string;
32
+ /**
33
+ * Surface to call against. Operator dashboards pass `"admin"`
34
+ * (default); storefront / partner / embedded surfaces pass
35
+ * `"public"`. Switches the path between
36
+ * `/v1/admin/catalog/search` and `/v1/public/catalog/search`.
37
+ */
38
+ surface?: "admin" | "public";
39
+ /** Disable the query — useful when `query` is empty and you don't want to hit the network. */
40
+ enabled?: boolean;
41
+ /** TanStack Query stale time, milliseconds. Default 30s. */
42
+ staleTime?: number;
43
+ }
44
+ export declare function useCatalogSearch(options: UseCatalogSearchOptions): import("@tanstack/react-query").UseQueryResult<{
45
+ vertical: string;
46
+ mode: "keyword" | "hybrid" | "semantic";
47
+ total: number;
48
+ hits: {
49
+ id: string;
50
+ score: number;
51
+ document: {
52
+ id: string;
53
+ fields: Record<string, unknown>;
54
+ embeddings?: Record<string, number[]> | undefined;
55
+ embedding_model_id?: string | undefined;
56
+ };
57
+ highlights?: Record<string, unknown> | undefined;
58
+ }[];
59
+ cards?: {
60
+ id: string;
61
+ name: string | null;
62
+ slug: string | null;
63
+ primaryCategory: {
64
+ id: string | null;
65
+ name: string | null;
66
+ slug: string | null;
67
+ } | null;
68
+ media: {
69
+ thumbnailUrl: string | null;
70
+ coverMediaUrl: string | null;
71
+ };
72
+ priceFrom: {
73
+ amountCents: number;
74
+ currency: string | null;
75
+ originalAmountCents: number | null;
76
+ } | null;
77
+ offerBadges: {
78
+ id: string | null;
79
+ name: string | null;
80
+ discountKind: string | null;
81
+ discountPercent: number | null;
82
+ discountAmountCents: number | null;
83
+ minPax?: number | null | undefined;
84
+ }[];
85
+ departures: {
86
+ upcomingCount: number | null;
87
+ nextDepartureAt: string | null;
88
+ nextDepartureDate: string | null;
89
+ months: string[];
90
+ dates: string[];
91
+ };
92
+ destinations: {
93
+ regions: string[];
94
+ countries: string[];
95
+ cities: string[];
96
+ ids: string[];
97
+ slugs: string[];
98
+ };
99
+ coordinates: {
100
+ latitude: number;
101
+ longitude: number;
102
+ } | null;
103
+ }[] | undefined;
104
+ facets?: Record<string, {
105
+ value: string | number;
106
+ count: number;
107
+ }[]> | undefined;
108
+ }, Error>;
109
+ //# sourceMappingURL=use-catalog-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-catalog-search.d.ts","sourceRoot":"","sources":["../../src/hooks/use-catalog-search.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;AACjE,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,WAAW,GACX,YAAY,GACZ,eAAe,GACf,QAAQ,CAAA;AACZ,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,iBAAiB,CAAA;AAE/D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IAEb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,UAAU,CAAC,EAAE,uBAAuB,CAAA;IACpC,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAsEhE"}
@@ -0,0 +1,52 @@
1
+ "use client";
2
+ import { keepPreviousData, useQuery } from "@tanstack/react-query";
3
+ import { fetchWithValidation } from "../client.js";
4
+ import { useVoyantCatalogContext } from "../provider.js";
5
+ import { catalogSearchResponseSchema } from "../schemas.js";
6
+ export function useCatalogSearch(options) {
7
+ const { baseUrl, fetcher } = useVoyantCatalogContext();
8
+ const { vertical, query = "", mode = "keyword", sort, projection, filters, facets, pagination, alpha, distance_threshold, query_embedding, market, locale, surface = "admin", enabled = true, staleTime = 30_000, } = options;
9
+ return useQuery({
10
+ queryKey: [
11
+ "catalog-search",
12
+ surface,
13
+ vertical,
14
+ query,
15
+ mode,
16
+ sort,
17
+ projection,
18
+ filters,
19
+ facets,
20
+ pagination,
21
+ alpha,
22
+ distance_threshold,
23
+ query_embedding,
24
+ market,
25
+ locale,
26
+ ],
27
+ queryFn: () => fetchWithValidation(`/v1/${surface}/catalog/search`, catalogSearchResponseSchema, { baseUrl, fetcher }, {
28
+ method: "POST",
29
+ body: JSON.stringify({
30
+ vertical,
31
+ query,
32
+ mode,
33
+ sort,
34
+ projection,
35
+ filters,
36
+ facets,
37
+ pagination,
38
+ alpha,
39
+ distance_threshold,
40
+ query_embedding,
41
+ market,
42
+ locale,
43
+ }),
44
+ }),
45
+ enabled: enabled && !!vertical,
46
+ staleTime,
47
+ // Keep the previous page/filter's results on screen while the next query
48
+ // loads, so paging/filtering doesn't flash a skeleton or shift layout.
49
+ // `isFetching` + `isPlaceholderData` let the UI show a subtle busy state.
50
+ placeholderData: keepPreviousData,
51
+ });
52
+ }
@@ -0,0 +1,397 @@
1
+ export declare const catalogUiEn: {
2
+ catalogPage: {
3
+ title: string;
4
+ description: string;
5
+ searchPlaceholder: string;
6
+ tabs: {
7
+ products: string;
8
+ extras: string;
9
+ cruises: string;
10
+ charters: string;
11
+ accommodations: string;
12
+ };
13
+ actions: {
14
+ bookThis: string;
15
+ openEditor: string;
16
+ };
17
+ columns: {
18
+ name: string;
19
+ status: string;
20
+ active: string;
21
+ source: string;
22
+ supplier: string;
23
+ bookingMode: string;
24
+ pax: string;
25
+ price: string;
26
+ selection: string;
27
+ pricing: string;
28
+ defaultQuantity: string;
29
+ type: string;
30
+ days: string;
31
+ nights: string;
32
+ availableDepartures: string;
33
+ yacht: string;
34
+ from: string;
35
+ class: string;
36
+ maxPax: string;
37
+ bedrooms: string;
38
+ };
39
+ filters: {
40
+ status: string;
41
+ source: string;
42
+ supplier: string;
43
+ bookingMode: string;
44
+ departureMonth: string;
45
+ destination: string;
46
+ country: string;
47
+ board: string;
48
+ stars: string;
49
+ transport: string;
50
+ type: string;
51
+ capacity: string;
52
+ visibility: string;
53
+ facility: string;
54
+ price: string;
55
+ pax: string;
56
+ any: string;
57
+ active: string;
58
+ selection: string;
59
+ pricingMode: string;
60
+ perPerson: string;
61
+ minQuantity: string;
62
+ maxQuantity: string;
63
+ ship: string;
64
+ embark: string;
65
+ disembark: string;
66
+ region: string;
67
+ theme: string;
68
+ nights: string;
69
+ yacht: string;
70
+ apaPercent: string;
71
+ inventory: string;
72
+ class: string;
73
+ smoking: string;
74
+ property: string;
75
+ maxPax: string;
76
+ bedrooms: string;
77
+ bathrooms: string;
78
+ };
79
+ fallbacks: {
80
+ productName: string;
81
+ extraName: string;
82
+ cruiseName: string;
83
+ charterName: string;
84
+ roomName: string;
85
+ detailName: string;
86
+ };
87
+ sourceKinds: {
88
+ owned: string;
89
+ voyantConnect: string;
90
+ manual: string;
91
+ gdsAmadeus: string;
92
+ gdsSabre: string;
93
+ gdsTravelport: string;
94
+ bedbankHotelbeds: string;
95
+ bedbankExpedia: string;
96
+ directSuffix: string;
97
+ };
98
+ search: {
99
+ noTabsConfigured: string;
100
+ clearAll: string;
101
+ noResults: string;
102
+ yourFilters: string;
103
+ resultSingular: string;
104
+ resultPlural: string;
105
+ showing: string;
106
+ previous: string;
107
+ next: string;
108
+ page: string;
109
+ };
110
+ filtersUi: {
111
+ min: string;
112
+ max: string;
113
+ to: string;
114
+ clear: string;
115
+ apply: string;
116
+ noResults: string;
117
+ clearFilter: string;
118
+ };
119
+ view: {
120
+ grid: string;
121
+ list: string;
122
+ filters: string;
123
+ sort: string;
124
+ sortRelevance: string;
125
+ sortPriceAsc: string;
126
+ sortPriceDesc: string;
127
+ sortSoonest: string;
128
+ sortNewest: string;
129
+ showAll: string;
130
+ showLess: string;
131
+ };
132
+ card: {
133
+ from: string;
134
+ viewDetails: string;
135
+ nextDeparture: string;
136
+ departures: string;
137
+ oneDeparture: string;
138
+ daysNights: string;
139
+ nights: string;
140
+ flightIncluded: string;
141
+ };
142
+ boards: {
143
+ RO: string;
144
+ BB: string;
145
+ HB: string;
146
+ FB: string;
147
+ AI: string;
148
+ };
149
+ detail: {
150
+ loadingFullContent: string;
151
+ matchPrefix: string;
152
+ stale: string;
153
+ system: string;
154
+ highlights: string;
155
+ supplier: string;
156
+ itinerary: string;
157
+ ship: string;
158
+ tagsThemes: string;
159
+ attributes: string;
160
+ departures: string;
161
+ sailings: string;
162
+ ends: string;
163
+ book: string;
164
+ options: string;
165
+ cabins: string;
166
+ policies: string;
167
+ brochure: string;
168
+ media: string;
169
+ day: string;
170
+ unlimited: string;
171
+ leftWithCapacity: string;
172
+ left: string;
173
+ capacity: string;
174
+ wheelchairAccessible: string;
175
+ floorPlan: string;
176
+ deckPlan: string;
177
+ openDeckPlan: string;
178
+ shipSpecs: {
179
+ type: string;
180
+ capacity: string;
181
+ capacityGuests: string;
182
+ decks: string;
183
+ yearBuilt: string;
184
+ };
185
+ tabs: {
186
+ overview: string;
187
+ };
188
+ attributeLabels: {
189
+ sellAmount: string;
190
+ supplierId: string;
191
+ };
192
+ tagsInputPlaceholder: string;
193
+ addTag: string;
194
+ arrayLabels: {
195
+ categories: string;
196
+ };
197
+ priceFromLabel: string;
198
+ noUpcomingDepartures: string;
199
+ noUpcomingSailings: string;
200
+ departuresTable: {
201
+ date: string;
202
+ status: string;
203
+ availability: string;
204
+ priceFrom: string;
205
+ soldOut: string;
206
+ closed: string;
207
+ cancelled: string;
208
+ open: string;
209
+ viewDetails: string;
210
+ optionsHeading: string;
211
+ noOptions: string;
212
+ anyMonth: string;
213
+ anyStatus: string;
214
+ minAvailability: string;
215
+ clearFilters: string;
216
+ noResults: string;
217
+ noResultsSailings: string;
218
+ remainingLabel: string;
219
+ };
220
+ };
221
+ values: {
222
+ active: string;
223
+ inactive: string;
224
+ empty: string;
225
+ yes: string;
226
+ no: string;
227
+ open: string;
228
+ };
229
+ };
230
+ catalogBookingPage: {
231
+ title: string;
232
+ descriptionPrefix: string;
233
+ actions: {
234
+ backToCatalog: string;
235
+ refreshPrice: string;
236
+ addTraveler: string;
237
+ removeTraveler: string;
238
+ cancel: string;
239
+ booking: string;
240
+ confirmBooking: string;
241
+ };
242
+ summary: {
243
+ untitled: string;
244
+ departure: string;
245
+ available: string;
246
+ livePrice: string;
247
+ quoteExpires: string;
248
+ quoteFailed: string;
249
+ };
250
+ values: {
251
+ loading: string;
252
+ empty: string;
253
+ yes: string;
254
+ no: string;
255
+ };
256
+ contact: {
257
+ title: string;
258
+ description: string;
259
+ firstName: string;
260
+ lastName: string;
261
+ email: string;
262
+ phone: string;
263
+ firstNamePlaceholder: string;
264
+ lastNamePlaceholder: string;
265
+ emailPlaceholder: string;
266
+ phonePlaceholder: string;
267
+ };
268
+ travelers: {
269
+ title: string;
270
+ description: string;
271
+ firstNameLabel: string;
272
+ lastNameLabel: string;
273
+ emailLabel: string;
274
+ firstNamePlaceholder: string;
275
+ lastNamePlaceholder: string;
276
+ emailPlaceholder: string;
277
+ };
278
+ notes: {
279
+ title: string;
280
+ description: string;
281
+ placeholder: string;
282
+ };
283
+ payment: {
284
+ title: string;
285
+ description: string;
286
+ intent: string;
287
+ hold: string;
288
+ cardComingSoon: string;
289
+ };
290
+ review: {
291
+ total: string;
292
+ };
293
+ validation: {
294
+ waitingForPrice: string;
295
+ notBookable: string;
296
+ contactNameRequired: string;
297
+ contactEmailRequired: string;
298
+ travelerNameRequired: string;
299
+ };
300
+ };
301
+ catalogBrowser: {
302
+ detail: {
303
+ datesAndPrices: string;
304
+ datesError: string;
305
+ availabilityUnavailable: string;
306
+ noDepartures: string;
307
+ selectDate: string;
308
+ roomType: string;
309
+ roomTypes: string;
310
+ roomsTitle: string;
311
+ notFound: string;
312
+ loadError: string;
313
+ about: string;
314
+ cabins: string;
315
+ itinerary: string;
316
+ ship: string;
317
+ day: string;
318
+ atSea: string;
319
+ capacity: string;
320
+ decks: string;
321
+ soldOut: string;
322
+ highlights: string;
323
+ location: string;
324
+ guestReviews: string;
325
+ reviewsWord: string;
326
+ book: string;
327
+ freeCancellation: string;
328
+ photos: string;
329
+ from: string;
330
+ nightsFlightIncluded: string;
331
+ max: string;
332
+ room: string;
333
+ perPerson: string;
334
+ mealPlan: string;
335
+ close: string;
336
+ prevPhoto: string;
337
+ nextPhoto: string;
338
+ boards: {
339
+ RO: string;
340
+ BB: string;
341
+ HB: string;
342
+ FB: string;
343
+ AI: string;
344
+ standard: string;
345
+ };
346
+ };
347
+ search: {
348
+ searchLabel: string;
349
+ searchPlaceholder: string;
350
+ destination: string;
351
+ chooseCountry: string;
352
+ when: string;
353
+ anyTime: string;
354
+ flyingFrom: string;
355
+ finding: string;
356
+ loading: string;
357
+ allAirports: string;
358
+ departureAirport: string;
359
+ duration: string;
360
+ nights: string;
361
+ adults: string;
362
+ searchAvailability: string;
363
+ searching: string;
364
+ clear: string;
365
+ error: string;
366
+ availabilityUnavailable: string;
367
+ noDepartures: string;
368
+ thisDestination: string;
369
+ departureDate: string;
370
+ departureDates: string;
371
+ in: string;
372
+ holiday: string;
373
+ holidays: string;
374
+ departing: string;
375
+ selectDay: string;
376
+ flightIncluded: string;
377
+ viewDates: string;
378
+ perPerson: string;
379
+ cruiseType: string;
380
+ allTypes: string;
381
+ typeRiver: string;
382
+ typeOcean: string;
383
+ cruisePlaceholder: string;
384
+ sailing: string;
385
+ sailings: string;
386
+ viewCruise: string;
387
+ noSailings: string;
388
+ };
389
+ calendar: {
390
+ prevMonth: string;
391
+ nextMonth: string;
392
+ offer: string;
393
+ offers: string;
394
+ };
395
+ };
396
+ };
397
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6YK,CAAA"}