@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.
- package/dist/components/HireControlMap.js +30 -15
- package/dist/components/HireControlMap.js.map +1 -1
- package/dist/components/containers/list/list-item/list-item-container.js +4 -2
- package/dist/components/containers/list/list-item/list-item-container.js.map +1 -1
- package/dist/components/containers/maps/map-container.js +62 -12
- package/dist/components/containers/maps/map-container.js.map +1 -1
- package/dist/components/modules/list/list-item/list-item.js +10 -6
- package/dist/components/modules/list/list-item/list-item.js.map +1 -1
- package/dist/contexts/mapListContext.js +13 -0
- package/dist/contexts/mapListContext.js.map +1 -1
- package/dist/styles/index.css +1 -1
- package/dist/types/components/containers/list/list-item/list-item-container.d.ts +2 -1
- package/dist/types/util/algoliaSearchUtil.d.ts +1 -1
- package/dist/util/algoliaSearchUtil.js +118 -51
- package/dist/util/algoliaSearchUtil.js.map +1 -1
- package/package.json +2 -1
- package/src/components/HireControlMap.js +23 -10
- package/src/components/containers/list/list-item/list-item-container.js +2 -0
- package/src/components/containers/maps/map-container.js +52 -4
- package/src/components/modules/list/list-item/list-item.jsx +8 -2
- package/src/contexts/mapListContext.tsx +14 -0
- package/src/util/algoliaSearchUtil.js +19 -3
|
@@ -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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
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
|
|
44
|
-
while (1) switch (
|
|
110
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
111
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
45
112
|
case 0:
|
|
46
113
|
if (isAlgoliaAvailable()) {
|
|
47
|
-
|
|
114
|
+
_context3.next = 2;
|
|
48
115
|
break;
|
|
49
116
|
}
|
|
50
117
|
throw new Error('Algolia search is not initialized');
|
|
51
118
|
case 2:
|
|
52
|
-
|
|
53
|
-
|
|
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$ =
|
|
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
|
|
149
|
+
return _context3.abrupt("return", {
|
|
83
150
|
referenceNumbers: referenceNumbers,
|
|
84
151
|
ids: ids,
|
|
85
152
|
orderMap: orderMap
|
|
86
153
|
});
|
|
87
154
|
case 17:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
console.error('Algolia search failed:',
|
|
91
|
-
throw
|
|
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
|
|
161
|
+
return _context3.stop();
|
|
95
162
|
}
|
|
96
|
-
},
|
|
163
|
+
}, _callee3, null, [[2, 17]]);
|
|
97
164
|
}));
|
|
98
|
-
return function searchAlgolia(
|
|
99
|
-
return
|
|
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
|
|
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
|
|
111
|
-
while (1) switch (
|
|
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
|
-
|
|
181
|
+
_context4.next = 2;
|
|
115
182
|
break;
|
|
116
183
|
}
|
|
117
|
-
return
|
|
184
|
+
return _context4.abrupt("return", listings);
|
|
118
185
|
case 2:
|
|
119
|
-
|
|
120
|
-
|
|
186
|
+
_context4.prev = 2;
|
|
187
|
+
_context4.next = 5;
|
|
121
188
|
return searchAlgolia(query);
|
|
122
189
|
case 5:
|
|
123
|
-
_yield$searchAlgolia =
|
|
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
|
|
209
|
+
var _ref5, _orderMap$get, _ref6, _orderMap$get2;
|
|
143
210
|
// Get the Algolia order index for each listing
|
|
144
|
-
var orderA = (
|
|
145
|
-
var orderB = (
|
|
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
|
|
216
|
+
return _context4.abrupt("return", filtered);
|
|
150
217
|
case 20:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
console.error('Failed to filter by Algolia search, returning all listings:',
|
|
154
|
-
return
|
|
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
|
|
224
|
+
return _context4.stop();
|
|
158
225
|
}
|
|
159
|
-
},
|
|
226
|
+
}, _callee4, null, [[2, 20]]);
|
|
160
227
|
}));
|
|
161
|
-
return function filterListingsByAlgoliaSearch(
|
|
162
|
-
return
|
|
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":";;;AAEA,IAAIA,aAAa,GAAG,IAAI,CAAA;AACxB,IAAIC,gBAAgB,GAAG,IAAI,CAAA;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACO,IAAMC,uBAAuB,GAAG,SAA1BA,uBAAuBA,CAAIC,KAAK,EAAEC,MAAM,EAAEC,SAAS,EAAK;EACpE,IAAI,CAACF,KAAK,IAAI,CAACC,MAAM,IAAI,CAACC,SAAS,EAAE;AACpCC,IAAAA,OAAO,CAACC,IAAI,CAAC,uDAAuD,CAAC,CAAA;AACrE,IAAA,OAAO,KAAK,CAAA;AACb,GAAA;EAEA,IAAI;AACHP,IAAAA,aAAa,GAAGQ,UAAa,CAACL,KAAK,EAAEC,MAAM,CAAC,CAAA;AAC5CH,IAAAA,gBAAgB,GAAGI,SAAS,CAAA;AAC5B,IAAA,OAAO,IAAI,CAAA;GACX,CAAC,OAAOI,KAAK,EAAE;AACfH,IAAAA,OAAO,CAACG,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC,CAAA;AACrD,IAAA,OAAO,KAAK,CAAA;AACb,GAAA;AACD,EAAC;;AAED;AACA;AACA;IACaC,kBAAkB,GAAG,SAArBA,kBAAkBA,GAAS;AACvC,EAAA,OAAOV,aAAa,KAAK,IAAI,IAAIC,gBAAgB,KAAK,IAAI,CAAA;AAC3D,EAAC;;AAED;AACA;AACA;AACA;AACA;IACaU,aAAa,gBAAA,YAAA;EAAA,IAAAC,IAAA,GAAAC,iBAAA,eAAAC,mBAAA,GAAAC,IAAA,CAAG,SAAAC,OAAAA,CAAOC,KAAK,EAAA;AAAA,IAAA,IAAAC,SAAA,EAAAC,qBAAA,EAAAC,OAAA,EAAAC,IAAA,EAAAC,gBAAA,EAAAC,GAAA,EAAAC,QAAA,CAAA;AAAA,IAAA,OAAAV,mBAAA,EAAA,CAAAW,IAAA,CAAA,SAAAC,SAAAC,QAAA,EAAA;AAAA,MAAA,OAAA,CAAA,EAAA,QAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;AAAA,QAAA,KAAA,CAAA;UAAA,IACnCnB,kBAAkB,EAAE,EAAA;AAAAiB,YAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAA,UAAA,MAClB,IAAIC,KAAK,CAAC,mCAAmC,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;AAAAH,UAAAA,QAAA,CAAAC,IAAA,GAAA,CAAA,CAAA;AAAAD,UAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;UAAA,OAI1B7B,aAAa,CAAC+B,MAAM,CAAC;AAC9CC,YAAAA,QAAQ,EAAE,CACT;AACC3B,cAAAA,SAAS,EAAEJ,gBAAgB;AAC3BgB,cAAAA,KAAK,EAAEA,KAAK;cACZgB,WAAW,EAAE,IAAI;aACjB,CAAA;AAEH,WAAC,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;UAAAd,qBAAA,GAAAQ,QAAA,CAAAO,IAAA,CAAA;UARMd,OAAO,GAAAD,qBAAA,CAAPC,OAAO,CAAA;AAUf;AACMC,UAAAA,IAAI,GAAG,CAAA,CAAAH,SAAA,GAAAE,OAAO,CAAC,CAAC,CAAC,MAAA,IAAA,IAAAF,SAAA,KAAVA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,SAAA,CAAYG,IAAI,KAAI,EAAE,CAAA;UACnCf,OAAO,CAAC6B,GAAG,CAAC,yBAAyB,EAAEd,IAAI,CAACe,MAAM,EAAE,MAAM,CAAC,CAAA;AAErDd,UAAAA,gBAAgB,GAAG,EAAE,CAAA;AACrBC,UAAAA,GAAG,GAAG,EAAE,CAAA;AACRC,UAAAA,QAAQ,GAAG,IAAIa,GAAG,EAAE,CAAE;AAE5BhB,UAAAA,IAAI,CAACiB,OAAO,CAAC,UAACC,GAAG,EAAEC,KAAK,EAAK;YAC5B,IAAID,GAAG,CAACE,eAAe,EAAE;AACxB,cAAA,IAAMC,MAAM,GAAGC,QAAQ,CAACJ,GAAG,CAACE,eAAe,CAAC,CAAA;AAC5CnB,cAAAA,gBAAgB,CAACsB,IAAI,CAACF,MAAM,CAAC,CAAA;cAC7BlB,QAAQ,CAACqB,GAAG,CAAAC,MAAAA,CAAAA,MAAA,CAAQJ,MAAM,CAAA,EAAIF,KAAK,CAAC,CAAA;AACrC,aAAA;YACA,IAAID,GAAG,CAACQ,EAAE,EAAE;AACXxB,cAAAA,GAAG,CAACqB,IAAI,CAACL,GAAG,CAACQ,EAAE,CAAC,CAAA;cAChBvB,QAAQ,CAACqB,GAAG,CAAA,KAAA,CAAAC,MAAA,CAAOP,GAAG,CAACQ,EAAE,CAAIP,EAAAA,KAAK,CAAC,CAAA;AACpC,aAAA;AACD,WAAC,CAAC,CAAA;AAEFlC,UAAAA,OAAO,CAAC6B,GAAG,CAAC,WAAW,EAAEb,gBAAgB,CAACc,MAAM,EAAE,sBAAsB,EAAEb,GAAG,CAACa,MAAM,EAAE,kBAAkB,CAAC,CAAA;UAAC,OAAAT,QAAA,CAAAqB,MAAA,CACnG,QAAA,EAAA;AAAE1B,YAAAA,gBAAgB,EAAhBA,gBAAgB;AAAEC,YAAAA,GAAG,EAAHA,GAAG;AAAEC,YAAAA,QAAQ,EAARA,QAAAA;WAAU,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA;AAAAG,UAAAA,QAAA,CAAAC,IAAA,GAAA,EAAA,CAAA;UAAAD,QAAA,CAAAsB,EAAA,GAAAtB,QAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA;UAE1CrB,OAAO,CAACG,KAAK,CAAC,wBAAwB,EAAAkB,QAAA,CAAAsB,EAAO,CAAC,CAAA;UAAC,MAAAtB,QAAA,CAAAsB,EAAA,CAAA;AAAA,QAAA,KAAA,EAAA,CAAA;AAAA,QAAA,KAAA,KAAA;UAAA,OAAAtB,QAAA,CAAAuB,IAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAAlC,OAAA,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;GAGhD,CAAA,CAAA,CAAA;EAAA,OA1CYL,SAAAA,aAAaA,CAAAwC,EAAA,EAAA;AAAA,IAAA,OAAAvC,IAAA,CAAAwC,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,GAAA,CAAA;AAAA,CAAA,GA0CxB;AACF;AACA;AACA;AACA;AACA;IACaC,6BAA6B,gBAAA,YAAA;AAAA,EAAA,IAAAC,KAAA,GAAA1C,iBAAA,eAAAC,mBAAA,EAAA,CAAAC,IAAA,CAAG,SAAAyC,QAAAA,CAAOC,QAAQ,EAAExC,KAAK,EAAA;IAAA,IAAAyC,oBAAA,EAAApC,gBAAA,EAAAC,GAAA,EAAAC,QAAA,EAAAmC,QAAA,CAAA;AAAA,IAAA,OAAA7C,mBAAA,EAAA,CAAAW,IAAA,CAAA,SAAAmC,UAAAC,SAAA,EAAA;AAAA,MAAA,OAAA,CAAA,EAAA,QAAAA,SAAA,CAAAjC,IAAA,GAAAiC,SAAA,CAAAhC,IAAA;AAAA,QAAA,KAAA,CAAA;AAAA,UAAA,IAAA,EAC9D,CAACZ,KAAK,IAAI,CAACP,kBAAkB,EAAE,CAAA,EAAA;AAAAmD,YAAAA,SAAA,CAAAhC,IAAA,GAAA,CAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAA,UAAA,OAAAgC,SAAA,CAAAb,MAAA,CAAA,QAAA,EAC3BS,QAAQ,CAAA,CAAA;AAAA,QAAA,KAAA,CAAA;AAAAI,UAAAA,SAAA,CAAAjC,IAAA,GAAA,CAAA,CAAA;AAAAiC,UAAAA,SAAA,CAAAhC,IAAA,GAAA,CAAA,CAAA;UAAA,OAImClB,aAAa,CAACM,KAAK,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;UAAAyC,oBAAA,GAAAG,SAAA,CAAA3B,IAAA,CAAA;UAA9DZ,gBAAgB,GAAAoC,oBAAA,CAAhBpC,gBAAgB,CAAA;UAAEC,GAAG,GAAAmC,oBAAA,CAAHnC,GAAG,CAAA;UAAEC,QAAQ,GAAAkC,oBAAA,CAARlC,QAAQ,CAAA;UAEvClB,OAAO,CAAC6B,GAAG,CAAC,WAAW,EAAEsB,QAAQ,CAACrB,MAAM,EAAE,kBAAkB,EAAEd,gBAAgB,CAACc,MAAM,EAAE,sBAAsB,EAAEb,GAAG,CAACa,MAAM,EAAE,KAAK,CAAC,CAAA;AACjI9B,UAAAA,OAAO,CAAC6B,GAAG,CAAC,kCAAkC,EAAEsB,QAAQ,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,GAAG,CAAC,UAAAC,CAAC,EAAA;YAAA,OAAIA,CAAC,CAACvB,eAAe,CAAA;AAAA,WAAA,CAAC,CAAC,CAAA;AACjGnC,UAAAA,OAAO,CAAC6B,GAAG,CAAC,qBAAqB,EAAEsB,QAAQ,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,GAAG,CAAC,UAAAC,CAAC,EAAA;YAAA,OAAIA,CAAC,CAACjB,EAAE,CAAA;AAAA,WAAA,CAAC,CAAC,CAAA;AACvEzC,UAAAA,OAAO,CAAC6B,GAAG,CAAC,kCAAkC,EAAEb,gBAAgB,CAACwC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAC7ExD,UAAAA,OAAO,CAAC6B,GAAG,CAAC,qBAAqB,EAAEZ,GAAG,CAACuC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;;AAEnD;AACMH,UAAAA,QAAQ,GAAGF,QAAQ,CAACQ,MAAM,CAAC,UAAAC,OAAO,EAAA;AAAA,YAAA,OACvC5C,gBAAgB,CAAC6C,QAAQ,CAACD,OAAO,CAACzB,eAAe,CAAC,IAAIlB,GAAG,CAAC4C,QAAQ,CAACD,OAAO,CAACnB,EAAE,CAAC,CAAA;AAAA,WAC/E,CAAC,CAED;AACAY,UAAAA,QAAQ,CAACS,IAAI,CAAC,UAACC,CAAC,EAAEC,CAAC,EAAK;AAAA,YAAA,IAAAC,KAAA,EAAAC,aAAA,EAAAC,KAAA,EAAAC,cAAA,CAAA;AACvB;AACA,YAAA,IAAMC,MAAM,GAAAJ,CAAAA,KAAA,GAAAC,CAAAA,aAAA,GAAGhD,QAAQ,CAACoD,GAAG,CAAA,MAAA,CAAA9B,MAAA,CAAQuB,CAAC,CAAC5B,eAAe,CAAE,CAAC,MAAA+B,IAAAA,IAAAA,aAAA,KAAAA,KAAAA,CAAAA,GAAAA,aAAA,GAAIhD,QAAQ,CAACoD,GAAG,CAAA,KAAA,CAAA9B,MAAA,CAAOuB,CAAC,CAACtB,EAAE,CAAE,CAAC,MAAA,IAAA,IAAAwB,KAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAA,GAAIM,QAAQ,CAAA;AACjG,YAAA,IAAMC,MAAM,GAAAL,CAAAA,KAAA,GAAAC,CAAAA,cAAA,GAAGlD,QAAQ,CAACoD,GAAG,CAAA,MAAA,CAAA9B,MAAA,CAAQwB,CAAC,CAAC7B,eAAe,CAAE,CAAC,MAAAiC,IAAAA,IAAAA,cAAA,KAAAA,KAAAA,CAAAA,GAAAA,cAAA,GAAIlD,QAAQ,CAACoD,GAAG,CAAA,KAAA,CAAA9B,MAAA,CAAOwB,CAAC,CAACvB,EAAE,CAAE,CAAC,MAAA,IAAA,IAAA0B,KAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAA,GAAII,QAAQ,CAAA;YACjG,OAAOF,MAAM,GAAGG,MAAM,CAAA;AACvB,WAAC,CAAC,CAAA;UAEFxE,OAAO,CAAC6B,GAAG,CAAC,kBAAkB,EAAEwB,QAAQ,CAACvB,MAAM,EAAE,8CAA8C,CAAC,CAAA;AAAC,UAAA,OAAAyB,SAAA,CAAAb,MAAA,CAAA,QAAA,EAC1FW,QAAQ,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA;AAAAE,UAAAA,SAAA,CAAAjC,IAAA,GAAA,EAAA,CAAA;UAAAiC,SAAA,CAAAZ,EAAA,GAAAY,SAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA;UAEfvD,OAAO,CAACG,KAAK,CAAC,6DAA6D,EAAAoD,SAAA,CAAAZ,EAAO,CAAC,CAAA;AAAC,UAAA,OAAAY,SAAA,CAAAb,MAAA,CAAA,QAAA,EAC7ES,QAAQ,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA,CAAA;AAAA,QAAA,KAAA,KAAA;UAAA,OAAAI,SAAA,CAAAX,IAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAAM,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;GAEhB,CAAA,CAAA,CAAA;AAAA,EAAA,OAAA,SAjCYF,6BAA6BA,CAAAyB,GAAA,EAAAC,GAAA,EAAA;AAAA,IAAA,OAAAzB,KAAA,CAAAH,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,GAAA,CAAA;AAAA,CAiCzC;;;;"}
|
|
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
|
@@ -140,17 +140,19 @@ export const HireControlMap = ({
|
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
}) => {
|
|
143
|
-
// Initialize Algolia
|
|
144
|
-
const [algoliaInitialized, setAlgoliaInitialized] = useState(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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 (!
|
|
259
|
-
return
|
|
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 =
|
|
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
|
-
{
|
|
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¢er=${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 &&
|
|
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={
|
|
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;
|