@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,34 +0,0 @@
1
- import React, { useState, useCallback } from 'react';
2
-
3
- import { Item, Img } from '../Lightbox/wrapper';
4
- import MediaButton from '../Gallery/MediaButton';
5
- import Rotation from './Rotation';
6
-
7
- type PropsType = {
8
- urls: string[];
9
- };
10
-
11
- const ThreeSixtyLightbox = ({ urls }: PropsType) => {
12
- const [started, setStarted] = useState(false);
13
-
14
- const onStart = useCallback(() => setStarted(true), []);
15
-
16
- if (!started) {
17
- return (
18
- <Item>
19
- <Img src={urls[0]} alt="alt" />
20
- <MediaButton text="Starta 360° exteriört" onClick={onStart} />
21
- </Item>
22
- );
23
- }
24
-
25
- return (
26
- <Rotation>
27
- {urls.map((image, i) => (
28
- <Img key={image} src={image} alt={`Bild ${i + 1}`} />
29
- ))}
30
- </Rotation>
31
- );
32
- };
33
-
34
- export default ThreeSixtyLightbox;
@@ -1,53 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Image } from '../Gallery/wrapper';
4
- import MediaButton from '../Gallery/MediaButton';
5
- import Rotation from './Rotation';
6
-
7
- const onMediaClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>, func: () => void) => {
8
- e.stopPropagation();
9
- e.preventDefault();
10
- func();
11
- };
12
-
13
- type PropsType = {
14
- urls: string[];
15
- navigationDisabled: boolean;
16
- visible: boolean;
17
- onDisableNavigation: () => void;
18
- };
19
-
20
- const ThreeSixty = ({ urls, visible, onDisableNavigation, navigationDisabled }: PropsType) => {
21
- if (!visible || (!navigationDisabled && visible)) {
22
- return (
23
- <>
24
- <Image src={urls[0]} alt="alt" />
25
- <MediaButton
26
- text="Starta 360° exteriört"
27
- onClick={(e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void =>
28
- onMediaClick(e, onDisableNavigation)
29
- }
30
- />
31
- </>
32
- );
33
- }
34
- if (navigationDisabled && visible) {
35
- return (
36
- <div
37
- onClick={(e) => {
38
- e.stopPropagation();
39
- e.preventDefault();
40
- }}
41
- >
42
- <Rotation>
43
- {urls.map((image, i) => (
44
- <Image key={image} src={image} alt={`Bild ${i + 1}`} />
45
- ))}
46
- </Rotation>
47
- </div>
48
- );
49
- }
50
- return null;
51
- };
52
-
53
- export default ThreeSixty;
@@ -1,47 +0,0 @@
1
- import React from 'react';
2
-
3
- import { List, Item, Box, ItemSection, Action } from './wrapper';
4
- import { IconInfo } from '../Icon/index';
5
-
6
- export interface ItemProps {
7
- title: string | number | null;
8
- onClick?: () => void;
9
- }
10
-
11
- export interface Props {
12
- items?: ItemProps[];
13
- small?: boolean;
14
- }
15
-
16
- const UspItem = ({ title, onClick }: ItemProps) => {
17
- return (
18
- <Item>
19
- <Box>
20
- <ItemSection>{title}</ItemSection>
21
- {onClick && (
22
- <ItemSection>
23
- <Action onClick={onClick}>
24
- <IconInfo block />
25
- </Action>
26
- </ItemSection>
27
- )}
28
- </Box>
29
- </Item>
30
- );
31
- };
32
-
33
- const UspList = ({ items, small }: Props) => {
34
- if (!items) {
35
- return null;
36
- }
37
-
38
- return (
39
- <List isSmall={small}>
40
- {items.map((item, index) => (
41
- <UspItem key={`${item.title}-${index}`} title={item.title} onClick={item.onClick} />
42
- ))}
43
- </List>
44
- );
45
- };
46
-
47
- export default UspList;
@@ -1,92 +0,0 @@
1
- import styled, { css } from 'styled-components';
2
-
3
- import { size } from '../../layout/helpers';
4
- import { ButtonReset } from '../Button/index';
5
-
6
- export const Item = styled.li`
7
- padding: ${size(0.5)};
8
- `;
9
-
10
- export const Box = styled.div`
11
- display: flex;
12
- align-items: center;
13
- background-color: ${(props) => props.theme.color.accentDark};
14
- padding: ${size(1)} ${size(1.5)};
15
- border-radius: 3px;
16
- font-size: 0.875rem;
17
- overflow-wrap: break-word;
18
- hyphens: auto;
19
- `;
20
-
21
- export const ItemSection = styled.div`
22
- & + & {
23
- margin-left: ${size(1)};
24
- }
25
- `;
26
-
27
- export const Action = styled(ButtonReset).attrs(() => ({
28
- className: 'wayke__theme wayke__color--primary-text',
29
- }))`
30
- position: relative;
31
- display: block;
32
- transform-origin: 50% 50%;
33
- transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);
34
-
35
- :before {
36
- content: '';
37
- position: absolute;
38
- top: ${size(-0.5)};
39
- bottom: ${size(-0.5)};
40
- left: ${size(-0.5)};
41
- right: ${size(-0.5)};
42
- background-color: ${(props) => props.theme.color.accent};
43
- border-radius: 50%;
44
- opacity: 0;
45
- transition: opacity 200ms ease;
46
- }
47
-
48
- > * {
49
- position: relative;
50
- z-index: 1;
51
- }
52
-
53
- :hover {
54
- :before {
55
- opacity: 1;
56
- }
57
- }
58
-
59
- :active {
60
- transform: scale(0.95);
61
- }
62
- `;
63
-
64
- export const List = styled.ul`
65
- display: flex;
66
- align-items: center;
67
- flex-wrap: wrap;
68
- list-style: none;
69
- padding: 0;
70
- margin: ${size(-0.5)};
71
-
72
- ${({ isSmall }: { isSmall?: boolean }) =>
73
- isSmall &&
74
- css`
75
- margin: ${size(-0.25)};
76
-
77
- ${Item} {
78
- padding: ${size(0.25)};
79
- }
80
-
81
- ${Box} {
82
- padding: ${size(0.5)} ${size(1)};
83
- font-size: 0.75rem;
84
- }
85
-
86
- ${ItemSection} {
87
- & + & {
88
- margin-left: ${size(0.5)};
89
- }
90
- }
91
- `}
92
- `;
@@ -1,17 +0,0 @@
1
- import styled from 'styled-components';
2
-
3
- export const UtilityTextRight = styled.div`
4
- text-align: right;
5
- `;
6
-
7
- export const UtilityFontSizeSmall = styled.span`
8
- font-size: 0.875rem;
9
- `;
10
-
11
- export const UtilityTextPrimary = styled.span.attrs(() => ({
12
- className: 'wayke__theme wayke__color--primary-text',
13
- }))``;
14
-
15
- export const UtilityTextBold = styled.span.attrs(() => ({
16
- className: 'wayke__theme wayke__font--bold',
17
- }))``;
@@ -1,28 +0,0 @@
1
- import React from 'react';
2
- import { Wrapper } from './wrapper';
3
- import Video from './Video';
4
-
5
- type PropsType = {
6
- url?: string;
7
- modal?: boolean;
8
- controls?: boolean;
9
- ratio?: string;
10
- isPreview?: boolean;
11
- };
12
-
13
- const CustomPlayer = ({ url, controls, modal, ratio = '56.25%', isPreview }: PropsType) => {
14
- return (
15
- <Wrapper ratio={ratio} isPreview={isPreview}>
16
- <Video
17
- key={url}
18
- modal={modal}
19
- preload="metadata"
20
- controls={controls}
21
- width="100%"
22
- height="100%"
23
- src={url}
24
- />
25
- </Wrapper>
26
- );
27
- };
28
- export default CustomPlayer;
@@ -1,31 +0,0 @@
1
- import React from 'react';
2
-
3
- import YouTubePlayer from './YoutubePlayer';
4
- import VimeoPlayer from './VimeoPlayer';
5
- import CustomPlayer from '../Video/CustomPlayer';
6
-
7
- const ytNames = ['youtube.com', 'youtu.be'];
8
- const isYouTubeVideo = (url: string): boolean =>
9
- ytNames.some((host: string): boolean => url.indexOf(host) >= 0);
10
-
11
- const vNames = ['vimeo.com'];
12
- const isVimeoVideo = (url: string): boolean =>
13
- vNames.some((host: string): boolean => url.indexOf(host) >= 0);
14
-
15
- type PropsType = {
16
- url: string;
17
- autoplay?: boolean;
18
- controls?: boolean;
19
- };
20
-
21
- const VideoPlayer = ({ url, autoplay = false, controls = true }: PropsType) => {
22
- if (!url) return null;
23
-
24
- if (isYouTubeVideo(url)) return <YouTubePlayer url={url} autoplay={autoplay} />;
25
-
26
- if (isVimeoVideo(url)) return <VimeoPlayer url={url} autoplay={autoplay} />;
27
-
28
- return <CustomPlayer ratio="56.25%" controls={controls} url={url} />;
29
- };
30
-
31
- export default VideoPlayer;
@@ -1,72 +0,0 @@
1
- import React, { useState, useCallback } from 'react';
2
-
3
- import useThumbnail from './useThumbnail';
4
- import { ImageFull } from '../Gallery/wrapper';
5
- import MediaButton from '../Gallery/MediaButton';
6
- import Modal from '../Modal/index';
7
- import VideoPlayer from './EmbeddedVideoLightbox';
8
- import { onImageLoad, onImageError } from './utils';
9
- import CustomPlayer from '../Video/CustomPlayer';
10
-
11
- interface GalleryEmbed {
12
- src: string;
13
- index: number;
14
- controls?: boolean;
15
- }
16
-
17
- const GalleryEmbed = ({ src, index }: GalleryEmbed) => {
18
- const [modal, setModal] = useState<string>();
19
- const thumbnail = useThumbnail(src);
20
-
21
- const onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
22
- e.stopPropagation();
23
- setModal(src);
24
- };
25
-
26
- const onCloseModal = (e: React.MouseEvent<HTMLButtonElement | HTMLDivElement, MouseEvent>) => {
27
- e.stopPropagation();
28
- setModal(undefined);
29
- };
30
-
31
- const onError = useCallback(
32
- (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),
33
- [thumbnail]
34
- );
35
-
36
- const onLoad = useCallback(
37
- (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),
38
- [thumbnail]
39
- );
40
-
41
- const customVideo = src.toLowerCase().endsWith('.mp4');
42
-
43
- if (thumbnail?.length && !customVideo) {
44
- return (
45
- <>
46
- <ImageFull onLoad={onLoad} src={thumbnail[0]} onError={onError} alt={`Bild ${index + 1}`} />
47
- <MediaButton text="Spela video" onClick={onClick} />
48
- {modal && (
49
- <Modal title="Video" onClose={onCloseModal}>
50
- <VideoPlayer url={modal} />
51
- </Modal>
52
- )}
53
- </>
54
- );
55
- }
56
-
57
- if (customVideo)
58
- return (
59
- <>
60
- <CustomPlayer ratio="66.66%" isPreview controls={false} url={src} />
61
- <MediaButton text="Spela video" onClick={onClick} />
62
- {modal && (
63
- <Modal title="Video" onClose={onCloseModal}>
64
- <VideoPlayer url={modal} />
65
- </Modal>
66
- )}
67
- </>
68
- );
69
- return null;
70
- };
71
-
72
- export default GalleryEmbed;
@@ -1,35 +0,0 @@
1
- import React, { useCallback } from 'react';
2
-
3
- import useThumbnail from './useThumbnail';
4
- import { QuickNavImg } from '../Gallery/wrapper';
5
- import { onImageLoad, onImageError } from './utils';
6
- import CustomPlayer from '../Video/CustomPlayer';
7
-
8
- interface QuickNavEmbededProps {
9
- src?: string;
10
- index: number;
11
- }
12
-
13
- const QuickNavEmbeded = ({ src, index }: QuickNavEmbededProps) => {
14
- const thumbnail = useThumbnail(src);
15
- const onError = useCallback(
16
- (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),
17
- [thumbnail]
18
- );
19
-
20
- const onLoad = useCallback(
21
- (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),
22
- [thumbnail]
23
- );
24
-
25
- const customVideo = src?.toLowerCase().endsWith('.mp4');
26
-
27
- if (thumbnail?.length && !customVideo)
28
- return (
29
- <QuickNavImg onLoad={onLoad} src={thumbnail[0]} onError={onError} alt={`Bild ${index + 1}`} />
30
- );
31
- if (customVideo) return <CustomPlayer key={index} url={src} ratio="66.66%" />;
32
- return null;
33
- };
34
-
35
- export default QuickNavEmbeded;
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
-
3
- import CustomPlayer from './CustomPlayer';
4
-
5
- interface QuickNavVideo {
6
- src?: string;
7
- index: number;
8
- }
9
-
10
- const QuickNavVideo = ({ src, index }: QuickNavVideo) => {
11
- return <CustomPlayer key={index} url={src} ratio="66.666%" />;
12
- };
13
-
14
- export default QuickNavVideo;
@@ -1,18 +0,0 @@
1
- import React from 'react';
2
- import styled from 'styled-components';
3
-
4
- type VideoProps = React.DetailedHTMLProps<
5
- React.HTMLAttributes<HTMLVideoElement>,
6
- HTMLVideoElement
7
- > & {
8
- modal?: boolean;
9
- };
10
-
11
- const Video = styled.video<VideoProps>`
12
- position: absolute;
13
- top: 0;
14
- left: 0;
15
- object-fit: ${({ modal }) => (modal ? 'contain' : 'cover')};
16
- `;
17
-
18
- export default Video;
@@ -1,21 +0,0 @@
1
- import React from 'react';
2
- import { getVimeoId } from './utils';
3
-
4
- import { Wrapper, Iframe } from './wrapper';
5
-
6
- type PropsType = {
7
- url: string;
8
- autoplay: boolean;
9
- };
10
-
11
- const VimeoPlayer = ({ url, autoplay }: PropsType) => (
12
- <Wrapper>
13
- <Iframe
14
- src={`https://player.vimeo.com/video/${getVimeoId(url)}?${
15
- autoplay ? '&autoplay=1' : ''
16
- }&loop=0&autopause=0`}
17
- />
18
- </Wrapper>
19
- );
20
-
21
- export default VimeoPlayer;
@@ -1,21 +0,0 @@
1
- import React from 'react';
2
- import { getYouTubeId } from './utils';
3
-
4
- import { Wrapper, Iframe } from './wrapper';
5
-
6
- type PropsType = {
7
- url: string;
8
- autoplay: boolean;
9
- };
10
-
11
- const YouTubePlayer = ({ url, autoplay }: PropsType) => (
12
- <Wrapper>
13
- <Iframe
14
- src={`https://www.youtube.com/embed/${getYouTubeId(url)}?&enablejsapi=1&?rel=0${
15
- autoplay ? '&autoplay=1' : ''
16
- }`}
17
- />
18
- </Wrapper>
19
- );
20
-
21
- export default YouTubePlayer;
@@ -1,28 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { getVimeoId, getYoutubeThumbnail } from './utils';
3
- import useVimeoThumbnail from '../../hooks/useVimeoThumbnail';
4
-
5
- const useThumbnail = (url?: string | null, small?: boolean) => {
6
- if (url?.toLowerCase().endsWith('.mp4')) return;
7
-
8
- const [thumbnail, setThumbnail] = useState<string[]>();
9
- const vimeoId = url ? getVimeoId(url) : undefined;
10
- const vimeoThumbnail = useVimeoThumbnail(vimeoId, small);
11
-
12
- useEffect(() => {
13
- if (url) {
14
- const youtubeThumbnail = getYoutubeThumbnail(url);
15
- if (youtubeThumbnail) {
16
- if (small) {
17
- setThumbnail([youtubeThumbnail.mqdefault]);
18
- } else {
19
- setThumbnail([youtubeThumbnail.maxresdefault, youtubeThumbnail.hqdefault]);
20
- }
21
- }
22
- }
23
- }, [url]);
24
-
25
- return vimeoThumbnail ? [vimeoThumbnail] : thumbnail;
26
- };
27
-
28
- export default useThumbnail;
@@ -1,47 +0,0 @@
1
- export const getVimeoId = (url: string): string => {
2
- const regExp = /\/(\d+)/;
3
- const match = url.match(regExp);
4
- return match && match[1].length > 3 ? match[1] : '';
5
- };
6
-
7
- export const getYouTubeId = (url: string): string => {
8
- const regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
9
- const match = url.match(regExp);
10
- return match && match[7].length === 11 ? match[7] : '';
11
- };
12
-
13
- const youtubeBase = 'https://img.youtube.com/vi/';
14
- export const getYoutubeThumbnail = (url: string) => {
15
- const id = getYouTubeId(url);
16
- if (!id) {
17
- return undefined;
18
- }
19
- return {
20
- maxresdefault: `${youtubeBase}${id}/maxresdefault.jpg`,
21
- hqdefault: `${youtubeBase}${id}/hqdefault.jpg`,
22
- mqdefault: `${youtubeBase}${id}/mqdefault.jpg`,
23
- };
24
- };
25
-
26
- export const onImageLoad = (
27
- e: React.SyntheticEvent<HTMLImageElement, Event>,
28
- thumbnail?: string[]
29
- ) => {
30
- if (
31
- thumbnail?.length === 2 &&
32
- e.currentTarget.src === thumbnail[0] &&
33
- e.currentTarget.naturalWidth === 120 &&
34
- e.currentTarget.naturalHeight === 90
35
- ) {
36
- e.currentTarget.src = thumbnail[1];
37
- }
38
- };
39
-
40
- export const onImageError = (
41
- e: React.SyntheticEvent<HTMLImageElement, Event>,
42
- thumbnail?: string[]
43
- ) => {
44
- if (thumbnail?.length === 2) {
45
- e.currentTarget.src = thumbnail[1];
46
- }
47
- };
@@ -1,29 +0,0 @@
1
- import styled from 'styled-components';
2
-
3
- type WrapperProps = React.DetailedHTMLProps<
4
- React.HTMLAttributes<HTMLDivElement>,
5
- HTMLDivElement
6
- > & {
7
- ratio?: string;
8
- isPreview?: boolean;
9
- };
10
-
11
- export const Wrapper = styled.div<WrapperProps>`
12
- position: relative;
13
- width: 100%;
14
- height: ${(props) => (props.isPreview ? '100%' : 0)};
15
- padding-bottom: ${(props): string => (props.ratio ? props.ratio : '56.25%')};
16
- `;
17
-
18
- export const Iframe = styled.iframe.attrs(() => ({
19
- width: '100%',
20
- height: '100%',
21
- allowFullScreen: true,
22
- frameBorder: '0',
23
- }))`
24
- position: absolute;
25
- top: 0;
26
- left: 0;
27
- width: 100%;
28
- height: 100%;
29
- `;
@@ -1,88 +0,0 @@
1
- import { useEffect, useState, useCallback } from 'react';
2
-
3
- const cache: { [key: string]: unknown | undefined } = {};
4
-
5
- const getCachedResult = <T>(key: string) => (cache?.[key] as T) || undefined;
6
- const setCachedResult = <T>(key: string, value: T) => {
7
- cache[key] = value;
8
- };
9
-
10
- /**
11
- * Reusing already fired request by attaching to same promise.
12
- * Usefull if multiple request is fetching from same endpoint, while
13
- * the first request has not been finished (so no cache exist yet).
14
- */
15
-
16
- let pendingPromise: { [key: string]: Promise<globalThis.Response> } = {};
17
- const isPendingPromise = (url: string) => !!pendingPromise[url];
18
- const setPendingPromise = (url: string, promise: Promise<globalThis.Response>) => {
19
- pendingPromise = {
20
- ...pendingPromise,
21
- [url]: promise,
22
- };
23
- };
24
- const clearPendingPromise = (url: string) => {
25
- delete pendingPromise[url];
26
- };
27
-
28
- interface Response<T> {
29
- loading: boolean;
30
- data?: T;
31
- error: boolean;
32
- }
33
-
34
- const useFetch = <T>(
35
- path: RequestInfo,
36
- options?: RequestInit,
37
- skip?: boolean,
38
- promiseCache?: boolean
39
- ): Response<T> => {
40
- const [data, setData] = useState<T | undefined>();
41
- const [loading, setLoading] = useState(false);
42
- const [error, setError] = useState(false);
43
-
44
- const doFetch = useCallback(async () => {
45
- const key = path.toString();
46
- const cached = getCachedResult<T>(key);
47
- setError(false);
48
- if (cached) {
49
- setData(cached);
50
- return;
51
- }
52
- setLoading(true);
53
- try {
54
- const reusePromise = promiseCache && isPendingPromise(key);
55
- const request = reusePromise ? pendingPromise[key] : fetch(path, options);
56
- if (promiseCache) {
57
- setPendingPromise(key, request);
58
- }
59
-
60
- const result = await request;
61
- if (result.ok) {
62
- const json = await result.clone().json();
63
- setCachedResult(key, json);
64
- setData(json);
65
- }
66
- } catch (e) {
67
- setError(true);
68
- } finally {
69
- setLoading(false);
70
- clearPendingPromise(key);
71
- }
72
- return;
73
- }, [path, options]);
74
-
75
- useEffect(() => {
76
- if (!skip) {
77
- doFetch();
78
- }
79
- }, [path, skip]);
80
-
81
- return {
82
- loading,
83
- data,
84
- error,
85
- };
86
- };
87
-
88
- export default useFetch;