@abcagency/hc-ui-components 1.7.6 → 1.7.8

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.
@@ -1,8 +1,46 @@
1
1
  import { asyncToGenerator as _asyncToGenerator, regeneratorRuntime as _regeneratorRuntime } from '../_virtual/_rollupPluginBabelHelpers.js';
2
- import { liteClient } from 'algoliasearch/lite';
3
2
 
4
3
  var algoliaClient = null;
5
4
  var algoliaIndexName = null;
5
+ var algoliaSearchModule = null;
6
+
7
+ /**
8
+ * Lazy load algoliasearch to avoid SSR issues
9
+ */
10
+ var getAlgoliaSearch = /*#__PURE__*/function () {
11
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
12
+ var _yield$import, liteClient;
13
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
14
+ while (1) switch (_context.prev = _context.next) {
15
+ case 0:
16
+ if (!(typeof window === 'undefined')) {
17
+ _context.next = 2;
18
+ break;
19
+ }
20
+ return _context.abrupt("return", null);
21
+ case 2:
22
+ if (algoliaSearchModule) {
23
+ _context.next = 8;
24
+ break;
25
+ }
26
+ _context.next = 5;
27
+ return import('algoliasearch/lite');
28
+ case 5:
29
+ _yield$import = _context.sent;
30
+ liteClient = _yield$import.liteClient;
31
+ algoliaSearchModule = liteClient;
32
+ case 8:
33
+ return _context.abrupt("return", algoliaSearchModule);
34
+ case 9:
35
+ case "end":
36
+ return _context.stop();
37
+ }
38
+ }, _callee);
39
+ }));
40
+ return function getAlgoliaSearch() {
41
+ return _ref.apply(this, arguments);
42
+ };
43
+ }();
6
44
 
7
45
  /**
8
46
  * Initialize Algolia search client
@@ -10,20 +48,49 @@ var algoliaIndexName = null;
10
48
  * @param {string} apiKey - Algolia Search API Key
11
49
  * @param {string} indexName - Algolia Index Name
12
50
  */
13
- var initializeAlgoliaSearch = function initializeAlgoliaSearch(appId, apiKey, indexName) {
14
- if (!appId || !apiKey || !indexName) {
15
- console.warn('Algolia search not initialized: missing configuration');
16
- return false;
17
- }
18
- try {
19
- algoliaClient = liteClient(appId, apiKey);
20
- algoliaIndexName = indexName;
21
- return true;
22
- } catch (error) {
23
- console.error('Failed to initialize Algolia:', error);
24
- return false;
25
- }
26
- };
51
+ var initializeAlgoliaSearch = /*#__PURE__*/function () {
52
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(appId, apiKey, indexName) {
53
+ var algoliasearch;
54
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
55
+ while (1) switch (_context2.prev = _context2.next) {
56
+ case 0:
57
+ if (!(!appId || !apiKey || !indexName)) {
58
+ _context2.next = 3;
59
+ break;
60
+ }
61
+ console.warn('Algolia search not initialized: missing configuration');
62
+ return _context2.abrupt("return", false);
63
+ case 3:
64
+ _context2.prev = 3;
65
+ _context2.next = 6;
66
+ return getAlgoliaSearch();
67
+ case 6:
68
+ algoliasearch = _context2.sent;
69
+ if (algoliasearch) {
70
+ _context2.next = 10;
71
+ break;
72
+ }
73
+ console.warn('Algolia search not available (SSR context)');
74
+ return _context2.abrupt("return", false);
75
+ case 10:
76
+ algoliaClient = algoliasearch(appId, apiKey);
77
+ algoliaIndexName = indexName;
78
+ return _context2.abrupt("return", true);
79
+ case 15:
80
+ _context2.prev = 15;
81
+ _context2.t0 = _context2["catch"](3);
82
+ console.error('Failed to initialize Algolia:', _context2.t0);
83
+ return _context2.abrupt("return", false);
84
+ case 19:
85
+ case "end":
86
+ return _context2.stop();
87
+ }
88
+ }, _callee2, null, [[3, 15]]);
89
+ }));
90
+ return function initializeAlgoliaSearch(_x, _x2, _x3) {
91
+ return _ref2.apply(this, arguments);
92
+ };
93
+ }();
27
94
 
28
95
  /**
29
96
  * Check if Algolia is initialized and available
@@ -38,19 +105,19 @@ var isAlgoliaAvailable = function isAlgoliaAvailable() {
38
105
  * @returns {Promise<{referenceNumbers: number[], ids: string[], orderMap: Map}>} Object with arrays of IDs and a map for ordering
39
106
  */
40
107
  var searchAlgolia = /*#__PURE__*/function () {
41
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(query) {
108
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(query) {
42
109
  var _results$, _yield$algoliaClient$, results, hits, referenceNumbers, ids, orderMap;
43
- return _regeneratorRuntime().wrap(function _callee$(_context) {
44
- while (1) switch (_context.prev = _context.next) {
110
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
111
+ while (1) switch (_context3.prev = _context3.next) {
45
112
  case 0:
46
113
  if (isAlgoliaAvailable()) {
47
- _context.next = 2;
114
+ _context3.next = 2;
48
115
  break;
49
116
  }
50
117
  throw new Error('Algolia search is not initialized');
51
118
  case 2:
52
- _context.prev = 2;
53
- _context.next = 5;
119
+ _context3.prev = 2;
120
+ _context3.next = 5;
54
121
  return algoliaClient.search({
55
122
  requests: [{
56
123
  indexName: algoliaIndexName,
@@ -59,7 +126,7 @@ var searchAlgolia = /*#__PURE__*/function () {
59
126
  }]
60
127
  });
61
128
  case 5:
62
- _yield$algoliaClient$ = _context.sent;
129
+ _yield$algoliaClient$ = _context3.sent;
63
130
  results = _yield$algoliaClient$.results;
64
131
  // Extract IDs from the results and maintain order
65
132
  hits = ((_results$ = results[0]) === null || _results$ === void 0 ? void 0 : _results$.hits) || [];
@@ -79,24 +146,24 @@ var searchAlgolia = /*#__PURE__*/function () {
79
146
  }
80
147
  });
81
148
  console.log('Extracted', referenceNumbers.length, 'referenceNumbers and', ids.length, 'ids from Algolia');
82
- return _context.abrupt("return", {
149
+ return _context3.abrupt("return", {
83
150
  referenceNumbers: referenceNumbers,
84
151
  ids: ids,
85
152
  orderMap: orderMap
86
153
  });
87
154
  case 17:
88
- _context.prev = 17;
89
- _context.t0 = _context["catch"](2);
90
- console.error('Algolia search failed:', _context.t0);
91
- throw _context.t0;
155
+ _context3.prev = 17;
156
+ _context3.t0 = _context3["catch"](2);
157
+ console.error('Algolia search failed:', _context3.t0);
158
+ throw _context3.t0;
92
159
  case 21:
93
160
  case "end":
94
- return _context.stop();
161
+ return _context3.stop();
95
162
  }
96
- }, _callee, null, [[2, 17]]);
163
+ }, _callee3, null, [[2, 17]]);
97
164
  }));
98
- return function searchAlgolia(_x) {
99
- return _ref.apply(this, arguments);
165
+ return function searchAlgolia(_x4) {
166
+ return _ref3.apply(this, arguments);
100
167
  };
101
168
  }(); /**
102
169
  * Filter listings by Algolia search results and sort by Algolia's result order
@@ -105,22 +172,22 @@ var searchAlgolia = /*#__PURE__*/function () {
105
172
  * @returns {Promise<Array>} Filtered and sorted listings
106
173
  */
107
174
  var filterListingsByAlgoliaSearch = /*#__PURE__*/function () {
108
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(listings, query) {
175
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(listings, query) {
109
176
  var _yield$searchAlgolia, referenceNumbers, ids, orderMap, filtered;
110
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
111
- while (1) switch (_context2.prev = _context2.next) {
177
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
178
+ while (1) switch (_context4.prev = _context4.next) {
112
179
  case 0:
113
180
  if (!(!query || !isAlgoliaAvailable())) {
114
- _context2.next = 2;
181
+ _context4.next = 2;
115
182
  break;
116
183
  }
117
- return _context2.abrupt("return", listings);
184
+ return _context4.abrupt("return", listings);
118
185
  case 2:
119
- _context2.prev = 2;
120
- _context2.next = 5;
186
+ _context4.prev = 2;
187
+ _context4.next = 5;
121
188
  return searchAlgolia(query);
122
189
  case 5:
123
- _yield$searchAlgolia = _context2.sent;
190
+ _yield$searchAlgolia = _context4.sent;
124
191
  referenceNumbers = _yield$searchAlgolia.referenceNumbers;
125
192
  ids = _yield$searchAlgolia.ids;
126
193
  orderMap = _yield$searchAlgolia.orderMap;
@@ -139,27 +206,27 @@ var filterListingsByAlgoliaSearch = /*#__PURE__*/function () {
139
206
  return referenceNumbers.includes(listing.referenceNumber) || ids.includes(listing.id);
140
207
  }); // Sort filtered listings by Algolia result order
141
208
  filtered.sort(function (a, b) {
142
- var _ref3, _orderMap$get, _ref4, _orderMap$get2;
209
+ var _ref5, _orderMap$get, _ref6, _orderMap$get2;
143
210
  // Get the Algolia order index for each listing
144
- var orderA = (_ref3 = (_orderMap$get = orderMap.get("ref-".concat(a.referenceNumber))) !== null && _orderMap$get !== void 0 ? _orderMap$get : orderMap.get("id-".concat(a.id))) !== null && _ref3 !== void 0 ? _ref3 : Infinity;
145
- var orderB = (_ref4 = (_orderMap$get2 = orderMap.get("ref-".concat(b.referenceNumber))) !== null && _orderMap$get2 !== void 0 ? _orderMap$get2 : orderMap.get("id-".concat(b.id))) !== null && _ref4 !== void 0 ? _ref4 : Infinity;
211
+ var orderA = (_ref5 = (_orderMap$get = orderMap.get("ref-".concat(a.referenceNumber))) !== null && _orderMap$get !== void 0 ? _orderMap$get : orderMap.get("id-".concat(a.id))) !== null && _ref5 !== void 0 ? _ref5 : Infinity;
212
+ var orderB = (_ref6 = (_orderMap$get2 = orderMap.get("ref-".concat(b.referenceNumber))) !== null && _orderMap$get2 !== void 0 ? _orderMap$get2 : orderMap.get("id-".concat(b.id))) !== null && _ref6 !== void 0 ? _ref6 : Infinity;
146
213
  return orderA - orderB;
147
214
  });
148
215
  console.log('Filtered result:', filtered.length, 'listings matched and sorted by Algolia order');
149
- return _context2.abrupt("return", filtered);
216
+ return _context4.abrupt("return", filtered);
150
217
  case 20:
151
- _context2.prev = 20;
152
- _context2.t0 = _context2["catch"](2);
153
- console.error('Failed to filter by Algolia search, returning all listings:', _context2.t0);
154
- return _context2.abrupt("return", listings);
218
+ _context4.prev = 20;
219
+ _context4.t0 = _context4["catch"](2);
220
+ console.error('Failed to filter by Algolia search, returning all listings:', _context4.t0);
221
+ return _context4.abrupt("return", listings);
155
222
  case 24:
156
223
  case "end":
157
- return _context2.stop();
224
+ return _context4.stop();
158
225
  }
159
- }, _callee2, null, [[2, 20]]);
226
+ }, _callee4, null, [[2, 20]]);
160
227
  }));
161
- return function filterListingsByAlgoliaSearch(_x2, _x3) {
162
- return _ref2.apply(this, arguments);
228
+ return function filterListingsByAlgoliaSearch(_x5, _x6) {
229
+ return _ref4.apply(this, arguments);
163
230
  };
164
231
  }();
165
232
 
@@ -1 +1 @@
1
- {"version":3,"file":"algoliaSearchUtil.js","sources":["../../src/util/algoliaSearchUtil.js"],"sourcesContent":["import { liteClient as algoliasearch } from 'algoliasearch/lite';\n\nlet algoliaClient = null;\nlet algoliaIndexName = null;\n\n/**\n * Initialize Algolia search client\n * @param {string} appId - Algolia Application ID\n * @param {string} apiKey - Algolia Search API Key\n * @param {string} indexName - Algolia Index Name\n */\nexport const initializeAlgoliaSearch = (appId, apiKey, indexName) => {\n\tif (!appId || !apiKey || !indexName) {\n\t\tconsole.warn('Algolia search not initialized: missing configuration');\n\t\treturn false;\n\t}\n\n\ttry {\n\t\talgoliaClient = algoliasearch(appId, apiKey);\n\t\talgoliaIndexName = indexName;\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error('Failed to initialize Algolia:', error);\n\t\treturn false;\n\t}\n};\n\n/**\n * Check if Algolia is initialized and available\n */\nexport const isAlgoliaAvailable = () => {\n\treturn algoliaClient !== null && algoliaIndexName !== null;\n};\n\n/**\n * Search using Algolia and return matching listing IDs with their order\n * @param {string} query - Search query\n * @returns {Promise<{referenceNumbers: number[], ids: string[], orderMap: Map}>} Object with arrays of IDs and a map for ordering\n */\nexport const searchAlgolia = async (query) => {\n\tif (!isAlgoliaAvailable()) {\n\t\tthrow new Error('Algolia search is not initialized');\n\t}\n\n\ttry {\n\t\tconst { results } = await algoliaClient.search({\n\t\t\trequests: [\n\t\t\t\t{\n\t\t\t\t\tindexName: algoliaIndexName,\n\t\t\t\t\tquery: query,\n\t\t\t\t\thitsPerPage: 1000 // Adjust based on your needs\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\n\t\t// Extract IDs from the results and maintain order\n\t\tconst hits = results[0]?.hits || [];\n\t\tconsole.log('Algolia search returned', hits.length, 'hits');\n\n\t\tconst referenceNumbers = [];\n\t\tconst ids = [];\n\t\tconst orderMap = new Map(); // Map to store the Algolia result order\n\n\t\thits.forEach((hit, index) => {\n\t\t\tif (hit.referenceNumber) {\n\t\t\t\tconst refNum = parseInt(hit.referenceNumber);\n\t\t\t\treferenceNumbers.push(refNum);\n\t\t\t\torderMap.set(`ref-${refNum}`, index);\n\t\t\t}\n\t\t\tif (hit.id) {\n\t\t\t\tids.push(hit.id);\n\t\t\t\torderMap.set(`id-${hit.id}`, index);\n\t\t\t}\n\t\t});\n\n\t\tconsole.log('Extracted', referenceNumbers.length, 'referenceNumbers and', ids.length, 'ids from Algolia');\n\t\treturn { referenceNumbers, ids, orderMap };\n\t} catch (error) {\n\t\tconsole.error('Algolia search failed:', error);\n\t\tthrow error;\n\t}\n};/**\n * Filter listings by Algolia search results and sort by Algolia's result order\n * @param {Array} listings - All listings to filter\n * @param {string} query - Search query\n * @returns {Promise<Array>} Filtered and sorted listings\n */\nexport const filterListingsByAlgoliaSearch = async (listings, query) => {\n\tif (!query || !isAlgoliaAvailable()) {\n\t\treturn listings;\n\t}\n\n\ttry {\n\t\tconst { referenceNumbers, ids, orderMap } = await searchAlgolia(query);\n\n\t\tconsole.log('Filtering', listings.length, 'listings against', referenceNumbers.length, 'referenceNumbers and', ids.length, 'ids');\n\t\tconsole.log('Sample listing referenceNumbers:', listings.slice(0, 5).map(l => l.referenceNumber));\n\t\tconsole.log('Sample listing ids:', listings.slice(0, 5).map(l => l.id));\n\t\tconsole.log('Sample Algolia referenceNumbers:', referenceNumbers.slice(0, 5));\n\t\tconsole.log('Sample Algolia ids:', ids.slice(0, 5));\n\n\t\t// Filter listings by matching referenceNumber OR id\n\t\tconst filtered = listings.filter(listing =>\n\t\t\treferenceNumbers.includes(listing.referenceNumber) || ids.includes(listing.id)\n\t\t);\n\n\t\t// Sort filtered listings by Algolia result order\n\t\tfiltered.sort((a, b) => {\n\t\t\t// Get the Algolia order index for each listing\n\t\t\tconst orderA = orderMap.get(`ref-${a.referenceNumber}`) ?? orderMap.get(`id-${a.id}`) ?? Infinity;\n\t\t\tconst orderB = orderMap.get(`ref-${b.referenceNumber}`) ?? orderMap.get(`id-${b.id}`) ?? Infinity;\n\t\t\treturn orderA - orderB;\n\t\t});\n\n\t\tconsole.log('Filtered result:', filtered.length, 'listings matched and sorted by Algolia order');\n\t\treturn filtered;\n\t} catch (error) {\n\t\tconsole.error('Failed to filter by Algolia search, returning all listings:', error);\n\t\treturn listings;\n\t}\n};\n"],"names":["algoliaClient","algoliaIndexName","initializeAlgoliaSearch","appId","apiKey","indexName","console","warn","algoliasearch","error","isAlgoliaAvailable","searchAlgolia","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","query","_results$","_yield$algoliaClient$","results","hits","referenceNumbers","ids","orderMap","wrap","_callee$","_context","prev","next","Error","search","requests","hitsPerPage","sent","log","length","Map","forEach","hit","index","referenceNumber","refNum","parseInt","push","set","concat","id","abrupt","t0","stop","_x","apply","arguments","filterListingsByAlgoliaSearch","_ref2","_callee2","listings","_yield$searchAlgolia","filtered","_callee2$","_context2","slice","map","l","filter","listing","includes","sort","a","b","_ref3","_orderMap$get","_ref4","_orderMap$get2","orderA","get","Infinity","orderB","_x2","_x3"],"mappings":"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"}
1
+ {"version":3,"file":"algoliaSearchUtil.js","sources":["../../src/util/algoliaSearchUtil.js"],"sourcesContent":["let algoliaClient = null;\nlet algoliaIndexName = null;\nlet algoliaSearchModule = null;\n\n/**\n * Lazy load algoliasearch to avoid SSR issues\n */\nconst getAlgoliaSearch = async () => {\n\tif (typeof window === 'undefined') return null;\n\tif (!algoliaSearchModule) {\n\t\tconst { liteClient } = await import('algoliasearch/lite');\n\t\talgoliaSearchModule = liteClient;\n\t}\n\treturn algoliaSearchModule;\n};\n\n/**\n * Initialize Algolia search client\n * @param {string} appId - Algolia Application ID\n * @param {string} apiKey - Algolia Search API Key\n * @param {string} indexName - Algolia Index Name\n */\nexport const initializeAlgoliaSearch = async (appId, apiKey, indexName) => {\n\tif (!appId || !apiKey || !indexName) {\n\t\tconsole.warn('Algolia search not initialized: missing configuration');\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst algoliasearch = await getAlgoliaSearch();\n\t\tif (!algoliasearch) {\n\t\t\tconsole.warn('Algolia search not available (SSR context)');\n\t\t\treturn false;\n\t\t}\n\t\talgoliaClient = algoliasearch(appId, apiKey);\n\t\talgoliaIndexName = indexName;\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error('Failed to initialize Algolia:', error);\n\t\treturn false;\n\t}\n};\n\n/**\n * Check if Algolia is initialized and available\n */\nexport const isAlgoliaAvailable = () => {\n\treturn algoliaClient !== null && algoliaIndexName !== null;\n};\n\n/**\n * Search using Algolia and return matching listing IDs with their order\n * @param {string} query - Search query\n * @returns {Promise<{referenceNumbers: number[], ids: string[], orderMap: Map}>} Object with arrays of IDs and a map for ordering\n */\nexport const searchAlgolia = async (query) => {\n\tif (!isAlgoliaAvailable()) {\n\t\tthrow new Error('Algolia search is not initialized');\n\t}\n\n\ttry {\n\t\tconst { results } = await algoliaClient.search({\n\t\t\trequests: [\n\t\t\t\t{\n\t\t\t\t\tindexName: algoliaIndexName,\n\t\t\t\t\tquery: query,\n\t\t\t\t\thitsPerPage: 1000 // Adjust based on your needs\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\n\t\t// Extract IDs from the results and maintain order\n\t\tconst hits = results[0]?.hits || [];\n\t\tconsole.log('Algolia search returned', hits.length, 'hits');\n\n\t\tconst referenceNumbers = [];\n\t\tconst ids = [];\n\t\tconst orderMap = new Map(); // Map to store the Algolia result order\n\n\t\thits.forEach((hit, index) => {\n\t\t\tif (hit.referenceNumber) {\n\t\t\t\tconst refNum = parseInt(hit.referenceNumber);\n\t\t\t\treferenceNumbers.push(refNum);\n\t\t\t\torderMap.set(`ref-${refNum}`, index);\n\t\t\t}\n\t\t\tif (hit.id) {\n\t\t\t\tids.push(hit.id);\n\t\t\t\torderMap.set(`id-${hit.id}`, index);\n\t\t\t}\n\t\t});\n\n\t\tconsole.log('Extracted', referenceNumbers.length, 'referenceNumbers and', ids.length, 'ids from Algolia');\n\t\treturn { referenceNumbers, ids, orderMap };\n\t} catch (error) {\n\t\tconsole.error('Algolia search failed:', error);\n\t\tthrow error;\n\t}\n};/**\n * Filter listings by Algolia search results and sort by Algolia's result order\n * @param {Array} listings - All listings to filter\n * @param {string} query - Search query\n * @returns {Promise<Array>} Filtered and sorted listings\n */\nexport const filterListingsByAlgoliaSearch = async (listings, query) => {\n\tif (!query || !isAlgoliaAvailable()) {\n\t\treturn listings;\n\t}\n\n\ttry {\n\t\tconst { referenceNumbers, ids, orderMap } = await searchAlgolia(query);\n\n\t\tconsole.log('Filtering', listings.length, 'listings against', referenceNumbers.length, 'referenceNumbers and', ids.length, 'ids');\n\t\tconsole.log('Sample listing referenceNumbers:', listings.slice(0, 5).map(l => l.referenceNumber));\n\t\tconsole.log('Sample listing ids:', listings.slice(0, 5).map(l => l.id));\n\t\tconsole.log('Sample Algolia referenceNumbers:', referenceNumbers.slice(0, 5));\n\t\tconsole.log('Sample Algolia ids:', ids.slice(0, 5));\n\n\t\t// Filter listings by matching referenceNumber OR id\n\t\tconst filtered = listings.filter(listing =>\n\t\t\treferenceNumbers.includes(listing.referenceNumber) || ids.includes(listing.id)\n\t\t);\n\n\t\t// Sort filtered listings by Algolia result order\n\t\tfiltered.sort((a, b) => {\n\t\t\t// Get the Algolia order index for each listing\n\t\t\tconst orderA = orderMap.get(`ref-${a.referenceNumber}`) ?? orderMap.get(`id-${a.id}`) ?? Infinity;\n\t\t\tconst orderB = orderMap.get(`ref-${b.referenceNumber}`) ?? orderMap.get(`id-${b.id}`) ?? Infinity;\n\t\t\treturn orderA - orderB;\n\t\t});\n\n\t\tconsole.log('Filtered result:', filtered.length, 'listings matched and sorted by Algolia order');\n\t\treturn filtered;\n\t} catch (error) {\n\t\tconsole.error('Failed to filter by Algolia search, returning all listings:', error);\n\t\treturn listings;\n\t}\n};\n"],"names":["algoliaClient","algoliaIndexName","algoliaSearchModule","getAlgoliaSearch","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_yield$import","liteClient","wrap","_callee$","_context","prev","next","window","abrupt","sent","stop","apply","arguments","initializeAlgoliaSearch","_ref2","_callee2","appId","apiKey","indexName","algoliasearch","_callee2$","_context2","console","warn","t0","error","_x","_x2","_x3","isAlgoliaAvailable","searchAlgolia","_ref3","_callee3","query","_results$","_yield$algoliaClient$","results","hits","referenceNumbers","ids","orderMap","_callee3$","_context3","Error","search","requests","hitsPerPage","log","length","Map","forEach","hit","index","referenceNumber","refNum","parseInt","push","set","concat","id","_x4","filterListingsByAlgoliaSearch","_ref4","_callee4","listings","_yield$searchAlgolia","filtered","_callee4$","_context4","slice","map","l","filter","listing","includes","sort","a","b","_ref5","_orderMap$get","_ref6","_orderMap$get2","orderA","get","Infinity","orderB","_x5","_x6"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@abcagency/hc-ui-components",
3
- "version": "1.7.6",
3
+ "version": "1.7.8",
4
4
  "description": "UI Components for HireControl",
5
+ "type": "module",
5
6
  "main": "dist/index.js",
6
7
  "module": "dist/index.js",
7
8
  "types": "dist/index.d.ts",
@@ -140,17 +140,19 @@ export const HireControlMap = ({
140
140
  }
141
141
  }
142
142
  }) => {
143
- // Initialize Algolia immediately if credentials are provided
144
- const [algoliaInitialized, setAlgoliaInitialized] = useState(() => {
145
- if (algoliaAppId && algoliaApiKey && algoliaIndexName) {
146
- const initialized = initializeAlgoliaSearch(algoliaAppId, algoliaApiKey, algoliaIndexName);
147
- if (initialized) {
148
- console.log('Algolia search initialized successfully');
149
- }
150
- return initialized;
143
+ // Initialize Algolia when credentials are provided (client-side only)
144
+ const [algoliaInitialized, setAlgoliaInitialized] = useState(false);
145
+
146
+ useEffect(() => {
147
+ if (algoliaAppId && algoliaApiKey && algoliaIndexName && typeof window !== 'undefined') {
148
+ initializeAlgoliaSearch(algoliaAppId, algoliaApiKey, algoliaIndexName).then(initialized => {
149
+ setAlgoliaInitialized(initialized);
150
+ if (initialized) {
151
+ console.log('Algolia search initialized successfully');
152
+ }
153
+ });
151
154
  }
152
- return false;
153
- });
155
+ }, [algoliaAppId, algoliaApiKey, algoliaIndexName]);
154
156
 
155
157
  // Load Google Maps (non-blocking - map component will handle this)
156
158
  const { isLoaded: isMapsLoaded, loadError } = useLoadScript({
@@ -170,6 +172,17 @@ export const HireControlMap = ({
170
172
  return <div className="hc-p-4">Error loading Google Maps</div>;
171
173
  }
172
174
 
175
+ // Wait for Google Maps to load before rendering
176
+ if (!isMapsLoaded) {
177
+ console.log('Waiting for Google Maps API to load...');
178
+ return <div className="hc-p-4 hc-flex hc-items-center hc-justify-center hc-h-screen">
179
+ <div className="hc-text-center">
180
+ <div className="hc-animate-spin hc-rounded-full hc-h-12 hc-w-12 hc-border-b-2 hc-border-gray-900 hc-mx-auto"></div>
181
+ <p className="hc-mt-4 hc-text-gray-600">Loading map...</p>
182
+ </div>
183
+ </div>;
184
+ }
185
+
173
186
  // siteConfiguration is now required - all data passed in statically
174
187
  if (!siteConfiguration) {
175
188
  console.error('Site configuration is required');
@@ -11,6 +11,7 @@ const ListItemContainer = ({
11
11
  specialFeatures,
12
12
  bodyClassName,
13
13
  onItemSelected,
14
+ index,
14
15
  ...props
15
16
  }) => {
16
17
  const { siteConfig, googleMapsApiKey, favorites, handleSettingFavorites, setMobileTab } = useMapList();
@@ -31,6 +32,7 @@ const ListItemContainer = ({
31
32
  googleMapsApiKey={googleMapsApiKey}
32
33
  favorites={favorites}
33
34
  handleSettingFavorites={handleSettingFavorites}
35
+ index={index}
34
36
  {...props}
35
37
  />
36
38
  );
@@ -16,6 +16,36 @@ import { MarkerClustererF, Marker } from "@react-google-maps/api";
16
16
  import { clusterOptions } from "~/util/mapUtil";
17
17
 
18
18
  const MapContainer = ({ markerConfigs, infoWindowClasses, clusterGridSize = 60 }) => {
19
+ const [isGoogleMapsReady, setIsGoogleMapsReady] = useState(false);
20
+
21
+ // Check if Google Maps is loaded
22
+ useEffect(() => {
23
+ if (typeof window !== 'undefined' && window.google && window.google.maps) {
24
+ console.log('Google Maps already loaded');
25
+ setIsGoogleMapsReady(true);
26
+ return;
27
+ }
28
+
29
+ console.log('Waiting for Google Maps to load...');
30
+ let attempts = 0;
31
+ const maxAttempts = 50; // 5 seconds max
32
+
33
+ // Poll for Google Maps to become available
34
+ const checkInterval = setInterval(() => {
35
+ attempts++;
36
+ if (typeof window !== 'undefined' && window.google && window.google.maps) {
37
+ console.log('Google Maps loaded after', attempts * 100, 'ms');
38
+ setIsGoogleMapsReady(true);
39
+ clearInterval(checkInterval);
40
+ } else if (attempts >= maxAttempts) {
41
+ console.error('Google Maps failed to load after 5 seconds');
42
+ clearInterval(checkInterval);
43
+ }
44
+ }, 100);
45
+
46
+ return () => clearInterval(checkInterval);
47
+ }, []);
48
+
19
49
  const {
20
50
  location,
21
51
  zoom,
@@ -255,11 +285,29 @@ const MapContainer = ({ markerConfigs, infoWindowClasses, clusterGridSize = 60 }
255
285
  }
256
286
  }, 300);
257
287
  };
258
- if (!mapItems) {
259
- return null;
288
+ if (!isGoogleMapsReady) {
289
+ return (
290
+ <div className="hc-w-full hc-h-full hc-bg-gray-100 hc-flex hc-items-center hc-justify-center">
291
+ <div className="hc-text-center hc-p-8">
292
+ <div className="hc-animate-spin hc-rounded-full hc-h-12 hc-w-12 hc-border-b-2 hc-border-gray-900 hc-mx-auto"></div>
293
+ <p className="hc-mt-4 hc-text-gray-600">Loading map...</p>
294
+ </div>
295
+ </div>
296
+ );
297
+ }
298
+
299
+ // Ensure mapItems is an array
300
+ const mapItemsArray = Array.isArray(mapItems) ? mapItems : [];
301
+
302
+ if (!mapItemsArray || mapItemsArray.length === 0) {
303
+ return (
304
+ <div className="hc-w-full hc-h-full hc-bg-gray-100 hc-flex hc-items-center hc-justify-center">
305
+ <div className="hc-text-gray-600">No locations to display</div>
306
+ </div>
307
+ );
260
308
  }
261
309
 
262
- const mapItemsKey = mapItems.map(item => item.id).join("-");
310
+ const mapItemsKey = mapItemsArray.map(item => item.id).join("-");
263
311
 
264
312
 
265
313
  return (
@@ -295,7 +343,7 @@ const MapContainer = ({ markerConfigs, infoWindowClasses, clusterGridSize = 60 }
295
343
  >
296
344
  {clusterer => (
297
345
  <>
298
- {mapItems.map(item => {
346
+ {mapItemsArray.map(item => {
299
347
  const markerCount = Object.values(item.items).length;
300
348
  return (
301
349
  <MapMarker
@@ -19,12 +19,18 @@ const ListItem = forwardRef(
19
19
  favorites,
20
20
  includeFavorite = true,
21
21
  siteConfig,
22
+ googleMapsApiKey,
22
23
  index,
23
24
  ...props
24
25
  },
25
26
  ref
26
27
  ) => {
27
28
  const mapPinColor = !showMap ? null : siteConfig.colors.primary.replace("#", "");
29
+
30
+ // Generate static map URL for mobile
31
+ const staticMapUrl = showMap && item.mapDetails?.latitude && item.mapDetails?.longitude
32
+ ? `https://maps.googleapis.com/maps/api/staticmap?scale=2&center=${item.mapDetails.latitude},${item.mapDetails.longitude}&zoom=10&size=240x180&maptype=roadmap&markers=color:0x${mapPinColor}%7Clabel:•%7C${item.mapDetails.latitude},${item.mapDetails.longitude}&key=${googleMapsApiKey}`
33
+ : null;
28
34
 
29
35
  // Mobile detection for bandwidth optimization
30
36
  const [isMobile, setIsMobile] = useState(false);
@@ -180,13 +186,13 @@ const ListItem = forwardRef(
180
186
  }
181
187
  </Grid>
182
188
  {/* MOBILE ONLY: This map section is visible on mobile and hidden on desktop (md:hc-hidden) */}
183
- {showMap && item.mapDetails?.staticMapUrl && (
189
+ {showMap && staticMapUrl && (
184
190
  <div
185
191
  onClick={() => { setMobileTab("mapTab"); handleClick(); }}
186
192
  className="md:hc-hidden hc-w-2/5 sm:hc-w-1/3 hc-p-1.5 hc-my-1 hc-bg-uiAccent/5 hc-border hc-border-uiAccent/10 hc-rounded-sm"
187
193
  >
188
194
  <img
189
- src={item.mapDetails.staticMapUrl}
195
+ src={staticMapUrl}
190
196
  alt={`Map of location for ${item.fields.position}`}
191
197
  className="hc-w-full hc-h-full hc-object-cover"
192
198
  loading="lazy"
@@ -303,6 +303,20 @@ export const MapListProvider: React.FC<MapListProviderProps> = ({
303
303
  fetchEntities();
304
304
  }, [commuteLocation, allListings, siteConfig.companyId, getListingEntitiesCallback, noEntities]);
305
305
 
306
+ // Convert passed-in entities array to listingEntities object
307
+ useEffect(() => {
308
+ if (entities && entities.length > 0) {
309
+ const entitiesObj: Record<string, any> = {};
310
+ entities.forEach((entity: any) => {
311
+ if (entity.entityKey) {
312
+ entitiesObj[entity.entityKey.toLowerCase()] = entity;
313
+ }
314
+ });
315
+ console.log('Set listingEntities from passed entities:', entitiesObj);
316
+ setListingEntities(entitiesObj);
317
+ }
318
+ }, [entities]);
319
+
306
320
  // Set listings from passed-in data
307
321
  useEffect(() => {
308
322
  if (!listings || listings.length === 0) {
@@ -1,7 +1,18 @@
1
- import { liteClient as algoliasearch } from 'algoliasearch/lite';
2
-
3
1
  let algoliaClient = null;
4
2
  let algoliaIndexName = null;
3
+ let algoliaSearchModule = null;
4
+
5
+ /**
6
+ * Lazy load algoliasearch to avoid SSR issues
7
+ */
8
+ const getAlgoliaSearch = async () => {
9
+ if (typeof window === 'undefined') return null;
10
+ if (!algoliaSearchModule) {
11
+ const { liteClient } = await import('algoliasearch/lite');
12
+ algoliaSearchModule = liteClient;
13
+ }
14
+ return algoliaSearchModule;
15
+ };
5
16
 
6
17
  /**
7
18
  * Initialize Algolia search client
@@ -9,13 +20,18 @@ let algoliaIndexName = null;
9
20
  * @param {string} apiKey - Algolia Search API Key
10
21
  * @param {string} indexName - Algolia Index Name
11
22
  */
12
- export const initializeAlgoliaSearch = (appId, apiKey, indexName) => {
23
+ export const initializeAlgoliaSearch = async (appId, apiKey, indexName) => {
13
24
  if (!appId || !apiKey || !indexName) {
14
25
  console.warn('Algolia search not initialized: missing configuration');
15
26
  return false;
16
27
  }
17
28
 
18
29
  try {
30
+ const algoliasearch = await getAlgoliaSearch();
31
+ if (!algoliasearch) {
32
+ console.warn('Algolia search not available (SSR context)');
33
+ return false;
34
+ }
19
35
  algoliaClient = algoliasearch(appId, apiKey);
20
36
  algoliaIndexName = indexName;
21
37
  return true;