UNPKG

@oclif/multi-stage-output

Version:

Terminal output for oclif commands with multiple stages

60 lines (59 loc) 2.45 kB
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 }); }