From c52a754076eea8bdaa2d77c431bd7dd4f1b911a3 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Mon, 21 Apr 2025 05:18:24 -0700 Subject: [PATCH] lots of ux --- .../react/src/sidebar-tsx/SidebarChat.tsx | 35 ++++++++++++++++--- .../src/sidebar-tsx/SidebarThreadSelector.tsx | 8 ++--- .../src/void-onboarding/VoidOnboarding.tsx | 22 ++++++++---- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 60441371..d0f136f3 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -1422,7 +1422,7 @@ const ToolRequestAcceptRejectButtons = ({ toolName }: { toolName: ToolName }) => : null - return
+ return
{approveButton} {cancelButton} {approvalToggle} @@ -2714,15 +2714,15 @@ export const SidebarChat = () => { const sidebarRef = useRef(null) const scrollContainerRef = useRef(null) - const onSubmit = useCallback(async () => { + const onSubmit = useCallback(async (_forceSubmit?: string) => { - if (isDisabled) return + if (isDisabled && !_forceSubmit) return if (isRunning) return const threadId = chatThreadsService.state.currentThreadId // send message to LLM - const userMessage = textAreaRef.current?.value ?? '' + const userMessage = _forceSubmit || textAreaRef.current?.value || '' try { await chatThreadsService.addUserMessageAndStreamResponse({ userMessage, threadId }) @@ -2884,6 +2884,26 @@ export const SidebarChat = () => { const isLandingPage = previousMessages.length === 0 + const initiallySuggestedPromptsHTML =
+ {[ + 'Summarize my codebase', + 'How do types work in Rust?', + 'Create a .voidrules file for me' + ].map((text, index) => ( +
onSubmit(text)} + > + {text} +
+ ))} +
+ + + console.log('!!!', Object.keys(chatThreadsState.allThreads).length) + + const threadPageInput =
@@ -2907,11 +2927,16 @@ export const SidebarChat = () => { {landingPageInput} - {Object.values(chatThreadsState.allThreads).length > 0 && // show if there are threads + {Object.keys(chatThreadsState.allThreads).length > 1 ? // show if there are threads
Previous Threads
+ : + +
Suggestions
+ {initiallySuggestedPromptsHTML} +
}
diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarThreadSelector.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarThreadSelector.tsx index 6e96aa22..6276f36b 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarThreadSelector.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarThreadSelector.tsx @@ -176,8 +176,8 @@ export const PastThreadsList = ({ className = '' }: { className?: string }) => { return (
- {displayThreads.length === 0 - ? <> // No chats yet... Suggestion: Tell me about my codebase Suggestion: Create a new .voidrules file in the root of my repo + {displayThreads.length === 0 // this should never happen + ? <> : displayThreads.map((threadId, i) => { const pastThread = allThreads[threadId]; if (!pastThread) { @@ -199,7 +199,7 @@ export const PastThreadsList = ({ className = '' }: { className?: string }) => { {hasMoreThreads && !showAll && (
setShowAll(true)} > Show {sortedThreadIds.length - numInitialThreads} more... @@ -207,7 +207,7 @@ export const PastThreadsList = ({ className = '' }: { className?: string }) => { )} {hasMoreThreads && showAll && (
setShowAll(false)} > Show less diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 8281fc77..31031bc5 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -131,16 +131,25 @@ const FadeIn = ({ children, className, delayMs = 0, durationMs, ...props }: { ch // prev/next const NextButton = ({ onClick, ...props }: { onClick: () => void } & React.ButtonHTMLAttributes) => { + + // Create a new props object without the disabled attribute + const { disabled, ...buttonProps } = props; + return ( @@ -481,7 +490,6 @@ const VoidOnboardingContent = () => { const [selectedPrivateProvider, setSelectedPrivateProvider] = useState('ollama'); const [selectedAffordableProvider, setSelectedAffordableProvider] = useState('gemini'); const [selectedAllProvider, setSelectedAllProvider] = useState('anthropic'); - const [didDoubleClickSkip, setDidDoubleClickSkip] = useState(false) // Helper function to get the current selected provider based on active tab const getSelectedProvider = (): ProviderName => {