forked from aws/agentcore-cli
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathAddSuccessScreen.tsx
More file actions
121 lines (115 loc) · 3.41 KB
/
Copy pathAddSuccessScreen.tsx
File metadata and controls
121 lines (115 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { GradientText, type NextStep, NextSteps, Screen } from '../../components';
import { Box, Text } from 'ink';
import type { ReactNode } from 'react';
import React from 'react';
/** Next steps shown after successfully adding a resource */
// eslint-disable-next-line react-refresh/only-export-components
export function getAddSuccessSteps(showDevOption: boolean): NextStep[] {
if (showDevOption) {
return [
{ command: 'dev', label: 'Run agent locally' },
{ command: 'deploy', label: 'Deploy to AWS' },
{ command: 'add', label: 'Add another resource' },
];
}
return [
{ command: 'deploy', label: 'Deploy to AWS' },
{ command: 'add', label: 'Add another resource' },
];
}
interface AddSuccessScreenProps {
/** Whether running in interactive TUI mode */
isInteractive: boolean;
/** Success message (shown in green when complete) */
message: string;
/** Optional detail text */
detail?: string;
/** Optional custom summary content to display between message and next steps */
summary?: ReactNode;
/** Loading state - shows gradient animation instead of success */
loading?: boolean;
/** Loading message to show with gradient */
loadingMessage?: string;
/** Whether to show the "dev" option (for agent resources) */
showDevOption?: boolean;
/** Called when "Add another resource" is selected */
onAddAnother: () => void;
/** Called when "Dev" is selected to run agent locally */
onDev?: () => void;
/** Called when "Deploy" is selected */
onDeploy?: () => void;
/** Called when "return" is selected to go back to main menu, or in non-interactive exit */
onExit: () => void;
}
export function AddSuccessScreen({
isInteractive,
message,
detail,
summary,
loading,
loadingMessage,
showDevOption,
onAddAnother,
onDev,
onDeploy,
onExit,
}: AddSuccessScreenProps) {
const handleSelect = (step: NextStep) => {
if (step.command === 'dev') {
onDev?.();
} else if (step.command === 'add') {
onAddAnother();
} else if (step.command === 'deploy') {
onDeploy?.();
}
};
// Disable exit while loading
const handleExit = loading
? () => {
/* noop while loading */
}
: onExit;
// Non-interactive mode - just show success message
if (!isInteractive) {
return (
<Screen title={loading ? 'Add Resource' : 'Success'} onExit={handleExit}>
<Box flexDirection="column">
{loading ? (
<GradientText text={loadingMessage ?? 'Processing...'} />
) : (
<>
<Text color="green">✓ {message}</Text>
{summary}
{detail && <Text>{detail}</Text>}
</>
)}
</Box>
</Screen>
);
}
return (
<Screen title={loading ? 'Add Resource' : 'Success'} onExit={handleExit}>
<Box flexDirection="column" gap={1}>
<Box flexDirection="column">
{loading ? (
<GradientText text={loadingMessage ?? 'Processing...'} />
) : (
<>
<Text color="green">✓ {message}</Text>
{summary}
{detail && <Text>{detail}</Text>}
</>
)}
</Box>
{!loading && (
<NextSteps
steps={getAddSuccessSteps(showDevOption ?? false)}
isInteractive={true}
onSelect={handleSelect}
onBack={onExit}
/>
)}
</Box>
</Screen>
);
}