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

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 (278) hide show
  1. package/dist/index.js +5529 -5460
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.mjs +320 -257
  4. package/dist/index.mjs.map +2 -2
  5. package/package.json +4 -2
  6. package/.editorconfig +0 -10
  7. package/.eslintrc.js +0 -62
  8. package/.github/workflows/release-to-production.yaml +0 -40
  9. package/.github/workflows/release-to-test.yaml +0 -40
  10. package/.prettierrc +0 -12
  11. package/assets/ajax-loader.gif +0 -0
  12. package/assets/default.css +0 -1
  13. package/assets/fonts/slick.eot +0 -0
  14. package/assets/fonts/slick.svg +0 -14
  15. package/assets/fonts/slick.ttf +0 -0
  16. package/assets/fonts/slick.woff +0 -0
  17. package/codegen.yml +0 -19
  18. package/esbuild/build.js +0 -39
  19. package/esbuild/common.js +0 -15
  20. package/esbuild/start.js +0 -21
  21. package/esbuild/www/index.html +0 -32
  22. package/example/src/@types/global.d.ts +0 -7
  23. package/example/src/@types/react-panellum.d.ts +0 -1
  24. package/example/src/App.tsx +0 -77
  25. package/example/src/assets/style/ecom.css +0 -63
  26. package/example/src/assets/style/theme.css +0 -83
  27. package/example/src/index.html +0 -26
  28. package/example/src/index.tsx +0 -11
  29. package/example/src/routes/HashRoute/index.tsx +0 -30
  30. package/example/src/routes/Home/index.tsx +0 -33
  31. package/example/src/routes/NotFound/index.tsx +0 -5
  32. package/example/src/routes/PathRoute/index.tsx +0 -35
  33. package/example/src/routes/Search/index.tsx +0 -28
  34. package/example/src/routes/SearchItem/index.tsx +0 -28
  35. package/example/src/routes/index.tsx +0 -25
  36. package/src/@types/action.ts +0 -3
  37. package/src/@types/codegen/types.ts +0 -366
  38. package/src/@types/filter.ts +0 -18
  39. package/src/@types/queryFilter.ts +0 -5
  40. package/src/@types/react-panellum.d.ts +0 -1
  41. package/src/@types/search.ts +0 -118
  42. package/src/@types/theme.d.ts +0 -5
  43. package/src/@types/vehicle-properties.ts +0 -33
  44. package/src/State/CentralStorage/CentralStorageContext.ts +0 -10
  45. package/src/State/CentralStorage/CentralStorageProvider.tsx +0 -21
  46. package/src/State/CentralStorage/useCentralStorage.ts +0 -37
  47. package/src/State/Path/PathContext.ts +0 -11
  48. package/src/State/Path/PathProvider.tsx +0 -66
  49. package/src/State/Path/reducer.ts +0 -30
  50. package/src/State/Path/usePath.ts +0 -13
  51. package/src/State/RelatedSearch/RelatedSearchContext.ts +0 -18
  52. package/src/State/RelatedSearch/RelatedSearchProvider.tsx +0 -55
  53. package/src/State/RelatedSearch/useRelatedSearch.ts +0 -20
  54. package/src/State/Search/SearchContext.ts +0 -27
  55. package/src/State/Search/SearchProvider.tsx +0 -243
  56. package/src/State/Search/useSearch.ts +0 -6
  57. package/src/State/Settings/SettingsContext.ts +0 -15
  58. package/src/State/Settings/SettingsProvider.tsx +0 -23
  59. package/src/State/Settings/useSettings.ts +0 -7
  60. package/src/components/Accordion/index.tsx +0 -57
  61. package/src/components/Accordion/wrapper.tsx +0 -107
  62. package/src/components/ActionList/index.tsx +0 -48
  63. package/src/components/ActionList/toggle-item.tsx +0 -59
  64. package/src/components/Avatar/index.tsx +0 -12
  65. package/src/components/Avatar/wrapper.tsx +0 -21
  66. package/src/components/Badge/index.tsx +0 -12
  67. package/src/components/Badge/wrapper.tsx +0 -32
  68. package/src/components/Blockquote/index.tsx +0 -32
  69. package/src/components/Blockquote/wrapper.tsx +0 -52
  70. package/src/components/Button/index.tsx +0 -226
  71. package/src/components/CheckMarkList/index.tsx +0 -21
  72. package/src/components/CheckMarkList/wrapper.tsx +0 -31
  73. package/src/components/Checklist/index.tsx +0 -51
  74. package/src/components/Checklist/wrapper.tsx +0 -65
  75. package/src/components/ColorSelect/index.tsx +0 -63
  76. package/src/components/ColorSelect/wrapper.tsx +0 -82
  77. package/src/components/ColumnRow/index.tsx +0 -20
  78. package/src/components/Container/index.tsx +0 -11
  79. package/src/components/Container/wrapper.tsx +0 -14
  80. package/src/components/Content/index.tsx +0 -15
  81. package/src/components/Content/wrapper.tsx +0 -61
  82. package/src/components/ContentLogo/index.tsx +0 -27
  83. package/src/components/DataList/index.tsx +0 -25
  84. package/src/components/DataList/wrapper.tsx +0 -29
  85. package/src/components/DetailBox/index.tsx +0 -34
  86. package/src/components/DetailBox/wrapper.tsx +0 -34
  87. package/src/components/ExtendContent/index.tsx +0 -43
  88. package/src/components/ExtendContent/wrapper.tsx +0 -41
  89. package/src/components/ExtendInfo/index.tsx +0 -32
  90. package/src/components/ExtendInfo/wrapper.tsx +0 -63
  91. package/src/components/Filter/index.tsx +0 -108
  92. package/src/components/Filter/wrapper.tsx +0 -79
  93. package/src/components/FilterPanel/checkListFacet.tsx +0 -46
  94. package/src/components/FilterPanel/colorFacet.tsx +0 -47
  95. package/src/components/FilterPanel/faceSelector.tsx +0 -53
  96. package/src/components/FilterPanel/index.tsx +0 -79
  97. package/src/components/FilterPanel/rangeFacet.tsx +0 -128
  98. package/src/components/FinancialOptions/LoanModal.tsx +0 -223
  99. package/src/components/FinancialOptions/index.tsx +0 -29
  100. package/src/components/FinancialOptions/leasing.tsx +0 -77
  101. package/src/components/FinancialOptions/loan.tsx +0 -87
  102. package/src/components/Gallery/MediaButton.tsx +0 -19
  103. package/src/components/Gallery/index.tsx +0 -227
  104. package/src/components/Gallery/wrapper.tsx +0 -323
  105. package/src/components/Grid/index.tsx +0 -87
  106. package/src/components/Grid/wrapper.tsx +0 -30
  107. package/src/components/Heading/index.tsx +0 -72
  108. package/src/components/Icon/index.tsx +0 -87
  109. package/src/components/InputCheckbox/index.tsx +0 -30
  110. package/src/components/InputCheckbox/wrapper.tsx +0 -87
  111. package/src/components/InputGroup/index.tsx +0 -24
  112. package/src/components/InputLabel/index.tsx +0 -14
  113. package/src/components/InputLabel/wrapper.tsx +0 -10
  114. package/src/components/InputSearch/index.tsx +0 -51
  115. package/src/components/InputSearch/wrapper.tsx +0 -97
  116. package/src/components/InputSelect/index.tsx +0 -35
  117. package/src/components/InputSelect/wrapper.tsx +0 -59
  118. package/src/components/InputText/index.tsx +0 -27
  119. package/src/components/InputText/wrapper.tsx +0 -57
  120. package/src/components/InsuranceOptions/Insurance.tsx +0 -60
  121. package/src/components/InsuranceOptions/InsuranceFree.tsx +0 -59
  122. package/src/components/InsuranceOptions/InsuranceFreeModal.tsx +0 -49
  123. package/src/components/InsuranceOptions/InsuranceModal.tsx +0 -253
  124. package/src/components/InsuranceOptions/index.tsx +0 -27
  125. package/src/components/Lightbox/index.tsx +0 -51
  126. package/src/components/Lightbox/wrapper.tsx +0 -97
  127. package/src/components/Loader/index.tsx +0 -18
  128. package/src/components/Loader/wrapper.tsx +0 -50
  129. package/src/components/LogoBox/index.tsx +0 -22
  130. package/src/components/LogoBox/wrapper.tsx +0 -19
  131. package/src/components/Map/index.tsx +0 -62
  132. package/src/components/Map/wrapper.tsx +0 -29
  133. package/src/components/Modal/index.tsx +0 -51
  134. package/src/components/Modal/wrapper.tsx +0 -127
  135. package/src/components/OpeningHours/index.tsx +0 -145
  136. package/src/components/OptionBox/index.tsx +0 -23
  137. package/src/components/OptionBox/wrapper.tsx +0 -56
  138. package/src/components/OverflowBox/index.tsx +0 -11
  139. package/src/components/OverflowBox/wrapper.tsx +0 -7
  140. package/src/components/OverflowGrid/index.tsx +0 -70
  141. package/src/components/Page/index.tsx +0 -46
  142. package/src/components/Panel/index.tsx +0 -50
  143. package/src/components/Panel/wrapper.tsx +0 -155
  144. package/src/components/Pdf/index.tsx +0 -46
  145. package/src/components/Pdf/wrapper.tsx +0 -61
  146. package/src/components/PhoneNumber/index.tsx +0 -33
  147. package/src/components/Portal/index.ts +0 -5
  148. package/src/components/Portal/portal-element.tsx +0 -9
  149. package/src/components/Portal/portal-namespace.ts +0 -1
  150. package/src/components/Portal/portal.tsx +0 -36
  151. package/src/components/Price/index.tsx +0 -12
  152. package/src/components/PriceTable/index.tsx +0 -34
  153. package/src/components/PriceTable/wrapper.tsx +0 -27
  154. package/src/components/ProductCard/index.tsx +0 -133
  155. package/src/components/ProductCard/wrapper.tsx +0 -147
  156. package/src/components/ProductPage/index.tsx +0 -99
  157. package/src/components/ProgressBar/index.tsx +0 -31
  158. package/src/components/ProgressBar/wrapper.tsx +0 -29
  159. package/src/components/RangeSlider/RangeSliderSimple.tsx +0 -90
  160. package/src/components/RangeSlider/SliderWithLabel.tsx +0 -62
  161. package/src/components/RangeSlider/handle.tsx +0 -26
  162. package/src/components/RangeSlider/index.tsx +0 -132
  163. package/src/components/RangeSlider/track.tsx +0 -19
  164. package/src/components/RangeSlider/wrapper.tsx +0 -93
  165. package/src/components/RangeSliderLabel/index.tsx +0 -18
  166. package/src/components/RangeSliderLabel/wrapper.tsx +0 -33
  167. package/src/components/Repeat/index.tsx +0 -21
  168. package/src/components/Result/index.tsx +0 -91
  169. package/src/components/Result/wrapper.tsx +0 -39
  170. package/src/components/Root/index.tsx +0 -24
  171. package/src/components/SearchBar/index.tsx +0 -48
  172. package/src/components/SearchFilter/index.tsx +0 -31
  173. package/src/components/SearchTerm/index.tsx +0 -23
  174. package/src/components/SearchTerm/wrapper.tsx +0 -71
  175. package/src/components/SectionHeader/index.tsx +0 -25
  176. package/src/components/SectionHeader/wrapper.tsx +0 -17
  177. package/src/components/Snackbar/index.tsx +0 -35
  178. package/src/components/Snackbar/wrapper.tsx +0 -65
  179. package/src/components/SortSelect/index.tsx +0 -35
  180. package/src/components/SortSelect/wrapper.tsx +0 -54
  181. package/src/components/Sphere/Sphere.tsx +0 -49
  182. package/src/components/Sphere/SphereLightbox.tsx +0 -10
  183. package/src/components/Sphere/SphereViewer.tsx +0 -81
  184. package/src/components/Sphere/wrapper.tsx +0 -253
  185. package/src/components/SrOnly/index.tsx +0 -14
  186. package/src/components/SwitchBar/index.tsx +0 -55
  187. package/src/components/SwitchBar/wrapper.tsx +0 -80
  188. package/src/components/TableColumn/index.tsx +0 -18
  189. package/src/components/TableList/index.tsx +0 -39
  190. package/src/components/Tabs/index.tsx +0 -34
  191. package/src/components/Tabs/wrapper.tsx +0 -82
  192. package/src/components/ThreeSixty/Rotation.tsx +0 -136
  193. package/src/components/ThreeSixty/ThreeSixtLightbox.tsx +0 -34
  194. package/src/components/ThreeSixty/ThreeSixty.tsx +0 -53
  195. package/src/components/UspList/index.tsx +0 -47
  196. package/src/components/UspList/wrapper.tsx +0 -92
  197. package/src/components/Utility/index.tsx +0 -17
  198. package/src/components/Video/CustomPlayer.tsx +0 -28
  199. package/src/components/Video/EmbeddedVideoLightbox.tsx +0 -31
  200. package/src/components/Video/EmbededVideo.tsx +0 -72
  201. package/src/components/Video/QuickNavEmbeded.tsx +0 -35
  202. package/src/components/Video/QuickNavVideo.tsx +0 -14
  203. package/src/components/Video/Video.tsx +0 -18
  204. package/src/components/Video/VimeoPlayer.tsx +0 -21
  205. package/src/components/Video/YoutubePlayer.tsx +0 -21
  206. package/src/components/Video/useThumbnail.ts +0 -28
  207. package/src/components/Video/utils.ts +0 -47
  208. package/src/components/Video/wrapper.tsx +0 -29
  209. package/src/hooks/useFetch.ts +0 -88
  210. package/src/hooks/useHasBeenVisible.ts +0 -17
  211. package/src/hooks/useHashGuid.ts +0 -33
  212. package/src/hooks/useInsurance.ts +0 -22
  213. package/src/hooks/useLoan.ts +0 -21
  214. package/src/hooks/useOnScreen.ts +0 -20
  215. package/src/hooks/useOutsideClick.ts +0 -19
  216. package/src/hooks/usePrevious.ts +0 -11
  217. package/src/hooks/useSearchItem.ts +0 -11
  218. package/src/hooks/useSearchItemBranch.ts +0 -14
  219. package/src/hooks/useSessionStorage.ts +0 -32
  220. package/src/hooks/useVimeoThumbnail.ts +0 -31
  221. package/src/images/map/marker.png +0 -0
  222. package/src/images/placeholders/staticmap.jpg +0 -0
  223. package/src/index-dev.tsx +0 -42
  224. package/src/index-esbuild.ts +0 -74
  225. package/src/index.ts +0 -72
  226. package/src/layout/helpers.tsx +0 -6
  227. package/src/layout/keyframes.tsx +0 -23
  228. package/src/layout/theme.ts +0 -60
  229. package/src/layouts/WaykeComposite.tsx +0 -64
  230. package/src/layouts/WaykeCompositeWithProvider.tsx +0 -17
  231. package/src/layouts/search/index.tsx +0 -124
  232. package/src/layouts/searchItem/Branch.tsx +0 -97
  233. package/src/layouts/searchItem/BranchModal.tsx +0 -67
  234. package/src/layouts/searchItem/CheckList.tsx +0 -146
  235. package/src/layouts/searchItem/ManufacturerPackagesOption.tsx +0 -54
  236. package/src/layouts/searchItem/MetadataItem.tsx +0 -74
  237. package/src/layouts/searchItem/PackageOptionModal.tsx +0 -54
  238. package/src/layouts/searchItem/PackageOptions.tsx +0 -58
  239. package/src/layouts/searchItem/Page404.tsx +0 -17
  240. package/src/layouts/searchItem/PageLoading.tsx +0 -17
  241. package/src/layouts/searchItem/Property.tsx +0 -134
  242. package/src/layouts/searchItem/Related.tsx +0 -120
  243. package/src/layouts/searchItem/index.tsx +0 -342
  244. package/src/providers/WaykeItemProvidet.tsx +0 -63
  245. package/src/providers/WaykeProvider.tsx +0 -75
  246. package/src/providers/graphqlProvider.tsx +0 -9
  247. package/src/providers/themeProvider.tsx +0 -15
  248. package/src/queries/INSURANCE_CALCULATION.ts +0 -43
  249. package/src/queries/LOAN_CALCULATION.ts +0 -39
  250. package/src/queries/SEARCH_ITEM_BRANCH_QUERY.ts +0 -120
  251. package/src/queries/SEARCH_ITEM_QUERY.ts +0 -237
  252. package/src/utils/constants.ts +0 -34
  253. package/src/utils/converters.ts +0 -45
  254. package/src/utils/deep-copy.ts +0 -6
  255. package/src/utils/formats.ts +0 -83
  256. package/src/utils/metadata.min.ts +0 -87
  257. package/src/utils/phonenumbers.ts +0 -17
  258. package/src/utils/pubsub/Actions.ts +0 -20
  259. package/src/utils/pubsub/Events.ts +0 -79
  260. package/src/utils/pubsub/pubsub.ts +0 -151
  261. package/src/utils/regex.ts +0 -13
  262. package/src/utils/sortOptions.ts +0 -36
  263. package/src/utils/specification.ts +0 -581
  264. package/src/utils/ssn.ts +0 -1
  265. package/src/utils/url.ts +0 -1
  266. package/src/utils/vehicle-properties/compare-basic-properties.ts +0 -63
  267. package/src/utils/vehicle-properties/compare-categories.ts +0 -45
  268. package/src/utils/vehicle-properties/compare-properties.ts +0 -5
  269. package/src/utils/vehicle-properties/custom-property-adder.ts +0 -163
  270. package/src/utils/vehicle-properties/property-hint-enricher.ts +0 -230
  271. package/src/utils/vehicle-properties/property-remover.ts +0 -28
  272. package/src/utils/vehicle-properties/property-tree-creator.ts +0 -171
  273. package/src/utils/vehicle-properties/property-tree-sorter.ts +0 -20
  274. package/tsconfig.build.json +0 -10
  275. package/tsconfig.eslint.json +0 -11
  276. package/tsconfig.json +0 -18
  277. package/webpack.analyze.js +0 -10
  278. 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;