|
1
|
|
|
import React, { useState, useCallback } from 'react' |
|
2
|
|
|
import { Translate } from 'react-localize-redux' |
|
3
|
|
|
import Container from '~/modules/home/components/project/Container' |
|
4
|
|
|
import Header from '~/modules/home/components/common/section/Header' |
|
5
|
|
|
import Content from '~/modules/home/components/project/Content' |
|
6
|
|
|
import SelectedImage from '~/modules/home/components/project/SelectedImage' |
|
7
|
|
|
import { PROJECTS } from '~/modules/home/consts/pages' |
|
8
|
|
|
import Anchor, { |
|
9
|
|
|
ANCHOR_DISTANCE_TO_TOP_OF_SECTION |
|
10
|
|
|
} from '~/modules/home/components/common/Anchor' |
|
11
|
|
|
import Gallery from 'react-photo-gallery' |
|
12
|
|
|
import Carousel, { Modal, ModalGateway } from 'react-images' |
|
13
|
|
|
import { photos } from '~/modules/home/consts/photos.js' |
|
14
|
|
|
import useWindowDimensions from '~/modules/core/utils/useWindowDimensions' |
|
15
|
|
|
|
|
16
|
1 |
|
const Project = () => { |
|
17
|
1 |
|
const { width } = useWindowDimensions() |
|
18
|
1 |
|
const [currentImage, setCurrentImage] = useState(0) |
|
19
|
1 |
|
const [viewerIsOpen, setViewerIsOpen] = useState(false) |
|
20
|
|
|
|
|
21
|
1 |
|
const openLightbox = useCallback(index => { |
|
22
|
|
|
setCurrentImage(index) |
|
23
|
|
|
setViewerIsOpen(true) |
|
24
|
|
|
}, []) |
|
25
|
|
|
|
|
26
|
1 |
|
const closeLightbox = () => { |
|
27
|
|
|
setCurrentImage(0) |
|
28
|
|
|
setViewerIsOpen(false) |
|
29
|
|
|
} |
|
30
|
1 |
|
const imageRenderer = useCallback(({ index, key, photo }) => ( |
|
31
|
|
|
<SelectedImage |
|
32
|
|
|
key={key} |
|
33
|
|
|
margin={'2px'} |
|
34
|
|
|
index={index} |
|
35
|
|
|
photo={photo} |
|
36
|
|
|
onClick={openLightbox} |
|
37
|
|
|
/> |
|
38
|
|
|
)) |
|
39
|
|
|
|
|
40
|
1 |
|
return ( |
|
41
|
|
|
<Container> |
|
42
|
|
|
<Anchor id={PROJECTS} top={ANCHOR_DISTANCE_TO_TOP_OF_SECTION} /> |
|
43
|
|
|
<Header> |
|
44
|
|
|
<h2> |
|
45
|
|
|
<Translate id="Project: Title" /> |
|
46
|
|
|
</h2> |
|
47
|
|
|
<h4> |
|
48
|
|
|
<Translate id="Project: SubTitle" /> |
|
49
|
|
|
</h4> |
|
50
|
|
|
</Header> |
|
51
|
|
|
<Content> |
|
52
|
|
|
<Gallery |
|
53
|
|
|
photos={photos} |
|
54
|
|
|
direction={width < 768 ? 'column' : 'row'} |
|
55
|
|
|
renderImage={imageRenderer} |
|
56
|
|
|
/> |
|
57
|
|
|
<ModalGateway> |
|
58
|
|
|
{viewerIsOpen ? ( |
|
59
|
|
|
<Modal onClose={closeLightbox}> |
|
60
|
|
|
<Carousel |
|
61
|
|
|
currentIndex={currentImage} |
|
62
|
|
|
views={photos.map(x => ({ |
|
63
|
|
|
...x, |
|
64
|
|
|
src: `${x.src}.jpg`, |
|
65
|
|
|
srcSet: `${x.src}.jpg`, |
|
66
|
|
|
caption: x.title |
|
67
|
|
|
}))} |
|
68
|
|
|
/> |
|
69
|
|
|
</Modal> |
|
70
|
|
|
) : null} |
|
71
|
|
|
</ModalGateway> |
|
72
|
|
|
</Content> |
|
73
|
|
|
</Container> |
|
74
|
|
|
) |
|
75
|
|
|
} |
|
76
|
|
|
|
|
77
|
|
|
export default Project |
|
78
|
|
|
|