|
| 1 | +import React, { Component } from 'react' |
| 2 | +import * as Spinners from 'react-spinners' |
| 3 | +import { SpinnerType, SpinnerSizeUnit } from './interfaces' |
| 4 | +import * as strings from './strings' |
| 5 | + |
| 6 | +interface Props { |
| 7 | + type: SpinnerType |
| 8 | + loading: boolean |
| 9 | + color?: string |
| 10 | + margin?: string |
| 11 | + size?: number | [number, number] |
| 12 | + sizeUnit?: SpinnerSizeUnit | [SpinnerSizeUnit, SpinnerSizeUnit] |
| 13 | +} |
| 14 | + |
| 15 | +class Spinner extends Component<Props, {}> { |
| 16 | + commonStyles = { |
| 17 | + loading: this.props.loading, |
| 18 | + color: this.props.color ? this.props.color : 'grey', |
| 19 | + margin: this.props.margin ? this.props.margin : '2px', |
| 20 | + } |
| 21 | + |
| 22 | + loaderStyles1 = { |
| 23 | + ...this.commonStyles, |
| 24 | + size: this.props.size ? (this.props.size as number) : 15, |
| 25 | + sizeUnit: this.props.sizeUnit ? (this.props.sizeUnit as SpinnerSizeUnit) : 'px', |
| 26 | + } |
| 27 | + |
| 28 | + loaderStyles2 = { |
| 29 | + ...this.commonStyles, |
| 30 | + width: this.props.size ? (this.props.size as [number, number])[0] : 5, |
| 31 | + height: this.props.size ? (this.props.size as [number, number])[1] : 15, |
| 32 | + widthUnit: this.props.sizeUnit |
| 33 | + ? (this.props.sizeUnit as [SpinnerSizeUnit, SpinnerSizeUnit])[0] |
| 34 | + : 'px', |
| 35 | + heightUnit: this.props.sizeUnit |
| 36 | + ? (this.props.sizeUnit as [SpinnerSizeUnit, SpinnerSizeUnit])[1] |
| 37 | + : 'px', |
| 38 | + } |
| 39 | + |
| 40 | + render() { |
| 41 | + switch (this.props.type) { |
| 42 | + case 'BarLoader': |
| 43 | + return <Spinners.BarLoader {...this.loaderStyles2} /> |
| 44 | + case 'BeatLoader': |
| 45 | + return <Spinners.BeatLoader {...this.loaderStyles1} /> |
| 46 | + case 'BounceLoader': |
| 47 | + return <Spinners.BounceLoader {...this.loaderStyles1} /> |
| 48 | + case 'ClimbingBoxLoader': |
| 49 | + return <Spinners.ClimbingBoxLoader {...this.loaderStyles1} /> |
| 50 | + case 'ClipLoader': |
| 51 | + return <Spinners.ClipLoader {...this.loaderStyles1} /> |
| 52 | + case 'DotLoader': |
| 53 | + return <Spinners.DotLoader {...this.loaderStyles1} /> |
| 54 | + case 'FadeLoader': |
| 55 | + return <Spinners.FadeLoader {...this.loaderStyles2} /> |
| 56 | + case 'PulseLoader': |
| 57 | + return <Spinners.PulseLoader {...this.loaderStyles1} /> |
| 58 | + case 'RotateLoader': |
| 59 | + return <Spinners.RotateLoader {...this.loaderStyles1} /> |
| 60 | + case 'ScaleLoader': |
| 61 | + return <Spinners.ScaleLoader {...this.loaderStyles2} /> |
| 62 | + case 'SyncLoader': |
| 63 | + return <Spinners.SyncLoader {...this.loaderStyles1} /> |
| 64 | + default: |
| 65 | + return <div>{strings.invalidSpinner}</div> |
| 66 | + } |
| 67 | + } |
| 68 | +} |
| 69 | + |
| 70 | +export { Spinner } |
0 commit comments