Skip to content

Commit aeb6219

Browse files
committed
feat: Removed the spinner powered by log messages (caused pointer issues previously) since it's no longer needed. Fix sudo util missing problems
1 parent 1bc02e7 commit aeb6219

File tree

6 files changed

+27
-35
lines changed

6 files changed

+27
-35
lines changed

src/common/base-command.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export abstract class BaseCommand extends Command {
5656

5757
// We print that we used sudo everytime even if the user provides it in the beginning
5858
if (flags.sudoPassword && data.options.requiresRoot) {
59-
console.log(chalk.blue(`Plugin: "${pluginName}" requires root access to run command: "${data.command}"`));
59+
console.log(chalk.blue(`Plugin: "${pluginName}" requires root access to run command: "sudo ${data.command}"`));
6060
}
6161

6262
if (data.options.stdin) {

src/ui/components/default-component.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,17 @@ import { PlanComponent } from './plan/plan.js';
2222
import { ProgressDisplay } from './progress/progress-display.js';
2323
import { PromptPressKeyToContinue } from './widgets/PromptPressKeyToContinue.js';
2424

25-
const spinnerEmitter = new EventEmitter();
26-
2725
export function DefaultComponent(props: {
2826
emitter: EventEmitter
2927
}) {
3028
const { emitter } = props
3129
const [disableSudoPrompt, setDisableSudoPrompt] = useState(false);
3230
const [{ status: renderStatus, data: renderData }] = useAtom(store.renderState);
33-
const logTriggeredSpinner = selectAtom(store.progressState, (progress) => progress?.logTriggeredSpinner ?? false);
3431

3532
// Use layoutEffect runs before the first render, whereas useEffect runs after
3633
useLayoutEffect(() => {
3734
const logListener = (log: string) => {
3835
console.log(chalk.cyan(log));
39-
40-
if (logTriggeredSpinner) {
41-
spinnerEmitter.emit('data');
42-
}
4336
};
4437

4538
emitter.on(RenderEvent.LOG, logListener);
@@ -64,7 +57,7 @@ export function DefaultComponent(props: {
6457
}
6558
{
6659
renderStatus === RenderStatus.PROGRESS && (
67-
<ProgressDisplay emitter={spinnerEmitter} eventType="data"/>
60+
<ProgressDisplay />
6861
)
6962
}
7063
{

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

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,44 +24,32 @@ export interface ProgressState {
2424
}> | null;
2525
}
2626

27-
export function ProgressDisplay(
28-
props: {
29-
// progress: ProgressState,
30-
emitter: EventEmitter,
31-
eventType: string,
32-
}
33-
) {
27+
export function ProgressDisplay() {
3428
const [progress] = useAtom(store.progressState);
3529
if (!progress) {
3630
return;
3731
}
3832

39-
const { label, status, subProgresses, logTriggeredSpinner } = progress;
33+
const { label, status, subProgresses } = progress;
4034

4135
return <Box flexDirection="column">
4236
{
4337
status === ProgressStatus.IN_PROGRESS
44-
? (logTriggeredSpinner
45-
? <Spinner eventEmitter={props.emitter} eventType={props.eventType} label={label} type="circleHalves"/>
46-
: <AutomatedSpinner label={label} type="circleHalves" />
47-
)
38+
? <AutomatedSpinner label={label} type="circleHalves" />
4839
: <StatusMessage variant="success">{label}</StatusMessage>
4940
}
5041
<Box flexDirection="column" marginLeft={2}>
51-
<SubProgressDisplay emitter={props.emitter} eventType={props.eventType} subProgresses={subProgresses} logTriggeredSpinner={logTriggeredSpinner}/>
42+
<SubProgressDisplay subProgresses={subProgresses}/>
5243
</Box>
5344
</Box>
5445
}
5546

5647
export function SubProgressDisplay(
5748
props: {
58-
logTriggeredSpinner: boolean;
5949
subProgresses: ProgressState['subProgresses'],
60-
emitter: EventEmitter,
61-
eventType: string,
6250
}
6351
) {
64-
const { subProgresses, emitter, eventType } = props;
52+
const { subProgresses } = props;
6553

6654
return <>{
6755
subProgresses && subProgresses
@@ -71,10 +59,7 @@ export function SubProgressDisplay(
7159
.slice(Math.max(0, subProgresses.length - 5), subProgresses.length)
7260
.map((s, idx) =>
7361
s.status === ProgressStatus.IN_PROGRESS
74-
? (props.logTriggeredSpinner
75-
? <Spinner eventEmitter={emitter} eventType={eventType} key={idx} label={s.label} type="circleHalves"/>
76-
: <AutomatedSpinner key={idx} label={s.label} type="circleHalves" />
77-
)
62+
? <AutomatedSpinner key={idx} label={s.label} type="circleHalves" />
7863
: <StatusMessage key={idx} variant="success">{s.label}</StatusMessage>
7964
)
8065
}</>

src/ui/reporters/default-reporter.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FormProps, FormReturnValue } from '@codifycli/ink-form';
22
import chalk from 'chalk';
3-
import { SudoRequestData } from 'codify-schemas';
3+
import { CommandRequestData } from 'codify-schemas';
44
import { render } from 'ink';
55
import { EventEmitter } from 'node:events';
66
import React from 'react';
@@ -169,8 +169,8 @@ export class DefaultReporter implements Reporter {
169169
this.updateRenderState(RenderStatus.DISPLAY_IMPORT_RESULT, { importResult, showConfigs });
170170
}
171171

172-
async promptSudo(pluginName: string, data: SudoRequestData, secureMode: boolean): Promise<string | undefined> {
173-
console.log(chalk.blue(`Plugin: "${pluginName}" requires root access to run command: "${data.command}"`));
172+
async promptSudo(pluginName: string, data: CommandRequestData, secureMode: boolean): Promise<string | undefined> {
173+
console.log(chalk.blue(`Plugin: "${pluginName}" requires root access to run command: "sudo ${data.command}"`));
174174

175175
let password;
176176

src/ui/reporters/reporter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SudoRequestData , SudoRequestResponseData } from 'codify-schemas';
1+
import { CommandRequestData } from 'codify-schemas';
22

33
import { Plan } from '../../entities/plan.js';
44
import { ResourceConfig } from '../../entities/resource-config.js';
@@ -59,7 +59,7 @@ export interface Reporter {
5959

6060
promptOptions(message: string, options: string[]): Promise<number>;
6161

62-
promptSudo(pluginName: string, data: SudoRequestData, secureMode: boolean): Promise<string | undefined>;
62+
promptSudo(pluginName: string, data: CommandRequestData, secureMode: boolean): Promise<string | undefined>;
6363

6464
promptUserForValues(resources: Array<ResourceInfo>, promptType: PromptType): Promise<ResourceConfig[]>;
6565

src/utils/sudo.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { execSync } from 'node:child_process';
2+
3+
4+
export const SudoUtils = {
5+
validate(password?: string): boolean {
6+
try {
7+
// Sudo with -SNv will not prompt if within sudo cache timeout
8+
execSync(`sudo -SNv ${password ? `<<< ${password}` : ''}`, { stdio: 'ignore' })
9+
return true;
10+
} catch {
11+
return false;
12+
}
13+
}
14+
};

0 commit comments

Comments
 (0)