@abcagency/hc-ui-components 1.3.17 → 1.3.19

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 (196) 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/filter/search.js +4 -4
  11. package/dist/components/modules/filter/search.js.map +1 -1
  12. package/dist/components/modules/jobListing/listing-details-container.js +45 -0
  13. package/dist/components/modules/jobListing/listing-details-container.js.map +1 -0
  14. package/dist/components/modules/jobListing/listing-details.js +24 -24
  15. package/dist/components/modules/jobListing/listing-details.js.map +1 -1
  16. package/dist/components/modules/{maps/list → list}/field-mapper.js +8 -7
  17. package/dist/components/modules/list/field-mapper.js.map +1 -0
  18. package/dist/components/modules/{maps/list → list}/header-item.js +2 -2
  19. package/dist/components/modules/list/header-item.js.map +1 -0
  20. package/dist/components/modules/{maps/list → list}/header.js +6 -4
  21. package/dist/components/modules/list/header.js.map +1 -0
  22. package/dist/components/modules/list/index.js +36 -0
  23. package/dist/components/modules/list/index.js.map +1 -0
  24. package/dist/components/modules/{maps/list → list}/item-expand-card/index.js +3 -1
  25. package/dist/components/modules/list/item-expand-card/index.js.map +1 -0
  26. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +2 -2
  27. package/dist/components/modules/list/item-expand-card/recruiter-contact-nav.js.map +1 -0
  28. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +1 -1
  29. package/dist/components/modules/list/item-expand-card/recruiter-details.js.map +1 -0
  30. package/dist/components/modules/list/item-expand-card/recruiter-headshot.js.map +1 -0
  31. package/dist/components/modules/list/item-list.js +28 -0
  32. package/dist/components/modules/list/item-list.js.map +1 -0
  33. package/dist/components/modules/list/list-item/index.js +75 -0
  34. package/dist/components/modules/list/list-item/index.js.map +1 -0
  35. package/dist/components/modules/list/list-item/list-item-container.js +47 -0
  36. package/dist/components/modules/list/list-item/list-item-container.js.map +1 -0
  37. package/dist/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +29 -33
  38. package/dist/components/modules/list/list-item/list-item.js.map +1 -0
  39. package/dist/components/modules/maps/map-list.js +3 -3
  40. package/dist/components/modules/maps/map-list.js.map +1 -1
  41. package/dist/constants/eventTypes.js +1 -1
  42. package/dist/constants/eventTypes.js.map +1 -1
  43. package/dist/contexts/mapContext.js +84 -113
  44. package/dist/contexts/mapContext.js.map +1 -1
  45. package/dist/contexts/mapListContext.js +181 -290
  46. package/dist/contexts/mapListContext.js.map +1 -1
  47. package/dist/contexts/trackEventContext.js +1 -1
  48. package/dist/services/configService.js +10 -28
  49. package/dist/services/configService.js.map +1 -1
  50. package/dist/services/googlePlacesNearbyService.js +33 -58
  51. package/dist/services/googlePlacesNearbyService.js.map +1 -1
  52. package/dist/services/listingAggregatorService.js +35 -75
  53. package/dist/services/listingAggregatorService.js.map +1 -1
  54. package/dist/services/listingEntityService.js +10 -31
  55. package/dist/services/listingEntityService.js.map +1 -1
  56. package/dist/services/listingService.js +26 -60
  57. package/dist/services/listingService.js.map +1 -1
  58. package/dist/services/recruiterService.js +11 -31
  59. package/dist/services/recruiterService.js.map +1 -1
  60. package/dist/types/apis/hcApi.d.ts +5 -0
  61. package/dist/types/clientToken.d.ts +2 -0
  62. package/dist/types/components/modules/accordions/MapAccordionItem.d.ts +9 -0
  63. package/dist/types/components/modules/accordions/default.d.ts +19 -0
  64. package/dist/types/components/modules/buttons/button-group-apply.d.ts +24 -0
  65. package/dist/types/components/modules/buttons/commute-pill.d.ts +5 -0
  66. package/dist/types/components/modules/buttons/default.d.ts +48 -0
  67. package/dist/types/components/modules/buttons/pill-wrapper.d.ts +3 -0
  68. package/dist/types/components/modules/dialogs/apply-dialog.d.ts +8 -0
  69. package/dist/types/components/modules/filter/sort.d.ts +8 -0
  70. package/dist/types/components/modules/grid.d.ts +8 -0
  71. package/dist/types/components/modules/icon.d.ts +10 -0
  72. package/dist/types/components/modules/jobListing/listing-details-container.d.ts +6 -0
  73. package/dist/types/components/modules/jobListing/listing-details.d.ts +18 -0
  74. package/dist/types/components/modules/list/field-mapper.d.ts +10 -0
  75. package/dist/types/components/modules/list/header-item.d.ts +11 -0
  76. package/dist/types/components/modules/list/header.d.ts +11 -0
  77. package/dist/types/components/modules/list/index.d.ts +9 -0
  78. package/dist/types/components/modules/list/item-expand-card/index.d.ts +7 -0
  79. package/dist/types/components/modules/list/item-expand-card/recruiter-contact-nav.d.ts +17 -0
  80. package/dist/types/components/modules/list/item-expand-card/recruiter-details.d.ts +21 -0
  81. package/dist/types/components/modules/list/item-expand-card/recruiter-headshot.d.ts +8 -0
  82. package/dist/types/components/modules/list/item-list.d.ts +21 -0
  83. package/dist/types/components/modules/list/list-item/index.d.ts +12 -0
  84. package/dist/types/components/modules/list/list-item/list-item-container.d.ts +14 -0
  85. package/dist/types/components/modules/list/list-item/list-item.d.ts +3 -0
  86. package/dist/types/constants/eventTypes.d.ts +13 -0
  87. package/dist/types/contexts/mapContext.d.ts +29 -0
  88. package/dist/types/contexts/mapListContext.d.ts +58 -0
  89. package/dist/types/contexts/trackEventContext.d.ts +6 -0
  90. package/dist/types/enums/SectionType.d.ts +9 -0
  91. package/dist/types/hooks/useList.d.ts +13 -0
  92. package/dist/types/services/configService.d.ts +6 -0
  93. package/dist/types/services/googlePlacesNearbyService.d.ts +5 -0
  94. package/dist/types/services/listingAggregatorService.d.ts +12 -0
  95. package/dist/types/services/listingEntityService.d.ts +6 -0
  96. package/dist/types/services/listingService.d.ts +9 -0
  97. package/dist/types/services/recruiterService.d.ts +6 -0
  98. package/dist/types/types/Address.d.ts +7 -0
  99. package/dist/types/types/ContentSection.d.ts +8 -0
  100. package/dist/types/types/GetListingParams.d.ts +8 -0
  101. package/dist/types/types/LatLng.d.ts +4 -0
  102. package/dist/types/types/ListingEntity.d.ts +10 -0
  103. package/dist/types/types/ListingFields.d.ts +20 -0
  104. package/dist/types/types/Listings.d.ts +31 -0
  105. package/dist/types/types/Recruiter.d.ts +9 -0
  106. package/dist/types/types/SimilarListing.d.ts +24 -0
  107. package/dist/types/types/config/Colors.d.ts +8 -0
  108. package/dist/types/types/config/MapConfig.d.ts +29 -0
  109. package/dist/types/types/config/PointsOfInterestConfig.d.ts +13 -0
  110. package/dist/types/types/config/SearchConfig.d.ts +4 -0
  111. package/dist/types/util/filterUtil.d.ts +28 -0
  112. package/dist/types/util/loading.d.ts +3 -0
  113. package/dist/types/util/localStorageUtil.d.ts +3 -0
  114. package/dist/types/util/mapUtil.d.ts +15 -0
  115. package/dist/types/util/sortUtil.d.ts +1 -0
  116. package/dist/types/util/stringUtils.d.ts +1 -0
  117. package/dist/util/filterUtil.js +34 -10
  118. package/dist/util/filterUtil.js.map +1 -1
  119. package/dist/util/localStorageUtil.js +37 -28
  120. package/dist/util/localStorageUtil.js.map +1 -1
  121. package/dist/util/mapUtil.js.map +1 -1
  122. package/package.json +22 -14
  123. package/rollup.config.mjs +23 -19
  124. package/src/apis/{hcApi.js → hcApi.ts} +27 -11
  125. package/src/components/HireControlMap.js +132 -129
  126. package/src/components/modules/accordions/MapAccordionItem.js +32 -74
  127. package/src/components/modules/filter/index.js +89 -89
  128. package/src/components/modules/filter/radio-item.js +0 -1
  129. package/src/components/modules/filter/search.js +93 -92
  130. package/src/components/modules/jobListing/listing-details-container.js +40 -0
  131. package/src/components/modules/jobListing/listing-details.js +209 -99
  132. package/src/components/modules/{maps/list → list}/field-mapper.js +114 -112
  133. package/src/components/modules/{maps/list → list}/header.js +49 -47
  134. package/src/components/modules/list/index.tsx +83 -0
  135. package/src/components/modules/{maps/list → list}/item-expand-card/index.js +24 -22
  136. package/src/components/modules/list/item-list.tsx +198 -0
  137. package/src/components/modules/list/list-item/index.js +70 -0
  138. package/src/components/modules/list/list-item/list-item-container.js +43 -0
  139. package/src/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +129 -135
  140. package/src/components/modules/maps/map-list.js +74 -74
  141. package/src/constants/eventTypes.js +13 -13
  142. package/src/contexts/mapContext.tsx +129 -0
  143. package/src/contexts/mapListContext.tsx +297 -0
  144. package/src/enums/SectionType.ts +9 -0
  145. package/src/services/{configService.js → configService.ts} +16 -16
  146. package/src/services/{googlePlacesNearbyService.js → googlePlacesNearbyService.ts} +11 -2
  147. package/src/services/listingAggregatorService.ts +76 -0
  148. package/src/services/listingEntityService.ts +16 -0
  149. package/src/services/listingService.ts +40 -0
  150. package/src/services/{recruiterService.js → recruiterService.ts} +18 -17
  151. package/src/types/Address.ts +7 -0
  152. package/src/types/ContentSection.ts +9 -0
  153. package/src/types/GetListingParams.ts +8 -0
  154. package/src/types/LatLng.ts +4 -0
  155. package/src/types/ListingEntity.ts +11 -0
  156. package/src/types/ListingFields.ts +20 -0
  157. package/src/types/Listings.ts +32 -0
  158. package/src/types/Recruiter.ts +9 -0
  159. package/src/types/SimilarListing.ts +24 -0
  160. package/src/types/config/Colors.ts +8 -0
  161. package/src/types/config/MapConfig.ts +30 -0
  162. package/src/types/config/PointsOfInterestConfig.ts +13 -0
  163. package/src/types/config/SearchConfig.ts +4 -0
  164. package/src/util/filterUtil.js +50 -6
  165. package/src/util/localStorageUtil.ts +34 -0
  166. package/src/util/mapUtil.js +91 -91
  167. package/tsconfig.json +23 -0
  168. package/dist/components/modules/maps/list/field-mapper.js.map +0 -1
  169. package/dist/components/modules/maps/list/header-item.js.map +0 -1
  170. package/dist/components/modules/maps/list/header.js.map +0 -1
  171. package/dist/components/modules/maps/list/index.js +0 -102
  172. package/dist/components/modules/maps/list/index.js.map +0 -1
  173. package/dist/components/modules/maps/list/item-expand-card/index.js.map +0 -1
  174. package/dist/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js.map +0 -1
  175. package/dist/components/modules/maps/list/item-expand-card/recruiter-details.js.map +0 -1
  176. package/dist/components/modules/maps/list/item-expand-card/recruiter-headshot.js.map +0 -1
  177. package/dist/components/modules/maps/list/list-item/index.js.map +0 -1
  178. package/dist/services/_virtual/_rollupPluginBabelHelpers.js +0 -372
  179. package/dist/services/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  180. package/dist/services/apis/hcApi.js +0 -189
  181. package/dist/services/apis/hcApi.js.map +0 -1
  182. package/dist/services/clientToken.js +0 -7
  183. package/dist/services/clientToken.js.map +0 -1
  184. package/dist/services/styles/index.css +0 -3
  185. package/src/components/modules/maps/list/index.js +0 -112
  186. package/src/contexts/mapContext.js +0 -101
  187. package/src/contexts/mapListContext.js +0 -242
  188. package/src/services/listingAggregatorService.js +0 -50
  189. package/src/services/listingEntityService.js +0 -15
  190. package/src/services/listingService.js +0 -26
  191. package/src/util/localStorageUtil.js +0 -27
  192. /package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
  193. /package/src/components/modules/{maps/list → list}/header-item.js +0 -0
  194. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +0 -0
  195. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +0 -0
  196. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
@@ -1,89 +1,89 @@
1
- import React, { useState } from 'react';
2
-
3
- import FilterSearch from '~/components/modules/filter/search';
4
- import FiltersAccordion from '~/components/modules/accordions/filters';
5
- import FilterLocations from '~/components/modules/filter/location';
6
- import Button from '~/components/modules/buttons/default';
7
-
8
- import { useMap } from '~/contexts/mapContext';
9
- import { useMapList } from '~/contexts/mapListContext';
10
- import { useTrackEvent } from '~/contexts/trackEventContext';
11
-
12
- const Filter = ({
13
- className,
14
- showMap
15
- }) => {
16
- const { trackEvent, eventTypes } = useTrackEvent();
17
- const [hasActiveFilters, setHasActiveFilters] = useState(false);
18
- const [defaultValue, setDefaultValue] = useState(null);
19
- const { setSelectedListItem, setLocation, filterReset } = useMap();
20
- const {
21
- filteredListings,
22
- selectedFilters,
23
- setSelectedFilters,
24
- setMobileTab,
25
- handleSettingFavorites,
26
- setQuery,
27
- siteConfig
28
- } = useMapList();
29
-
30
- return (
31
- <div
32
- className={`
33
- hc-relative hc-max-h-[95vh] md:hc-max-h-screen hc-overflow-y-auto hc-overflow-x-auto
34
- ${className ?? ""}
35
- `}
36
- >
37
- <div className="hc-px-4 md:hc-pt-4 hc-space-y-4">
38
- <FiltersAccordion
39
- setHasActiveFilters={setHasActiveFilters}
40
- defaultValue={defaultValue}
41
- setDefaultValue={value => { setDefaultValue(value == defaultValue ? "" : value); }}
42
- setLocation={setLocation}
43
- setSelectedListItem={setSelectedListItem}
44
- />
45
- <FilterSearch />
46
- {siteConfig.hideLocations !== true &&
47
- <FilterLocations
48
- setHasActiveFilters={setHasActiveFilters}
49
- defaultValue={defaultValue}
50
- showMap={showMap}
51
- setDefaultValue={value => { setDefaultValue(value == defaultValue ? "" : value); }}
52
- setLocation={setLocation}
53
- setSelectedListItem={setSelectedListItem}
54
- />
55
- }
56
- </div>
57
- <div className="hc-sticky hc-bottom-0 hc-inset-x-0 hc-flex hc-items-center hc-justify-between hc-gap-2 hc-py-2 hc-px-4 hc-mt-2 hc-bg-white md:hc-bg-gray-100">
58
- <Button.Btn
59
- onClick={() => {trackEvent(eventTypes.FILTERS_RESET, { filtersRemoved: selectedFilters }); filterReset(); setSelectedFilters({}); setQuery(null); handleSettingFavorites(null); }}
60
- variant="outline"
61
- size="sm"
62
- >
63
- Reset
64
- </Button.Btn>
65
- {selectedFilters && Object.keys(selectedFilters).length > 0 &&
66
- <Button.Btn
67
- onClick={() => setMobileTab("listTab")}
68
- variant="primary"
69
- size="sm"
70
- className={`
71
- md:hc-hidden
72
- ${hasActiveFilters ? "hc-opacity-0 hc-pointer-events-none" : "hc-opacity-100"}
73
- `}
74
- >
75
- <Button.Body>
76
- <Button.Icon
77
- icon="fluent:search-12-filled"
78
- size="hc-size-3.5"
79
- />
80
- Show {filteredListings.length} Jobs
81
- </Button.Body>
82
- </Button.Btn>
83
- }
84
- </div>
85
- </div>
86
- );
87
- };
88
-
89
- export default Filter;
1
+ import React, { useState } from 'react';
2
+
3
+ import FilterSearch from '~/components/modules/filter/search';
4
+ import FiltersAccordion from '~/components/modules/accordions/filters';
5
+ import FilterLocations from '~/components/modules/filter/location';
6
+ import Button from '~/components/modules/buttons/default';
7
+
8
+ import { useMap } from '~/contexts/mapContext';
9
+ import { useMapList } from '~/contexts/mapListContext';
10
+ import { useTrackEvent } from '~/contexts/trackEventContext';
11
+
12
+ const Filter = ({
13
+ className,
14
+ showMap
15
+ }) => {
16
+ const { trackEvent, eventTypes } = useTrackEvent();
17
+ const [hasActiveFilters, setHasActiveFilters] = useState(false);
18
+ const [defaultValue, setDefaultValue] = useState(null);
19
+ const { setSelectedListItem, setLocation, filterReset } = useMap();
20
+ const {
21
+ filteredListings,
22
+ selectedFilters,
23
+ setSelectedFilters,
24
+ setMobileTab,
25
+ handleSettingFavorites,
26
+ setQuery,
27
+ siteConfig
28
+ } = useMapList();
29
+
30
+ return (
31
+ <div
32
+ className={`
33
+ hc-relative hc-max-h-[95vh] md:hc-max-h-screen hc-overflow-y-auto hc-overflow-x-auto
34
+ ${className ?? ""}
35
+ `}
36
+ >
37
+ <div className="hc-px-4 md:hc-pt-4 hc-space-y-4">
38
+ <FiltersAccordion
39
+ setHasActiveFilters={setHasActiveFilters}
40
+ defaultValue={defaultValue}
41
+ setDefaultValue={value => { setDefaultValue(value == defaultValue ? "" : value); }}
42
+ setLocation={setLocation}
43
+ setSelectedListItem={setSelectedListItem}
44
+ />
45
+ <FilterSearch />
46
+ {siteConfig.hideLocations !== true &&
47
+ <FilterLocations
48
+ setHasActiveFilters={setHasActiveFilters}
49
+ defaultValue={defaultValue}
50
+ showMap={showMap}
51
+ setDefaultValue={value => { setDefaultValue(value == defaultValue ? "" : value); }}
52
+ setLocation={setLocation}
53
+ setSelectedListItem={setSelectedListItem}
54
+ />
55
+ }
56
+ </div>
57
+ <div className="hc-sticky hc-bottom-0 hc-inset-x-0 hc-flex hc-items-center hc-justify-between hc-gap-2 hc-py-2 hc-px-4 hc-mt-2 hc-bg-white md:hc-bg-gray-100">
58
+ <Button.Btn
59
+ onClick={() => {trackEvent(eventTypes.FILTERS_RESET, { filtersRemoved: selectedFilters }); filterReset(); setSelectedFilters({}); setQuery(null); handleSettingFavorites(null); }}
60
+ variant="outline"
61
+ size="sm"
62
+ >
63
+ Reset
64
+ </Button.Btn>
65
+ {selectedFilters && Object.keys(selectedFilters).length > 0 &&
66
+ <Button.Btn
67
+ onClick={() => setMobileTab("listTab")}
68
+ variant="primary"
69
+ size="sm"
70
+ className={`
71
+ md:hc-hidden
72
+ ${hasActiveFilters ? "hc-opacity-0 hc-pointer-events-none" : "hc-opacity-100"}
73
+ `}
74
+ >
75
+ <Button.Body>
76
+ <Button.Icon
77
+ icon="fluent:search-12-filled"
78
+ size="hc-size-3.5"
79
+ />
80
+ Show {filteredListings.length} Jobs
81
+ </Button.Body>
82
+ </Button.Btn>
83
+ }
84
+ </div>
85
+ </div>
86
+ );
87
+ };
88
+
89
+ export default Filter;
@@ -42,7 +42,6 @@ const RadioItem = ({
42
42
  onClick={() => {
43
43
  changeHandler();
44
44
  }}
45
- onChange={() => { }}
46
45
  />
47
46
  <span className="hc-font-medium">{item.key}</span>
48
47
  {isActive &&
@@ -1,92 +1,93 @@
1
- import React, { useRef, useState, useEffect } from 'react';
2
-
3
- import Button from '~/components/modules/buttons/default';
4
- import Icon from '~/components/modules/icon';
5
- import FilterCard from '~/components/modules/cards/filter';
6
-
7
- import { useMapList } from '~/contexts/mapListContext';
8
-
9
- const Search = ({
10
- inputPlaceholder = "Keywords",
11
- showSearchIcon = false,
12
- className,
13
- labelClassName
14
- }) => {
15
- const [inputValue, setInputValue] = useState(query != null ? query : "");
16
- const debounceTimer = useRef(null);
17
- const {
18
- query,
19
- setQuery,
20
- siteConfig
21
- } = useMapList();
22
- const handleInputChange = e => {
23
- setInputValue(e.target.value);
24
- if (debounceTimer.current) {
25
- clearTimeout(debounceTimer.current);
26
- }
27
- debounceTimer.current = setTimeout(() => {
28
- setQuery(e.target.value);
29
- }, 500);
30
- };
31
-
32
- const handleReset = () => {
33
- setInputValue("");
34
- setQuery("");
35
- };
36
-
37
- useEffect(() => {
38
- if (query == null) {
39
- setInputValue("");
40
- }
41
- }, [query]);
42
- inputPlaceholder = siteConfig.searchConfig.placeholder;
43
- return (
44
- <FilterCard as="form" className={className ?? ""}>
45
- <FilterCard.Title
46
- as="label"
47
- icon="fluent:search-12-filled"
48
- className={labelClassName ?? ""}
49
- >
50
- <span>
51
- {siteConfig.searchConfig.label}
52
- </span>
53
- </FilterCard.Title>
54
-
55
- <div className="hc-relative hc-flex hc-items-center hc-px-2 hc-rounded hc-bg-white hc-border hc-border-uiAccent/20 focus-within:hc-ring-1 focus-within:hc-ring-uiAccent">
56
- {showSearchIcon && (
57
- <Icon
58
- icon="fluent:search-12-filled"
59
- size="hc-size-4"
60
- className="hc-mr-2 hc-text-uiAccent/50"
61
- />
62
- )}
63
- <input
64
- type="text"
65
- name="search"
66
- onKeyDown={e => {
67
- if (e.key === 'Enter') {
68
- e.preventDefault();
69
- }
70
- }}
71
- placeholder={inputPlaceholder}
72
- value={inputValue}
73
- className="hc-w-full hc-px-0 hc-py-2 hc-text-sm hc-border-0 hc-transition-colors placeholder:hc-text-uiText/50 focus:hc-ring-0 focus:hc-outline-none"
74
- onChange={handleInputChange}
75
- />
76
-
77
- <Button.Btn
78
- type="reset"
79
- variant="icon"
80
- size="sqsm"
81
- className={`transition-opacity ${inputValue ? "hc-opacity-100" : "hc-opacity-0 hc-pointer-events-none"}`}
82
- onClick={handleReset}
83
- >
84
- <span className="sr-only">Clear</span>
85
- <Button.Icon icon="uil:times" className="hc-text-uiAccent" />
86
- </Button.Btn>
87
- </div>
88
- </FilterCard>
89
- );
90
- };
91
-
92
- export default Search;
1
+ import React, { useRef, useState, useEffect } from 'react';
2
+
3
+ import Button from '~/components/modules/buttons/default';
4
+ import Icon from '~/components/modules/icon';
5
+ import FilterCard from '~/components/modules/cards/filter';
6
+
7
+ import { useMapList } from '~/contexts/mapListContext';
8
+
9
+ const Search = ({
10
+ inputPlaceholder = "Keywords",
11
+ showSearchIcon = false,
12
+ className,
13
+ labelClassName
14
+ }) => {
15
+ const {
16
+ query,
17
+ setQuery,
18
+ siteConfig
19
+ } = useMapList();
20
+ const [inputValue, setInputValue] = useState(query != null ? query : "");
21
+ const debounceTimer = useRef(null);
22
+
23
+ const handleInputChange = e => {
24
+ setInputValue(e.target.value);
25
+ if (debounceTimer.current) {
26
+ clearTimeout(debounceTimer.current);
27
+ }
28
+ debounceTimer.current = setTimeout(() => {
29
+ setQuery(e.target.value);
30
+ }, 500);
31
+ };
32
+
33
+ const handleReset = () => {
34
+ setInputValue("");
35
+ setQuery("");
36
+ };
37
+
38
+ useEffect(() => {
39
+ if (query == null) {
40
+ setInputValue("");
41
+ }
42
+ }, [query]);
43
+ inputPlaceholder = siteConfig.searchConfig.placeholder;
44
+ return (
45
+ <FilterCard as="form" className={className ?? ""}>
46
+ <FilterCard.Title
47
+ as="label"
48
+ icon="fluent:search-12-filled"
49
+ className={labelClassName ?? ""}
50
+ >
51
+ <span>
52
+ {siteConfig.searchConfig.label}
53
+ </span>
54
+ </FilterCard.Title>
55
+
56
+ <div className="hc-relative hc-flex hc-items-center hc-px-2 hc-rounded hc-bg-white hc-border hc-border-uiAccent/20 focus-within:hc-ring-1 focus-within:hc-ring-uiAccent">
57
+ {showSearchIcon && (
58
+ <Icon
59
+ icon="fluent:search-12-filled"
60
+ size="hc-size-4"
61
+ className="hc-mr-2 hc-text-uiAccent/50"
62
+ />
63
+ )}
64
+ <input
65
+ type="text"
66
+ name="search"
67
+ onKeyDown={e => {
68
+ if (e.key === 'Enter') {
69
+ e.preventDefault();
70
+ }
71
+ }}
72
+ placeholder={inputPlaceholder}
73
+ value={inputValue}
74
+ className="hc-w-full hc-px-0 hc-py-2 hc-text-sm hc-border-0 hc-transition-colors placeholder:hc-text-uiText/50 focus:hc-ring-0 focus:hc-outline-none"
75
+ onChange={handleInputChange}
76
+ />
77
+
78
+ <Button.Btn
79
+ type="reset"
80
+ variant="icon"
81
+ size="sqsm"
82
+ className={`transition-opacity ${inputValue ? "hc-opacity-100" : "hc-opacity-0 hc-pointer-events-none"}`}
83
+ onClick={handleReset}
84
+ >
85
+ <span className="sr-only">Clear</span>
86
+ <Button.Icon icon="uil:times" className="hc-text-uiAccent" />
87
+ </Button.Btn>
88
+ </div>
89
+ </FilterCard>
90
+ );
91
+ };
92
+
93
+ export default Search;
@@ -0,0 +1,40 @@
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 ListingDetails from '~/components/modules/jobListing/listing-details';
6
+
7
+ const ListingDetailsContainer = ({ item, recruiters }) => {
8
+ const { trackEvent, eventTypes } = useTrackEvent();
9
+ const { travelTime } = useMap();
10
+ const { siteConfig, navigateToDetails, navigateToEasyApply, Link, linkFormat } = useMapList();
11
+
12
+ const {
13
+ useDetailsPostMessage,
14
+ useApplyDialog,
15
+ internalApplyLink,
16
+ companyName,
17
+ jobsDomain
18
+ } = siteConfig;
19
+
20
+ return (
21
+ <ListingDetails
22
+ item={item}
23
+ recruiters={recruiters}
24
+ travelTime={travelTime}
25
+ useDetailsPostMessage={useDetailsPostMessage}
26
+ navigateToDetails={navigateToDetails}
27
+ navigateToEasyApply={navigateToEasyApply}
28
+ Link={Link}
29
+ linkFormat={linkFormat}
30
+ useApplyDialog={useApplyDialog}
31
+ internalApplyLink={internalApplyLink}
32
+ companyName={companyName}
33
+ jobsDomain={jobsDomain}
34
+ trackEvent={trackEvent}
35
+ eventTypes={eventTypes}
36
+ />
37
+ );
38
+ };
39
+
40
+ export default ListingDetailsContainer;