@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.
- package/dist/index.js +5529 -5460
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +320 -257
- package/dist/index.mjs.map +2 -2
- package/package.json +4 -2
- package/.editorconfig +0 -10
- package/.eslintrc.js +0 -62
- package/.github/workflows/release-to-production.yaml +0 -40
- package/.github/workflows/release-to-test.yaml +0 -40
- package/.prettierrc +0 -12
- package/assets/ajax-loader.gif +0 -0
- package/assets/default.css +0 -1
- package/assets/fonts/slick.eot +0 -0
- package/assets/fonts/slick.svg +0 -14
- package/assets/fonts/slick.ttf +0 -0
- package/assets/fonts/slick.woff +0 -0
- package/codegen.yml +0 -19
- package/esbuild/build.js +0 -39
- package/esbuild/common.js +0 -15
- package/esbuild/start.js +0 -21
- package/esbuild/www/index.html +0 -32
- package/example/src/@types/global.d.ts +0 -7
- package/example/src/@types/react-panellum.d.ts +0 -1
- package/example/src/App.tsx +0 -77
- package/example/src/assets/style/ecom.css +0 -63
- package/example/src/assets/style/theme.css +0 -83
- package/example/src/index.html +0 -26
- package/example/src/index.tsx +0 -11
- package/example/src/routes/HashRoute/index.tsx +0 -30
- package/example/src/routes/Home/index.tsx +0 -33
- package/example/src/routes/NotFound/index.tsx +0 -5
- package/example/src/routes/PathRoute/index.tsx +0 -35
- package/example/src/routes/Search/index.tsx +0 -28
- package/example/src/routes/SearchItem/index.tsx +0 -28
- package/example/src/routes/index.tsx +0 -25
- package/src/@types/action.ts +0 -3
- package/src/@types/codegen/types.ts +0 -366
- package/src/@types/filter.ts +0 -18
- package/src/@types/queryFilter.ts +0 -5
- package/src/@types/react-panellum.d.ts +0 -1
- package/src/@types/search.ts +0 -118
- package/src/@types/theme.d.ts +0 -5
- package/src/@types/vehicle-properties.ts +0 -33
- package/src/State/CentralStorage/CentralStorageContext.ts +0 -10
- package/src/State/CentralStorage/CentralStorageProvider.tsx +0 -21
- package/src/State/CentralStorage/useCentralStorage.ts +0 -37
- package/src/State/Path/PathContext.ts +0 -11
- package/src/State/Path/PathProvider.tsx +0 -66
- package/src/State/Path/reducer.ts +0 -30
- package/src/State/Path/usePath.ts +0 -13
- package/src/State/RelatedSearch/RelatedSearchContext.ts +0 -18
- package/src/State/RelatedSearch/RelatedSearchProvider.tsx +0 -55
- package/src/State/RelatedSearch/useRelatedSearch.ts +0 -20
- package/src/State/Search/SearchContext.ts +0 -27
- package/src/State/Search/SearchProvider.tsx +0 -243
- package/src/State/Search/useSearch.ts +0 -6
- package/src/State/Settings/SettingsContext.ts +0 -15
- package/src/State/Settings/SettingsProvider.tsx +0 -23
- package/src/State/Settings/useSettings.ts +0 -7
- package/src/components/Accordion/index.tsx +0 -57
- package/src/components/Accordion/wrapper.tsx +0 -107
- package/src/components/ActionList/index.tsx +0 -48
- package/src/components/ActionList/toggle-item.tsx +0 -59
- package/src/components/Avatar/index.tsx +0 -12
- package/src/components/Avatar/wrapper.tsx +0 -21
- package/src/components/Badge/index.tsx +0 -12
- package/src/components/Badge/wrapper.tsx +0 -32
- package/src/components/Blockquote/index.tsx +0 -32
- package/src/components/Blockquote/wrapper.tsx +0 -52
- package/src/components/Button/index.tsx +0 -226
- package/src/components/CheckMarkList/index.tsx +0 -21
- package/src/components/CheckMarkList/wrapper.tsx +0 -31
- package/src/components/Checklist/index.tsx +0 -51
- package/src/components/Checklist/wrapper.tsx +0 -65
- package/src/components/ColorSelect/index.tsx +0 -63
- package/src/components/ColorSelect/wrapper.tsx +0 -82
- package/src/components/ColumnRow/index.tsx +0 -20
- package/src/components/Container/index.tsx +0 -11
- package/src/components/Container/wrapper.tsx +0 -14
- package/src/components/Content/index.tsx +0 -15
- package/src/components/Content/wrapper.tsx +0 -61
- package/src/components/ContentLogo/index.tsx +0 -27
- package/src/components/DataList/index.tsx +0 -25
- package/src/components/DataList/wrapper.tsx +0 -29
- package/src/components/DetailBox/index.tsx +0 -34
- package/src/components/DetailBox/wrapper.tsx +0 -34
- package/src/components/ExtendContent/index.tsx +0 -43
- package/src/components/ExtendContent/wrapper.tsx +0 -41
- package/src/components/ExtendInfo/index.tsx +0 -32
- package/src/components/ExtendInfo/wrapper.tsx +0 -63
- package/src/components/Filter/index.tsx +0 -108
- package/src/components/Filter/wrapper.tsx +0 -79
- package/src/components/FilterPanel/checkListFacet.tsx +0 -46
- package/src/components/FilterPanel/colorFacet.tsx +0 -47
- package/src/components/FilterPanel/faceSelector.tsx +0 -53
- package/src/components/FilterPanel/index.tsx +0 -79
- package/src/components/FilterPanel/rangeFacet.tsx +0 -128
- package/src/components/FinancialOptions/LoanModal.tsx +0 -223
- package/src/components/FinancialOptions/index.tsx +0 -29
- package/src/components/FinancialOptions/leasing.tsx +0 -77
- package/src/components/FinancialOptions/loan.tsx +0 -87
- package/src/components/Gallery/MediaButton.tsx +0 -19
- package/src/components/Gallery/index.tsx +0 -227
- package/src/components/Gallery/wrapper.tsx +0 -323
- package/src/components/Grid/index.tsx +0 -87
- package/src/components/Grid/wrapper.tsx +0 -30
- package/src/components/Heading/index.tsx +0 -72
- package/src/components/Icon/index.tsx +0 -87
- package/src/components/InputCheckbox/index.tsx +0 -30
- package/src/components/InputCheckbox/wrapper.tsx +0 -87
- package/src/components/InputGroup/index.tsx +0 -24
- package/src/components/InputLabel/index.tsx +0 -14
- package/src/components/InputLabel/wrapper.tsx +0 -10
- package/src/components/InputSearch/index.tsx +0 -51
- package/src/components/InputSearch/wrapper.tsx +0 -97
- package/src/components/InputSelect/index.tsx +0 -35
- package/src/components/InputSelect/wrapper.tsx +0 -59
- package/src/components/InputText/index.tsx +0 -27
- package/src/components/InputText/wrapper.tsx +0 -57
- package/src/components/InsuranceOptions/Insurance.tsx +0 -60
- package/src/components/InsuranceOptions/InsuranceFree.tsx +0 -59
- package/src/components/InsuranceOptions/InsuranceFreeModal.tsx +0 -49
- package/src/components/InsuranceOptions/InsuranceModal.tsx +0 -253
- package/src/components/InsuranceOptions/index.tsx +0 -27
- package/src/components/Lightbox/index.tsx +0 -51
- package/src/components/Lightbox/wrapper.tsx +0 -97
- package/src/components/Loader/index.tsx +0 -18
- package/src/components/Loader/wrapper.tsx +0 -50
- package/src/components/LogoBox/index.tsx +0 -22
- package/src/components/LogoBox/wrapper.tsx +0 -19
- package/src/components/Map/index.tsx +0 -62
- package/src/components/Map/wrapper.tsx +0 -29
- package/src/components/Modal/index.tsx +0 -51
- package/src/components/Modal/wrapper.tsx +0 -127
- package/src/components/OpeningHours/index.tsx +0 -145
- package/src/components/OptionBox/index.tsx +0 -23
- package/src/components/OptionBox/wrapper.tsx +0 -56
- package/src/components/OverflowBox/index.tsx +0 -11
- package/src/components/OverflowBox/wrapper.tsx +0 -7
- package/src/components/OverflowGrid/index.tsx +0 -70
- package/src/components/Page/index.tsx +0 -46
- package/src/components/Panel/index.tsx +0 -50
- package/src/components/Panel/wrapper.tsx +0 -155
- package/src/components/Pdf/index.tsx +0 -46
- package/src/components/Pdf/wrapper.tsx +0 -61
- package/src/components/PhoneNumber/index.tsx +0 -33
- package/src/components/Portal/index.ts +0 -5
- package/src/components/Portal/portal-element.tsx +0 -9
- package/src/components/Portal/portal-namespace.ts +0 -1
- package/src/components/Portal/portal.tsx +0 -36
- package/src/components/Price/index.tsx +0 -12
- package/src/components/PriceTable/index.tsx +0 -34
- package/src/components/PriceTable/wrapper.tsx +0 -27
- package/src/components/ProductCard/index.tsx +0 -133
- package/src/components/ProductCard/wrapper.tsx +0 -147
- package/src/components/ProductPage/index.tsx +0 -99
- package/src/components/ProgressBar/index.tsx +0 -31
- package/src/components/ProgressBar/wrapper.tsx +0 -29
- package/src/components/RangeSlider/RangeSliderSimple.tsx +0 -90
- package/src/components/RangeSlider/SliderWithLabel.tsx +0 -62
- package/src/components/RangeSlider/handle.tsx +0 -26
- package/src/components/RangeSlider/index.tsx +0 -132
- package/src/components/RangeSlider/track.tsx +0 -19
- package/src/components/RangeSlider/wrapper.tsx +0 -93
- package/src/components/RangeSliderLabel/index.tsx +0 -18
- package/src/components/RangeSliderLabel/wrapper.tsx +0 -33
- package/src/components/Repeat/index.tsx +0 -21
- package/src/components/Result/index.tsx +0 -91
- package/src/components/Result/wrapper.tsx +0 -39
- package/src/components/Root/index.tsx +0 -24
- package/src/components/SearchBar/index.tsx +0 -48
- package/src/components/SearchFilter/index.tsx +0 -31
- package/src/components/SearchTerm/index.tsx +0 -23
- package/src/components/SearchTerm/wrapper.tsx +0 -71
- package/src/components/SectionHeader/index.tsx +0 -25
- package/src/components/SectionHeader/wrapper.tsx +0 -17
- package/src/components/Snackbar/index.tsx +0 -35
- package/src/components/Snackbar/wrapper.tsx +0 -65
- package/src/components/SortSelect/index.tsx +0 -35
- package/src/components/SortSelect/wrapper.tsx +0 -54
- package/src/components/Sphere/Sphere.tsx +0 -49
- package/src/components/Sphere/SphereLightbox.tsx +0 -10
- package/src/components/Sphere/SphereViewer.tsx +0 -81
- package/src/components/Sphere/wrapper.tsx +0 -253
- package/src/components/SrOnly/index.tsx +0 -14
- package/src/components/SwitchBar/index.tsx +0 -55
- package/src/components/SwitchBar/wrapper.tsx +0 -80
- package/src/components/TableColumn/index.tsx +0 -18
- package/src/components/TableList/index.tsx +0 -39
- package/src/components/Tabs/index.tsx +0 -34
- package/src/components/Tabs/wrapper.tsx +0 -82
- package/src/components/ThreeSixty/Rotation.tsx +0 -136
- package/src/components/ThreeSixty/ThreeSixtLightbox.tsx +0 -34
- package/src/components/ThreeSixty/ThreeSixty.tsx +0 -53
- package/src/components/UspList/index.tsx +0 -47
- package/src/components/UspList/wrapper.tsx +0 -92
- package/src/components/Utility/index.tsx +0 -17
- package/src/components/Video/CustomPlayer.tsx +0 -28
- package/src/components/Video/EmbeddedVideoLightbox.tsx +0 -31
- package/src/components/Video/EmbededVideo.tsx +0 -72
- package/src/components/Video/QuickNavEmbeded.tsx +0 -35
- package/src/components/Video/QuickNavVideo.tsx +0 -14
- package/src/components/Video/Video.tsx +0 -18
- package/src/components/Video/VimeoPlayer.tsx +0 -21
- package/src/components/Video/YoutubePlayer.tsx +0 -21
- package/src/components/Video/useThumbnail.ts +0 -28
- package/src/components/Video/utils.ts +0 -47
- package/src/components/Video/wrapper.tsx +0 -29
- package/src/hooks/useFetch.ts +0 -88
- package/src/hooks/useHasBeenVisible.ts +0 -17
- package/src/hooks/useHashGuid.ts +0 -33
- package/src/hooks/useInsurance.ts +0 -22
- package/src/hooks/useLoan.ts +0 -21
- package/src/hooks/useOnScreen.ts +0 -20
- package/src/hooks/useOutsideClick.ts +0 -19
- package/src/hooks/usePrevious.ts +0 -11
- package/src/hooks/useSearchItem.ts +0 -11
- package/src/hooks/useSearchItemBranch.ts +0 -14
- package/src/hooks/useSessionStorage.ts +0 -32
- package/src/hooks/useVimeoThumbnail.ts +0 -31
- package/src/images/map/marker.png +0 -0
- package/src/images/placeholders/staticmap.jpg +0 -0
- package/src/index-dev.tsx +0 -42
- package/src/index-esbuild.ts +0 -74
- package/src/index.ts +0 -72
- package/src/layout/helpers.tsx +0 -6
- package/src/layout/keyframes.tsx +0 -23
- package/src/layout/theme.ts +0 -60
- package/src/layouts/WaykeComposite.tsx +0 -64
- package/src/layouts/WaykeCompositeWithProvider.tsx +0 -17
- package/src/layouts/search/index.tsx +0 -124
- package/src/layouts/searchItem/Branch.tsx +0 -97
- package/src/layouts/searchItem/BranchModal.tsx +0 -67
- package/src/layouts/searchItem/CheckList.tsx +0 -146
- package/src/layouts/searchItem/ManufacturerPackagesOption.tsx +0 -54
- package/src/layouts/searchItem/MetadataItem.tsx +0 -74
- package/src/layouts/searchItem/PackageOptionModal.tsx +0 -54
- package/src/layouts/searchItem/PackageOptions.tsx +0 -58
- package/src/layouts/searchItem/Page404.tsx +0 -17
- package/src/layouts/searchItem/PageLoading.tsx +0 -17
- package/src/layouts/searchItem/Property.tsx +0 -134
- package/src/layouts/searchItem/Related.tsx +0 -120
- package/src/layouts/searchItem/index.tsx +0 -342
- package/src/providers/WaykeItemProvidet.tsx +0 -63
- package/src/providers/WaykeProvider.tsx +0 -75
- package/src/providers/graphqlProvider.tsx +0 -9
- package/src/providers/themeProvider.tsx +0 -15
- package/src/queries/INSURANCE_CALCULATION.ts +0 -43
- package/src/queries/LOAN_CALCULATION.ts +0 -39
- package/src/queries/SEARCH_ITEM_BRANCH_QUERY.ts +0 -120
- package/src/queries/SEARCH_ITEM_QUERY.ts +0 -237
- package/src/utils/constants.ts +0 -34
- package/src/utils/converters.ts +0 -45
- package/src/utils/deep-copy.ts +0 -6
- package/src/utils/formats.ts +0 -83
- package/src/utils/metadata.min.ts +0 -87
- package/src/utils/phonenumbers.ts +0 -17
- package/src/utils/pubsub/Actions.ts +0 -20
- package/src/utils/pubsub/Events.ts +0 -79
- package/src/utils/pubsub/pubsub.ts +0 -151
- package/src/utils/regex.ts +0 -13
- package/src/utils/sortOptions.ts +0 -36
- package/src/utils/specification.ts +0 -581
- package/src/utils/ssn.ts +0 -1
- package/src/utils/url.ts +0 -1
- package/src/utils/vehicle-properties/compare-basic-properties.ts +0 -63
- package/src/utils/vehicle-properties/compare-categories.ts +0 -45
- package/src/utils/vehicle-properties/compare-properties.ts +0 -5
- package/src/utils/vehicle-properties/custom-property-adder.ts +0 -163
- package/src/utils/vehicle-properties/property-hint-enricher.ts +0 -230
- package/src/utils/vehicle-properties/property-remover.ts +0 -28
- package/src/utils/vehicle-properties/property-tree-creator.ts +0 -171
- package/src/utils/vehicle-properties/property-tree-sorter.ts +0 -20
- package/tsconfig.build.json +0 -10
- package/tsconfig.eslint.json +0 -11
- package/tsconfig.json +0 -18
- package/webpack.analyze.js +0 -10
- 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
|
-
`;
|
package/src/hooks/useFetch.ts
DELETED
|
@@ -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;
|