A library for easily managing loading spinners in complex React applications.
:star: This library is basically a clone of @chevtek/react-spinners with this pull request merged.
$ npm i @simply007org/react-spinners --save
If you're running npm v8 or higher then --save
is implied if you don't include it.
First import the Spinner
component and use it anywhere in your app.
// ./src/App.jsx
import * as React from 'react';
import { Spinner } from '@simply007org/react-spinners';
export default class YourComponent extends React.Component {
...
render() {
return (
<div>
...
<Spinner name="mySpinner">
Loading...
</Spinner>
</div>
);
}
}
Now just import the spinnerService
wherever you need it.
// ./src/services/yourService.js
import { spinnerService } from '@simply007org/react-spinners';
function beginSomeOperation() {
spinnerService.show('mySpinner');
doSomething().then(() => {
spinnerService.hide('mySpinner');
});
}
@Simply/react-spinners
contains a singleton instance of SpinnerService
for your convenience and as you've seen above all you have to do is import and use it. Optionally, you can create your own instance of the SpinnerService
and pass that to your Spinner
components instead. This is useful in certain situations such as centralizing all your dependencies to be used for dependency injection.
import { Spinner, SpinnerServie } from '@simply007org/react-spinners';
const yourCustomSpinnerService = new SpinnerService();
...
function SomeDumbComponent() {
return (
<Spinner name="yourSpinner" spinnerService={yourCustomSpinnerService}>
Loading...
</Spinner>
);
}
In this way you can declare the spinner service in a centralized location and have greater control over where you store this singleton.
The spinner component gives you several options.
The name attribute is required. It is what you must pass to the service when trying to show/hide that specific spinner.
<spinner name="mySpinner"></spinner>
Optionally a group name may be specified so that you can show/hide groups of spinners.
<spinner name="mySpinner" group="foo"></spinner>
<spinner name="mySpinner2" group="foo"></spinner>
<spinner name="mySpinner3" group="bar"></spinner>
this.spinnerService.showGroup('foo');
By default all spinners are hidden when first registered. You can set a spinner to be visible by default by setting the show
property to true
.
<spinner name="mySpinner" show={true}></spinner>
Passing in a loading image is the simplest way to create a quick spinner.
<spinner name="mySpinner" loadingImage="/path/to/loading.gif"></spinner>
If you want to disable the loading image entirely then simply do not specify the loadingImage
property and an image won't be used. If you don't include the loadingImage
option then be sure to specify some custom markup within the spinner component itself so it can be used instead.
If you need more control over the kind of spinner you want to display, beyond just a simple animated image. You are able to supply any custom markup that you need by simply nesting it within the spinner component. Any content will be projeced into the spinner template below the loadingImage
if one was specified.
<spinner name="mySpinner">
<h3>Loading...</h3>
</spinner>
Content projection is the most common way to use the SpinnerComponent
as it allows you to pass in custom markup and use CSS animations instead of just an animated .gif image.
The most common way of interacting with your spinners is via the spinnerService
. This service can be injected just like any other Angular service. Once you have reference to the service you can take advantage of several methods.
import { spinnerService } from '@simply007org/react-spinners';
import * as axios from 'axios'; // replace with your preferred ajax request library
function loadData() {
spinnerService.show('mySpinner');
axios.get('/some/url/for/data/')
.then(res => {
spinnerService.hide('mySpinner');
// do stuff with res
})
.catch(err => {
spinnerService.hide('mySpinner');
// log error
});
}
The show
method allows you to display a specific spinner by name.
<spinner name="mySpinner" loadingImage="/path/to/loader.gif"></spinner>
spinnerService.show('mySpinner');
Works exactly like show
but hides the spinner element.
The showGroup
method allows you to display all spinners with the same group name.
<spinner name="spinner1" group="foo"></spinner>
<spinner name="spinner2" group="foo"></spinner>
<spinner name="spinner3" group="bar"></spinner>
spinnerService.showGroup('foo');
Spinners 1 and 2 would show but spinner 3 would not since it is not part of group "foo".
Works exactly the same as showGroup
except it hides the spinners instead.
Hopefully it's obvious that this method will show every single spinner registered with the service. This method is rarely used but is there for parity just in case.
The hideAll
method is identical to showAll
except it hides every spinner that is registered. This method also isn't used very often but is extremely useful in global error handlers. We all know how much users HATE frozen spinners, right?
The isShowing
method returns a boolean indicating whether or not the specified spinner is currently showing.