import { asyncStateColors, colorPallet } from '../styles/colors.js' import { Box, Text } from 'ink' import Spinner from 'ink-spinner' import React from 'react' import type { FC, ReactNode } from 'react' type ValueOf = T[keyof T] export type StepProps = { isActive?: boolean activeContent: React.ReactNode nonActiveContent: React.ReactNode name: string prompt: string color: ValueOf icon?: ReactNode children?: never hide?: boolean } const DEFAULT_DESIRED_WIDTH = 16 const formatName = (name: string, desiredWidth = DEFAULT_DESIRED_WIDTH) => { const leftWidth = Math.floor((desiredWidth - name.length) / 2) const rightWidth = Math.ceil((desiredWidth - name.length) / 2) return ' '.repeat(leftWidth) + name + ' '.repeat(rightWidth) } export const Step: FC = ({ hide = false, isActive, activeContent, nonActiveContent, name, color, icon, prompt, }) => { if (hide) { return <> } return ( {formatName( name, icon ? DEFAULT_DESIRED_WIDTH - 1 : DEFAULT_DESIRED_WIDTH, )} {prompt} {isActive ? activeContent : nonActiveContent} ) } export type AsyncStepState = 'loading' | 'error' | 'success' export type AsyncStepProps = { name: string state: AsyncStepState prompt: string successMessage: string errorMessage: string loadingMessage: string } export const AsyncStep: FC = ({ name, state, prompt, successMessage, loadingMessage, errorMessage, }) => { return ( {loadingMessage} ) } nonActiveContent={[ state === 'error' && ( {errorMessage} ), state === 'success' && ( {successMessage} ), ]} color={asyncStateColors[state]} prompt={prompt} icon={state === 'loading' ? : undefined} /> ) }