@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,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;