Skip to content

Commit b8caedf

Browse files
committed
feat: fixed bug with tty outputs not showing
1 parent ad2ff3c commit b8caedf

File tree

3 files changed

+68
-7
lines changed

3 files changed

+68
-7
lines changed

src/ui/components/default-component.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { ImportParametersForm } from './import/index.js';
1212
import { PlanComponent } from './plan/plan.js';
1313
import { ProgressDisplay, ProgressState } from './progress/progress-display.js';
1414

15+
const spinnerEmitter = new EventEmitter();
16+
1517
export function DefaultComponent(props: {
1618
emitter: EventEmitter
1719
}) {
@@ -48,7 +50,8 @@ export function DefaultComponent(props: {
4850
})
4951

5052
emitter.on(RenderEvent.LOG, (log: string) => {
51-
console.log(chalk.cyan(log))
53+
console.log(chalk.cyan(log));
54+
spinnerEmitter.emit('data');
5255
});
5356

5457
emitter.on(RenderEvent.PROGRESS_UPDATE, (state: ProgressState) => {
@@ -88,7 +91,7 @@ export function DefaultComponent(props: {
8891
return <Box flexDirection="column">
8992
{
9093
([RenderState.APPLY_COMPLETE, RenderState.APPLYING, RenderState.GENERATING_PLAN].includes(state)) && progressState && !hideProgress && (
91-
<ProgressDisplay progress={progressState}/>
94+
<ProgressDisplay emitter={spinnerEmitter} eventType="data" progress={progressState}/>
9295
)
9396
}
9497
{

src/ui/components/progress/progress-display.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { Spinner, StatusMessage } from '@inkjs/ui';
1+
import { StatusMessage } from '@inkjs/ui';
22
import { Box } from 'ink';
3+
import EventEmitter from 'node:events';
34
import React from 'react';
45

6+
import Spinner from './spinner.js';
7+
58
export enum ProgressStatus {
69
IN_PROGRESS,
710
FINISHED,
@@ -21,33 +24,37 @@ export interface ProgressState {
2124
export function ProgressDisplay(
2225
props: {
2326
progress: ProgressState,
27+
emitter: EventEmitter,
28+
eventType: string,
2429
}
2530
) {
2631
const { label, status, subProgresses } = props.progress;
2732

2833
return <Box flexDirection="column">
2934
{
3035
status === ProgressStatus.IN_PROGRESS
31-
? <Spinner label={label}/>
36+
? <Spinner type="circleHalves" eventEmitter={props.emitter} eventType={props.eventType} label={label}/>
3237
: <StatusMessage variant="success">{label}</StatusMessage>
3338
}
3439
<Box flexDirection="column" marginLeft={2}>
35-
<SubProgressDisplay subProgresses={subProgresses}/>
40+
<SubProgressDisplay emitter={props.emitter} eventType={props.eventType} subProgresses={subProgresses} />
3641
</Box>
3742
</Box>
3843
}
3944

4045
export function SubProgressDisplay(
4146
props: {
4247
subProgresses: ProgressState['subProgresses'],
48+
emitter: EventEmitter,
49+
eventType: string,
4350
}
4451
) {
45-
const { subProgresses } = props;
52+
const { subProgresses, emitter, eventType } = props;
4653

4754
return <>{
4855
subProgresses && subProgresses.map((s, idx) =>
4956
s.status === ProgressStatus.IN_PROGRESS
50-
? <Spinner key={idx} label={s.label}/>
57+
? <Spinner eventEmitter={emitter} eventType={eventType} key={idx} label={s.label} type="circleHalves"/>
5158
: <StatusMessage key={idx} variant="success">{s.label}</StatusMessage>
5259
)
5360
}</>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import type { SpinnerName } from 'cli-spinners';
2+
3+
import spinners from 'cli-spinners';
4+
import { Box, Text } from 'ink';
5+
import EventEmitter from 'node:events';
6+
import React, { useEffect, useState } from 'react';
7+
8+
type Props = {
9+
/**
10+
* Type of a spinner.
11+
* See [cli-spinners](https://github.com/sindresorhus/cli-spinners) for available spinners.
12+
*
13+
* @default dots
14+
*/
15+
type?: SpinnerName;
16+
17+
eventEmitter: EventEmitter;
18+
19+
eventType: string;
20+
21+
label?: string;
22+
};
23+
24+
/**
25+
* Spinner.
26+
*/
27+
function Spinner({ eventEmitter, eventType, type = 'dots', label }: Props) {
28+
const [frame, setFrame] = useState(0);
29+
const spinner = spinners[type];
30+
31+
useEffect(() => {
32+
const listener = () => {
33+
setFrame(previousFrame => {
34+
const isLastFrame = previousFrame === spinner.frames.length - 1;
35+
return isLastFrame ? 0 : previousFrame + 1;
36+
});
37+
};
38+
39+
eventEmitter.on(eventType, listener);
40+
41+
return () => {
42+
eventEmitter.removeListener(eventType, listener);
43+
};
44+
}, [spinner]);
45+
return <Box gap={1}>
46+
<Text color="blue">{spinner.frames[frame]}</Text>
47+
{label && <Text>{label}</Text>}
48+
</Box>
49+
}
50+
51+
export default Spinner;

0 commit comments

Comments
 (0)