@wayke-se/components-react 3.0.0-beta.11 → 3.0.0-beta.12

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 (274) hide show
  1. package/package.json +4 -2
  2. package/.editorconfig +0 -10
  3. package/.eslintrc.js +0 -62
  4. package/.github/workflows/release-to-production.yaml +0 -40
  5. package/.github/workflows/release-to-test.yaml +0 -40
  6. package/.prettierrc +0 -12
  7. package/assets/ajax-loader.gif +0 -0
  8. package/assets/default.css +0 -1
  9. package/assets/fonts/slick.eot +0 -0
  10. package/assets/fonts/slick.svg +0 -14
  11. package/assets/fonts/slick.ttf +0 -0
  12. package/assets/fonts/slick.woff +0 -0
  13. package/codegen.yml +0 -19
  14. package/esbuild/build.js +0 -39
  15. package/esbuild/common.js +0 -15
  16. package/esbuild/start.js +0 -21
  17. package/esbuild/www/index.html +0 -32
  18. package/example/src/@types/global.d.ts +0 -7
  19. package/example/src/@types/react-panellum.d.ts +0 -1
  20. package/example/src/App.tsx +0 -77
  21. package/example/src/assets/style/ecom.css +0 -63
  22. package/example/src/assets/style/theme.css +0 -83
  23. package/example/src/index.html +0 -26
  24. package/example/src/index.tsx +0 -11
  25. package/example/src/routes/HashRoute/index.tsx +0 -30
  26. package/example/src/routes/Home/index.tsx +0 -33
  27. package/example/src/routes/NotFound/index.tsx +0 -5
  28. package/example/src/routes/PathRoute/index.tsx +0 -35
  29. package/example/src/routes/Search/index.tsx +0 -28
  30. package/example/src/routes/SearchItem/index.tsx +0 -28
  31. package/example/src/routes/index.tsx +0 -25
  32. package/src/@types/action.ts +0 -3
  33. package/src/@types/codegen/types.ts +0 -366
  34. package/src/@types/filter.ts +0 -18
  35. package/src/@types/queryFilter.ts +0 -5
  36. package/src/@types/react-panellum.d.ts +0 -1
  37. package/src/@types/search.ts +0 -118
  38. package/src/@types/theme.d.ts +0 -5
  39. package/src/@types/vehicle-properties.ts +0 -33
  40. package/src/State/CentralStorage/CentralStorageContext.ts +0 -10
  41. package/src/State/CentralStorage/CentralStorageProvider.tsx +0 -21
  42. package/src/State/CentralStorage/useCentralStorage.ts +0 -37
  43. package/src/State/Path/PathContext.ts +0 -11
  44. package/src/State/Path/PathProvider.tsx +0 -66
  45. package/src/State/Path/reducer.ts +0 -30
  46. package/src/State/Path/usePath.ts +0 -13
  47. package/src/State/RelatedSearch/RelatedSearchContext.ts +0 -18
  48. package/src/State/RelatedSearch/RelatedSearchProvider.tsx +0 -55
  49. package/src/State/RelatedSearch/useRelatedSearch.ts +0 -20
  50. package/src/State/Search/SearchContext.ts +0 -27
  51. package/src/State/Search/SearchProvider.tsx +0 -243
  52. package/src/State/Search/useSearch.ts +0 -6
  53. package/src/State/Settings/SettingsContext.ts +0 -15
  54. package/src/State/Settings/SettingsProvider.tsx +0 -23
  55. package/src/State/Settings/useSettings.ts +0 -7
  56. package/src/components/Accordion/index.tsx +0 -57
  57. package/src/components/Accordion/wrapper.tsx +0 -107
  58. package/src/components/ActionList/index.tsx +0 -48
  59. package/src/components/ActionList/toggle-item.tsx +0 -59
  60. package/src/components/Avatar/index.tsx +0 -12
  61. package/src/components/Avatar/wrapper.tsx +0 -21
  62. package/src/components/Badge/index.tsx +0 -12
  63. package/src/components/Badge/wrapper.tsx +0 -32
  64. package/src/components/Blockquote/index.tsx +0 -32
  65. package/src/components/Blockquote/wrapper.tsx +0 -52
  66. package/src/components/Button/index.tsx +0 -226
  67. package/src/components/CheckMarkList/index.tsx +0 -21
  68. package/src/components/CheckMarkList/wrapper.tsx +0 -31
  69. package/src/components/Checklist/index.tsx +0 -51
  70. package/src/components/Checklist/wrapper.tsx +0 -65
  71. package/src/components/ColorSelect/index.tsx +0 -63
  72. package/src/components/ColorSelect/wrapper.tsx +0 -82
  73. package/src/components/ColumnRow/index.tsx +0 -20
  74. package/src/components/Container/index.tsx +0 -11
  75. package/src/components/Container/wrapper.tsx +0 -14
  76. package/src/components/Content/index.tsx +0 -15
  77. package/src/components/Content/wrapper.tsx +0 -61
  78. package/src/components/ContentLogo/index.tsx +0 -27
  79. package/src/components/DataList/index.tsx +0 -25
  80. package/src/components/DataList/wrapper.tsx +0 -29
  81. package/src/components/DetailBox/index.tsx +0 -34
  82. package/src/components/DetailBox/wrapper.tsx +0 -34
  83. package/src/components/ExtendContent/index.tsx +0 -43
  84. package/src/components/ExtendContent/wrapper.tsx +0 -41
  85. package/src/components/ExtendInfo/index.tsx +0 -32
  86. package/src/components/ExtendInfo/wrapper.tsx +0 -63
  87. package/src/components/Filter/index.tsx +0 -108
  88. package/src/components/Filter/wrapper.tsx +0 -79
  89. package/src/components/FilterPanel/checkListFacet.tsx +0 -46
  90. package/src/components/FilterPanel/colorFacet.tsx +0 -47
  91. package/src/components/FilterPanel/faceSelector.tsx +0 -53
  92. package/src/components/FilterPanel/index.tsx +0 -79
  93. package/src/components/FilterPanel/rangeFacet.tsx +0 -128
  94. package/src/components/FinancialOptions/LoanModal.tsx +0 -223
  95. package/src/components/FinancialOptions/index.tsx +0 -29
  96. package/src/components/FinancialOptions/leasing.tsx +0 -77
  97. package/src/components/FinancialOptions/loan.tsx +0 -87
  98. package/src/components/Gallery/MediaButton.tsx +0 -19
  99. package/src/components/Gallery/index.tsx +0 -227
  100. package/src/components/Gallery/wrapper.tsx +0 -323
  101. package/src/components/Grid/index.tsx +0 -87
  102. package/src/components/Grid/wrapper.tsx +0 -30
  103. package/src/components/Heading/index.tsx +0 -72
  104. package/src/components/Icon/index.tsx +0 -87
  105. package/src/components/InputCheckbox/index.tsx +0 -30
  106. package/src/components/InputCheckbox/wrapper.tsx +0 -87
  107. package/src/components/InputGroup/index.tsx +0 -24
  108. package/src/components/InputLabel/index.tsx +0 -14
  109. package/src/components/InputLabel/wrapper.tsx +0 -10
  110. package/src/components/InputSearch/index.tsx +0 -51
  111. package/src/components/InputSearch/wrapper.tsx +0 -97
  112. package/src/components/InputSelect/index.tsx +0 -35
  113. package/src/components/InputSelect/wrapper.tsx +0 -59
  114. package/src/components/InputText/index.tsx +0 -27
  115. package/src/components/InputText/wrapper.tsx +0 -57
  116. package/src/components/InsuranceOptions/Insurance.tsx +0 -60
  117. package/src/components/InsuranceOptions/InsuranceFree.tsx +0 -59
  118. package/src/components/InsuranceOptions/InsuranceFreeModal.tsx +0 -49
  119. package/src/components/InsuranceOptions/InsuranceModal.tsx +0 -253
  120. package/src/components/InsuranceOptions/index.tsx +0 -27
  121. package/src/components/Lightbox/index.tsx +0 -51
  122. package/src/components/Lightbox/wrapper.tsx +0 -97
  123. package/src/components/Loader/index.tsx +0 -18
  124. package/src/components/Loader/wrapper.tsx +0 -50
  125. package/src/components/LogoBox/index.tsx +0 -22
  126. package/src/components/LogoBox/wrapper.tsx +0 -19
  127. package/src/components/Map/index.tsx +0 -62
  128. package/src/components/Map/wrapper.tsx +0 -29
  129. package/src/components/Modal/index.tsx +0 -51
  130. package/src/components/Modal/wrapper.tsx +0 -127
  131. package/src/components/OpeningHours/index.tsx +0 -145
  132. package/src/components/OptionBox/index.tsx +0 -23
  133. package/src/components/OptionBox/wrapper.tsx +0 -56
  134. package/src/components/OverflowBox/index.tsx +0 -11
  135. package/src/components/OverflowBox/wrapper.tsx +0 -7
  136. package/src/components/OverflowGrid/index.tsx +0 -70
  137. package/src/components/Page/index.tsx +0 -46
  138. package/src/components/Panel/index.tsx +0 -50
  139. package/src/components/Panel/wrapper.tsx +0 -155
  140. package/src/components/Pdf/index.tsx +0 -46
  141. package/src/components/Pdf/wrapper.tsx +0 -61
  142. package/src/components/PhoneNumber/index.tsx +0 -33
  143. package/src/components/Portal/index.ts +0 -5
  144. package/src/components/Portal/portal-element.tsx +0 -9
  145. package/src/components/Portal/portal-namespace.ts +0 -1
  146. package/src/components/Portal/portal.tsx +0 -36
  147. package/src/components/Price/index.tsx +0 -12
  148. package/src/components/PriceTable/index.tsx +0 -34
  149. package/src/components/PriceTable/wrapper.tsx +0 -27
  150. package/src/components/ProductCard/index.tsx +0 -133
  151. package/src/components/ProductCard/wrapper.tsx +0 -147
  152. package/src/components/ProductPage/index.tsx +0 -99
  153. package/src/components/ProgressBar/index.tsx +0 -31
  154. package/src/components/ProgressBar/wrapper.tsx +0 -29
  155. package/src/components/RangeSlider/RangeSliderSimple.tsx +0 -90
  156. package/src/components/RangeSlider/SliderWithLabel.tsx +0 -62
  157. package/src/components/RangeSlider/handle.tsx +0 -26
  158. package/src/components/RangeSlider/index.tsx +0 -132
  159. package/src/components/RangeSlider/track.tsx +0 -19
  160. package/src/components/RangeSlider/wrapper.tsx +0 -93
  161. package/src/components/RangeSliderLabel/index.tsx +0 -18
  162. package/src/components/RangeSliderLabel/wrapper.tsx +0 -33
  163. package/src/components/Repeat/index.tsx +0 -21
  164. package/src/components/Result/index.tsx +0 -91
  165. package/src/components/Result/wrapper.tsx +0 -39
  166. package/src/components/Root/index.tsx +0 -24
  167. package/src/components/SearchBar/index.tsx +0 -48
  168. package/src/components/SearchFilter/index.tsx +0 -31
  169. package/src/components/SearchTerm/index.tsx +0 -23
  170. package/src/components/SearchTerm/wrapper.tsx +0 -71
  171. package/src/components/SectionHeader/index.tsx +0 -25
  172. package/src/components/SectionHeader/wrapper.tsx +0 -17
  173. package/src/components/Snackbar/index.tsx +0 -35
  174. package/src/components/Snackbar/wrapper.tsx +0 -65
  175. package/src/components/SortSelect/index.tsx +0 -35
  176. package/src/components/SortSelect/wrapper.tsx +0 -54
  177. package/src/components/Sphere/Sphere.tsx +0 -49
  178. package/src/components/Sphere/SphereLightbox.tsx +0 -10
  179. package/src/components/Sphere/SphereViewer.tsx +0 -81
  180. package/src/components/Sphere/wrapper.tsx +0 -253
  181. package/src/components/SrOnly/index.tsx +0 -14
  182. package/src/components/SwitchBar/index.tsx +0 -55
  183. package/src/components/SwitchBar/wrapper.tsx +0 -80
  184. package/src/components/TableColumn/index.tsx +0 -18
  185. package/src/components/TableList/index.tsx +0 -39
  186. package/src/components/Tabs/index.tsx +0 -34
  187. package/src/components/Tabs/wrapper.tsx +0 -82
  188. package/src/components/ThreeSixty/Rotation.tsx +0 -136
  189. package/src/components/ThreeSixty/ThreeSixtLightbox.tsx +0 -34
  190. package/src/components/ThreeSixty/ThreeSixty.tsx +0 -53
  191. package/src/components/UspList/index.tsx +0 -47
  192. package/src/components/UspList/wrapper.tsx +0 -92
  193. package/src/components/Utility/index.tsx +0 -17
  194. package/src/components/Video/CustomPlayer.tsx +0 -28
  195. package/src/components/Video/EmbeddedVideoLightbox.tsx +0 -31
  196. package/src/components/Video/EmbededVideo.tsx +0 -72
  197. package/src/components/Video/QuickNavEmbeded.tsx +0 -35
  198. package/src/components/Video/QuickNavVideo.tsx +0 -14
  199. package/src/components/Video/Video.tsx +0 -18
  200. package/src/components/Video/VimeoPlayer.tsx +0 -21
  201. package/src/components/Video/YoutubePlayer.tsx +0 -21
  202. package/src/components/Video/useThumbnail.ts +0 -28
  203. package/src/components/Video/utils.ts +0 -47
  204. package/src/components/Video/wrapper.tsx +0 -29
  205. package/src/hooks/useFetch.ts +0 -88
  206. package/src/hooks/useHasBeenVisible.ts +0 -17
  207. package/src/hooks/useHashGuid.ts +0 -33
  208. package/src/hooks/useInsurance.ts +0 -22
  209. package/src/hooks/useLoan.ts +0 -21
  210. package/src/hooks/useOnScreen.ts +0 -20
  211. package/src/hooks/useOutsideClick.ts +0 -19
  212. package/src/hooks/usePrevious.ts +0 -11
  213. package/src/hooks/useSearchItem.ts +0 -11
  214. package/src/hooks/useSearchItemBranch.ts +0 -14
  215. package/src/hooks/useSessionStorage.ts +0 -32
  216. package/src/hooks/useVimeoThumbnail.ts +0 -31
  217. package/src/images/map/marker.png +0 -0
  218. package/src/images/placeholders/staticmap.jpg +0 -0
  219. package/src/index-dev.tsx +0 -42
  220. package/src/index-esbuild.ts +0 -74
  221. package/src/index.ts +0 -72
  222. package/src/layout/helpers.tsx +0 -6
  223. package/src/layout/keyframes.tsx +0 -23
  224. package/src/layout/theme.ts +0 -60
  225. package/src/layouts/WaykeComposite.tsx +0 -64
  226. package/src/layouts/WaykeCompositeWithProvider.tsx +0 -17
  227. package/src/layouts/search/index.tsx +0 -124
  228. package/src/layouts/searchItem/Branch.tsx +0 -97
  229. package/src/layouts/searchItem/BranchModal.tsx +0 -67
  230. package/src/layouts/searchItem/CheckList.tsx +0 -146
  231. package/src/layouts/searchItem/ManufacturerPackagesOption.tsx +0 -54
  232. package/src/layouts/searchItem/MetadataItem.tsx +0 -74
  233. package/src/layouts/searchItem/PackageOptionModal.tsx +0 -54
  234. package/src/layouts/searchItem/PackageOptions.tsx +0 -58
  235. package/src/layouts/searchItem/Page404.tsx +0 -17
  236. package/src/layouts/searchItem/PageLoading.tsx +0 -17
  237. package/src/layouts/searchItem/Property.tsx +0 -134
  238. package/src/layouts/searchItem/Related.tsx +0 -120
  239. package/src/layouts/searchItem/index.tsx +0 -342
  240. package/src/providers/WaykeItemProvidet.tsx +0 -63
  241. package/src/providers/WaykeProvider.tsx +0 -75
  242. package/src/providers/graphqlProvider.tsx +0 -9
  243. package/src/providers/themeProvider.tsx +0 -15
  244. package/src/queries/INSURANCE_CALCULATION.ts +0 -43
  245. package/src/queries/LOAN_CALCULATION.ts +0 -39
  246. package/src/queries/SEARCH_ITEM_BRANCH_QUERY.ts +0 -120
  247. package/src/queries/SEARCH_ITEM_QUERY.ts +0 -237
  248. package/src/utils/constants.ts +0 -34
  249. package/src/utils/converters.ts +0 -45
  250. package/src/utils/deep-copy.ts +0 -6
  251. package/src/utils/formats.ts +0 -83
  252. package/src/utils/metadata.min.ts +0 -87
  253. package/src/utils/phonenumbers.ts +0 -17
  254. package/src/utils/pubsub/Actions.ts +0 -20
  255. package/src/utils/pubsub/Events.ts +0 -79
  256. package/src/utils/pubsub/pubsub.ts +0 -151
  257. package/src/utils/regex.ts +0 -13
  258. package/src/utils/sortOptions.ts +0 -36
  259. package/src/utils/specification.ts +0 -581
  260. package/src/utils/ssn.ts +0 -1
  261. package/src/utils/url.ts +0 -1
  262. package/src/utils/vehicle-properties/compare-basic-properties.ts +0 -63
  263. package/src/utils/vehicle-properties/compare-categories.ts +0 -45
  264. package/src/utils/vehicle-properties/compare-properties.ts +0 -5
  265. package/src/utils/vehicle-properties/custom-property-adder.ts +0 -163
  266. package/src/utils/vehicle-properties/property-hint-enricher.ts +0 -230
  267. package/src/utils/vehicle-properties/property-remover.ts +0 -28
  268. package/src/utils/vehicle-properties/property-tree-creator.ts +0 -171
  269. package/src/utils/vehicle-properties/property-tree-sorter.ts +0 -20
  270. package/tsconfig.build.json +0 -10
  271. package/tsconfig.eslint.json +0 -11
  272. package/tsconfig.json +0 -18
  273. package/webpack.analyze.js +0 -10
  274. package/webpack.config.js +0 -95
@@ -1,63 +0,0 @@
1
- import styled from 'styled-components';
2
-
3
- import { size } from '../../layout/helpers';
4
- import { ButtonReset } from '../Button/index';
5
-
6
- export const Wrapper = styled.div``;
7
-
8
- export const Header = styled.div`
9
- display: flex;
10
- align-items: center;
11
- `;
12
-
13
- export const Title = styled.div``;
14
-
15
- export const Info = styled.div`
16
- margin-left: ${size(1)};
17
- `;
18
-
19
- export const InfoBtn = styled(ButtonReset).attrs(() => ({
20
- className: 'wayke__theme wayke__color--primary-text',
21
- }))`
22
- position: relative;
23
- display: block;
24
- font: inherit;
25
- font-size: 1em;
26
- transform-origin: 50% 50%;
27
- transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);
28
-
29
- :before {
30
- content: '';
31
- position: absolute;
32
- top: ${size(-0.5)};
33
- bottom: ${size(-0.5)};
34
- left: ${size(-0.5)};
35
- right: ${size(-0.5)};
36
- background-color: ${(props) => props.theme.color.accentDark};
37
- border-radius: 50%;
38
- opacity: 0;
39
- transition: opacity 200ms ease;
40
- }
41
-
42
- > * {
43
- position: relative;
44
- z-index: 1;
45
- }
46
-
47
- :hover {
48
- :before {
49
- opacity: 1;
50
- }
51
- }
52
-
53
- :active {
54
- transform: scale(0.95);
55
- }
56
- `;
57
-
58
- export const Extend = styled.div`
59
- padding-top: ${size(1)};
60
- margin-top: ${size(1)};
61
- border-top: 1px solid ${(props) => props.theme.color.border};
62
- font-size: 0.875em;
63
- `;
@@ -1,108 +0,0 @@
1
- import React, { useState, useCallback } from 'react';
2
-
3
- import { List, Item, Action, Label, Indicator, IndicatorValue } from './wrapper';
4
- import { Facet } from '../../@types/search';
5
- import { FacetIdToTitle } from '../../utils/formats';
6
- import { PRICE, MILEAGE, MODEL_YEAR } from '../../utils/constants';
7
- import useSearch from '../../State/Search/useSearch';
8
- import { SearchFilterTypes, SearchFilterNameTypes } from '../../@types/filter';
9
- import FilterPanel from '../FilterPanel/index';
10
-
11
- const isSelected = (f: Facet, searchParams: URLSearchParams) => {
12
- switch (f.id) {
13
- case PRICE:
14
- case MILEAGE:
15
- case MODEL_YEAR:
16
- return searchParams.has(`${f.id}.min`) || searchParams.has(`${f.id}.max`) ? 1 : 0;
17
- default:
18
- return f.filters.filter((filter) => filter.selected).length;
19
- }
20
- };
21
-
22
- interface FilterProps {
23
- filterList?: SearchFilterTypes[];
24
- }
25
-
26
- const Filter = ({ filterList }: FilterProps) => {
27
- const { queryFilter, initialFacets, loading, response, onFilterUpdate } = useSearch();
28
-
29
- const facets = response?.facets;
30
-
31
- const [facet, setFacet] = useState<Facet>();
32
- const onSelectFacet = useCallback((nextFacet: Facet) => setFacet(nextFacet), []);
33
- const onClose = useCallback(() => setFacet(undefined), []);
34
-
35
- if (!facets) {
36
- return null;
37
- }
38
- const filterNames = filterList ? filterList.map((x) => x.filterName) : undefined;
39
-
40
- const filteredFacets = facets
41
- ?.filter((x) => x.id !== 'segment')
42
- ?.filter((f) => (filterNames ? filterNames.includes(f.id as SearchFilterNameTypes) : true))
43
- .sort((a, b) =>
44
- filterNames
45
- ? filterNames.indexOf(a.id as SearchFilterNameTypes) -
46
- filterNames.indexOf(b.id as SearchFilterNameTypes)
47
- : 0
48
- )
49
- .map((x) => {
50
- const match = filterList?.find((y) => y.filterName === x.id);
51
- if (match?.displayName) {
52
- return {
53
- ...x,
54
- displayName: match.displayName,
55
- };
56
- }
57
- return {
58
- ...x,
59
- displayName: FacetIdToTitle(x.id),
60
- };
61
- });
62
-
63
- return (
64
- <>
65
- {initialFacets && facet && (
66
- <FilterPanel
67
- filterList={filterList}
68
- facet={facet}
69
- loading={loading}
70
- filteredFacets={filteredFacets}
71
- numberOfHits={response?.documentList.numberOfHits || 0}
72
- onFilterUpdate={onFilterUpdate}
73
- onClose={onClose}
74
- />
75
- )}
76
- <List>
77
- {filteredFacets
78
- .filter((x) => x.filters.length)
79
- .map((f) => {
80
- const selected = isSelected(f, queryFilter.searchParams);
81
- return (
82
- <Item key={f.id}>
83
- <Action
84
- onClick={() => onSelectFacet(f)}
85
- title={f.displayName}
86
- aria-label={f.displayName}
87
- className={
88
- selected > 0
89
- ? 'wayke__theme wayke__color--primary-bg wayke__font--bold'
90
- : 'wayke__theme wayke__font--regular'
91
- }
92
- >
93
- <Label>{f.displayName}</Label>
94
- {selected > 0 && (
95
- <Indicator>
96
- <IndicatorValue>{selected}</IndicatorValue>
97
- </Indicator>
98
- )}
99
- </Action>
100
- </Item>
101
- );
102
- })}
103
- </List>
104
- </>
105
- );
106
- };
107
-
108
- export default Filter;
@@ -1,79 +0,0 @@
1
- import styled from 'styled-components';
2
-
3
- import { size } from '../../layout/helpers';
4
- import { ButtonReset } from '../Button/index';
5
-
6
- export const List = styled.ul`
7
- display: flex;
8
- align-items: center;
9
- flex-wrap: wrap;
10
- list-style: none;
11
- padding: 0;
12
- margin: ${size(-0.5)};
13
- `;
14
-
15
- export const Item = styled.li`
16
- padding: ${size(0.5)};
17
- `;
18
-
19
- export const Action = styled(ButtonReset)`
20
- position: relative;
21
- display: flex;
22
- align-items: center;
23
- padding: ${size(1.5)} ${size(3)};
24
- background-color: ${(props) => props.theme.color.accentDark};
25
- border-radius: 3px;
26
- font-size: 0.875rem;
27
- line-height: 1;
28
- transform-origin: 50% 50%;
29
- transition: transform 150ms ease;
30
-
31
- :before {
32
- content: '';
33
- position: absolute;
34
- top: 0;
35
- left: 0;
36
- width: 100%;
37
- height: 100%;
38
- background-color: ${(props) => props.theme.color.hoverOverlay};
39
- border-radius: 3px;
40
- opacity: 0;
41
- transition: opacity 150ms ease;
42
- }
43
-
44
- :hover {
45
- :before {
46
- opacity: 1;
47
- }
48
- }
49
-
50
- :active {
51
- transform: scale(0.95);
52
- }
53
- `;
54
-
55
- export const Label = styled.div`
56
- z-index: 1;
57
- `;
58
-
59
- export const Indicator = styled.div`
60
- flex-shrink: 0;
61
- display: flex;
62
- align-items: center;
63
- justify-content: center;
64
- padding: 0 ${size(0.375)};
65
- margin-left: ${size(0.5)};
66
- background-color: currentColor;
67
- min-width: 1em;
68
- height: 1em;
69
- border-radius: 999px;
70
- z-index: 1;
71
- `;
72
-
73
- export const IndicatorValue = styled.div`
74
- font-family: sans-serif; // Default font to guarantee visibility
75
- font-size: 0.75rem;
76
- font-weight: bold;
77
- color: white;
78
- mix-blend-mode: difference;
79
- `;
@@ -1,46 +0,0 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
- import Checklist from '../Checklist/index';
3
- import OverflowBox from '../OverflowBox/index';
4
- import { Facet, FacetFilter } from '../../@types/search';
5
- import useSearch from '../../State/Search/useSearch';
6
-
7
- interface ChecklistFacetProps {
8
- facet: Facet;
9
- }
10
-
11
- const ChecklistFacet = ({ facet }: ChecklistFacetProps) => {
12
- const { loading, error, onFilterUpdate } = useSearch();
13
- const [selected, setSelected] = useState<{ [key: string]: boolean }>();
14
- useEffect(() => {
15
- setSelected(undefined);
16
- }, [facet, error]);
17
-
18
- const onClick = useCallback(
19
- (f: FacetFilter) => {
20
- if (!loading) {
21
- setSelected({
22
- ...selected,
23
- [f.displayName]: !f.selected,
24
- });
25
- onFilterUpdate(f.query);
26
- }
27
- },
28
- [loading]
29
- );
30
-
31
- return (
32
- <OverflowBox>
33
- <Checklist
34
- items={facet.filters
35
- .sort((a, b) => a.displayName.localeCompare(b.displayName))
36
- .map((f) => ({
37
- label: f.displayName,
38
- onClick: () => onClick(f),
39
- active: selected?.[f.displayName] !== undefined ? selected[f.displayName] : f.selected,
40
- }))}
41
- />
42
- </OverflowBox>
43
- );
44
- };
45
-
46
- export default ChecklistFacet;
@@ -1,47 +0,0 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
-
3
- import { Facet, FacetFilter } from '../../@types/search';
4
- import ColorSelect from '../ColorSelect/index';
5
- import useSearch from '../../State/Search/useSearch';
6
- import { getHexColorFromDisplayName } from '../../utils/converters';
7
-
8
- interface ColorSelectFacetProps {
9
- facet: Facet;
10
- }
11
-
12
- const ColorSelectFacet = ({ facet }: ColorSelectFacetProps) => {
13
- const { loading, error, onFilterUpdate } = useSearch();
14
- const [selected, setSelected] = useState<{ [key: string]: boolean }>();
15
-
16
- useEffect(() => {
17
- setSelected(undefined);
18
- }, [facet, error]);
19
-
20
- const onClick = useCallback(
21
- (f: FacetFilter) => {
22
- if (!loading) {
23
- setSelected({
24
- ...selected,
25
- [f.displayName]: !f.selected,
26
- });
27
- onFilterUpdate(f.query);
28
- }
29
- },
30
- [loading]
31
- );
32
-
33
- return (
34
- <ColorSelect
35
- items={facet.filters
36
- .sort((a, b) => a.displayName.localeCompare(b.displayName))
37
- .map((f) => ({
38
- label: f.displayName,
39
- onClick: () => onClick(f),
40
- active: selected?.[f.displayName] !== undefined ? selected[f.displayName] : f.selected,
41
- hex: [getHexColorFromDisplayName(f.displayName)],
42
- }))}
43
- />
44
- );
45
- };
46
-
47
- export default ColorSelectFacet;
@@ -1,53 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Facet } from '../../@types/search';
4
- import CheckListFacet from './checkListFacet';
5
- import ColorSelectFacet from './colorFacet';
6
- import RangeFacet from './rangeFacet';
7
- import {
8
- MANUFACTURER,
9
- MODEL_SERIES,
10
- FUEL_TYPE,
11
- GEARBOX_TYPE,
12
- ENVIRONMENT_CLASS,
13
- SEGMENT,
14
- DRIVING_WHEEL,
15
- COLOR,
16
- PRICE,
17
- BRANCH,
18
- MILEAGE,
19
- MODEL_YEAR,
20
- LEASING_PRICE,
21
- } from '../../utils/constants';
22
-
23
- interface FacetSelectorProps {
24
- facet: Facet;
25
- }
26
-
27
- const FacetSelector = ({ facet }: FacetSelectorProps) => {
28
- switch (facet.id) {
29
- case MANUFACTURER:
30
- case MODEL_SERIES:
31
- case FUEL_TYPE:
32
- case GEARBOX_TYPE:
33
- case BRANCH:
34
- case ENVIRONMENT_CLASS:
35
- case SEGMENT:
36
- case DRIVING_WHEEL:
37
- return <CheckListFacet facet={facet} />;
38
- case COLOR:
39
- return <ColorSelectFacet facet={facet} />;
40
- case PRICE:
41
- return <RangeFacet facet={facet} unit="kr" formatValues />;
42
- case LEASING_PRICE:
43
- return <RangeFacet facet={facet} unit="kr/mån" formatValues />;
44
- case MILEAGE:
45
- return <RangeFacet facet={facet} unit="mil" formatValues />;
46
- case MODEL_YEAR:
47
- return <RangeFacet facet={facet} unit="år" />;
48
- default:
49
- return null;
50
- }
51
- };
52
-
53
- export default FacetSelector;
@@ -1,79 +0,0 @@
1
- import React, { useCallback } from 'react';
2
-
3
- import { Facet } from '../../@types/search';
4
- import Panel from '../Panel/index';
5
- import { FooterAction, FooterActionItem } from '../Panel/wrapper';
6
- import { ButtonSecondary, ButtonContent, ButtonPrimary } from '../Button/index';
7
- import Accordion, { AccordionItem } from '../Accordion/index';
8
- import { Repeat } from '../Repeat/index';
9
- import FacetSelector from './faceSelector';
10
- import { SearchFilterTypes } from '../../@types/filter';
11
-
12
- export interface FilterProps {
13
- label: string;
14
- activeFilters?: number;
15
- }
16
-
17
- export interface Props {
18
- facet?: Facet;
19
- loading: boolean;
20
- filteredFacets: Facet[];
21
- filterList?: SearchFilterTypes[];
22
- numberOfHits: number;
23
- onClose: () => void;
24
- onFilterUpdate: (nextQuery: string) => void;
25
- }
26
-
27
- const FilterPanel = ({
28
- facet,
29
- filteredFacets,
30
- numberOfHits,
31
- loading,
32
- onFilterUpdate,
33
- onClose,
34
- }: Props) => {
35
- const onClearFilters = useCallback(() => onFilterUpdate(''), []);
36
-
37
- return (
38
- <Panel
39
- title="Filtrera"
40
- onClose={onClose}
41
- footer={
42
- <>
43
- <FooterAction>
44
- <FooterActionItem>
45
- <ButtonSecondary fullWidth disabled={loading} onClick={onClearFilters}>
46
- <ButtonContent>Rensa alla</ButtonContent>
47
- </ButtonSecondary>
48
- </FooterActionItem>
49
- <FooterActionItem>
50
- <ButtonPrimary fullWidth disabled={loading} onClick={onClose}>
51
- <ButtonContent>{`Visa ${numberOfHits} ${
52
- numberOfHits === 1 ? 'bil' : 'bilar'
53
- }`}</ButtonContent>
54
- </ButtonPrimary>
55
- </FooterActionItem>
56
- </FooterAction>
57
- </>
58
- }
59
- >
60
- <Accordion>
61
- {filteredFacets
62
- .filter((x) => x.filters.length)
63
- .map((f) => (
64
- <AccordionItem
65
- key={f.displayName}
66
- heading={f.displayName}
67
- isActive={f.id === facet?.id}
68
- >
69
- <Repeat>
70
- <FacetSelector facet={f} />
71
- </Repeat>
72
- </AccordionItem>
73
- ))}
74
- </Accordion>
75
- </Panel>
76
- );
77
- };
78
-
79
- export default FilterPanel;
@@ -1,128 +0,0 @@
1
- import React, { useCallback, useState, useEffect } from 'react';
2
- import { Facet } from '../../@types/search';
3
- import RangeSlider from '../RangeSlider/index';
4
- import useSearch from '../../State/Search/useSearch';
5
-
6
- interface RangeFacetProps {
7
- facet: Facet;
8
- unit?: string;
9
- formatValues?: boolean;
10
- }
11
-
12
- const getInitialValues = (domain: number[], facet: Facet, searchParams: URLSearchParams) => {
13
- const facetMin = domain[0]; //parseInt(facet.filters[0].displayName, 10);
14
- const _queryMin = searchParams?.get(`${facet.id}.min`) || null;
15
- const facetMax = domain[domain.length - 1]; //parseInt(facet.filters[facet.filters.length - 1].displayName, 10);
16
- const _queryMax = searchParams?.get(`${facet.id}.max`) || null;
17
-
18
- const queryMin = parseInt(_queryMin === null ? `${facetMin}` : _queryMin, 10);
19
- const min = facetMin > queryMin ? facetMin : queryMin;
20
- const queryMax = parseInt(_queryMax === null ? `${facetMax}` : _queryMax, 10);
21
- const max = queryMax > facetMax ? facetMin : queryMax;
22
-
23
- return min || max ? [min ? min : domain[0], max ? max : domain[1]] : domain;
24
- };
25
-
26
- const averageDelta = ([x, ...xs]: number[]) => {
27
- if (x === undefined) return NaN;
28
-
29
- return xs.reduce(([acc, last], x) => [acc + (x - last), x], [0, x])[0] / xs.length;
30
- };
31
-
32
- const getSteps = (initialAllValues: number[]) => {
33
- const delta = averageDelta(initialAllValues);
34
- const max = Math.floor(initialAllValues[initialAllValues.length - 1] * 1000) / 1000;
35
- if (delta > 1000) return new Array(max / 1000 + 1).fill('').map((x, i) => i * 1000);
36
- if (delta <= 1000 && delta >= 500)
37
- return new Array(max / 500 + 1).fill('').map((x, i) => i * 500);
38
- return initialAllValues;
39
- };
40
-
41
- const RangeFacet = ({ facet, unit, formatValues }: RangeFacetProps) => {
42
- const { loading, queryFilter, initialFacets, onFilterUpdate } = useSearch();
43
- const initialFacet = initialFacets?.find((x) => x.id === facet.id);
44
- const maxPrefix =
45
- initialFacet?.filters[initialFacet?.filters.length - 1]?.displayName?.includes('+');
46
- const [state, setValues] = useState<
47
- { id: string | undefined; steps: number[]; domain: number[]; values: number[] } | undefined
48
- >(undefined);
49
-
50
- useEffect(() => {
51
- const _initialAllValues = initialFacet?.filters.map((f) =>
52
- parseInt(f.displayName.replace(/[\<\>+-]+/g, ''), 10)
53
- ) || [1, 2];
54
-
55
- const _steps = getSteps(_initialAllValues);
56
- const domain = [_steps[0], _steps[_steps.length - 1]];
57
-
58
- setValues({
59
- id: initialFacet?.id,
60
- steps: _steps,
61
- domain: [_steps[0], _steps[_steps.length - 1]],
62
- values: initialFacet?.filters.length
63
- ? getInitialValues(domain, initialFacet, queryFilter.searchParams)
64
- : [0, 0],
65
- });
66
- }, [initialFacet?.id]);
67
-
68
- useEffect(() => {
69
- if (state?.id) {
70
- const init = initialFacet?.filters.length
71
- ? getInitialValues(state.domain, initialFacet, queryFilter.searchParams)
72
- : [0, 0];
73
- const minStr = queryFilter.searchParams?.get(`${facet.id}.min`);
74
- const maxStr = queryFilter.searchParams?.get(`${facet.id}.max`);
75
-
76
- const min = minStr ? parseFloat(minStr) : init[0];
77
- const max = maxStr ? parseFloat(maxStr) : init[1];
78
- if (min !== state.values[0] || max !== state.values[1]) {
79
- onChange([min, max]);
80
- }
81
- }
82
- }, [queryFilter.searchParams?.toString()]);
83
-
84
- const onChange = useCallback(
85
- (nextValues: readonly number[]) => {
86
- if (state?.id) {
87
- if (state.values[0] !== nextValues[0] || state.values[1] !== nextValues[1]) {
88
- setValues({ ...state, values: nextValues.slice() });
89
- const query = new URLSearchParams(queryFilter.searchParams);
90
- query.set('hits', '30');
91
- query.delete(`${facet.id}.min`);
92
- query.delete(`${facet.id}.max`);
93
-
94
- if (nextValues[0] !== state.domain[0]) {
95
- query.set(`${facet.id}.min`, `${nextValues[0]}`);
96
- }
97
-
98
- if (nextValues[1] !== state.domain[1]) {
99
- query.set(`${facet.id}.max`, `${nextValues[1]}`);
100
- }
101
-
102
- query.sort();
103
- onFilterUpdate(query.toString());
104
- }
105
- }
106
- },
107
- [queryFilter.searchParams, state]
108
- );
109
-
110
- return (
111
- <>
112
- {state && (
113
- <RangeSlider
114
- loading={loading}
115
- domain={state.domain}
116
- values={state.values}
117
- maxPrefix={maxPrefix ? '+' : undefined}
118
- steps={state.steps}
119
- unit={unit}
120
- onChange={onChange}
121
- formatValues={formatValues}
122
- />
123
- )}
124
- </>
125
- );
126
- };
127
-
128
- export default RangeFacet;