@performant-software/semantic-components 0.5.16-beta.0 → 0.5.16-beta.1
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/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/main.css +8 -0
- package/package.json +4 -6
- package/src/components/AudioPlayer.js +40 -22
- package/src/components/LazyAudio.js +21 -4
- package/src/components/LazyDocument.js +20 -3
- package/src/components/LazyImage.js +22 -5
- package/src/components/LazyLoader.css +7 -0
- package/src/components/LazyLoader.js +28 -0
- package/src/components/LazyVideo.js +30 -5
- package/src/components/PhotoViewer.js +38 -25
- package/src/components/VideoPlayer.js +23 -2
- package/src/i18n/en.json +24 -0
- package/types/components/AudioPlayer.js.flow +40 -22
- package/types/components/LazyAudio.js.flow +21 -4
- package/types/components/LazyDocument.js.flow +20 -3
- package/types/components/LazyImage.js.flow +22 -5
- package/types/components/LazyLoader.js.flow +28 -0
- package/types/components/LazyVideo.js.flow +30 -5
- package/types/components/PhotoViewer.js.flow +38 -25
- package/types/components/VideoPlayer.js.flow +23 -2
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from 'semantic-ui-react';
|
|
14
14
|
import i18n from '../i18n/i18n';
|
|
15
15
|
import AudioPlayer from './AudioPlayer';
|
|
16
|
+
import LazyLoader from './LazyLoader';
|
|
16
17
|
import './LazyAudio.css';
|
|
17
18
|
|
|
18
19
|
type Props = {
|
|
@@ -26,9 +27,11 @@ type Props = {
|
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
const LazyAudio = (props: Props) => {
|
|
29
|
-
const [visible, setVisible] = useState(false);
|
|
30
|
-
const [modal, setModal] = useState(false);
|
|
31
30
|
const [dimmer, setDimmer] = useState(false);
|
|
31
|
+
const [error, setError] = useState(false);
|
|
32
|
+
const [loaded, setLoaded] = useState(!props.preview);
|
|
33
|
+
const [modal, setModal] = useState(false);
|
|
34
|
+
const [visible, setVisible] = useState(false);
|
|
32
35
|
|
|
33
36
|
if (!visible) {
|
|
34
37
|
return (
|
|
@@ -60,14 +63,28 @@ const LazyAudio = (props: Props) => {
|
|
|
60
63
|
onMouseEnter={() => setDimmer(true)}
|
|
61
64
|
onMouseLeave={() => setDimmer(false)}
|
|
62
65
|
>
|
|
63
|
-
{
|
|
66
|
+
{ !loaded && (
|
|
67
|
+
<LazyLoader
|
|
68
|
+
active
|
|
69
|
+
size={props.size}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
{ !error && props.preview && (
|
|
64
73
|
<Image
|
|
65
74
|
{...props.image}
|
|
75
|
+
onError={() => {
|
|
76
|
+
setError(true);
|
|
77
|
+
setLoaded(true);
|
|
78
|
+
}}
|
|
79
|
+
onLoad={() => {
|
|
80
|
+
setError(false);
|
|
81
|
+
setLoaded(true);
|
|
82
|
+
}}
|
|
66
83
|
size={props.size}
|
|
67
84
|
src={props.preview}
|
|
68
85
|
/>
|
|
69
86
|
)}
|
|
70
|
-
{ !props.preview && (
|
|
87
|
+
{ (error || !props.preview) && (
|
|
71
88
|
<Image
|
|
72
89
|
{...props.image}
|
|
73
90
|
className='placeholder-image'
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from 'semantic-ui-react';
|
|
14
14
|
import i18n from '../i18n/i18n';
|
|
15
15
|
import DownloadButton from './DownloadButton';
|
|
16
|
+
import LazyLoader from './LazyLoader';
|
|
16
17
|
import './LazyDocument.css';
|
|
17
18
|
|
|
18
19
|
type Props = {
|
|
@@ -27,8 +28,10 @@ type Props = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const LazyDocument = (props: Props) => {
|
|
30
|
-
const [visible, setVisible] = useState(false);
|
|
31
31
|
const [dimmer, setDimmer] = useState(false);
|
|
32
|
+
const [error, setError] = useState(false);
|
|
33
|
+
const [loaded, setLoaded] = useState(!props.preview);
|
|
34
|
+
const [visible, setVisible] = useState(false);
|
|
32
35
|
|
|
33
36
|
if (!visible) {
|
|
34
37
|
return (
|
|
@@ -60,9 +63,23 @@ const LazyDocument = (props: Props) => {
|
|
|
60
63
|
onMouseEnter={() => setDimmer(true)}
|
|
61
64
|
onMouseLeave={() => setDimmer(false)}
|
|
62
65
|
>
|
|
63
|
-
{
|
|
66
|
+
{ !loaded && (
|
|
67
|
+
<LazyLoader
|
|
68
|
+
active
|
|
69
|
+
size={props.size}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
{ !error && props.preview && (
|
|
64
73
|
<Image
|
|
65
74
|
{...props.image}
|
|
75
|
+
onError={() => {
|
|
76
|
+
setError(true);
|
|
77
|
+
setLoaded(true);
|
|
78
|
+
}}
|
|
79
|
+
onLoad={() => {
|
|
80
|
+
setError(false);
|
|
81
|
+
setLoaded(true);
|
|
82
|
+
}}
|
|
66
83
|
src={props.preview}
|
|
67
84
|
size={props.size}
|
|
68
85
|
/>
|
|
@@ -81,7 +98,7 @@ const LazyDocument = (props: Props) => {
|
|
|
81
98
|
</Document>
|
|
82
99
|
</Image>
|
|
83
100
|
)}
|
|
84
|
-
{ !props.preview && !(props.src && props.pdf) && (
|
|
101
|
+
{ (error || (!props.preview && !(props.src && props.pdf))) && (
|
|
85
102
|
<Image
|
|
86
103
|
{...props.image}
|
|
87
104
|
className='placeholder-image'
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
Visibility
|
|
13
13
|
} from 'semantic-ui-react';
|
|
14
14
|
import i18n from '../i18n/i18n';
|
|
15
|
+
import LazyLoader from './LazyLoader';
|
|
15
16
|
import PhotoViewer from './PhotoViewer';
|
|
16
17
|
import './LazyImage.css';
|
|
17
18
|
|
|
@@ -26,9 +27,11 @@ type Props = {
|
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
const LazyImage = (props: Props) => {
|
|
29
|
-
const [visible, setVisible] = useState(false);
|
|
30
|
-
const [modal, setModal] = useState(false);
|
|
31
30
|
const [dimmer, setDimmer] = useState(false);
|
|
31
|
+
const [error, setError] = useState(false);
|
|
32
|
+
const [loaded, setLoaded] = useState(!(props.src || props.preview));
|
|
33
|
+
const [modal, setModal] = useState(false);
|
|
34
|
+
const [visible, setVisible] = useState(false);
|
|
32
35
|
|
|
33
36
|
if (!visible) {
|
|
34
37
|
return (
|
|
@@ -60,14 +63,28 @@ const LazyImage = (props: Props) => {
|
|
|
60
63
|
onMouseEnter={() => setDimmer(true)}
|
|
61
64
|
onMouseLeave={() => setDimmer(false)}
|
|
62
65
|
>
|
|
63
|
-
{
|
|
66
|
+
{ !loaded && (
|
|
67
|
+
<LazyLoader
|
|
68
|
+
active
|
|
69
|
+
size={props.size}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
{ !error && (props.preview || props.src) && (
|
|
64
73
|
<Image
|
|
65
74
|
{...props.image}
|
|
75
|
+
onError={() => {
|
|
76
|
+
setError(true);
|
|
77
|
+
setLoaded(true);
|
|
78
|
+
}}
|
|
79
|
+
onLoad={() => {
|
|
80
|
+
setError(false);
|
|
81
|
+
setLoaded(true);
|
|
82
|
+
}}
|
|
66
83
|
size={props.size}
|
|
67
84
|
src={props.preview || props.src}
|
|
68
85
|
/>
|
|
69
86
|
)}
|
|
70
|
-
{ !(props.preview || props.src) && (
|
|
87
|
+
{ (error || !(props.preview || props.src)) && (
|
|
71
88
|
<Image
|
|
72
89
|
{...props.image}
|
|
73
90
|
className='placeholder-image'
|
|
@@ -79,7 +96,7 @@ const LazyImage = (props: Props) => {
|
|
|
79
96
|
/>
|
|
80
97
|
</Image>
|
|
81
98
|
)}
|
|
82
|
-
{ (props.src || props.children) && props.dimmable && (
|
|
99
|
+
{ !error && (props.src || props.children) && props.dimmable && (
|
|
83
100
|
<Dimmer
|
|
84
101
|
active={dimmer}
|
|
85
102
|
>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Image, Loader } from 'semantic-ui-react';
|
|
5
|
+
import './LazyLoader.css';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
active: boolean,
|
|
9
|
+
size: string
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const LazyLoader = (props: Props) => (
|
|
13
|
+
<Image
|
|
14
|
+
className='lazy-loader'
|
|
15
|
+
size={props.size}
|
|
16
|
+
>
|
|
17
|
+
<Loader
|
|
18
|
+
active={props.active}
|
|
19
|
+
/>
|
|
20
|
+
</Image>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
LazyLoader.defaultProps = {
|
|
24
|
+
active: false,
|
|
25
|
+
size: 'small'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default LazyLoader;
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
Visibility
|
|
13
13
|
} from 'semantic-ui-react';
|
|
14
14
|
import i18n from '../i18n/i18n';
|
|
15
|
+
import LazyLoader from './LazyLoader';
|
|
15
16
|
import VideoPlayer from './VideoPlayer';
|
|
16
17
|
import './LazyVideo.css';
|
|
17
18
|
|
|
@@ -29,9 +30,11 @@ type Props = {
|
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
const LazyVideo = (props: Props) => {
|
|
32
|
-
const [visible, setVisible] = useState(false);
|
|
33
|
-
const [modal, setModal] = useState(false);
|
|
34
33
|
const [dimmer, setDimmer] = useState(false);
|
|
34
|
+
const [error, setError] = useState(false);
|
|
35
|
+
const [loaded, setLoaded] = useState(!(props.preview || props.src));
|
|
36
|
+
const [modal, setModal] = useState(false);
|
|
37
|
+
const [visible, setVisible] = useState(false);
|
|
35
38
|
|
|
36
39
|
if (!visible) {
|
|
37
40
|
return (
|
|
@@ -63,24 +66,46 @@ const LazyVideo = (props: Props) => {
|
|
|
63
66
|
onMouseEnter={() => setDimmer(true)}
|
|
64
67
|
onMouseLeave={() => setDimmer(false)}
|
|
65
68
|
>
|
|
66
|
-
{
|
|
69
|
+
{ !loaded && (
|
|
70
|
+
<LazyLoader
|
|
71
|
+
active
|
|
72
|
+
size={props.size}
|
|
73
|
+
/>
|
|
74
|
+
)}
|
|
75
|
+
{ !error && props.preview && (
|
|
67
76
|
<Image
|
|
68
77
|
{...props.image}
|
|
78
|
+
onError={() => {
|
|
79
|
+
setError(true);
|
|
80
|
+
setLoaded(true);
|
|
81
|
+
}}
|
|
82
|
+
onLoad={() => {
|
|
83
|
+
setError(false);
|
|
84
|
+
setLoaded(true);
|
|
85
|
+
}}
|
|
69
86
|
src={props.preview}
|
|
70
87
|
size={props.size}
|
|
71
88
|
/>
|
|
72
89
|
)}
|
|
73
|
-
{ !props.preview && props.src && (
|
|
90
|
+
{ !error && !props.preview && props.src && (
|
|
74
91
|
<Image
|
|
75
92
|
{...props.image}
|
|
76
93
|
size={props.size}
|
|
77
94
|
>
|
|
78
95
|
<video
|
|
96
|
+
onError={() => {
|
|
97
|
+
setError(true);
|
|
98
|
+
setLoaded(true);
|
|
99
|
+
}}
|
|
100
|
+
onLoadedData={() => {
|
|
101
|
+
setError(false);
|
|
102
|
+
setLoaded(true);
|
|
103
|
+
}}
|
|
79
104
|
src={props.src}
|
|
80
105
|
/>
|
|
81
106
|
</Image>
|
|
82
107
|
)}
|
|
83
|
-
{ !props.preview && !props.src && (
|
|
108
|
+
{ (error || (!props.preview && !props.src)) && (
|
|
84
109
|
<Image
|
|
85
110
|
{...props.image}
|
|
86
111
|
className='placeholder-image'
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { Image, Modal } from 'semantic-ui-react';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { Image, Message, Modal } from 'semantic-ui-react';
|
|
5
5
|
import ModalContext from '../context/ModalContext';
|
|
6
6
|
import './PhotoViewer.css';
|
|
7
|
+
import i18n from '../i18n/i18n';
|
|
7
8
|
|
|
8
9
|
type Props = {
|
|
9
10
|
alt?: string,
|
|
@@ -13,29 +14,41 @@ type Props = {
|
|
|
13
14
|
size?: string
|
|
14
15
|
};
|
|
15
16
|
|
|
16
|
-
const PhotoViewer = (props: Props) =>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
)
|
|
17
|
+
const PhotoViewer = (props: Props) => {
|
|
18
|
+
const [error, setError] = useState(false);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<ModalContext.Consumer>
|
|
22
|
+
{(mountNode) => (
|
|
23
|
+
<Modal
|
|
24
|
+
centered={false}
|
|
25
|
+
className='photo-viewer'
|
|
26
|
+
closeIcon
|
|
27
|
+
mountNode={mountNode}
|
|
28
|
+
onClose={props.onClose.bind(this)}
|
|
29
|
+
open={props.open}
|
|
30
|
+
size={props.size}
|
|
31
|
+
>
|
|
32
|
+
<Modal.Content>
|
|
33
|
+
{ error && (
|
|
34
|
+
<Message
|
|
35
|
+
content={i18n.t('PhotoViewer.errors.path.content', { path: props.image })}
|
|
36
|
+
header={i18n.t('PhotoViewer.errors.path.header')}
|
|
37
|
+
icon='exclamation circle'
|
|
38
|
+
/>
|
|
39
|
+
)}
|
|
40
|
+
<Image
|
|
41
|
+
alt={props.alt}
|
|
42
|
+
fluid
|
|
43
|
+
onError={() => setError(true)}
|
|
44
|
+
src={props.image}
|
|
45
|
+
/>
|
|
46
|
+
</Modal.Content>
|
|
47
|
+
</Modal>
|
|
48
|
+
)}
|
|
49
|
+
</ModalContext.Consumer>
|
|
50
|
+
);
|
|
51
|
+
};
|
|
39
52
|
|
|
40
53
|
PhotoViewer.defaultProps = {
|
|
41
54
|
size: 'small'
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
import React, {
|
|
4
|
-
|
|
3
|
+
import React, {
|
|
4
|
+
useEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
useState,
|
|
7
|
+
type Element
|
|
8
|
+
} from 'react';
|
|
9
|
+
import {
|
|
10
|
+
Embed,
|
|
11
|
+
Message,
|
|
12
|
+
Modal,
|
|
13
|
+
Ref
|
|
14
|
+
} from 'semantic-ui-react';
|
|
5
15
|
import ModalContext from '../context/ModalContext';
|
|
6
16
|
import './VideoPlayer.css';
|
|
17
|
+
import i18n from '../i18n/i18n';
|
|
7
18
|
|
|
8
19
|
type Props = {
|
|
9
20
|
autoPlay?: boolean,
|
|
@@ -18,6 +29,8 @@ type Props = {
|
|
|
18
29
|
};
|
|
19
30
|
|
|
20
31
|
const VideoPlayer = (props: Props) => {
|
|
32
|
+
const [error, setError] = useState(false);
|
|
33
|
+
|
|
21
34
|
const embedRef = useRef();
|
|
22
35
|
|
|
23
36
|
/**
|
|
@@ -46,6 +59,13 @@ const VideoPlayer = (props: Props) => {
|
|
|
46
59
|
size={props.size}
|
|
47
60
|
>
|
|
48
61
|
<Modal.Content>
|
|
62
|
+
{ error && (
|
|
63
|
+
<Message
|
|
64
|
+
content={i18n.t('VideoPlayer.errors.path.content', { path: props.video })}
|
|
65
|
+
header={i18n.t('VideoPlayer.errors.path.header')}
|
|
66
|
+
icon='exclamation circle'
|
|
67
|
+
/>
|
|
68
|
+
)}
|
|
49
69
|
{ props.embedded && (
|
|
50
70
|
<Ref
|
|
51
71
|
innerRef={embedRef}
|
|
@@ -63,6 +83,7 @@ const VideoPlayer = (props: Props) => {
|
|
|
63
83
|
<video
|
|
64
84
|
autoPlay={props.autoPlay}
|
|
65
85
|
controls
|
|
86
|
+
onError={() => setError(true)}
|
|
66
87
|
src={props.video}
|
|
67
88
|
/>
|
|
68
89
|
)}
|