@abcagency/hc-ui-components 1.3.18 → 1.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/apis/hcApi.js +85 -183
  2. package/dist/apis/hcApi.js.map +1 -1
  3. package/dist/components/HireControlMap.js +10 -5
  4. package/dist/components/HireControlMap.js.map +1 -1
  5. package/dist/components/modules/accordions/MapAccordionItem.js +10 -67
  6. package/dist/components/modules/accordions/MapAccordionItem.js.map +1 -1
  7. package/dist/components/modules/filter/index.js.map +1 -1
  8. package/dist/components/modules/filter/radio-item.js +1 -2
  9. package/dist/components/modules/filter/radio-item.js.map +1 -1
  10. package/dist/components/modules/jobListing/listing-details-container.js +45 -0
  11. package/dist/components/modules/jobListing/listing-details-container.js.map +1 -0
  12. package/dist/components/modules/jobListing/listing-details.js +25 -24
  13. package/dist/components/modules/jobListing/listing-details.js.map +1 -1
  14. package/dist/components/modules/{maps/list → list}/field-mapper.js +8 -7
  15. package/dist/components/modules/list/field-mapper.js.map +1 -0
  16. package/dist/components/modules/{maps/list → list}/header-item.js +2 -2
  17. package/dist/components/modules/list/header-item.js.map +1 -0
  18. package/dist/components/modules/{maps/list → list}/header.js +6 -4
  19. package/dist/components/modules/list/header.js.map +1 -0
  20. package/dist/components/modules/list/index.js +36 -0
  21. package/dist/components/modules/list/index.js.map +1 -0
  22. package/dist/components/modules/{maps/list → list}/item-expand-card/index.js +3 -1
  23. package/dist/components/modules/list/item-expand-card/index.js.map +1 -0
  24. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +2 -2
  25. package/dist/components/modules/list/item-expand-card/recruiter-contact-nav.js.map +1 -0
  26. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +1 -1
  27. package/dist/components/modules/list/item-expand-card/recruiter-details.js.map +1 -0
  28. package/dist/components/modules/list/item-expand-card/recruiter-headshot.js.map +1 -0
  29. package/dist/components/modules/list/item-list.js +131 -0
  30. package/dist/components/modules/list/item-list.js.map +1 -0
  31. package/dist/components/modules/list/list-item/index.js +75 -0
  32. package/dist/components/modules/list/list-item/index.js.map +1 -0
  33. package/dist/components/modules/list/list-item/list-item-container.js +47 -0
  34. package/dist/components/modules/list/list-item/list-item-container.js.map +1 -0
  35. package/dist/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +29 -33
  36. package/dist/components/modules/list/list-item/list-item.js.map +1 -0
  37. package/dist/components/modules/maps/map-list.js +3 -3
  38. package/dist/components/modules/maps/map-list.js.map +1 -1
  39. package/dist/contexts/mapContext.js +84 -113
  40. package/dist/contexts/mapContext.js.map +1 -1
  41. package/dist/contexts/mapListContext.js +181 -293
  42. package/dist/contexts/mapListContext.js.map +1 -1
  43. package/dist/contexts/trackEventContext.js +1 -1
  44. package/dist/services/configService.js +10 -28
  45. package/dist/services/configService.js.map +1 -1
  46. package/dist/services/googlePlacesNearbyService.js +33 -58
  47. package/dist/services/googlePlacesNearbyService.js.map +1 -1
  48. package/dist/services/listingAggregatorService.js +35 -75
  49. package/dist/services/listingAggregatorService.js.map +1 -1
  50. package/dist/services/listingEntityService.js +10 -31
  51. package/dist/services/listingEntityService.js.map +1 -1
  52. package/dist/services/listingService.js +26 -60
  53. package/dist/services/listingService.js.map +1 -1
  54. package/dist/services/recruiterService.js +11 -31
  55. package/dist/services/recruiterService.js.map +1 -1
  56. package/dist/types/apis/hcApi.d.ts +5 -0
  57. package/dist/types/clientToken.d.ts +2 -0
  58. package/dist/types/components/modules/accordions/MapAccordionItem.d.ts +9 -0
  59. package/dist/types/components/modules/accordions/default.d.ts +19 -0
  60. package/dist/types/components/modules/buttons/button-group-apply.d.ts +24 -0
  61. package/dist/types/components/modules/buttons/commute-pill.d.ts +5 -0
  62. package/dist/types/components/modules/buttons/default.d.ts +48 -0
  63. package/dist/types/components/modules/buttons/pill-wrapper.d.ts +3 -0
  64. package/dist/types/components/modules/dialogs/apply-dialog.d.ts +8 -0
  65. package/dist/types/components/modules/filter/sort.d.ts +8 -0
  66. package/dist/types/components/modules/grid.d.ts +8 -0
  67. package/dist/types/components/modules/icon.d.ts +10 -0
  68. package/dist/types/components/modules/jobListing/listing-details-container.d.ts +6 -0
  69. package/dist/types/components/modules/jobListing/listing-details.d.ts +18 -0
  70. package/dist/types/components/modules/list/field-mapper.d.ts +10 -0
  71. package/dist/types/components/modules/list/header-item.d.ts +11 -0
  72. package/dist/types/components/modules/list/header.d.ts +11 -0
  73. package/dist/types/components/modules/list/index.d.ts +9 -0
  74. package/dist/types/components/modules/list/item-expand-card/index.d.ts +7 -0
  75. package/dist/types/components/modules/list/item-expand-card/recruiter-contact-nav.d.ts +17 -0
  76. package/dist/types/components/modules/list/item-expand-card/recruiter-details.d.ts +21 -0
  77. package/dist/types/components/modules/list/item-expand-card/recruiter-headshot.d.ts +8 -0
  78. package/dist/types/components/modules/list/item-list.d.ts +21 -0
  79. package/dist/types/components/modules/list/list-item/index.d.ts +12 -0
  80. package/dist/types/components/modules/list/list-item/list-item-container.d.ts +14 -0
  81. package/dist/types/components/modules/list/list-item/list-item.d.ts +3 -0
  82. package/dist/types/constants/eventTypes.d.ts +13 -0
  83. package/dist/types/contexts/mapContext.d.ts +29 -0
  84. package/dist/types/contexts/mapListContext.d.ts +58 -0
  85. package/dist/types/contexts/trackEventContext.d.ts +6 -0
  86. package/dist/types/enums/SectionType.d.ts +9 -0
  87. package/dist/types/hooks/useList.d.ts +13 -0
  88. package/dist/types/services/configService.d.ts +6 -0
  89. package/dist/types/services/googlePlacesNearbyService.d.ts +5 -0
  90. package/dist/types/services/listingAggregatorService.d.ts +12 -0
  91. package/dist/types/services/listingEntityService.d.ts +6 -0
  92. package/dist/types/services/listingService.d.ts +9 -0
  93. package/dist/types/services/recruiterService.d.ts +6 -0
  94. package/dist/types/types/Address.d.ts +7 -0
  95. package/dist/types/types/ContentSection.d.ts +8 -0
  96. package/dist/types/types/GetListingParams.d.ts +8 -0
  97. package/dist/types/types/LatLng.d.ts +4 -0
  98. package/dist/types/types/ListingEntity.d.ts +10 -0
  99. package/dist/types/types/ListingFields.d.ts +20 -0
  100. package/dist/types/types/Listings.d.ts +31 -0
  101. package/dist/types/types/Recruiter.d.ts +9 -0
  102. package/dist/types/types/SimilarListing.d.ts +24 -0
  103. package/dist/types/types/config/Colors.d.ts +8 -0
  104. package/dist/types/types/config/MapConfig.d.ts +29 -0
  105. package/dist/types/types/config/PointsOfInterestConfig.d.ts +13 -0
  106. package/dist/types/types/config/SearchConfig.d.ts +4 -0
  107. package/dist/types/util/filterUtil.d.ts +28 -0
  108. package/dist/types/util/loading.d.ts +3 -0
  109. package/dist/types/util/localStorageUtil.d.ts +3 -0
  110. package/dist/types/util/mapUtil.d.ts +15 -0
  111. package/dist/types/util/sortUtil.d.ts +1 -0
  112. package/dist/types/util/stringUtils.d.ts +1 -0
  113. package/dist/util/filterUtil.js +1 -3
  114. package/dist/util/filterUtil.js.map +1 -1
  115. package/dist/util/localStorageUtil.js +37 -28
  116. package/dist/util/localStorageUtil.js.map +1 -1
  117. package/dist/util/mapUtil.js.map +1 -1
  118. package/package.json +23 -17
  119. package/rollup.config.mjs +23 -19
  120. package/src/apis/{hcApi.js → hcApi.ts} +27 -11
  121. package/src/components/HireControlMap.js +132 -129
  122. package/src/components/modules/accordions/MapAccordionItem.js +32 -74
  123. package/src/components/modules/filter/index.js +89 -89
  124. package/src/components/modules/filter/radio-item.js +0 -1
  125. package/src/components/modules/jobListing/listing-details-container.js +40 -0
  126. package/src/components/modules/jobListing/listing-details.js +209 -99
  127. package/src/components/modules/{maps/list → list}/field-mapper.js +114 -112
  128. package/src/components/modules/{maps/list → list}/header.js +49 -47
  129. package/src/components/modules/list/index.tsx +83 -0
  130. package/src/components/modules/{maps/list → list}/item-expand-card/index.js +24 -22
  131. package/src/components/modules/list/item-list.tsx +198 -0
  132. package/src/components/modules/list/list-item/index.js +70 -0
  133. package/src/components/modules/list/list-item/list-item-container.js +43 -0
  134. package/src/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +32 -38
  135. package/src/components/modules/maps/map-list.js +74 -74
  136. package/src/contexts/mapContext.tsx +129 -0
  137. package/src/contexts/mapListContext.tsx +297 -0
  138. package/src/enums/SectionType.ts +9 -0
  139. package/src/services/{configService.js → configService.ts} +16 -16
  140. package/src/services/{googlePlacesNearbyService.js → googlePlacesNearbyService.ts} +11 -2
  141. package/src/services/listingAggregatorService.ts +76 -0
  142. package/src/services/listingEntityService.ts +16 -0
  143. package/src/services/listingService.ts +40 -0
  144. package/src/services/{recruiterService.js → recruiterService.ts} +18 -17
  145. package/src/types/Address.ts +7 -0
  146. package/src/types/ContentSection.ts +9 -0
  147. package/src/types/GetListingParams.ts +8 -0
  148. package/src/types/LatLng.ts +4 -0
  149. package/src/types/ListingEntity.ts +11 -0
  150. package/src/types/ListingFields.ts +20 -0
  151. package/src/types/Listings.ts +32 -0
  152. package/src/types/Recruiter.ts +9 -0
  153. package/src/types/SimilarListing.ts +24 -0
  154. package/src/types/config/Colors.ts +8 -0
  155. package/src/types/config/MapConfig.ts +30 -0
  156. package/src/types/config/PointsOfInterestConfig.ts +13 -0
  157. package/src/types/config/SearchConfig.ts +4 -0
  158. package/src/util/filterUtil.js +239 -239
  159. package/src/util/localStorageUtil.ts +34 -0
  160. package/src/util/mapUtil.js +91 -91
  161. package/tsconfig.json +23 -0
  162. package/dist/components/modules/maps/list/field-mapper.js.map +0 -1
  163. package/dist/components/modules/maps/list/header-item.js.map +0 -1
  164. package/dist/components/modules/maps/list/header.js.map +0 -1
  165. package/dist/components/modules/maps/list/index.js +0 -102
  166. package/dist/components/modules/maps/list/index.js.map +0 -1
  167. package/dist/components/modules/maps/list/item-expand-card/index.js.map +0 -1
  168. package/dist/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js.map +0 -1
  169. package/dist/components/modules/maps/list/item-expand-card/recruiter-details.js.map +0 -1
  170. package/dist/components/modules/maps/list/item-expand-card/recruiter-headshot.js.map +0 -1
  171. package/dist/components/modules/maps/list/list-item/index.js.map +0 -1
  172. package/dist/services/_virtual/_rollupPluginBabelHelpers.js +0 -372
  173. package/dist/services/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  174. package/dist/services/apis/hcApi.js +0 -189
  175. package/dist/services/apis/hcApi.js.map +0 -1
  176. package/dist/services/clientToken.js +0 -7
  177. package/dist/services/clientToken.js.map +0 -1
  178. package/dist/services/styles/index.css +0 -3
  179. package/src/components/modules/maps/list/index.js +0 -112
  180. package/src/contexts/mapContext.js +0 -101
  181. package/src/contexts/mapListContext.js +0 -242
  182. package/src/services/listingAggregatorService.js +0 -50
  183. package/src/services/listingEntityService.js +0 -15
  184. package/src/services/listingService.js +0 -26
  185. package/src/util/localStorageUtil.js +0 -27
  186. /package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
  187. /package/src/components/modules/{maps/list → list}/header-item.js +0 -0
  188. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +0 -0
  189. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +0 -0
  190. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import { useMap } from '~/contexts/mapContext';
3
+ import { useMapList } from '~/contexts/mapListContext';
4
+ import { useTrackEvent } from '~/contexts/trackEventContext';
5
+ import { setStorageObject } from '~/util/localStorageUtil';
6
+ import MapAccordionItem from '~/components/modules/accordions/MapAccordionItem';
7
+ import ListItemContainer from '~/components/modules/list/list-item/list-item-container';
8
+
9
+ const MapAccordionItemContainer = ({
10
+ showMap,
11
+ item,
12
+ itemRefs,
13
+ fieldsShown,
14
+ itemExpandedContent,
15
+ specialFeatures,
16
+ isActive,
17
+ hasListItemSelected
18
+ }) => {
19
+ const { mapItems } = useMapList();
20
+ const { selectItem } = useMap();
21
+ const { trackEvent, eventTypes } = useTrackEvent();
22
+
23
+ const setSelectedItemAndZoomMap = (item, isActive) => {
24
+ if (isActive) {
25
+ localStorage.removeItem("selectedListItem");
26
+ const location = mapItems.find(x => Object.prototype.hasOwnProperty.call(x.items, item.id)) || null;
27
+ selectItem(null, null, 9, { lat: 39.8283, lng: -98.5795 });
28
+ } else {
29
+ setStorageObject("selectedListItem", item);
30
+ const location = mapItems.find(x => Object.prototype.hasOwnProperty.call(x.items, item.id)) || null;
31
+ selectItem(item, location, 12, {
32
+ lat: location?.latitude,
33
+ lng: location?.longitude
34
+ });
35
+ }
36
+ };
37
+
38
+ const handleItemClick = item => {
39
+ trackEvent(eventTypes.JOB_LISTING_SELECTED, {
40
+ jobTitle: item.fields.position,
41
+ jobCategory: item.fields.category,
42
+ entityDisplayName: item?.mapDetails?.entityDisplayName
43
+ });
44
+
45
+ setSelectedItemAndZoomMap(item, isActive);
46
+ };
47
+
48
+ return (
49
+ <MapAccordionItem
50
+ item={item}
51
+ itemRefs={itemRefs}
52
+ itemExpandedContent={itemExpandedContent}
53
+ isActive={isActive}
54
+
55
+ >
56
+ <ListItemContainer
57
+ showMap={showMap}
58
+ item={item}
59
+ itemRefs={itemRefs}
60
+ fieldsShown={fieldsShown}
61
+ specialFeatures={specialFeatures}
62
+ isActive={isActive}
63
+ hasListItemSelected={hasListItemSelected}
64
+ onClick={() => handleItemClick(item)}
65
+ />
66
+ </MapAccordionItem>
67
+ );
68
+ };
69
+
70
+ export default MapAccordionItemContainer;
@@ -0,0 +1,43 @@
1
+ import React, { useState } from 'react';
2
+ import { useMapList } from '~/contexts/mapListContext';
3
+ import { useTrackEvent } from '~/contexts/trackEventContext';
4
+ import ListItem from '~/components/modules/list/list-item/list-item';
5
+
6
+ const ListItemContainer = ({
7
+ isActive,
8
+ showMap,
9
+ item,
10
+ itemRefs,
11
+ fieldsShown,
12
+ specialFeatures,
13
+ className,
14
+ bodyClassName,
15
+ onItemSelected,
16
+ ...props
17
+ }) => {
18
+ const { siteConfig, favorites, handleSettingFavorites, setMobileTab } = useMapList();
19
+ const { trackEvent, eventTypes } = useTrackEvent();
20
+
21
+ return (
22
+ <ListItem
23
+ isActive={isActive}
24
+ showMap={showMap}
25
+ item={item}
26
+ itemRefs={itemRefs}
27
+ fieldsShown={fieldsShown}
28
+ specialFeatures={specialFeatures}
29
+ className={isActive ? "!hc-border-secondary hc-border hc-border-b-0" : "hc-opacity-85"}
30
+ bodyClassName={bodyClassName}
31
+ onItemSelected={onItemSelected}
32
+ setMobileTab={setMobileTab}
33
+ siteConfig={siteConfig}
34
+ trackEvent={trackEvent}
35
+ eventTypes={eventTypes}
36
+ favorites={favorites}
37
+ handleSettingFavorites={handleSettingFavorites}
38
+ {...props}
39
+ />
40
+ );
41
+ };
42
+
43
+ export default ListItemContainer;
@@ -1,11 +1,7 @@
1
- import React, { forwardRef } from 'react';
2
-
1
+ import React, { forwardRef, useState } from 'react';
3
2
  import Grid from '~/components/modules/grid';
4
3
  import Icon from '~/components/modules/icon';
5
- import FieldMapper from '~/components/modules/maps/list/field-mapper';
6
-
7
- import { useMapList } from '~/contexts/mapListContext';
8
- import { useTrackEvent } from '~/contexts/trackEventContext';
4
+ import FieldMapper from '~/components/modules/list/field-mapper';
9
5
 
10
6
  const ListItem = forwardRef(
11
7
  (
@@ -19,45 +15,45 @@ const ListItem = forwardRef(
19
15
  onItemSelected,
20
16
  showMap,
21
17
  setMobileTab,
18
+ handleSettingFavorites,
22
19
  favorites,
23
- setFavorites,
20
+ includeFavorite = false,
21
+ siteConfig,
22
+ trackEvent,
23
+ eventTypes,
24
24
  ...props
25
25
  },
26
26
  ref
27
27
  ) => {
28
- const { siteConfig } = useMapList();
29
- const { trackEvent, eventTypes } = useTrackEvent();
30
- const mapPinColor = siteConfig.colors.primary.replace("#", "");
28
+ const mapPinColor = !showMap ? null : siteConfig.colors.primary.replace("#", "");
31
29
 
32
30
  const handleClick = () => {
33
31
  if (onItemSelected) {
34
32
  onItemSelected(item);
35
33
  }
36
34
  };
37
-
38
35
  let isFavorite = favorites.includes(item.id);
39
36
 
40
- const handleFavouriteClick = event => {
37
+ const handleFavouriteClick = (event, item) => {
38
+ if(!includeFavorite)return;
41
39
  event.stopPropagation();
42
40
  let updatedFavorites;
43
41
  if (isFavorite) {
44
42
  updatedFavorites = favorites.filter(fav => fav !== item.id);
45
43
  } else {
46
- trackEvent(eventTypes.FAVORITE_SELECTED, { jobTitle: item.fields.position, jobCategory: item.fields.category, entityDisplayName: item?.mapDetails?.entityDisplayName });
47
44
  updatedFavorites = [...favorites, item.id];
48
45
  }
49
46
  isFavorite = !isFavorite;
50
- setFavorites(updatedFavorites);
47
+ handleSettingFavorites(updatedFavorites);
51
48
  };
52
-
53
49
  return (
54
50
  <button
55
51
  ref={ref}
56
- onClick={handleClick}
52
+ onClick={() => { handleClick(); }}
57
53
  className={`
58
- hc-group hc-relative hc-flex md:hc-flex-col hc-w-full md:hc-pl-4 hc-text-left hc-bg-clip-border hc-border hc-border-transparent hc-break-words hc-overflow-hidden hc-cursor-pointer hc-transition-colors hover:hc-bg-uiAccent/5 focus:hover:hc-bg-uiAccent/5
59
- ${isActive ? "hc-bg-uiAccent/5 hc-border-secondary hc-border" : "hc-text-uiText hc-bg-white"}
60
- ${className ?? ""}
54
+ hc-group hc-relative hc-flex md:hc-flex-col hc-w-full md:hc-pl-4 hc-text-left hc-bg-clip-border hc-border hc-border-transparent hc-break-words hc-overflow-hidden hc-cursor-pointer hc-transition-colors hover:hc-bg-uiAccent/5 focus:hover:hc-bg-uiAccent/5
55
+ ${isActive ? "hc-bg-uiAccent/5 hc-border-secondary hc-border" : "hc-text-uiText hc-bg-white"}
56
+ ${className ?? ""}
61
57
  `}
62
58
  {...props}
63
59
  >
@@ -66,9 +62,9 @@ const ListItem = forwardRef(
66
62
  gap="hc-gap-2"
67
63
  isAnimated={false}
68
64
  className={`
69
- hc-block md:hc-grid hc-p-2 hc-ps-4 hc-w-full hc-grow hc-leading-tight hc-text-sm md:hc-text-xs lg:hc-text-sm
70
- ${bodyClassName ?? ""}
71
- `}
65
+ hc-block md:hc-grid hc-p-2 hc-ps-4 hc-w-full hc-grow hc-leading-tight hc-text-sm md:hc-text-xs lg:hc-text-sm
66
+ ${bodyClassName ?? ""}
67
+ `}
72
68
  >
73
69
  <Grid.Item className="hc-hidden md:hc-block md:hc-absolute md:hc-left-1.5 hc-top-1.5">
74
70
  <span className="hc-sr-only">Expand row</span>
@@ -76,20 +72,20 @@ const ListItem = forwardRef(
76
72
  icon="fluent-emoji-high-contrast:plus"
77
73
  size="hc-size-2.5"
78
74
  className={`
79
- hc-opacity-0 hc-text-uiText/60 hc-transition group-hover:hc-opacity-100 group-active:hc-opacity-100
80
- ${isActive ? "hc-opacity-100 hc-rotate-45" : ""}
81
- `}
75
+ hc-opacity-0 hc-text-uiText/60 hc-transition group-hover:hc-opacity-100 group-active:hc-opacity-100
76
+ ${isActive ? "hc-opacity-100 hc-rotate-45" : ""}
77
+ `}
82
78
  />
83
-
84
79
  </Grid.Item>
85
-
86
80
  <FieldMapper
87
81
  item={item}
88
82
  fieldsShown={fieldsShown}
89
83
  specialFeatures={specialFeatures}
90
84
  isFavorite={isFavorite}
85
+ includeFavorite={includeFavorite}
91
86
  handleFavouriteClick={handleFavouriteClick}
92
87
  />
88
+ {includeFavorite &&
93
89
  <Grid.Item
94
90
  key={"favorites"}
95
91
  className="hc-hidden md:hc-block hc-col-span-1"
@@ -99,14 +95,12 @@ const ListItem = forwardRef(
99
95
  size="hc-size-3.5"
100
96
  iconClasses={isFavorite ? "hc-text-primary" : ""}
101
97
  title={!isFavorite ? 'Add job to favorites' : 'Remove job from favorites'}
102
- className={`
103
- hc-pr-2 hc-transition-opacity hc-duration-300 hc-cursor-pointer hc-opacity-100"
104
- `}
105
- onClick={e => handleFavouriteClick(e)}
98
+ className="hc-pr-2 hc-transition-opacity hc-duration-300 hc-cursor-pointer hc-opacity-100"
99
+ onClick={e => {handleFavouriteClick(e, item);}}
106
100
  />
107
101
  </Grid.Item>
102
+ }
108
103
  </Grid>
109
-
110
104
  {showMap && (
111
105
  <div onClick={() => { setMobileTab("mapTab"); handleClick(); }} 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">
112
106
  <img
@@ -125,11 +119,11 @@ ListItem.displayName = "ListItem";
125
119
 
126
120
  export default React.memo(ListItem, (prevProps, nextProps) => {
127
121
  return (
128
- (prevProps.isActive === nextProps.isActive ||
129
- prevProps.isActive !== nextProps.isActive) &&
130
- prevProps.bodyClassName === nextProps.bodyClassName &&
131
- prevProps.className === nextProps.className &&
132
- prevProps.fieldsShown === nextProps.fieldsShown &&
133
- prevProps.item.id === nextProps.item.id
122
+ prevProps.isActive === nextProps.isActive &&
123
+ prevProps.favorites === nextProps.favorites &&
124
+ prevProps.item.id === nextProps.item.id &&
125
+ prevProps.fieldsShown === nextProps.fieldsShown &&
126
+ prevProps.bodyClassName === nextProps.bodyClassName &&
127
+ prevProps.className === nextProps.className
134
128
  );
135
129
  });
@@ -1,74 +1,74 @@
1
- import React from 'react';
2
-
3
- import List from '~/components/modules/maps/list';
4
- import Map from '~/components/modules/maps/map';
5
- import Tabs from '~/components/modules/maps/tabs';
6
- import Filter from '~/components/modules/filter';
7
-
8
- const MapList = ({
9
- loading = false,
10
- mapDetails,
11
- markerConfigs,
12
- itemExpandedContent,
13
- fieldsShown,
14
- specialFeatures,
15
- fieldNames,
16
- showMap,
17
- placeMappings
18
- }) => {
19
-
20
- const listProps = {
21
- fieldsShown: fieldsShown,
22
- fieldNames: fieldNames,
23
- itemExpandedContent: itemExpandedContent,
24
- loading: loading,
25
- showMap: showMap,
26
- specialFeatures: specialFeatures
27
- };
28
-
29
- const mapProps = {
30
- mapDetails: mapDetails,
31
- markerConfigs: markerConfigs,
32
- placeMappings: placeMappings,
33
- clusterGridSize: 60,
34
- showMap: showMap
35
- };
36
-
37
- // useEffect(() => {
38
- // if (selectedItem !== null) {
39
- // trackEvent("Map", "View Location", selectedItem[titlePropName]);
40
- // }
41
- // // eslint-disable-next-line react-hooks/exhaustive-deps
42
- // }, []);
43
- const map = <Map {...mapProps} />;
44
- return (
45
- <>
46
- <div
47
- className={`
48
- ${showMap == false ? "md:hc-grid-rows-[100vh]" : "md:hc-grid-rows-[50vh_50vh]"}
49
- md:hc-grid md:hc-pt-4 hc-overflow-hidden hc-relative bg-gray-100
50
- `}
51
- >
52
- <div>
53
- <List {...listProps} />
54
- </div>
55
- <div>{showMap && map}</div>
56
- </div>
57
- <div className="md:hc-hidden">
58
- <Tabs
59
- showMap={showMap}
60
- list={<List {...listProps} />}
61
- map={!loading && showMap && map}
62
- filter={
63
- <Filter
64
- showMap={showMap}
65
- className="md:hc-hidden"
66
- />
67
- }
68
- />
69
- </div>
70
- </>
71
- );
72
- };
73
-
74
- export default MapList;
1
+ import React from 'react';
2
+
3
+ import List from '~/components/modules/list';
4
+ import Map from '~/components/modules/maps/map';
5
+ import Tabs from '~/components/modules/maps/tabs';
6
+ import Filter from '~/components/modules/filter';
7
+
8
+ const MapList = ({
9
+ loading = false,
10
+ mapDetails,
11
+ markerConfigs,
12
+ itemExpandedContent,
13
+ fieldsShown,
14
+ specialFeatures,
15
+ fieldNames,
16
+ showMap,
17
+ placeMappings
18
+ }) => {
19
+
20
+ const listProps = {
21
+ fieldsShown: fieldsShown,
22
+ fieldNames: fieldNames,
23
+ itemExpandedContent: itemExpandedContent,
24
+ loading: loading,
25
+ showMap: showMap,
26
+ specialFeatures: specialFeatures
27
+ };
28
+
29
+ const mapProps = {
30
+ mapDetails: mapDetails,
31
+ markerConfigs: markerConfigs,
32
+ placeMappings: placeMappings,
33
+ clusterGridSize: 60,
34
+ showMap: showMap
35
+ };
36
+
37
+ // useEffect(() => {
38
+ // if (selectedItem !== null) {
39
+ // trackEvent("Map", "View Location", selectedItem[titlePropName]);
40
+ // }
41
+ // // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ // }, []);
43
+ const map = <Map {...mapProps} />;
44
+ return (
45
+ <>
46
+ <div
47
+ className={`
48
+ ${showMap == false ? "md:hc-grid-rows-[100vh]" : "md:hc-grid-rows-[50vh_50vh]"}
49
+ md:hc-grid md:hc-pt-4 hc-overflow-hidden hc-relative bg-gray-100
50
+ `}
51
+ >
52
+ <div>
53
+ <List {...listProps} />
54
+ </div>
55
+ <div>{showMap && map}</div>
56
+ </div>
57
+ <div className="md:hc-hidden">
58
+ <Tabs
59
+ showMap={showMap}
60
+ list={<List {...listProps} />}
61
+ map={!loading && showMap && map}
62
+ filter={
63
+ <Filter
64
+ showMap={showMap}
65
+ className="md:hc-hidden"
66
+ />
67
+ }
68
+ />
69
+ </div>
70
+ </>
71
+ );
72
+ };
73
+
74
+ export default MapList;
@@ -0,0 +1,129 @@
1
+ import React, { createContext, useState, useContext, useEffect, useRef, ReactNode } from 'react';
2
+ import { getStorageObject, setStorageObject } from '~/util/localStorageUtil';
3
+ import { Listing } from '~/types/Listings';
4
+ import { LatLng } from '~/types/LatLng';
5
+ interface IMapContext {
6
+ selectedListItem: Listing | null;
7
+ setSelectedListItem: (item: Listing | null) => void;
8
+ location: any | null;
9
+ setLocation: (location: LatLng | null) => void;
10
+ center: LatLng;
11
+ setCenter: (center: LatLng) => void;
12
+ zoom: number;
13
+ setZoom: (zoom: number) => void;
14
+ selectedPlaces: string[];
15
+ setSelectedPlaces: (places: string[]) => void;
16
+ mapInteracted: boolean;
17
+ setMapInteracted: (interacted: boolean) => void;
18
+ userSetZoom: React.MutableRefObject<boolean>;
19
+ firstLoadListItem: any;
20
+ selectItem: (item: Listing, itemLocation: LatLng | null, zoom: number, center: LatLng) => void;
21
+ filterReset: () => void;
22
+ selectLocationEntity: (location: LatLng) => void;
23
+ }
24
+
25
+ const MapContext = createContext<IMapContext | undefined>(undefined);
26
+
27
+ export const useMap = () => {
28
+ const context = useContext(MapContext);
29
+ if (!context) {
30
+ throw new Error("useMap must be used within a MapProvider");
31
+ }
32
+ return context;
33
+ };
34
+
35
+ interface MapProviderProps {
36
+ children: ReactNode;
37
+ resetFilters: boolean;
38
+ }
39
+
40
+ export const MapProvider: React.FC<MapProviderProps> = ({ children, resetFilters }) => {
41
+ const [selectedListItem, setSelectedListItem] = useState<Listing | null>(getStorageObject('selectedListItem'));
42
+ const [location, setLocation] = useState<any>(getStorageObject('location'));
43
+ const [center, setCenter] = useState<LatLng>(getStorageObject("center", { lat: 39.8283, lng: -98.5795 }) || { lat: 39.8283, lng: -98.5795 });
44
+ const [zoom, setZoom] = useState<number>(getStorageObject("zoom", 10) || 10);
45
+ const [selectedPlaces, setSelectedPlaces] = useState<string[]>([]);
46
+ const [mapInteracted, setMapInteracted] = useState<boolean>(false);
47
+ const [firstLoadListItem] = useState<any>(getStorageObject('selectedListItem', { id: "defaultId" }));
48
+ const userSetZoom = useRef<boolean>(true);
49
+
50
+ useEffect(() => {
51
+ setStorageObject("selectedListItem", selectedListItem);
52
+ }, [selectedListItem]);
53
+
54
+ useEffect(() => {
55
+ localStorage.setItem("zoom", zoom.toString());
56
+ }, [zoom]);
57
+
58
+ useEffect(() => {
59
+ if (location == null) {
60
+ localStorage.removeItem("location");
61
+ } else {
62
+ setStorageObject("location", location);
63
+ }
64
+ }, [location]);
65
+
66
+ useEffect(() => {
67
+ setStorageObject("center", center);
68
+ }, [center]);
69
+
70
+ const selectItem = (item: Listing, itemLocation: LatLng | null, zoom: number, center: LatLng) => {
71
+ setSelectedListItem(item);
72
+ if (mapInteracted === false && itemLocation != null) {
73
+ setLocation(itemLocation);
74
+ }
75
+ if (mapInteracted === false || itemLocation != null) {
76
+ setLocation(itemLocation);
77
+ setCenter(center);
78
+ }
79
+ if (mapInteracted === false) {
80
+ setZoom(zoom);
81
+ }
82
+ };
83
+
84
+ const filterReset = () => {
85
+ setSelectedPlaces([]);
86
+ setSelectedListItem(null);
87
+ setLocation(null);
88
+ setZoom(8);
89
+ setMapInteracted(false);
90
+ };
91
+
92
+ useEffect(() => {
93
+ if (resetFilters === true) {
94
+ filterReset();
95
+ }
96
+ }, [resetFilters]);
97
+
98
+ const selectLocationEntity = (location: LatLng) => {
99
+ localStorage.removeItem("selectedListItem");
100
+ setTimeout(() => setLocation(location), 200);
101
+ setSelectedListItem(null);
102
+ };
103
+
104
+ return (
105
+ <MapContext.Provider
106
+ value={{
107
+ selectedListItem,
108
+ setSelectedListItem,
109
+ location,
110
+ center,
111
+ setCenter,
112
+ zoom,
113
+ setZoom,
114
+ selectItem,
115
+ setSelectedPlaces,
116
+ selectedPlaces,
117
+ selectLocationEntity,
118
+ setLocation,
119
+ setMapInteracted,
120
+ mapInteracted,
121
+ userSetZoom,
122
+ firstLoadListItem,
123
+ filterReset
124
+ }}
125
+ >
126
+ {children}
127
+ </MapContext.Provider>
128
+ );
129
+ };