1- import React , { Component } from 'react' ;
1+ import React from 'react' ;
22import PropTypes from 'prop-types' ;
33
44const defaultLoaderStyle = {
@@ -21,54 +21,54 @@ const defaultSpinnerStyle = {
2121 height : 100 ,
2222} ;
2323
24- class Loader extends Component {
25- static propTypes = {
26- color : PropTypes . string ,
27- loading : PropTypes . bool ,
28- background : PropTypes . string ,
24+ const Loader = ( props ) => {
25+ const { promiseInProgress } = props . promiseTracker ? props . promiseTracker ( ) : false ;
26+ const loaderStyle = {
27+ ... defaultLoaderStyle ,
28+ background : props . background ,
2929 } ;
30+ const spinnerItemsArray = [
31+ { transform : 'rotate(0 50 50)' , begin : '-0.9166666666666666s' } ,
32+ { transform : 'rotate(30 50 50)' , begin : '-0.8333333333333334s' } ,
33+ { transform : 'rotate(60 50 50)' , begin : '-0.75s' } ,
34+ { transform : 'rotate(90 50 50)' , begin : '-0.6666666666666666s' } ,
35+ { transform : 'rotate(120 50 50)' , begin : '-0.5833333333333334s' } ,
36+ { transform : 'rotate(150 50 50)' , begin : '-0.5s' } ,
37+ { transform : 'rotate(180 50 50)' , begin : '-0.4166666666666667s' } ,
38+ { transform : 'rotate(210 50 50)' , begin : '-0.3333333333333333s' } ,
39+ { transform : 'rotate(240 50 50)' , begin : '-0.25s' } ,
40+ { transform : 'rotate(270 50 50)' , begin : '-0.16666666666666666s' } ,
41+ { transform : 'rotate(300 50 50)' , begin : '-0.08333333333333333s' } ,
42+ { transform : 'rotate(330 50 50)' , begin : '0s' } ,
43+ ] ;
44+ return (
45+ props . loading || promiseInProgress
46+ ? < div style = { loaderStyle } >
47+ < div style = { defaultSpinnerStyle } >
48+ < svg className = "lds-spinner" width = "100%" height = "100%" xmlns = "http://www.w3.org/2000/svg"
49+ viewBox = "0 0 100 100" preserveAspectRatio = "xMidYMid" >
50+ { spinnerItemsArray . map ( ( item ) => < g key = { item . transform } transform = { item . transform } >
51+ < rect x = "47" y = "24" rx = "9.4" ry = "4.8" width = "6" height = "12" fill = { props . color } >
52+ < animate attributeName = "opacity" values = "1;0" keyTimes = "0;1" dur = "1s" begin = { item . begin } repeatCount = "indefinite" />
53+ </ rect >
54+ </ g > ) }
55+ </ svg >
56+ </ div >
57+ </ div > : ''
58+ ) ;
59+ } ;
3060
31- static defaultProps = {
32- color : '#000' ,
33- loading : false ,
34- background : 'rgba(255,255,255,.5)' ,
35- } ;
61+ Loader . propTypes = {
62+ color : PropTypes . string ,
63+ loading : PropTypes . bool ,
64+ background : PropTypes . string ,
65+ promiseTracker : PropTypes . any ,
66+ } ;
3667
37- render ( ) {
38- const loaderStyle = {
39- ...defaultLoaderStyle ,
40- background : this . props . background ,
41- } ;
42- const spinnerItemsArray = [
43- { transform : 'rotate(0 50 50)' , begin : '-0.9166666666666666s' } ,
44- { transform : 'rotate(30 50 50)' , begin : '-0.8333333333333334s' } ,
45- { transform : 'rotate(60 50 50)' , begin : '-0.75s' } ,
46- { transform : 'rotate(90 50 50)' , begin : '-0.6666666666666666s' } ,
47- { transform : 'rotate(120 50 50)' , begin : '-0.5833333333333334s' } ,
48- { transform : 'rotate(150 50 50)' , begin : '-0.5s' } ,
49- { transform : 'rotate(180 50 50)' , begin : '-0.4166666666666667s' } ,
50- { transform : 'rotate(210 50 50)' , begin : '-0.3333333333333333s' } ,
51- { transform : 'rotate(240 50 50)' , begin : '-0.25s' } ,
52- { transform : 'rotate(270 50 50)' , begin : '-0.16666666666666666s' } ,
53- { transform : 'rotate(300 50 50)' , begin : '-0.08333333333333333s' } ,
54- { transform : 'rotate(330 50 50)' , begin : '0s' } ,
55- ] ;
56- return (
57- this . props . loading
58- && < div style = { loaderStyle } >
59- < div style = { defaultSpinnerStyle } >
60- < svg className = "lds-spinner" width = "100%" height = "100%" xmlns = "http://www.w3.org/2000/svg"
61- viewBox = "0 0 100 100" preserveAspectRatio = "xMidYMid" >
62- { spinnerItemsArray . map ( ( item ) => < g key = { item . transform } transform = { item . transform } >
63- < rect x = "47" y = "24" rx = "9.4" ry = "4.8" width = "6" height = "12" fill = { this . props . color } >
64- < animate attributeName = "opacity" values = "1;0" keyTimes = "0;1" dur = "1s" begin = { item . begin } repeatCount = "indefinite" />
65- </ rect >
66- </ g > ) }
67- </ svg >
68- </ div >
69- </ div >
70- ) ;
71- }
72- }
68+ Loader . defaultProps = {
69+ color : '#000' ,
70+ loading : false ,
71+ background : 'rgba(255,255,255,.5)' ,
72+ } ;
7373
7474export default Loader ;
0 commit comments