Files
Iris/src/js/components/Loader.js

96 lines
2.1 KiB
JavaScript
Raw Normal View History

import React, { memo } from 'react';
import Icon from './Icon';
const ProgressRing = ({ radius, stroke, progress }) => {
const normalizedRadius = radius - stroke * 2;
const circumference = normalizedRadius * 2 * Math.PI;
const strokeDashoffset = circumference - progress * circumference;
return (
<svg
className="loader__spinner__progress"
height={radius * 2}
width={radius * 2}
style={{
transform: `rotate(-90deg) translate(${stroke}px, -${stroke}px)`,
}}
>
<circle
stroke="white"
fill="transparent"
strokeWidth={stroke}
strokeDasharray={`${circumference} ${circumference}`}
strokeDashoffset={strokeDashoffset}
r={normalizedRadius}
cx={radius}
cy={radius}
/>
</svg>
);
};
export default memo((props) => {
const {
body,
loading,
mini,
lazy,
white,
className = '',
progress = null,
} = props;
if (!loading) {
return null;
}
let classNameString = 'loader';
if (className) {
classNameString += ` ${className}`;
}
if (mini) {
classNameString += ' loader--mini';
}
if (body) {
classNameString += ' loader--body';
}
if (lazy) {
classNameString += ' loader--lazy';
}
if (white) {
classNameString += ' loader--white';
}
if (!navigator.onLine) {
return (
<div className={classNameString}>
<div className="loader__offline">
<Icon name="wifi_off" />
<p> You need to be online load this resource </p>
</div>
</div>
);
}
if (progress) {
classNameString += ' loader--progress';
return (
<div className={classNameString}>
<div className="loader__spinner">
<ProgressRing
stroke="2"
radius={mini ? '12' : '60'}
progress={progress}
/>
</div>
</div>
);
}
return (
<div className={classNameString}>
<div className="loader__spinner" />
</div>
);
});