Skip to content

Commit 2758c84

Browse files
committed
fix: Fixed weird memory problem with using spinner and status message from @inkjs/ui
1 parent 05f94cb commit 2758c84

File tree

4 files changed

+39
-48
lines changed

4 files changed

+39
-48
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"ajv": "^8.12.0",
1616
"ajv-formats": "^3.0.1",
1717
"chalk": "^5.3.0",
18+
"cli-spinners": "^3.4.0",
1819
"codify-schemas": "1.0.86-beta11",
1920
"cors": "^2.8.5",
2021
"debug": "^4.3.4",
@@ -27,7 +28,7 @@
2728
"ink-select-input": "^6.0.0",
2829
"jju": "^1.4.0",
2930
"jose": "^6.1.0",
30-
"jotai": "^2.11.1",
31+
"jotai": "^2.18.0",
3132
"js-yaml": "^4.1.0",
3233
"js-yaml-source-map": "^0.2.2",
3334
"json-source-map": "^0.6.1",

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { Spinner as AutomatedSpinner, StatusMessage } from '@inkjs/ui';
2-
import { Box } from 'ink';
1+
import { Box, Text } from 'ink';
32
import { useAtom } from 'jotai';
43
import React from 'react';
54

65
import { store } from '../../store/index.js';
6+
import Spinner from './spinner.js';
77

88
export enum ProgressStatus {
99
IN_PROGRESS,
@@ -32,8 +32,8 @@ export function ProgressDisplay() {
3232
return <Box flexDirection="column">
3333
{
3434
status === ProgressStatus.IN_PROGRESS
35-
? <AutomatedSpinner label={label} type="dots" />
36-
: <StatusMessage variant="success">{label}</StatusMessage>
35+
? <Spinner label={label} type="dots" />
36+
: <Text><Text color='greenBright'></Text> {label}</Text>
3737
}
3838
<Box flexDirection="column" marginLeft={2}>
3939
<SubProgressDisplay subProgresses={subProgresses}/>
@@ -56,8 +56,8 @@ export function SubProgressDisplay(
5656
.slice(Math.max(0, subProgresses.length - 5), subProgresses.length)
5757
.map((s, idx) =>
5858
s.status === ProgressStatus.IN_PROGRESS
59-
? <AutomatedSpinner key={idx} label={s.label} type="dots" />
60-
: <StatusMessage key={idx} variant="success">{s.label}</StatusMessage>
59+
? <Spinner key={idx} label={s.label} type="dots" />
60+
: <Text key={idx}><Text color='greenBright'></Text> {s.label}</Text>
6161
)
6262
}</>
6363
}
Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,42 @@
11
import type { SpinnerName } from 'cli-spinners';
22

33
import spinners from 'cli-spinners';
4-
import { Box, Text } from 'ink';
5-
import EventEmitter from 'node:events';
6-
import React, { useLayoutEffect, useState } from 'react';
4+
import { Text } from 'ink';
5+
import React, { useEffect, useState } from 'react';
76

87
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;
8+
/**
9+
* Type of a spinner.
10+
* See [cli-spinners](https://github.com/sindresorhus/cli-spinners) for available spinners.
11+
*
12+
* @default dots
13+
*/
14+
type?: SpinnerName;
15+
16+
label?: string;
2217
};
2318

2419
/**
2520
* Spinner.
2621
*/
27-
function Spinner({ eventEmitter, eventType, type = 'dots', label }: Props) {
28-
const [frame, setFrame] = useState(0);
29-
const spinner = spinners[type];
30-
31-
useLayoutEffect(() => {
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-
}, [])
45-
46-
return <Box gap={1}>
47-
<Text color="blue">{spinner.frames[frame]}</Text>
48-
{label && <Text>{label}</Text>}
49-
</Box>
22+
function Spinner({ type = 'dots', label }: Props) {
23+
const [frame, setFrame] = useState(0);
24+
const spinner = spinners[type];
25+
26+
useEffect(() => {
27+
const timer = setInterval(() => {
28+
setFrame(previousFrame => {
29+
const isLastFrame = previousFrame === spinner.frames.length - 1;
30+
return isLastFrame ? 0 : previousFrame + 1;
31+
});
32+
}, spinner.interval);
33+
34+
return () => {
35+
clearInterval(timer);
36+
};
37+
}, [spinner]);
38+
39+
return <Text>{spinner.frames[frame]} {label}</Text>;
5040
}
5141

52-
export default Spinner;
42+
export default Spinner;

src/ui/reporters/default-reporter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ export class DefaultReporter implements Reporter {
314314

315315
// Validates that the password works
316316
if (SudoUtils.validate(passwordAttempt)) {
317-
this.updateRenderState(RenderStatus.PROGRESS)
317+
await this.displayProgress();
318318
return passwordAttempt;
319319
}
320320

0 commit comments

Comments
 (0)