summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/components/GeminiRespondingSpinner.tsx
diff options
context:
space:
mode:
authorJacob Richman <[email protected]>2025-05-28 18:17:19 +0000
committerGitHub <[email protected]>2025-05-28 11:17:19 -0700
commit05a49702d888bee912682f78c3993d98f7f9d628 (patch)
treeea200621adc0d83ba8251dc86cf8aac4a3a41c8f /packages/cli/src/ui/components/GeminiRespondingSpinner.tsx
parent98dcf43214da5f03055213f02f999b047a5f00d4 (diff)
Refactor: Add GeminiRespondingSpinner to make use of streamingState idiomatic (#583)
Diffstat (limited to 'packages/cli/src/ui/components/GeminiRespondingSpinner.tsx')
-rw-r--r--packages/cli/src/ui/components/GeminiRespondingSpinner.tsx34
1 files changed, 34 insertions, 0 deletions
diff --git a/packages/cli/src/ui/components/GeminiRespondingSpinner.tsx b/packages/cli/src/ui/components/GeminiRespondingSpinner.tsx
new file mode 100644
index 00000000..57f5dd30
--- /dev/null
+++ b/packages/cli/src/ui/components/GeminiRespondingSpinner.tsx
@@ -0,0 +1,34 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import React from 'react';
+import { Text } from 'ink';
+import Spinner from 'ink-spinner';
+import type { SpinnerName } from 'cli-spinners';
+import { useStreamingContext } from '../contexts/StreamingContext.js';
+import { StreamingState } from '../types.js';
+
+interface GeminiRespondingSpinnerProps {
+ /**
+ * Optional string to display when not in Responding state.
+ * If not provided and not Responding, renders null.
+ */
+ nonRespondingDisplay?: string;
+ spinnerType?: SpinnerName;
+}
+
+export const GeminiRespondingSpinner: React.FC<
+ GeminiRespondingSpinnerProps
+> = ({ nonRespondingDisplay, spinnerType = 'dots' }) => {
+ const { streamingState } = useStreamingContext();
+
+ if (streamingState === StreamingState.Responding) {
+ return <Spinner type={spinnerType} />;
+ } else if (nonRespondingDisplay) {
+ return <Text>{nonRespondingDisplay}</Text>;
+ }
+ return null;
+};