@abcagency/hc-ui-components 1.3.28 → 1.3.29
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/containers/accordions/filter-item-container.js +4 -1
- package/dist/components/containers/accordions/filter-item-container.js.map +1 -1
- package/dist/components/containers/maps/info-window-content-container.js +9 -4
- package/dist/components/containers/maps/info-window-content-container.js.map +1 -1
- package/dist/components/containers/maps/map-marker-container.js +3 -5
- package/dist/components/containers/maps/map-marker-container.js.map +1 -1
- package/dist/components/modules/maps/info-window-content.js +4 -2
- package/dist/components/modules/maps/info-window-content.js.map +1 -1
- package/dist/contexts/mapListContext.js +6 -0
- package/dist/contexts/mapListContext.js.map +1 -1
- package/dist/types/contexts/mapListContext.d.ts +1 -0
- package/package.json +1 -1
- package/src/components/containers/accordions/filter-item-container.js +69 -66
- package/src/components/containers/maps/info-window-content-container.js +5 -3
- package/src/components/containers/maps/map-marker-container.js +2 -2
- package/src/components/modules/maps/info-window-content.js +36 -35
- package/src/contexts/mapListContext.tsx +319 -311
|
@@ -20,7 +20,10 @@ var FilterItemContainer = function FilterItemContainer(_ref) {
|
|
|
20
20
|
if (subcategoryRequireCategory && fieldKey == 'categoryClass') {
|
|
21
21
|
delete updatedFilters['category'];
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
if (fieldKey == 'state' || fieldKey == 'city' || fieldKey == 'cityState') {
|
|
24
|
+
delete updatedFilters.entityId;
|
|
25
|
+
delete updatedFilters[fieldKey];
|
|
26
|
+
}
|
|
24
27
|
return updatedFilters;
|
|
25
28
|
});
|
|
26
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-item-container.js","sources":["../../../../src/components/containers/accordions/filter-item-container.js"],"sourcesContent":["import React, { memo } from 'react';\
|
|
1
|
+
{"version":3,"file":"filter-item-container.js","sources":["../../../../src/components/containers/accordions/filter-item-container.js"],"sourcesContent":["import React, { memo } from 'react';\nimport AccordionFilterItem from '~/components/modules/accordions/filterItem';\nimport FilterItem from '~/components/containers/filter/filter-item-container';\nimport ItemsPill from '~/components/modules/buttons/items-pill';\n\nconst FilterItemContainer = ({\n\tfilter,\n\tsetDefaultValue,\n\tsetSelectedFilters,\n\tselectedFilters,\n\tsubcategoryRequireCategory = false\n}) => {\n\tconst fieldKey = filter.id;\n\tconst activeItemsCount = selectedFilters != null && selectedFilters[fieldKey]\n\t\t? Object.keys(selectedFilters[fieldKey]).length\n\t\t: 0;\n\n\tconst handleClearFilters = event => {\n\t\tevent.stopPropagation();\n\t\tsetSelectedFilters(prevFilters => {\n\t\t\tconst updatedFilters = { ...prevFilters };\n\t\t\tif(subcategoryRequireCategory && fieldKey == 'categoryClass'){\n\t\t\t\tdelete updatedFilters['category'];\n\t\t\t}\n\t\t\tif(fieldKey == 'state' || fieldKey == 'city' || fieldKey == 'cityState'){\n\t\t\t\tdelete updatedFilters.entityId;\n\t\t\t\tdelete updatedFilters[fieldKey];\n\t\t\t}\n\t\t\treturn updatedFilters;\n\t\t});\n\t};\n\n\tconst header = (\n\t\t<>\n\t\t\t{filter.title}\n\t\t\t{activeItemsCount > 0 && (\n\t\t\t\t<ItemsPill\n\t\t\t\t\tactiveItemsCount={activeItemsCount}\n\t\t\t\t\tonClick={handleClearFilters}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n\n\tconst body = (\n\t\t<>\n\t\t\t{filter.items.sort().map(item => (\n\t\t\t\t<FilterItem\n\t\t\t\t\tkey={item.name}\n\t\t\t\t\titem={item}\n\t\t\t\t\tfield={filter.id}\n\t\t\t\t\tselectedFilters={selectedFilters}\n\t\t\t\t\tsetSelectedFilters={setSelectedFilters}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t);\n\n\treturn (\n\t\t<AccordionFilterItem\n\t\t\tid={filter.id}\n\t\t\tsetDefaultValue={setDefaultValue}\n\t\t\theader={header}\n\t\t\tbody={body}\n\t\t/>\n\t);\n};\n\nexport default memo(FilterItemContainer);\n"],"names":["FilterItemContainer","_ref","filter","setDefaultValue","setSelectedFilters","selectedFilters","_ref$subcategoryRequi","subcategoryRequireCategory","fieldKey","id","activeItemsCount","Object","keys","length","handleClearFilters","event","stopPropagation","prevFilters","updatedFilters","_objectSpread","entityId","header","React","createElement","Fragment","title","ItemsPill","onClick","body","items","sort","map","item","FilterItem","key","name","field","AccordionFilterItem","memo"],"mappings":";;;;;;AAKA,IAAMA,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAAC,IAAA,EAMnB;AAAA,EAAA,IALLC,MAAM,GAAAD,IAAA,CAANC,MAAM;IACNC,eAAe,GAAAF,IAAA,CAAfE,eAAe;IACfC,kBAAkB,GAAAH,IAAA,CAAlBG,kBAAkB;IAClBC,eAAe,GAAAJ,IAAA,CAAfI,eAAe;IAAAC,qBAAA,GAAAL,IAAA,CACfM,0BAA0B;AAA1BA,IAAAA,0BAA0B,GAAAD,qBAAA,KAAG,KAAA,CAAA,GAAA,KAAK,GAAAA,qBAAA,CAAA;AAElC,EAAA,IAAME,QAAQ,GAAGN,MAAM,CAACO,EAAE,CAAA;EAC1B,IAAMC,gBAAgB,GAAGL,eAAe,IAAI,IAAI,IAAIA,eAAe,CAACG,QAAQ,CAAC,GAC1EG,MAAM,CAACC,IAAI,CAACP,eAAe,CAACG,QAAQ,CAAC,CAAC,CAACK,MAAM,GAC7C,CAAC,CAAA;AAEJ,EAAA,IAAMC,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAGC,KAAK,EAAI;IACnCA,KAAK,CAACC,eAAe,EAAE,CAAA;IACvBZ,kBAAkB,CAAC,UAAAa,WAAW,EAAI;AACjC,MAAA,IAAMC,cAAc,GAAAC,cAAA,CAAA,EAAA,EAAQF,WAAW,CAAE,CAAA;AACzC,MAAA,IAAGV,0BAA0B,IAAIC,QAAQ,IAAI,eAAe,EAAC;QAC5D,OAAOU,cAAc,CAAC,UAAU,CAAC,CAAA;AAClC,OAAA;MACA,IAAGV,QAAQ,IAAI,OAAO,IAAIA,QAAQ,IAAI,MAAM,IAAIA,QAAQ,IAAI,WAAW,EAAC;QACvE,OAAOU,cAAc,CAACE,QAAQ,CAAA;QAC9B,OAAOF,cAAc,CAACV,QAAQ,CAAC,CAAA;AAChC,OAAA;AACA,MAAA,OAAOU,cAAc,CAAA;AACtB,KAAC,CAAC,CAAA;GACF,CAAA;EAED,IAAMG,MAAM,gBACXC,cAAA,CAAAC,aAAA,CAAAD,cAAA,CAAAE,QAAA,EACEtB,IAAAA,EAAAA,MAAM,CAACuB,KAAK,EACZf,gBAAgB,GAAG,CAAC,iBACpBY,cAAA,CAAAC,aAAA,CAACG,eAAS,EAAA;AACThB,IAAAA,gBAAgB,EAAEA,gBAAiB;AACnCiB,IAAAA,OAAO,EAAEb,kBAAAA;AAAmB,GAC5B,CAED,CACF,CAAA;EAED,IAAMc,IAAI,gBACTN,cAAA,CAAAC,aAAA,CAAAD,cAAA,CAAAE,QAAA,EAAA,IAAA,EACEtB,MAAM,CAAC2B,KAAK,CAACC,IAAI,EAAE,CAACC,GAAG,CAAC,UAAAC,IAAI,EAAA;AAAA,IAAA,oBAC5BV,cAAA,CAAAC,aAAA,CAACU,qBAAU,EAAA;MACVC,GAAG,EAAEF,IAAI,CAACG,IAAK;AACfH,MAAAA,IAAI,EAAEA,IAAK;MACXI,KAAK,EAAElC,MAAM,CAACO,EAAG;AACjBJ,MAAAA,eAAe,EAAEA,eAAgB;AACjCD,MAAAA,kBAAkB,EAAEA,kBAAAA;AAAmB,KACvC,CAAC,CAAA;AAAA,GACF,CACA,CACF,CAAA;AAED,EAAA,oBACCkB,cAAA,CAAAC,aAAA,CAACc,qBAAmB,EAAA;IACnB5B,EAAE,EAAEP,MAAM,CAACO,EAAG;AACdN,IAAAA,eAAe,EAAEA,eAAgB;AACjCkB,IAAAA,MAAM,EAAEA,MAAO;AACfO,IAAAA,IAAI,EAAEA,IAAAA;AAAK,GACX,CAAC,CAAA;AAEJ,CAAC,CAAA;AAED,0BAAeU,aAAAA,IAAI,CAACtC,mBAAmB,CAAC;;;;"}
|
|
@@ -6,8 +6,8 @@ import { useTrackEvent } from '../../../contexts/trackEventContext.js';
|
|
|
6
6
|
|
|
7
7
|
var InfoWindowContentContainer = function InfoWindowContentContainer(_ref) {
|
|
8
8
|
var _items$0$mapDetails, _items$0$mapDetails2, _items$0$mapDetails3, _items$0$mapDetails4;
|
|
9
|
-
var item = _ref.item
|
|
10
|
-
|
|
9
|
+
var item = _ref.item;
|
|
10
|
+
_ref.filterListingsByLocation;
|
|
11
11
|
var _useTrackEvent = useTrackEvent(),
|
|
12
12
|
trackEvent = _useTrackEvent.trackEvent,
|
|
13
13
|
eventTypes = _useTrackEvent.eventTypes;
|
|
@@ -16,7 +16,8 @@ var InfoWindowContentContainer = function InfoWindowContentContainer(_ref) {
|
|
|
16
16
|
setMobileTab = _useMapList.setMobileTab,
|
|
17
17
|
selectedFilters = _useMapList.selectedFilters,
|
|
18
18
|
siteConfig = _useMapList.siteConfig;
|
|
19
|
-
|
|
19
|
+
_useMapList.filteredListings;
|
|
20
|
+
var fieldsShown = siteConfig.locationFiltersShown;
|
|
20
21
|
var items = item && item.items ? Object.values(item.items) : null;
|
|
21
22
|
var addressParts = [(_items$0$mapDetails = items[0].mapDetails) === null || _items$0$mapDetails === void 0 || (_items$0$mapDetails = _items$0$mapDetails.address) === null || _items$0$mapDetails === void 0 ? void 0 : _items$0$mapDetails.street, (_items$0$mapDetails2 = items[0].mapDetails) === null || _items$0$mapDetails2 === void 0 || (_items$0$mapDetails2 = _items$0$mapDetails2.address) === null || _items$0$mapDetails2 === void 0 ? void 0 : _items$0$mapDetails2.city, (_items$0$mapDetails3 = items[0].mapDetails) === null || _items$0$mapDetails3 === void 0 || (_items$0$mapDetails3 = _items$0$mapDetails3.address) === null || _items$0$mapDetails3 === void 0 ? void 0 : _items$0$mapDetails3.state, (_items$0$mapDetails4 = items[0].mapDetails) === null || _items$0$mapDetails4 === void 0 || (_items$0$mapDetails4 = _items$0$mapDetails4.address) === null || _items$0$mapDetails4 === void 0 ? void 0 : _items$0$mapDetails4.zip];
|
|
22
23
|
var fullAddress = addressParts.filter(Boolean).join(', ');
|
|
@@ -45,11 +46,15 @@ var InfoWindowContentContainer = function InfoWindowContentContainer(_ref) {
|
|
|
45
46
|
filterChecked: items[0].fields.state
|
|
46
47
|
});
|
|
47
48
|
}
|
|
49
|
+
newFilters.entityId = _defineProperty({}, items[0].fields.entityId, true);
|
|
50
|
+
filters.push({
|
|
51
|
+
filterType: 'entityId',
|
|
52
|
+
filterChecked: items[0].fields.entityId
|
|
53
|
+
});
|
|
48
54
|
trackEvent(eventTypes.VIEW_JOBS_AT_Location, {
|
|
49
55
|
filtersApplied: filters
|
|
50
56
|
});
|
|
51
57
|
setSelectedFilters(newFilters);
|
|
52
|
-
filterListingsByLocation();
|
|
53
58
|
};
|
|
54
59
|
return /*#__PURE__*/React__default.createElement(InfoWindowContent, {
|
|
55
60
|
items: items,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info-window-content-container.js","sources":["../../../../src/components/containers/maps/info-window-content-container.js"],"sourcesContent":["import React from 'react';\nimport InfoWindowContent from '~/components/modules/maps/info-window-content';\nimport { useMapList } from '~/contexts/mapListContext';\nimport { useTrackEvent } from '~/contexts/trackEventContext';\n\nconst InfoWindowContentContainer = ({\n\titem,\n\tfilterListingsByLocation\n}) => {\n\tconst { trackEvent, eventTypes } = useTrackEvent();\n\tconst { setSelectedFilters, setMobileTab, selectedFilters, siteConfig } = useMapList();\n\tconst fieldsShown = siteConfig.
|
|
1
|
+
{"version":3,"file":"info-window-content-container.js","sources":["../../../../src/components/containers/maps/info-window-content-container.js"],"sourcesContent":["import React from 'react';\nimport InfoWindowContent from '~/components/modules/maps/info-window-content';\nimport { useMapList } from '~/contexts/mapListContext';\nimport { useTrackEvent } from '~/contexts/trackEventContext';\n\nconst InfoWindowContentContainer = ({\n\titem,\n\tfilterListingsByLocation\n}) => {\n\tconst { trackEvent, eventTypes } = useTrackEvent();\n\tconst { setSelectedFilters, setMobileTab, selectedFilters, siteConfig, filteredListings } = useMapList();\n\tconst fieldsShown = siteConfig.locationFiltersShown;\n\tlet items = item && item.items ? Object.values(item.items) : null;\n\n\tconst addressParts = [\n\t\titems[0].mapDetails?.address?.street,\n\t\titems[0].mapDetails?.address?.city,\n\t\titems[0].mapDetails?.address?.state,\n\t\titems[0].mapDetails?.address?.zip\n\t];\n\tconst fullAddress = addressParts.filter(Boolean).join(', ');\n\n\tconst applyFilters = () => {\n\t\tsetMobileTab(\"listTab\");\n\t\tconst newFilters = { ...selectedFilters };\n\t\tlet filters = [];\n\n\t\tif (fieldsShown.includes('cityState')) {\n\t\t\tnewFilters.cityState = { [items[0].fields.cityState]: true };\n\t\t\tfilters.push({ filterType: 'cityState', filterChecked: items[0].fields.cityState });\n\t\t}\n\n\t\tif (fieldsShown.includes('city')) {\n\t\t\tnewFilters.city = { [items[0].fields.city]: true };\n\t\t\tfilters.push({ filterType: 'city', filterChecked: items[0].fields.city });\n\t\t}\n\n\t\tif (fieldsShown.includes('state')) {\n\t\t\tnewFilters.state = { [items[0].fields.state]: true };\n\t\t\tfilters.push({ filterType: 'state', filterChecked: items[0].fields.state });\n\t\t}\n\n\t\tnewFilters.entityId = { [items[0].fields.entityId]: true };\n\t\tfilters.push({ filterType: 'entityId', filterChecked: items[0].fields.entityId });\n\n\t\ttrackEvent(eventTypes.VIEW_JOBS_AT_Location, { filtersApplied: filters });\n\t\tsetSelectedFilters(newFilters);\n\t};\n\n\treturn <InfoWindowContent items={items} fullAddress={fullAddress} applyFilters={applyFilters} />;\n};\n\nexport default InfoWindowContentContainer;\n"],"names":["InfoWindowContentContainer","_ref","_items$0$mapDetails","_items$0$mapDetails2","_items$0$mapDetails3","_items$0$mapDetails4","item","filterListingsByLocation","_useTrackEvent","useTrackEvent","trackEvent","eventTypes","_useMapList","useMapList","setSelectedFilters","setMobileTab","selectedFilters","siteConfig","filteredListings","fieldsShown","locationFiltersShown","items","Object","values","addressParts","mapDetails","address","street","city","state","zip","fullAddress","filter","Boolean","join","applyFilters","newFilters","_objectSpread","filters","includes","cityState","_defineProperty","fields","push","filterType","filterChecked","entityId","VIEW_JOBS_AT_Location","filtersApplied","React","createElement","InfoWindowContent"],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ var MapMarkerContainer = function MapMarkerContainer(_ref) {
|
|
|
26
26
|
trackEvent = _useTrackEvent.trackEvent,
|
|
27
27
|
eventTypes = _useTrackEvent.eventTypes;
|
|
28
28
|
var _useMapList = useMapList(),
|
|
29
|
-
|
|
29
|
+
resetEntityFilter = _useMapList.resetEntityFilter;
|
|
30
30
|
useEffect(function () {
|
|
31
31
|
markerRefs.current[item.id] = markerRef.current;
|
|
32
32
|
}, []);
|
|
@@ -62,6 +62,7 @@ var MapMarkerContainer = function MapMarkerContainer(_ref) {
|
|
|
62
62
|
onCloseClick: function onCloseClick() {
|
|
63
63
|
setMapInteracted(true);
|
|
64
64
|
setLocation(null);
|
|
65
|
+
resetEntityFilter();
|
|
65
66
|
},
|
|
66
67
|
options: {
|
|
67
68
|
maxWidth: 400
|
|
@@ -71,10 +72,7 @@ var MapMarkerContainer = function MapMarkerContainer(_ref) {
|
|
|
71
72
|
id: item.id,
|
|
72
73
|
content: /*#__PURE__*/React__default.createElement(InfoWindowContentContainer, {
|
|
73
74
|
item: item,
|
|
74
|
-
commuteLocation: commuteLocation
|
|
75
|
-
filterListingsByLocation: function filterListingsByLocation() {
|
|
76
|
-
return handleFilterListingsByLocation(selectedLocation);
|
|
77
|
-
}
|
|
75
|
+
commuteLocation: commuteLocation
|
|
78
76
|
})
|
|
79
77
|
})));
|
|
80
78
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-marker-container.js","sources":["../../../../src/components/containers/maps/map-marker-container.js"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport MapMarker from '~/components/modules/maps/map-marker';\nimport { InfoWindow } from '@react-google-maps/api';\nimport InfoWindowCard from '~/components/modules/maps/info-window-card';\nimport InfoWindowContent from \"~/components/containers/maps/info-window-content-container\";\n\nimport { useMap } from \"~/contexts/mapContext\";\nimport { useMapList } from \"~/contexts/mapListContext\";\nimport { useTrackEvent } from '~/contexts/trackEventContext';\n\nconst MapMarkerContainer = ({\n\titem,\n\tmarkerRefs,\n\tinfoWindowClasses,\n\tmarkerClickHandler,\n\tclusterer,\n\tmarkerIconSelected,\n\tmarkerIcon,\n\tselectedLocation,\n\tsetMapInteracted\n}) => {\n\tconst { setLocation, commuteLocation } = useMap();\n\tconst isSelected = item.id === selectedLocation?.id;\n\tconst markerRef = useRef(null);\n\tconst { trackEvent, eventTypes } = useTrackEvent();\n\tconst {
|
|
1
|
+
{"version":3,"file":"map-marker-container.js","sources":["../../../../src/components/containers/maps/map-marker-container.js"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport MapMarker from '~/components/modules/maps/map-marker';\nimport { InfoWindow } from '@react-google-maps/api';\nimport InfoWindowCard from '~/components/modules/maps/info-window-card';\nimport InfoWindowContent from \"~/components/containers/maps/info-window-content-container\";\n\nimport { useMap } from \"~/contexts/mapContext\";\nimport { useMapList } from \"~/contexts/mapListContext\";\nimport { useTrackEvent } from '~/contexts/trackEventContext';\n\nconst MapMarkerContainer = ({\n\titem,\n\tmarkerRefs,\n\tinfoWindowClasses,\n\tmarkerClickHandler,\n\tclusterer,\n\tmarkerIconSelected,\n\tmarkerIcon,\n\tselectedLocation,\n\tsetMapInteracted\n}) => {\n\tconst { setLocation, commuteLocation } = useMap();\n\tconst isSelected = item.id === selectedLocation?.id;\n\tconst markerRef = useRef(null);\n\tconst { trackEvent, eventTypes } = useTrackEvent();\n\tconst { resetEntityFilter } = useMapList();\n\n\tuseEffect(() => {\n\t\tmarkerRefs.current[item.id] = markerRef.current;\n\t}, []);\n\n\tconst onMarkerClick = () => {\n\t\ttrackEvent(eventTypes.MAP_MARKER_CLICKED, {\n\t\t\tentityDisplayName: item.entityDisplayName,\n\t\t\tlat: item.latitude,\n\t\t\tlng: item.longitude,\n\t\t\ttravelTime: item.travelTime\n\t\t});\n\t\tsetMapInteracted(true);\n\t\tmarkerClickHandler(item);\n\t};\n\n\treturn (\n\t\t<MapMarker\n\t\t\tposition={{ lat: item.latitude, lng: item.longitude }}\n\t\t\ttitle={item.name}\n\t\t\ticon={isSelected ? markerIconSelected : markerIcon}\n\t\t\tzIndex={isSelected ? 9999 : 1}\n\t\t\tonLoad={marker => (markerRef.current = marker)}\n\t\t\tonClick={onMarkerClick}\n\t\t\tclusterer={clusterer}\n\t\t>\n\t\t\t{isSelected && (\n\t\t\t\t<InfoWindow\n\t\t\t\t\tposition={{ lat: item.latitude, lng: item.longitude }}\n\t\t\t\t\tanchor={markerRefs.current[item.id]}\n\t\t\t\t\tonCloseClick={() => {\n\t\t\t\t\t\tsetMapInteracted(true);\n\t\t\t\t\t\tsetLocation(null);\n\t\t\t\t\t\tresetEntityFilter();\n\t\t\t\t\t}}\n\t\t\t\t\toptions={{ maxWidth: 400 }}\n\t\t\t\t>\n\t\t\t\t\t<InfoWindowCard\n\t\t\t\t\t\tclassName={infoWindowClasses}\n\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\tcontent={<InfoWindowContent\n\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\tcommuteLocation={commuteLocation}\n\t\t\t\t\t\t/>}\n\t\t\t\t\t/>\n\t\t\t\t</InfoWindow>\n\t\t\t)}\n\t\t</MapMarker>\n\t);\n};\n\nexport default MapMarkerContainer;\n"],"names":["MapMarkerContainer","_ref","item","markerRefs","infoWindowClasses","markerClickHandler","clusterer","markerIconSelected","markerIcon","selectedLocation","setMapInteracted","_useMap","useMap","setLocation","commuteLocation","isSelected","id","markerRef","useRef","_useTrackEvent","useTrackEvent","trackEvent","eventTypes","_useMapList","useMapList","resetEntityFilter","useEffect","current","onMarkerClick","MAP_MARKER_CLICKED","entityDisplayName","lat","latitude","lng","longitude","travelTime","React","createElement","MapMarker","position","title","name","icon","zIndex","onLoad","marker","onClick","InfoWindow","anchor","onCloseClick","options","maxWidth","InfoWindowCard","className","content","InfoWindowContent"],"mappings":"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"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
var InfoWindowContent = function InfoWindowContent(_ref) {
|
|
4
|
-
var _items$0$mapDetails;
|
|
4
|
+
var _items$0$mapDetails, _items$0$mapDetails2, _items$0$mapDetails3;
|
|
5
5
|
var items = _ref.items,
|
|
6
6
|
fullAddress = _ref.fullAddress,
|
|
7
7
|
applyFilters = _ref.applyFilters;
|
|
8
8
|
if (!items || items.length < 0) {
|
|
9
9
|
return null;
|
|
10
10
|
}
|
|
11
|
+
var entityDisplayName = (_items$0$mapDetails = items[0].mapDetails) === null || _items$0$mapDetails === void 0 ? void 0 : _items$0$mapDetails.entityDisplayName;
|
|
12
|
+
console.log(items[0].mapDetails);
|
|
11
13
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
12
14
|
className: "hc-flex-auto hc-p-2"
|
|
13
15
|
}, /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("h4", {
|
|
14
16
|
className: "hc-text-lg hc-font-bold hc-leading-tight hc-mb-3"
|
|
15
|
-
}, (_items$0$
|
|
17
|
+
}, entityDisplayName), /*#__PURE__*/React__default.createElement("p", null, !entityDisplayName.includes((_items$0$mapDetails2 = items[0].mapDetails) === null || _items$0$mapDetails2 === void 0 || (_items$0$mapDetails2 = _items$0$mapDetails2.address) === null || _items$0$mapDetails2 === void 0 ? void 0 : _items$0$mapDetails2.street) && !entityDisplayName.icnludes((_items$0$mapDetails3 = items[0].mapDetails) === null || _items$0$mapDetails3 === void 0 || (_items$0$mapDetails3 = _items$0$mapDetails3.address) === null || _items$0$mapDetails3 === void 0 ? void 0 : _items$0$mapDetails3.zip) && fullAddress), /*#__PURE__*/React__default.createElement("div", {
|
|
16
18
|
className: "hc-pt-2"
|
|
17
19
|
}, /*#__PURE__*/React__default.createElement("button", {
|
|
18
20
|
className: "hc-cursor-pointer hover:hc-opacity-70 hc-text-primary",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info-window-content.js","sources":["../../../../src/components/modules/maps/info-window-content.js"],"sourcesContent":["import React from 'react';\n\nconst InfoWindowContent = ({\n\titems,\n\tfullAddress,\n\tapplyFilters\n}) => {\n\tif (!items || items.length < 0) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"hc-flex-auto hc-p-2\">\n\t\t\t<div>\n\t\t\t\t<div>\n\t\t\t\t\t<h4 className=\"hc-text-lg hc-font-bold hc-leading-tight hc-mb-3\">\n\t\t\t\t\t\t{
|
|
1
|
+
{"version":3,"file":"info-window-content.js","sources":["../../../../src/components/modules/maps/info-window-content.js"],"sourcesContent":["import React from 'react';\n\nconst InfoWindowContent = ({\n\titems,\n\tfullAddress,\n\tapplyFilters\n}) => {\n\tif (!items || items.length < 0) {\n\t\treturn null;\n\t}\n\tlet entityDisplayName = items[0].mapDetails?.entityDisplayName;\n\tconsole.log(items[0].mapDetails);\n\treturn (\n\t\t<div className=\"hc-flex-auto hc-p-2\">\n\t\t\t<div>\n\t\t\t\t<div>\n\t\t\t\t\t<h4 className=\"hc-text-lg hc-font-bold hc-leading-tight hc-mb-3\">\n\t\t\t\t\t\t{entityDisplayName}\n\t\t\t\t\t</h4>\n\t\t\t\t\t<p>{!entityDisplayName.includes(items[0].mapDetails?.address?.street) && !entityDisplayName.icnludes(items[0].mapDetails?.address?.zip) && fullAddress}</p>\n\t\t\t\t\t<div className=\"hc-pt-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName=\"hc-cursor-pointer hover:hc-opacity-70 hc-text-primary\"\n\t\t\t\t\t\t\tonClick={applyFilters}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{items.length > 1\n\t\t\t\t\t\t\t\t? `View All ${items.length} jobs at this location`\n\t\t\t\t\t\t\t\t: `View job at this location`}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default InfoWindowContent;\n"],"names":["InfoWindowContent","_ref","_items$0$mapDetails","_items$0$mapDetails2","_items$0$mapDetails3","items","fullAddress","applyFilters","length","entityDisplayName","mapDetails","console","log","React","createElement","className","includes","address","street","icnludes","zip","onClick","concat"],"mappings":";;AAEA,IAAMA,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAAC,IAAA,EAIjB;AAAA,EAAA,IAAAC,mBAAA,EAAAC,oBAAA,EAAAC,oBAAA,CAAA;AAAA,EAAA,IAHLC,KAAK,GAAAJ,IAAA,CAALI,KAAK;IACLC,WAAW,GAAAL,IAAA,CAAXK,WAAW;IACXC,YAAY,GAAAN,IAAA,CAAZM,YAAY,CAAA;EAEZ,IAAI,CAACF,KAAK,IAAIA,KAAK,CAACG,MAAM,GAAG,CAAC,EAAE;AAC/B,IAAA,OAAO,IAAI,CAAA;AACZ,GAAA;AACA,EAAA,IAAIC,iBAAiB,GAAA,CAAAP,mBAAA,GAAGG,KAAK,CAAC,CAAC,CAAC,CAACK,UAAU,MAAAR,IAAAA,IAAAA,mBAAA,KAAnBA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,mBAAA,CAAqBO,iBAAiB,CAAA;EAC9DE,OAAO,CAACC,GAAG,CAACP,KAAK,CAAC,CAAC,CAAC,CAACK,UAAU,CAAC,CAAA;EAChC,oBACCG,cAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,qBAAA;GACdF,eAAAA,cAAA,CAAAC,aAAA,CACCD,KAAAA,EAAAA,IAAAA,eAAAA,cAAA,CAAAC,aAAA,CAAA,KAAA,EAAA,IAAA,eACCD,cAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;AAAIC,IAAAA,SAAS,EAAC,kDAAA;AAAkD,GAAA,EAC9DN,iBACE,CAAC,eACLI,cAAA,CAAAC,aAAA,CAAA,GAAA,EAAA,IAAA,EAAI,CAACL,iBAAiB,CAACO,QAAQ,CAAAb,CAAAA,oBAAA,GAACE,KAAK,CAAC,CAAC,CAAC,CAACK,UAAU,MAAAP,IAAAA,IAAAA,oBAAA,gBAAAA,oBAAA,GAAnBA,oBAAA,CAAqBc,OAAO,MAAAd,IAAAA,IAAAA,oBAAA,KAA5BA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,oBAAA,CAA8Be,MAAM,CAAC,IAAI,CAACT,iBAAiB,CAACU,QAAQ,CAAA,CAAAf,oBAAA,GAACC,KAAK,CAAC,CAAC,CAAC,CAACK,UAAU,MAAA,IAAA,IAAAN,oBAAA,KAAAA,KAAAA,CAAAA,IAAAA,CAAAA,oBAAA,GAAnBA,oBAAA,CAAqBa,OAAO,MAAAb,IAAAA,IAAAA,oBAAA,uBAA5BA,oBAAA,CAA8BgB,GAAG,CAAC,IAAId,WAAe,CAAC,eAC3JO,cAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,SAAA;GACdF,eAAAA,cAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACCC,IAAAA,SAAS,EAAC,uDAAuD;AACjEM,IAAAA,OAAO,EAAEd,YAAAA;AAAa,GAAA,EAErBF,KAAK,CAACG,MAAM,GAAG,CAAC,eAAAc,MAAA,CACFjB,KAAK,CAACG,MAAM,EAEpB,wBAAA,CAAA,GAAA,2BAAA,CACJ,CACD,CACD,CACD,CAAC,CAAA;AAER;;;;"}
|
|
@@ -151,6 +151,11 @@ const MapListProvider = ({ children, siteConfig, resetFilters, navigateToDetails
|
|
|
151
151
|
const { filteredListings } = filterListingsByLocation(allListings, selectedLocation, listingEntities);
|
|
152
152
|
setNewFilteredListings(filteredListings);
|
|
153
153
|
};
|
|
154
|
+
const resetEntityFilter = () => {
|
|
155
|
+
let newFilters = { ...selectedFilters };
|
|
156
|
+
delete newFilters.entityId;
|
|
157
|
+
setSelectedFilters(newFilters);
|
|
158
|
+
};
|
|
154
159
|
const handleSettingFavorites = (newFavorites) => {
|
|
155
160
|
if (newFavorites == null) {
|
|
156
161
|
localStorage.removeItem('favorites');
|
|
@@ -181,6 +186,7 @@ const MapListProvider = ({ children, siteConfig, resetFilters, navigateToDetails
|
|
|
181
186
|
siteConfig,
|
|
182
187
|
favorites,
|
|
183
188
|
handleSettingFavorites,
|
|
189
|
+
resetEntityFilter,
|
|
184
190
|
setFilterByFavorites,
|
|
185
191
|
filterByFavorites,
|
|
186
192
|
commuteLocation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapListContext.js","sources":["../../src/contexts/mapListContext.tsx"],"sourcesContent":["import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';\r\n\r\nimport { generateFilterOptions, applyFilters, filterListingsByLocation } from '~/util/filterUtil';\r\nimport { getStorageObject, setStorageObject } from '~/util/localStorageUtil';\r\nimport { updateURLWithFilters, filtersFromURL } from '~/util/urlFilterUtil';\r\n\r\nimport { getListingEntities } from \"~/services/listingEntityService\";\r\nimport fetchListings from '~/services/listingAggregatorService';\r\n\r\nimport { Listing } from '~/types/Listings';\r\nimport { ListingEntity } from '~/types/ListingEntity';\r\nimport { Recruiter } from '~/types/Recruiter';\r\nimport { MapConfig, MapConfig as SiteConfig } from '~/types/config/MapConfig';\r\n\r\ninterface MapListContextProps {\r\n loading: boolean;\r\n allListings: Listing[];\r\n filteredListings: Listing[];\r\n mapItems: any;\r\n query: string | null;\r\n setNewFilteredListings: (filteredListings: Listing[]) => void;\r\n setQuery: (query: string | null) => void;\r\n listingEntities: Record<number, ListingEntity> | null;\r\n selectedFilters: Record<string, any>;\r\n setSelectedFilters: (filters: Record<string, any>) => void;\r\n filterOptions: any;\r\n recruiters: Record<number, Recruiter>;\r\n handleFilterListingsByLocation: (selectedLocation: any) => void;\r\n filterDialogIsOpen: boolean;\r\n setFilterDialogIsOpen: (isOpen: boolean) => void;\r\n setMobileTab: (tab: string) => void;\r\n mobileTab: string;\r\n siteConfig: SiteConfig;\r\n favorites: number[];\r\n handleSettingFavorites: (favorites: number[] | null) => void;\r\n setFilterByFavorites: (filter: boolean) => void;\r\n filterByFavorites: boolean;\r\n commuteLocation: any | null;\r\n setCommuteLocation: (location: any | null) => void;\r\n navigateToDetails: (id: number) => void;\r\n navigateToEasyApply: (id: number) => void;\r\n Link: React.ComponentType<any>;\r\n linkFormat: string;\r\n sortSetting: { field: string; type: string };\r\n setSortSetting: (setting: { field: string; type: string }) => void;\r\n trackEvent: (event: string) => void;\r\n}\r\n\r\nconst MapListContext = createContext<MapListContextProps | undefined>(undefined);\r\n\r\nexport const useMapList = () => {\r\n\tconst context = useContext(MapListContext);\r\n\tif (!context) {\r\n\t\tthrow new Error('useMapList must be used within a MapListProvider');\r\n\t}\r\n\treturn context;\r\n};\r\n\r\nconst getQuery = (): string | null => {\r\n\tlet query: string | null = null;\r\n\tif (typeof window !== 'undefined') {\r\n\t\tquery = localStorage.getItem('query');\r\n\t}\r\n\treturn query;\r\n};\r\n\r\ninterface MapListProviderProps {\r\n children: ReactNode;\r\n siteConfig: MapConfig;\r\n resetFilters: boolean;\r\n navigateToDetails: (id: number) => void;\r\n navigateToEasyApply: (id: number) => void;\r\n Link: React.ComponentType<any>;\r\n linkFormat: string;\r\n trackEvent: (event: string) => void;\r\n listings?: Listing[];\r\n setFiltersUrl?:boolean;\r\n}\r\n\r\nexport const MapListProvider: React.FC<MapListProviderProps> = ({\r\n\tchildren,\r\n\tsiteConfig,\r\n\tresetFilters,\r\n\tnavigateToDetails,\r\n\tnavigateToEasyApply,\r\n\tLink,\r\n\tlinkFormat,\r\n\ttrackEvent,\r\n\tlistings = [],\r\n\tsetFiltersUrl\r\n}) => {\r\n\tconst firstLoadFilters = () =>{\r\n\t\tlet urlFilters = filtersFromURL(window.location)?.filters;\r\n\t\treturn (setFiltersUrl === true && urlFilters && Object.keys(urlFilters).length > 0) ? urlFilters : getStorageObject('selectedFilters', {}) || {}\r\n\t}\r\n\tconst [allListings, setAllListings] = useState<Listing[]>(getStorageObject(\"listings\", listings) || []);\r\n\tconst [filteredListings, setFilteredListings] = useState<Listing[]>([]);\r\n\tconst [loading, setLoading] = useState<boolean>(false);\r\n\tconst [mapItems, setMapItems] = useState<any>(getStorageObject('mapItems', []) || []);\r\n\tconst [query, setQuery] = useState<string | null>(() => resetFilters ? null : getQuery());\r\n\tconst [sortSetting, setSortSetting] = useState<{ field: string; type: string }>(getStorageObject('sortSetting', { field: 'position', type: 'asc' }) || { field: 'position', type: 'asc' });\r\n\tconst [listingEntities, setListingEntities] = useState<Record<number, ListingEntity> | null>(getStorageObject(\"listingEntities\", null));\r\n\tconst [firstLoad, setFirstLoad] = useState<boolean>(true);\r\n\tconst [commuteLocation, setCommuteLocation] = useState<any | null>(getStorageObject('commuteLocation'));\r\n\tconst [selectedFilters, setSelectedFilters] = useState<Record<string, any>>(() => resetFilters ? {} : firstLoadFilters());\r\n\tconst [filterOptions, setFilterOptions] = useState<any>();\r\n\tconst [recruiters, setRecruiters] = useState<Record<number, Recruiter>>(getStorageObject(\"recruiters\", {}) || {});\r\n\tconst [filterDialogIsOpen, setFilterDialogIsOpen] = useState<boolean>(false);\r\n\tconst [mobileTab, setMobileTab] = useState<string>(\"listTab\");\r\n\tconst [favorites, setFavorites] = useState<number[]>([]);\r\n\tconst [filterByFavorites, setFilterByFavorites] = useState<boolean>(false);\r\n\r\n\tconst setNewFilteredListings = (filteredListings: Listing[]) => {\r\n\t\tsetFilteredListings(filteredListings);\r\n\t};\r\n\r\n\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!sortSetting) return;\r\n\t\tlocalStorage.setItem('sortSetting', JSON.stringify(sortSetting));\r\n\t\tsetNewFilteredListings(filteredListings);\r\n\t}, [sortSetting]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst loadedFavorites = JSON.parse(localStorage.getItem('favorites') || '[]');\r\n\t\tsetFavorites(loadedFavorites);\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetStorageObject(\"commuteLocation\", commuteLocation);\r\n\t}, [commuteLocation]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!commuteLocation) return;\r\n\r\n\t\tasync function fetchEntities() {\r\n\t\t\tconst distinctEntityIds = [\r\n\t\t\t\t...new Set(allListings.map(listing => listing.entityId ?? -1))\r\n\t\t\t];\r\n\t\t\ttry {\r\n\t\t\t\tconst fetchedEntities = await getListingEntities(\r\n\t\t\t\t\tdistinctEntityIds,\r\n\t\t\t\t\t`${commuteLocation.lat}, ${commuteLocation.lng}`\r\n\t\t\t\t);\r\n\t\t\t\tsetListingEntities(fetchedEntities);\r\n\t\t\t\tconst newFilteredListings: Listing[] = [...filteredListings] ?? [];\r\n\t\t\t\tfor (let i = 0; i < allListings.length; i++) {\r\n\t\t\t\t\tconst listing = newFilteredListings[i];\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tlisting &&\r\n\t\t\t\t\t\tlisting.fields &&\r\n\t\t\t\t\t\tlisting.entityId !== undefined &&\r\n\t\t\t\t\t\tlisting.entityId !== -1\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tconst entityId = listing.entityId;\r\n\t\t\t\t\t\tconst travelTime = fetchedEntities[entityId]?.travelTime;\r\n\r\n\t\t\t\t\t\tif (travelTime !== undefined && listing.fields) {\r\n\t\t\t\t\t\t\tlisting.fields.travelTime = travelTime;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Failed to fetch listing entities:\", error);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfetchEntities();\r\n\t}, [commuteLocation, allListings, siteConfig.companyId]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst handleFetchListings = async () => {\r\n\t\t\tif (!getStorageObject('listings') ?? [].length) {\r\n\t\t\t\tsetLoading(true);\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst {\r\n\t\t\t\t\tlistingsResult,\r\n\t\t\t\t\tfetchedRecruiters,\r\n\t\t\t\t\tfetchedEntities,\r\n\t\t\t\t\tdistinctItems\r\n\t\t\t\t} = await fetchListings(query ?? '', siteConfig, commuteLocation);\r\n\t\t\t\tsetAllListings(listingsResult);\r\n\t\t\t\tsetRecruiters(fetchedRecruiters);\r\n\t\t\t\tsetListingEntities(fetchedEntities);\r\n\t\t\t\tsetMapItems(distinctItems);\r\n\t\t\t\tsetStorageObject(\"mapItems\", distinctItems);\r\n\t\t\t\tsetStorageObject(\"listingEntities\", fetchedEntities);\r\n\t\t\t\tsetStorageObject(\"recruiters\", fetchedRecruiters);\r\n\t\t\t\tsetStorageObject(\"listings\", listingsResult);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.log(error);\r\n\t\t\t}\r\n\t\t\tsetLoading(false);\r\n\t\t};\r\n\t\thandleFetchListings();\r\n\t}, [query, siteConfig]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst processListings = () => {\r\n\t\t\tlet filteredListings: Listing[];\r\n\t\t\tlet tempSelectedFilters = selectedFilters;\r\n\t\t\tlet tempQuery = query;\r\n\r\n\t\t\tconst { mapItems, filteredListings: tempFilteredListings } = applyFilters(\r\n\t\t\t\tallListings,\r\n\t\t\t\ttempSelectedFilters,\r\n\t\t\t\ttempQuery,\r\n\t\t\t\tlistingEntities,\r\n\t\t\t\tfavorites,\r\n\t\t\t\tsiteConfig\r\n\t\t\t);\r\n\t\t\tfilteredListings = tempFilteredListings;\r\n\r\n\t\t\tif (filterByFavorites) {\r\n\t\t\t\tfilteredListings = filteredListings.filter((x: Listing) => favorites.includes(x.id));\r\n\t\t\t}\r\n\t\t\tsetNewFilteredListings(filteredListings);\r\n\t\t\tif (firstLoad && tempSelectedFilters) {\r\n\t\t\t\t// Update URL with filters if needed\r\n\t\t\t} else if (Object.keys(tempSelectedFilters).length === 0 && !firstLoad) {\r\n\t\t\t\tlocalStorage.removeItem('selectedFilters');\r\n\t\t\t} else if (!firstLoad) {\r\n\t\t\t\tsetStorageObject('selectedFilters', tempSelectedFilters);\r\n\t\t\t}\r\n\t\t\tif(setFiltersUrl === true)\r\n\t\t\t{\r\n\t\t\t\tupdateURLWithFilters(tempSelectedFilters, window.location, tempQuery);\r\n\t\t\t}\r\n\t\t\ttempQuery != null ? localStorage.setItem('query', tempQuery) : localStorage.removeItem('query');\r\n\t\t\tsetMapItems(mapItems);\r\n\r\n\t\t\tif (tempSelectedFilters) {\r\n\t\t\t\tconst keys = Object.keys(tempSelectedFilters);\r\n\t\t\t\tconst lastKey = keys[keys.length - 1];\r\n\t\t\t\tconst options = generateFilterOptions(\r\n\t\t\t\t\tfirstLoad ? allListings : filteredListings,\r\n\t\t\t\t\tallListings,\r\n\t\t\t\t\tsiteConfig,\r\n\t\t\t\t\tfilterOptions,\r\n\t\t\t\t\tlastKey,\r\n\t\t\t\t\tfavorites\r\n\t\t\t\t);\r\n\t\t\t\tif (options) {\r\n\t\t\t\t\tsetFilterOptions(options);\r\n\t\t\t\t\tif (firstLoad) setFirstLoad(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tprocessListings();\r\n\t}, [selectedFilters, query, listingEntities, filterByFavorites, favorites]);\r\n\r\n\tconst handleFilterListingsByLocation = (selectedLocation: any) => {\r\n\t\tconst { filteredListings } = filterListingsByLocation(\r\n\t\t\tallListings,\r\n\t\t\tselectedLocation,\r\n\t\t\tlistingEntities\r\n\t\t);\r\n\t\tsetNewFilteredListings(filteredListings);\r\n\t};\r\n\r\n\tconst handleSettingFavorites = (newFavorites: number[] | null) => {\r\n\t\tif (newFavorites == null) {\r\n\t\t\tlocalStorage.removeItem('favorites');\r\n\t\t} else {\r\n\t\t\tsetFavorites(newFavorites);\r\n\t\t\tlocalStorage.setItem('favorites', JSON.stringify(newFavorites));\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<MapListContext.Provider value={{\r\n\t\t\tloading,\r\n\t\t\tallListings,\r\n\t\t\tfilteredListings,\r\n\t\t\tmapItems,\r\n\t\t\tquery,\r\n\t\t\tsetNewFilteredListings,\r\n\t\t\tsetQuery,\r\n\t\t\tlistingEntities,\r\n\t\t\tselectedFilters,\r\n\t\t\tsetSelectedFilters,\r\n\t\t\tfilterOptions,\r\n\t\t\trecruiters,\r\n\t\t\thandleFilterListingsByLocation,\r\n\t\t\tfilterDialogIsOpen,\r\n\t\t\tsetFilterDialogIsOpen,\r\n\t\t\tsetMobileTab,\r\n\t\t\tmobileTab,\r\n\t\t\tsiteConfig,\r\n\t\t\tfavorites,\r\n\t\t\thandleSettingFavorites,\r\n\t\t\tsetFilterByFavorites,\r\n\t\t\tfilterByFavorites,\r\n\t\t\tcommuteLocation,\r\n\t\t\tsetCommuteLocation,\r\n\t\t\tnavigateToDetails,\r\n\t\t\tnavigateToEasyApply,\r\n\t\t\tLink,\r\n\t\t\tlinkFormat,\r\n\t\t\tsortSetting,\r\n\t\t\tsetSortSetting,\r\n\t\t\ttrackEvent\r\n\t\t}}>\r\n\t\t\t{children}\r\n\t\t</MapListContext.Provider>\r\n\t);\r\n};\r\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mapListContext.js","sources":["../../src/contexts/mapListContext.tsx"],"sourcesContent":["import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';\n\nimport { generateFilterOptions, applyFilters, filterListingsByLocation } from '~/util/filterUtil';\nimport { getStorageObject, setStorageObject } from '~/util/localStorageUtil';\nimport { updateURLWithFilters, filtersFromURL } from '~/util/urlFilterUtil';\n\nimport { getListingEntities } from \"~/services/listingEntityService\";\nimport fetchListings from '~/services/listingAggregatorService';\n\nimport { Listing } from '~/types/Listings';\nimport { ListingEntity } from '~/types/ListingEntity';\nimport { Recruiter } from '~/types/Recruiter';\nimport { MapConfig, MapConfig as SiteConfig } from '~/types/config/MapConfig';\n\ninterface MapListContextProps {\n loading: boolean;\n allListings: Listing[];\n filteredListings: Listing[];\n mapItems: any;\n query: string | null;\n setNewFilteredListings: (filteredListings: Listing[]) => void;\n setQuery: (query: string | null) => void;\n listingEntities: Record<number, ListingEntity> | null;\n selectedFilters: Record<string, any>;\n setSelectedFilters: (filters: Record<string, any>) => void;\n filterOptions: any;\n recruiters: Record<number, Recruiter>;\n handleFilterListingsByLocation: (selectedLocation: any) => void;\n filterDialogIsOpen: boolean;\n setFilterDialogIsOpen: (isOpen: boolean) => void;\n setMobileTab: (tab: string) => void;\n mobileTab: string;\n siteConfig: SiteConfig;\n favorites: number[];\n resetEntityFilter: () => void;\n handleSettingFavorites: (favorites: number[] | null) => void;\n setFilterByFavorites: (filter: boolean) => void;\n filterByFavorites: boolean;\n commuteLocation: any | null;\n setCommuteLocation: (location: any | null) => void;\n navigateToDetails: (id: number) => void;\n navigateToEasyApply: (id: number) => void;\n Link: React.ComponentType<any>;\n linkFormat: string;\n sortSetting: { field: string; type: string };\n setSortSetting: (setting: { field: string; type: string }) => void;\n trackEvent: (event: string) => void;\n}\n\nconst MapListContext = createContext<MapListContextProps | undefined>(undefined);\n\nexport const useMapList = () => {\n\tconst context = useContext(MapListContext);\n\tif (!context) {\n\t\tthrow new Error('useMapList must be used within a MapListProvider');\n\t}\n\treturn context;\n};\n\nconst getQuery = (): string | null => {\n\tlet query: string | null = null;\n\tif (typeof window !== 'undefined') {\n\t\tquery = localStorage.getItem('query');\n\t}\n\treturn query;\n};\n\ninterface MapListProviderProps {\n children: ReactNode;\n siteConfig: MapConfig;\n resetFilters: boolean;\n navigateToDetails: (id: number) => void;\n navigateToEasyApply: (id: number) => void;\n Link: React.ComponentType<any>;\n linkFormat: string;\n trackEvent: (event: string) => void;\n listings?: Listing[];\n setFiltersUrl?:boolean;\n}\n\nexport const MapListProvider: React.FC<MapListProviderProps> = ({\n\tchildren,\n\tsiteConfig,\n\tresetFilters,\n\tnavigateToDetails,\n\tnavigateToEasyApply,\n\tLink,\n\tlinkFormat,\n\ttrackEvent,\n\tlistings = [],\n\tsetFiltersUrl\n}) => {\n\tconst firstLoadFilters = () =>{\n\t\tlet urlFilters = filtersFromURL(window.location)?.filters;\n\t\treturn (setFiltersUrl === true && urlFilters && Object.keys(urlFilters).length > 0) ? urlFilters : getStorageObject('selectedFilters', {}) || {}\n\t}\n\tconst [allListings, setAllListings] = useState<Listing[]>(getStorageObject(\"listings\", listings) || []);\n\tconst [filteredListings, setFilteredListings] = useState<Listing[]>([]);\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst [mapItems, setMapItems] = useState<any>(getStorageObject('mapItems', []) || []);\n\tconst [query, setQuery] = useState<string | null>(() => resetFilters ? null : getQuery());\n\tconst [sortSetting, setSortSetting] = useState<{ field: string; type: string }>(getStorageObject('sortSetting', { field: 'position', type: 'asc' }) || { field: 'position', type: 'asc' });\n\tconst [listingEntities, setListingEntities] = useState<Record<number, ListingEntity> | null>(getStorageObject(\"listingEntities\", null));\n\tconst [firstLoad, setFirstLoad] = useState<boolean>(true);\n\tconst [commuteLocation, setCommuteLocation] = useState<any | null>(getStorageObject('commuteLocation'));\n\tconst [selectedFilters, setSelectedFilters] = useState<Record<string, any>>(() => resetFilters ? {} : firstLoadFilters());\n\tconst [filterOptions, setFilterOptions] = useState<any>();\n\tconst [recruiters, setRecruiters] = useState<Record<number, Recruiter>>(getStorageObject(\"recruiters\", {}) || {});\n\tconst [filterDialogIsOpen, setFilterDialogIsOpen] = useState<boolean>(false);\n\tconst [mobileTab, setMobileTab] = useState<string>(\"listTab\");\n\tconst [favorites, setFavorites] = useState<number[]>([]);\n\tconst [filterByFavorites, setFilterByFavorites] = useState<boolean>(false);\n\n\tconst setNewFilteredListings = (filteredListings: Listing[]) => {\n\t\tsetFilteredListings(filteredListings);\n\t};\n\n\n\n\tuseEffect(() => {\n\t\tif (!sortSetting) return;\n\t\tlocalStorage.setItem('sortSetting', JSON.stringify(sortSetting));\n\t\tsetNewFilteredListings(filteredListings);\n\t}, [sortSetting]);\n\n\tuseEffect(() => {\n\t\tconst loadedFavorites = JSON.parse(localStorage.getItem('favorites') || '[]');\n\t\tsetFavorites(loadedFavorites);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetStorageObject(\"commuteLocation\", commuteLocation);\n\t}, [commuteLocation]);\n\n\tuseEffect(() => {\n\t\tif (!commuteLocation) return;\n\n\t\tasync function fetchEntities() {\n\t\t\tconst distinctEntityIds = [\n\t\t\t\t...new Set(allListings.map(listing => listing.entityId ?? -1))\n\t\t\t];\n\t\t\ttry {\n\t\t\t\tconst fetchedEntities = await getListingEntities(\n\t\t\t\t\tdistinctEntityIds,\n\t\t\t\t\t`${commuteLocation.lat}, ${commuteLocation.lng}`\n\t\t\t\t);\n\t\t\t\tsetListingEntities(fetchedEntities);\n\t\t\t\tconst newFilteredListings: Listing[] = [...filteredListings] ?? [];\n\t\t\t\tfor (let i = 0; i < allListings.length; i++) {\n\t\t\t\t\tconst listing = newFilteredListings[i];\n\t\t\t\t\tif (\n\t\t\t\t\t\tlisting &&\n\t\t\t\t\t\tlisting.fields &&\n\t\t\t\t\t\tlisting.entityId !== undefined &&\n\t\t\t\t\t\tlisting.entityId !== -1\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst entityId = listing.entityId;\n\t\t\t\t\t\tconst travelTime = fetchedEntities[entityId]?.travelTime;\n\n\t\t\t\t\t\tif (travelTime !== undefined && listing.fields) {\n\t\t\t\t\t\t\tlisting.fields.travelTime = travelTime;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to fetch listing entities:\", error);\n\t\t\t}\n\t\t}\n\n\t\tfetchEntities();\n\t}, [commuteLocation, allListings, siteConfig.companyId]);\n\n\tuseEffect(() => {\n\t\tconst handleFetchListings = async () => {\n\t\t\tif (!getStorageObject('listings') ?? [].length) {\n\t\t\t\tsetLoading(true);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\tlistingsResult,\n\t\t\t\t\tfetchedRecruiters,\n\t\t\t\t\tfetchedEntities,\n\t\t\t\t\tdistinctItems\n\t\t\t\t} = await fetchListings(query ?? '', siteConfig, commuteLocation);\n\t\t\t\tsetAllListings(listingsResult);\n\t\t\t\tsetRecruiters(fetchedRecruiters);\n\t\t\t\tsetListingEntities(fetchedEntities);\n\t\t\t\tsetMapItems(distinctItems);\n\t\t\t\tsetStorageObject(\"mapItems\", distinctItems);\n\t\t\t\tsetStorageObject(\"listingEntities\", fetchedEntities);\n\t\t\t\tsetStorageObject(\"recruiters\", fetchedRecruiters);\n\t\t\t\tsetStorageObject(\"listings\", listingsResult);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(error);\n\t\t\t}\n\t\t\tsetLoading(false);\n\t\t};\n\t\thandleFetchListings();\n\t}, [query, siteConfig]);\n\n\tuseEffect(() => {\n\t\tconst processListings = () => {\n\t\t\tlet filteredListings: Listing[];\n\t\t\tlet tempSelectedFilters = selectedFilters;\n\t\t\tlet tempQuery = query;\n\n\t\t\tconst { mapItems, filteredListings: tempFilteredListings } = applyFilters(\n\t\t\t\tallListings,\n\t\t\t\ttempSelectedFilters,\n\t\t\t\ttempQuery,\n\t\t\t\tlistingEntities,\n\t\t\t\tfavorites,\n\t\t\t\tsiteConfig\n\t\t\t);\n\t\t\tfilteredListings = tempFilteredListings;\n\n\t\t\tif (filterByFavorites) {\n\t\t\t\tfilteredListings = filteredListings.filter((x: Listing) => favorites.includes(x.id));\n\t\t\t}\n\t\t\tsetNewFilteredListings(filteredListings);\n\t\t\tif (firstLoad && tempSelectedFilters) {\n\t\t\t\t// Update URL with filters if needed\n\t\t\t} else if (Object.keys(tempSelectedFilters).length === 0 && !firstLoad) {\n\t\t\t\tlocalStorage.removeItem('selectedFilters');\n\t\t\t} else if (!firstLoad) {\n\t\t\t\tsetStorageObject('selectedFilters', tempSelectedFilters);\n\t\t\t}\n\t\t\tif(setFiltersUrl === true)\n\t\t\t{\n\t\t\t\tupdateURLWithFilters(tempSelectedFilters, window.location, tempQuery);\n\t\t\t}\n\t\t\ttempQuery != null ? localStorage.setItem('query', tempQuery) : localStorage.removeItem('query');\n\t\t\tsetMapItems(mapItems);\n\n\t\t\tif (tempSelectedFilters) {\n\t\t\t\tconst keys = Object.keys(tempSelectedFilters);\n\t\t\t\tconst lastKey = keys[keys.length - 1];\n\t\t\t\tconst options = generateFilterOptions(\n\t\t\t\t\tfirstLoad ? allListings : filteredListings,\n\t\t\t\t\tallListings,\n\t\t\t\t\tsiteConfig,\n\t\t\t\t\tfilterOptions,\n\t\t\t\t\tlastKey,\n\t\t\t\t\tfavorites\n\t\t\t\t);\n\t\t\t\tif (options) {\n\t\t\t\t\tsetFilterOptions(options);\n\t\t\t\t\tif (firstLoad) setFirstLoad(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tprocessListings();\n\t}, [selectedFilters, query, listingEntities, filterByFavorites, favorites]);\n\n\tconst handleFilterListingsByLocation = (selectedLocation: any) => {\n\t\tconst { filteredListings } = filterListingsByLocation(\n\t\t\tallListings,\n\t\t\tselectedLocation,\n\t\t\tlistingEntities\n\t\t);\n\t\tsetNewFilteredListings(filteredListings);\n\t};\n\n\tconst resetEntityFilter = () => {\n\t\tlet newFilters = {...selectedFilters};\n\t\tdelete newFilters.entityId;\n\t\tsetSelectedFilters(newFilters);\n\t}\n\n\tconst handleSettingFavorites = (newFavorites: number[] | null) => {\n\t\tif (newFavorites == null) {\n\t\t\tlocalStorage.removeItem('favorites');\n\t\t} else {\n\t\t\tsetFavorites(newFavorites);\n\t\t\tlocalStorage.setItem('favorites', JSON.stringify(newFavorites));\n\t\t}\n\t};\n\n\treturn (\n\t\t<MapListContext.Provider value={{\n\t\t\tloading,\n\t\t\tallListings,\n\t\t\tfilteredListings,\n\t\t\tmapItems,\n\t\t\tquery,\n\t\t\tsetNewFilteredListings,\n\t\t\tsetQuery,\n\t\t\tlistingEntities,\n\t\t\tselectedFilters,\n\t\t\tsetSelectedFilters,\n\t\t\tfilterOptions,\n\t\t\trecruiters,\n\t\t\thandleFilterListingsByLocation,\n\t\t\tfilterDialogIsOpen,\n\t\t\tsetFilterDialogIsOpen,\n\t\t\tsetMobileTab,\n\t\t\tmobileTab,\n\t\t\tsiteConfig,\n\t\t\tfavorites,\n\t\t\thandleSettingFavorites,\n\t\t\tresetEntityFilter,\n\t\t\tsetFilterByFavorites,\n\t\t\tfilterByFavorites,\n\t\t\tcommuteLocation,\n\t\t\tsetCommuteLocation,\n\t\t\tnavigateToDetails,\n\t\t\tnavigateToEasyApply,\n\t\t\tLink,\n\t\t\tlinkFormat,\n\t\t\tsortSetting,\n\t\t\tsetSortSetting,\n\t\t\ttrackEvent\n\t\t}}>\n\t\t\t{children}\n\t\t</MapListContext.Provider>\n\t);\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ interface MapListContextProps {
|
|
|
23
23
|
mobileTab: string;
|
|
24
24
|
siteConfig: SiteConfig;
|
|
25
25
|
favorites: number[];
|
|
26
|
+
resetEntityFilter: () => void;
|
|
26
27
|
handleSettingFavorites: (favorites: number[] | null) => void;
|
|
27
28
|
setFilterByFavorites: (filter: boolean) => void;
|
|
28
29
|
filterByFavorites: boolean;
|
package/package.json
CHANGED
|
@@ -1,66 +1,69 @@
|
|
|
1
|
-
import React, { memo } from 'react';
|
|
2
|
-
import AccordionFilterItem from '~/components/modules/accordions/filterItem';
|
|
3
|
-
import FilterItem from '~/components/containers/filter/filter-item-container';
|
|
4
|
-
import ItemsPill from '~/components/modules/buttons/items-pill';
|
|
5
|
-
|
|
6
|
-
const FilterItemContainer = ({
|
|
7
|
-
filter,
|
|
8
|
-
setDefaultValue,
|
|
9
|
-
setSelectedFilters,
|
|
10
|
-
selectedFilters,
|
|
11
|
-
subcategoryRequireCategory = false
|
|
12
|
-
}) => {
|
|
13
|
-
const fieldKey = filter.id;
|
|
14
|
-
const activeItemsCount = selectedFilters != null && selectedFilters[fieldKey]
|
|
15
|
-
? Object.keys(selectedFilters[fieldKey]).length
|
|
16
|
-
: 0;
|
|
17
|
-
|
|
18
|
-
const handleClearFilters = event => {
|
|
19
|
-
event.stopPropagation();
|
|
20
|
-
setSelectedFilters(prevFilters => {
|
|
21
|
-
const updatedFilters = { ...prevFilters };
|
|
22
|
-
if(subcategoryRequireCategory && fieldKey == 'categoryClass'){
|
|
23
|
-
delete updatedFilters['category'];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
import React, { memo } from 'react';
|
|
2
|
+
import AccordionFilterItem from '~/components/modules/accordions/filterItem';
|
|
3
|
+
import FilterItem from '~/components/containers/filter/filter-item-container';
|
|
4
|
+
import ItemsPill from '~/components/modules/buttons/items-pill';
|
|
5
|
+
|
|
6
|
+
const FilterItemContainer = ({
|
|
7
|
+
filter,
|
|
8
|
+
setDefaultValue,
|
|
9
|
+
setSelectedFilters,
|
|
10
|
+
selectedFilters,
|
|
11
|
+
subcategoryRequireCategory = false
|
|
12
|
+
}) => {
|
|
13
|
+
const fieldKey = filter.id;
|
|
14
|
+
const activeItemsCount = selectedFilters != null && selectedFilters[fieldKey]
|
|
15
|
+
? Object.keys(selectedFilters[fieldKey]).length
|
|
16
|
+
: 0;
|
|
17
|
+
|
|
18
|
+
const handleClearFilters = event => {
|
|
19
|
+
event.stopPropagation();
|
|
20
|
+
setSelectedFilters(prevFilters => {
|
|
21
|
+
const updatedFilters = { ...prevFilters };
|
|
22
|
+
if(subcategoryRequireCategory && fieldKey == 'categoryClass'){
|
|
23
|
+
delete updatedFilters['category'];
|
|
24
|
+
}
|
|
25
|
+
if(fieldKey == 'state' || fieldKey == 'city' || fieldKey == 'cityState'){
|
|
26
|
+
delete updatedFilters.entityId;
|
|
27
|
+
delete updatedFilters[fieldKey];
|
|
28
|
+
}
|
|
29
|
+
return updatedFilters;
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const header = (
|
|
34
|
+
<>
|
|
35
|
+
{filter.title}
|
|
36
|
+
{activeItemsCount > 0 && (
|
|
37
|
+
<ItemsPill
|
|
38
|
+
activeItemsCount={activeItemsCount}
|
|
39
|
+
onClick={handleClearFilters}
|
|
40
|
+
/>
|
|
41
|
+
)}
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const body = (
|
|
46
|
+
<>
|
|
47
|
+
{filter.items.sort().map(item => (
|
|
48
|
+
<FilterItem
|
|
49
|
+
key={item.name}
|
|
50
|
+
item={item}
|
|
51
|
+
field={filter.id}
|
|
52
|
+
selectedFilters={selectedFilters}
|
|
53
|
+
setSelectedFilters={setSelectedFilters}
|
|
54
|
+
/>
|
|
55
|
+
))}
|
|
56
|
+
</>
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<AccordionFilterItem
|
|
61
|
+
id={filter.id}
|
|
62
|
+
setDefaultValue={setDefaultValue}
|
|
63
|
+
header={header}
|
|
64
|
+
body={body}
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default memo(FilterItemContainer);
|
|
@@ -8,8 +8,8 @@ const InfoWindowContentContainer = ({
|
|
|
8
8
|
filterListingsByLocation
|
|
9
9
|
}) => {
|
|
10
10
|
const { trackEvent, eventTypes } = useTrackEvent();
|
|
11
|
-
const { setSelectedFilters, setMobileTab, selectedFilters, siteConfig } = useMapList();
|
|
12
|
-
const fieldsShown = siteConfig.
|
|
11
|
+
const { setSelectedFilters, setMobileTab, selectedFilters, siteConfig, filteredListings } = useMapList();
|
|
12
|
+
const fieldsShown = siteConfig.locationFiltersShown;
|
|
13
13
|
let items = item && item.items ? Object.values(item.items) : null;
|
|
14
14
|
|
|
15
15
|
const addressParts = [
|
|
@@ -40,9 +40,11 @@ const InfoWindowContentContainer = ({
|
|
|
40
40
|
filters.push({ filterType: 'state', filterChecked: items[0].fields.state });
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
newFilters.entityId = { [items[0].fields.entityId]: true };
|
|
44
|
+
filters.push({ filterType: 'entityId', filterChecked: items[0].fields.entityId });
|
|
45
|
+
|
|
43
46
|
trackEvent(eventTypes.VIEW_JOBS_AT_Location, { filtersApplied: filters });
|
|
44
47
|
setSelectedFilters(newFilters);
|
|
45
|
-
filterListingsByLocation();
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
return <InfoWindowContent items={items} fullAddress={fullAddress} applyFilters={applyFilters} />;
|
|
@@ -23,7 +23,7 @@ const MapMarkerContainer = ({
|
|
|
23
23
|
const isSelected = item.id === selectedLocation?.id;
|
|
24
24
|
const markerRef = useRef(null);
|
|
25
25
|
const { trackEvent, eventTypes } = useTrackEvent();
|
|
26
|
-
const {
|
|
26
|
+
const { resetEntityFilter } = useMapList();
|
|
27
27
|
|
|
28
28
|
useEffect(() => {
|
|
29
29
|
markerRefs.current[item.id] = markerRef.current;
|
|
@@ -57,6 +57,7 @@ const MapMarkerContainer = ({
|
|
|
57
57
|
onCloseClick={() => {
|
|
58
58
|
setMapInteracted(true);
|
|
59
59
|
setLocation(null);
|
|
60
|
+
resetEntityFilter();
|
|
60
61
|
}}
|
|
61
62
|
options={{ maxWidth: 400 }}
|
|
62
63
|
>
|
|
@@ -66,7 +67,6 @@ const MapMarkerContainer = ({
|
|
|
66
67
|
content={<InfoWindowContent
|
|
67
68
|
item={item}
|
|
68
69
|
commuteLocation={commuteLocation}
|
|
69
|
-
filterListingsByLocation={() => handleFilterListingsByLocation(selectedLocation)}
|
|
70
70
|
/>}
|
|
71
71
|
/>
|
|
72
72
|
</InfoWindow>
|
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
const InfoWindowContent = ({
|
|
4
|
-
items,
|
|
5
|
-
fullAddress,
|
|
6
|
-
applyFilters
|
|
7
|
-
}) => {
|
|
8
|
-
if (!items || items.length < 0) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const InfoWindowContent = ({
|
|
4
|
+
items,
|
|
5
|
+
fullAddress,
|
|
6
|
+
applyFilters
|
|
7
|
+
}) => {
|
|
8
|
+
if (!items || items.length < 0) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
let entityDisplayName = items[0].mapDetails?.entityDisplayName;
|
|
12
|
+
return (
|
|
13
|
+
<div className="hc-flex-auto hc-p-2">
|
|
14
|
+
<div>
|
|
15
|
+
<div>
|
|
16
|
+
<h4 className="hc-text-lg hc-font-bold hc-leading-tight hc-mb-3">
|
|
17
|
+
{entityDisplayName}
|
|
18
|
+
</h4>
|
|
19
|
+
<p>{!entityDisplayName.includes(items[0].mapDetails?.address?.street) && !entityDisplayName.includes(items[0].mapDetails?.address?.zip) && fullAddress}</p>
|
|
20
|
+
<div className="hc-pt-2">
|
|
21
|
+
<button
|
|
22
|
+
className="hc-cursor-pointer hover:hc-opacity-70 hc-text-primary"
|
|
23
|
+
onClick={applyFilters}
|
|
24
|
+
>
|
|
25
|
+
{items.length > 1
|
|
26
|
+
? `View All ${items.length} jobs at this location`
|
|
27
|
+
: `View job at this location`}
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default InfoWindowContent;
|
|
@@ -1,311 +1,319 @@
|
|
|
1
|
-
import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
import { generateFilterOptions, applyFilters, filterListingsByLocation } from '~/util/filterUtil';
|
|
4
|
-
import { getStorageObject, setStorageObject } from '~/util/localStorageUtil';
|
|
5
|
-
import { updateURLWithFilters, filtersFromURL } from '~/util/urlFilterUtil';
|
|
6
|
-
|
|
7
|
-
import { getListingEntities } from "~/services/listingEntityService";
|
|
8
|
-
import fetchListings from '~/services/listingAggregatorService';
|
|
9
|
-
|
|
10
|
-
import { Listing } from '~/types/Listings';
|
|
11
|
-
import { ListingEntity } from '~/types/ListingEntity';
|
|
12
|
-
import { Recruiter } from '~/types/Recruiter';
|
|
13
|
-
import { MapConfig, MapConfig as SiteConfig } from '~/types/config/MapConfig';
|
|
14
|
-
|
|
15
|
-
interface MapListContextProps {
|
|
16
|
-
loading: boolean;
|
|
17
|
-
allListings: Listing[];
|
|
18
|
-
filteredListings: Listing[];
|
|
19
|
-
mapItems: any;
|
|
20
|
-
query: string | null;
|
|
21
|
-
setNewFilteredListings: (filteredListings: Listing[]) => void;
|
|
22
|
-
setQuery: (query: string | null) => void;
|
|
23
|
-
listingEntities: Record<number, ListingEntity> | null;
|
|
24
|
-
selectedFilters: Record<string, any>;
|
|
25
|
-
setSelectedFilters: (filters: Record<string, any>) => void;
|
|
26
|
-
filterOptions: any;
|
|
27
|
-
recruiters: Record<number, Recruiter>;
|
|
28
|
-
handleFilterListingsByLocation: (selectedLocation: any) => void;
|
|
29
|
-
filterDialogIsOpen: boolean;
|
|
30
|
-
setFilterDialogIsOpen: (isOpen: boolean) => void;
|
|
31
|
-
setMobileTab: (tab: string) => void;
|
|
32
|
-
mobileTab: string;
|
|
33
|
-
siteConfig: SiteConfig;
|
|
34
|
-
favorites: number[];
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const [
|
|
98
|
-
const [
|
|
99
|
-
const [
|
|
100
|
-
const [
|
|
101
|
-
const [
|
|
102
|
-
const [
|
|
103
|
-
const [
|
|
104
|
-
const [
|
|
105
|
-
const [
|
|
106
|
-
const [
|
|
107
|
-
const [
|
|
108
|
-
const [
|
|
109
|
-
const [
|
|
110
|
-
const [
|
|
111
|
-
const [
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
listing
|
|
153
|
-
listing.
|
|
154
|
-
listing.entityId !==
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
setStorageObject("
|
|
191
|
-
setStorageObject("
|
|
192
|
-
setStorageObject("
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
let
|
|
205
|
-
let
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
allListings,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
1
|
+
import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import { generateFilterOptions, applyFilters, filterListingsByLocation } from '~/util/filterUtil';
|
|
4
|
+
import { getStorageObject, setStorageObject } from '~/util/localStorageUtil';
|
|
5
|
+
import { updateURLWithFilters, filtersFromURL } from '~/util/urlFilterUtil';
|
|
6
|
+
|
|
7
|
+
import { getListingEntities } from "~/services/listingEntityService";
|
|
8
|
+
import fetchListings from '~/services/listingAggregatorService';
|
|
9
|
+
|
|
10
|
+
import { Listing } from '~/types/Listings';
|
|
11
|
+
import { ListingEntity } from '~/types/ListingEntity';
|
|
12
|
+
import { Recruiter } from '~/types/Recruiter';
|
|
13
|
+
import { MapConfig, MapConfig as SiteConfig } from '~/types/config/MapConfig';
|
|
14
|
+
|
|
15
|
+
interface MapListContextProps {
|
|
16
|
+
loading: boolean;
|
|
17
|
+
allListings: Listing[];
|
|
18
|
+
filteredListings: Listing[];
|
|
19
|
+
mapItems: any;
|
|
20
|
+
query: string | null;
|
|
21
|
+
setNewFilteredListings: (filteredListings: Listing[]) => void;
|
|
22
|
+
setQuery: (query: string | null) => void;
|
|
23
|
+
listingEntities: Record<number, ListingEntity> | null;
|
|
24
|
+
selectedFilters: Record<string, any>;
|
|
25
|
+
setSelectedFilters: (filters: Record<string, any>) => void;
|
|
26
|
+
filterOptions: any;
|
|
27
|
+
recruiters: Record<number, Recruiter>;
|
|
28
|
+
handleFilterListingsByLocation: (selectedLocation: any) => void;
|
|
29
|
+
filterDialogIsOpen: boolean;
|
|
30
|
+
setFilterDialogIsOpen: (isOpen: boolean) => void;
|
|
31
|
+
setMobileTab: (tab: string) => void;
|
|
32
|
+
mobileTab: string;
|
|
33
|
+
siteConfig: SiteConfig;
|
|
34
|
+
favorites: number[];
|
|
35
|
+
resetEntityFilter: () => void;
|
|
36
|
+
handleSettingFavorites: (favorites: number[] | null) => void;
|
|
37
|
+
setFilterByFavorites: (filter: boolean) => void;
|
|
38
|
+
filterByFavorites: boolean;
|
|
39
|
+
commuteLocation: any | null;
|
|
40
|
+
setCommuteLocation: (location: any | null) => void;
|
|
41
|
+
navigateToDetails: (id: number) => void;
|
|
42
|
+
navigateToEasyApply: (id: number) => void;
|
|
43
|
+
Link: React.ComponentType<any>;
|
|
44
|
+
linkFormat: string;
|
|
45
|
+
sortSetting: { field: string; type: string };
|
|
46
|
+
setSortSetting: (setting: { field: string; type: string }) => void;
|
|
47
|
+
trackEvent: (event: string) => void;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const MapListContext = createContext<MapListContextProps | undefined>(undefined);
|
|
51
|
+
|
|
52
|
+
export const useMapList = () => {
|
|
53
|
+
const context = useContext(MapListContext);
|
|
54
|
+
if (!context) {
|
|
55
|
+
throw new Error('useMapList must be used within a MapListProvider');
|
|
56
|
+
}
|
|
57
|
+
return context;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const getQuery = (): string | null => {
|
|
61
|
+
let query: string | null = null;
|
|
62
|
+
if (typeof window !== 'undefined') {
|
|
63
|
+
query = localStorage.getItem('query');
|
|
64
|
+
}
|
|
65
|
+
return query;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
interface MapListProviderProps {
|
|
69
|
+
children: ReactNode;
|
|
70
|
+
siteConfig: MapConfig;
|
|
71
|
+
resetFilters: boolean;
|
|
72
|
+
navigateToDetails: (id: number) => void;
|
|
73
|
+
navigateToEasyApply: (id: number) => void;
|
|
74
|
+
Link: React.ComponentType<any>;
|
|
75
|
+
linkFormat: string;
|
|
76
|
+
trackEvent: (event: string) => void;
|
|
77
|
+
listings?: Listing[];
|
|
78
|
+
setFiltersUrl?:boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const MapListProvider: React.FC<MapListProviderProps> = ({
|
|
82
|
+
children,
|
|
83
|
+
siteConfig,
|
|
84
|
+
resetFilters,
|
|
85
|
+
navigateToDetails,
|
|
86
|
+
navigateToEasyApply,
|
|
87
|
+
Link,
|
|
88
|
+
linkFormat,
|
|
89
|
+
trackEvent,
|
|
90
|
+
listings = [],
|
|
91
|
+
setFiltersUrl
|
|
92
|
+
}) => {
|
|
93
|
+
const firstLoadFilters = () =>{
|
|
94
|
+
let urlFilters = filtersFromURL(window.location)?.filters;
|
|
95
|
+
return (setFiltersUrl === true && urlFilters && Object.keys(urlFilters).length > 0) ? urlFilters : getStorageObject('selectedFilters', {}) || {}
|
|
96
|
+
}
|
|
97
|
+
const [allListings, setAllListings] = useState<Listing[]>(getStorageObject("listings", listings) || []);
|
|
98
|
+
const [filteredListings, setFilteredListings] = useState<Listing[]>([]);
|
|
99
|
+
const [loading, setLoading] = useState<boolean>(false);
|
|
100
|
+
const [mapItems, setMapItems] = useState<any>(getStorageObject('mapItems', []) || []);
|
|
101
|
+
const [query, setQuery] = useState<string | null>(() => resetFilters ? null : getQuery());
|
|
102
|
+
const [sortSetting, setSortSetting] = useState<{ field: string; type: string }>(getStorageObject('sortSetting', { field: 'position', type: 'asc' }) || { field: 'position', type: 'asc' });
|
|
103
|
+
const [listingEntities, setListingEntities] = useState<Record<number, ListingEntity> | null>(getStorageObject("listingEntities", null));
|
|
104
|
+
const [firstLoad, setFirstLoad] = useState<boolean>(true);
|
|
105
|
+
const [commuteLocation, setCommuteLocation] = useState<any | null>(getStorageObject('commuteLocation'));
|
|
106
|
+
const [selectedFilters, setSelectedFilters] = useState<Record<string, any>>(() => resetFilters ? {} : firstLoadFilters());
|
|
107
|
+
const [filterOptions, setFilterOptions] = useState<any>();
|
|
108
|
+
const [recruiters, setRecruiters] = useState<Record<number, Recruiter>>(getStorageObject("recruiters", {}) || {});
|
|
109
|
+
const [filterDialogIsOpen, setFilterDialogIsOpen] = useState<boolean>(false);
|
|
110
|
+
const [mobileTab, setMobileTab] = useState<string>("listTab");
|
|
111
|
+
const [favorites, setFavorites] = useState<number[]>([]);
|
|
112
|
+
const [filterByFavorites, setFilterByFavorites] = useState<boolean>(false);
|
|
113
|
+
|
|
114
|
+
const setNewFilteredListings = (filteredListings: Listing[]) => {
|
|
115
|
+
setFilteredListings(filteredListings);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (!sortSetting) return;
|
|
122
|
+
localStorage.setItem('sortSetting', JSON.stringify(sortSetting));
|
|
123
|
+
setNewFilteredListings(filteredListings);
|
|
124
|
+
}, [sortSetting]);
|
|
125
|
+
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
const loadedFavorites = JSON.parse(localStorage.getItem('favorites') || '[]');
|
|
128
|
+
setFavorites(loadedFavorites);
|
|
129
|
+
}, []);
|
|
130
|
+
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
setStorageObject("commuteLocation", commuteLocation);
|
|
133
|
+
}, [commuteLocation]);
|
|
134
|
+
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
if (!commuteLocation) return;
|
|
137
|
+
|
|
138
|
+
async function fetchEntities() {
|
|
139
|
+
const distinctEntityIds = [
|
|
140
|
+
...new Set(allListings.map(listing => listing.entityId ?? -1))
|
|
141
|
+
];
|
|
142
|
+
try {
|
|
143
|
+
const fetchedEntities = await getListingEntities(
|
|
144
|
+
distinctEntityIds,
|
|
145
|
+
`${commuteLocation.lat}, ${commuteLocation.lng}`
|
|
146
|
+
);
|
|
147
|
+
setListingEntities(fetchedEntities);
|
|
148
|
+
const newFilteredListings: Listing[] = [...filteredListings] ?? [];
|
|
149
|
+
for (let i = 0; i < allListings.length; i++) {
|
|
150
|
+
const listing = newFilteredListings[i];
|
|
151
|
+
if (
|
|
152
|
+
listing &&
|
|
153
|
+
listing.fields &&
|
|
154
|
+
listing.entityId !== undefined &&
|
|
155
|
+
listing.entityId !== -1
|
|
156
|
+
) {
|
|
157
|
+
const entityId = listing.entityId;
|
|
158
|
+
const travelTime = fetchedEntities[entityId]?.travelTime;
|
|
159
|
+
|
|
160
|
+
if (travelTime !== undefined && listing.fields) {
|
|
161
|
+
listing.fields.travelTime = travelTime;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error("Failed to fetch listing entities:", error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
fetchEntities();
|
|
171
|
+
}, [commuteLocation, allListings, siteConfig.companyId]);
|
|
172
|
+
|
|
173
|
+
useEffect(() => {
|
|
174
|
+
const handleFetchListings = async () => {
|
|
175
|
+
if (!getStorageObject('listings') ?? [].length) {
|
|
176
|
+
setLoading(true);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
const {
|
|
181
|
+
listingsResult,
|
|
182
|
+
fetchedRecruiters,
|
|
183
|
+
fetchedEntities,
|
|
184
|
+
distinctItems
|
|
185
|
+
} = await fetchListings(query ?? '', siteConfig, commuteLocation);
|
|
186
|
+
setAllListings(listingsResult);
|
|
187
|
+
setRecruiters(fetchedRecruiters);
|
|
188
|
+
setListingEntities(fetchedEntities);
|
|
189
|
+
setMapItems(distinctItems);
|
|
190
|
+
setStorageObject("mapItems", distinctItems);
|
|
191
|
+
setStorageObject("listingEntities", fetchedEntities);
|
|
192
|
+
setStorageObject("recruiters", fetchedRecruiters);
|
|
193
|
+
setStorageObject("listings", listingsResult);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.log(error);
|
|
196
|
+
}
|
|
197
|
+
setLoading(false);
|
|
198
|
+
};
|
|
199
|
+
handleFetchListings();
|
|
200
|
+
}, [query, siteConfig]);
|
|
201
|
+
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
const processListings = () => {
|
|
204
|
+
let filteredListings: Listing[];
|
|
205
|
+
let tempSelectedFilters = selectedFilters;
|
|
206
|
+
let tempQuery = query;
|
|
207
|
+
|
|
208
|
+
const { mapItems, filteredListings: tempFilteredListings } = applyFilters(
|
|
209
|
+
allListings,
|
|
210
|
+
tempSelectedFilters,
|
|
211
|
+
tempQuery,
|
|
212
|
+
listingEntities,
|
|
213
|
+
favorites,
|
|
214
|
+
siteConfig
|
|
215
|
+
);
|
|
216
|
+
filteredListings = tempFilteredListings;
|
|
217
|
+
|
|
218
|
+
if (filterByFavorites) {
|
|
219
|
+
filteredListings = filteredListings.filter((x: Listing) => favorites.includes(x.id));
|
|
220
|
+
}
|
|
221
|
+
setNewFilteredListings(filteredListings);
|
|
222
|
+
if (firstLoad && tempSelectedFilters) {
|
|
223
|
+
// Update URL with filters if needed
|
|
224
|
+
} else if (Object.keys(tempSelectedFilters).length === 0 && !firstLoad) {
|
|
225
|
+
localStorage.removeItem('selectedFilters');
|
|
226
|
+
} else if (!firstLoad) {
|
|
227
|
+
setStorageObject('selectedFilters', tempSelectedFilters);
|
|
228
|
+
}
|
|
229
|
+
if(setFiltersUrl === true)
|
|
230
|
+
{
|
|
231
|
+
updateURLWithFilters(tempSelectedFilters, window.location, tempQuery);
|
|
232
|
+
}
|
|
233
|
+
tempQuery != null ? localStorage.setItem('query', tempQuery) : localStorage.removeItem('query');
|
|
234
|
+
setMapItems(mapItems);
|
|
235
|
+
|
|
236
|
+
if (tempSelectedFilters) {
|
|
237
|
+
const keys = Object.keys(tempSelectedFilters);
|
|
238
|
+
const lastKey = keys[keys.length - 1];
|
|
239
|
+
const options = generateFilterOptions(
|
|
240
|
+
firstLoad ? allListings : filteredListings,
|
|
241
|
+
allListings,
|
|
242
|
+
siteConfig,
|
|
243
|
+
filterOptions,
|
|
244
|
+
lastKey,
|
|
245
|
+
favorites
|
|
246
|
+
);
|
|
247
|
+
if (options) {
|
|
248
|
+
setFilterOptions(options);
|
|
249
|
+
if (firstLoad) setFirstLoad(false);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
processListings();
|
|
255
|
+
}, [selectedFilters, query, listingEntities, filterByFavorites, favorites]);
|
|
256
|
+
|
|
257
|
+
const handleFilterListingsByLocation = (selectedLocation: any) => {
|
|
258
|
+
const { filteredListings } = filterListingsByLocation(
|
|
259
|
+
allListings,
|
|
260
|
+
selectedLocation,
|
|
261
|
+
listingEntities
|
|
262
|
+
);
|
|
263
|
+
setNewFilteredListings(filteredListings);
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
const resetEntityFilter = () => {
|
|
267
|
+
let newFilters = {...selectedFilters};
|
|
268
|
+
delete newFilters.entityId;
|
|
269
|
+
setSelectedFilters(newFilters);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const handleSettingFavorites = (newFavorites: number[] | null) => {
|
|
273
|
+
if (newFavorites == null) {
|
|
274
|
+
localStorage.removeItem('favorites');
|
|
275
|
+
} else {
|
|
276
|
+
setFavorites(newFavorites);
|
|
277
|
+
localStorage.setItem('favorites', JSON.stringify(newFavorites));
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
return (
|
|
282
|
+
<MapListContext.Provider value={{
|
|
283
|
+
loading,
|
|
284
|
+
allListings,
|
|
285
|
+
filteredListings,
|
|
286
|
+
mapItems,
|
|
287
|
+
query,
|
|
288
|
+
setNewFilteredListings,
|
|
289
|
+
setQuery,
|
|
290
|
+
listingEntities,
|
|
291
|
+
selectedFilters,
|
|
292
|
+
setSelectedFilters,
|
|
293
|
+
filterOptions,
|
|
294
|
+
recruiters,
|
|
295
|
+
handleFilterListingsByLocation,
|
|
296
|
+
filterDialogIsOpen,
|
|
297
|
+
setFilterDialogIsOpen,
|
|
298
|
+
setMobileTab,
|
|
299
|
+
mobileTab,
|
|
300
|
+
siteConfig,
|
|
301
|
+
favorites,
|
|
302
|
+
handleSettingFavorites,
|
|
303
|
+
resetEntityFilter,
|
|
304
|
+
setFilterByFavorites,
|
|
305
|
+
filterByFavorites,
|
|
306
|
+
commuteLocation,
|
|
307
|
+
setCommuteLocation,
|
|
308
|
+
navigateToDetails,
|
|
309
|
+
navigateToEasyApply,
|
|
310
|
+
Link,
|
|
311
|
+
linkFormat,
|
|
312
|
+
sortSetting,
|
|
313
|
+
setSortSetting,
|
|
314
|
+
trackEvent
|
|
315
|
+
}}>
|
|
316
|
+
{children}
|
|
317
|
+
</MapListContext.Provider>
|
|
318
|
+
);
|
|
319
|
+
};
|