@react-slate/core
Version:
Write interactive CLI apps with React
85 lines • 3.04 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importDefault(require("react"));
const cli_spinners_1 = __importDefault(require("cli-spinners"));
const __1 = require("..");
class Spinner extends react_1.default.Component {
constructor() {
super(...arguments);
this.state = {
frame: this.getAnimation().frames[0],
index: 0,
};
}
getAnimation() {
const { type = 'dots', interval, frames } = this.props;
if (frames && typeof interval !== 'number') {
throw new Error('Spinner: Interval property must be specified when using custom frames');
}
if (typeof interval !== 'undefined' &&
(typeof interval !== 'number' || isNaN(interval) || interval <= 0)) {
throw new Error('Spinner: Interval property must be a number grater than 0');
}
if (frames) {
return {
frames,
interval: interval,
};
}
const spinner = cli_spinners_1.default[type];
return {
frames: spinner.frames,
interval: interval || spinner.interval,
};
}
start() {
const { frames, interval } = this.getAnimation();
if (this.intervalId) {
clearInterval(this.intervalId);
}
this.intervalId = setInterval(() => {
this.setState((state, props) => {
if (props.paused) {
return state;
}
const index = state.index === frames.length - 1
? 0
: Math.min(state.index + 1, frames.length - 1);
return { index, frame: frames[index] };
});
}, interval);
}
componentDidMount() {
this.start();
}
componentWillUnmount() {
if (this.intervalId) {
clearInterval(this.intervalId);
}
}
render() {
// eslint-disable-next-line
const _a = this.props, { frames, interval, type, paused } = _a, textStyle = __rest(_a, ["frames", "interval", "type", "paused"]);
return (
// <View>
react_1.default.createElement(__1.Text, Object.assign({}, textStyle), this.state.frame)
/* </View> */
);
}
}
exports.default = Spinner;
//# sourceMappingURL=Spinner.js.map