@oclif/multi-stage-output
Version:
Terminal output for oclif commands with multiple stages
60 lines (59 loc) • 2.45 kB
JavaScript
import spinners from 'cli-spinners';
import { Box, Text } from 'ink';
import React, { useEffect, useState } from 'react';
import { Icon } from './icon.js';
function useSpinner({ type = 'dots' }) {
const [frame, setFrame] = useState(0);
const spinner = spinners[type];
useEffect(() => {
const timer = setInterval(() => {
setFrame((previousFrame) => {
const isLastFrame = previousFrame === spinner.frames.length - 1;
return isLastFrame ? 0 : previousFrame + 1;
});
}, spinner.interval);
return () => {
clearInterval(timer);
};
}, [spinner]);
return {
frame: spinner.frames[frame] ?? '',
};
}
export function Spinner({ isBold, label, labelPosition = 'right', type }) {
const { frame } = useSpinner({ type });
return (React.createElement(Box, null,
label && labelPosition === 'left' ? React.createElement(Text, null,
label,
" ") : null,
isBold ? (React.createElement(Text, { bold: true, color: "magenta" }, frame)) : (React.createElement(Text, { color: "magenta" }, frame)),
label && labelPosition === 'right' ? React.createElement(Text, null,
" ",
label) : null));
}
export function SpinnerOrError({ design, error, labelPosition = 'right', ...props }) {
if (error) {
return (React.createElement(Box, null,
props.label && labelPosition === 'left' ? React.createElement(Text, null,
props.label,
" ") : null,
React.createElement(Icon, { icon: design.icons.failed }),
props.label && labelPosition === 'right' ? React.createElement(Text, null,
" ",
props.label) : null));
}
return React.createElement(Spinner, { labelPosition: labelPosition, ...props });
}
export function SpinnerOrErrorOrChildren({ children, error, ...props }) {
if (children) {
return (React.createElement(Box, { flexWrap: "wrap" },
props.label && props.labelPosition === 'left' ? React.createElement(Text, null,
props.label,
" ") : null,
children,
props.label && props.labelPosition === 'right' ? React.createElement(Text, null,
" ",
props.label) : null));
}
return React.createElement(SpinnerOrError, { error: error, ...props });
}